Transaction executed successfully

Transaction Details

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

Transaction hash
AE33E8FBFFDF4719A59A989499C3E4318FD129BB5757BD9556F93431D870386F

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
41,547,113
Gas consumed
FEE
200000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3910000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cp/xAQoML3ZtLm1fYWRkcGtnEo3xAQooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLQ8AEKB2R1ZWJvb2sSO2duby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9kdWVib29rGsuBAQoLZHVlYm9vay5nbm8SuoEBLy8gUGFja2FnZSBkdWVib29rIGlzIGEgcHVyZSBzY2hlZHVsaW5nIHByaW1pdGl2ZSBmb3IgcmVhbG1zIHRoYXQgbmVlZCB0bwovLyBhdXRob3JpemUgYW4gYWN0aW9uIG5vdyBhbmQgcGVyZm9ybSBpdCBsYXRlci4gSXQgaXMgdG8gKnRpbWUqIHdoYXQKLy8gZmVlbGVkZ2VyIGlzIHRvICptb25leSo6IGl0IGhvbGRzIG5vIGNvaW5zLCBwZXJmb3JtcyBubyBlZmZlY3RzLCBpbXBvcnRzCi8vIG5vIGNoYWluIEFQSXMsIGFuZCBvd25zIG5vIHBhY2thZ2UtbGV2ZWwgc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gb3ducwovLyBhICpCb29rLCBzdXBwbGllcyB0aGUgY2xvY2ssIGFuZCBwZXJmb3JtcyBpdHMgb3duIGVmZmVjdHMuCi8vCi8vICMgVGhlIG9uZSBpZGVhCi8vCi8vIEEgcmVhbG0gZG9lcyBub3QgYXNrIGR1ZWJvb2sgdG8gZXhlY3V0ZSBhbnl0aGluZyDigJQgR25vIGhhcyBubyBhdXRvbm9tb3VzCi8vIGV4ZWN1dGlvbiwgc28gInNjaGVkdWxlZCIgYWx3YXlzIG1lYW5zICJzb21lb25lIHNlbmRzIGEgdHJhbnNhY3Rpb24KLy8gbGF0ZXIiLiBXaGF0IGEgcmVhbG0gYWN0dWFsbHkgbmVlZHMgaXMgZm9yIHRoYXQgbGF0ZXIgdHJhbnNhY3Rpb24gdG8gYmUKLy8gYXV0aG9yaXplZCBleGFjdGx5IG9uY2UuIENsYWltIGlzIHRoYXQgc3RlcDoKLy8KLy8JZCwgZXJyIDo9IGJvb2suQ2xhaW0oaWQsIG5vdykKLy8JaWYgZXJyICE9IG5pbCB7Ci8vCQlwYW5pYyhlcnIpIC8vIG5vdCBkdWUsIGV4cGlyZWQsIGNhbmNlbGxlZCwgb3IgYWxyZWFkeSBjbGFpbWVkCi8vCX0KLy8JLy8gLi4uIHRoZSByZWFsbSBwZXJmb3JtcyBpdHMgb3duIGVmZmVjdCBoZXJlLCB1bmRlciBpdHMgb3duIGF1dGhvcml0eQovLwovLyBDbGFpbSBjaGVja3MgZHVlIC8gbm90LWV4cGlyZWQgLyBzdGlsbC1vcGVuIGFuZCBDT05TVU1FUyB0aGUgZGVmZXJyYWwgaW4KLy8gdGhlIHNhbWUgY2FsbCwgYmVmb3JlIHJldHVybmluZy4gVGhlIHJlYWxtIHRoZW4gYWN0cy4gUmVwbGF5IGlzIG5vdAovLyBndWFyZGVkIGFnYWluc3QsIGl0IGlzIHN0cnVjdHVyYWxseSBpbXBvc3NpYmxlOgovLwovLyAgIC0gSURzIGFyZSBhbGxvY2F0ZWQgbW9ub3RvbmljYWxseSBmcm9tIGFuIGludGVybmFsIGNvdW50ZXIgYW5kIGFyZQovLyAgICAgTkVWRVIgcmV1c2VkLCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBCb29rOwovLyAgIC0gYSBzdWNjZXNzZnVsIENsYWltIHJlbW92ZXMgdGhlIGRlZmVycmFsIGJlZm9yZSByZXR1cm5pbmc7Ci8vCi8vIHNvIGF0IG1vc3Qgb25lIENsYWltIHBlciBJRCBjYW4gZXZlciBzdWNjZWVkLCBhY3Jvc3MgYWxsIHRyYW5zYWN0aW9ucywKLy8gZm9yZXZlci4gQSBzZWNvbmQgQ2xhaW0gb2YgdGhlIHNhbWUgSUQgcmV0dXJucyBFcnJOb3RGb3VuZCB3aGV0aGVyIHRoZQovLyBmaXJzdCBvbmUgaGFwcGVuZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiBvciBhIHllYXIgYWdvLgovLwovLyBCZWNhdXNlIHRoZSByZWFsbSBwZXJmb3JtcyB0aGUgZWZmZWN0IGl0c2VsZiwgbm8gY2xvc3VyZSwgY2FsbGJhY2ssIG9yCi8vIGNhcGFiaWxpdHkgZXZlciBjcm9zc2VzIGEgcmVhbG0gYm91bmRhcnkuIGR1ZWJvb2sgY2Fubm90IGJlIGhhbmRlZCBjb2RlCi8vIHRvIHJ1biwgc28gaXQgY2Fubm90IGJlIHRyaWNrZWQgaW50byBydW5uaW5nIHRoZSB3cm9uZyBjb2RlLgovLwovLyAjIExpZmVjeWNsZQovLwovLyBBIGRlZmVycmFsIGlzIG9wZW4gZnJvbSBTY2hlZHVsZSB1bnRpbCBleGFjdGx5IG9uZSBvZiBDbGFpbSwgQ2FuY2VsLCBvcgovLyBFeHBpcmUgY29uc3VtZXMgaXQuIFRoZXJlIGlzIG5vIG90aGVyIHRyYW5zaXRpb24gYW5kIG5vIHdheSBiYWNrLgovLwovLwlTY2hlZHVsZSDilIDilIA+IG9wZW4g4pSA4pSA4pSs4pSA4pSAIENsYWltICAgKG5vdyA+PSBEdWVBdCwgYmVmb3JlIEV4cGlyZXNBdCkKLy8JICAgICAgICAgICAgICAgICAgICDilJzilIDilIAgQ2FuY2VsICAob3duZXIgb25seSwgYW55IHRpbWUgd2hpbGUgb3BlbikKLy8JICAgICAgICAgICAgICAgICAgICDilJTilIDilIAgRXhwaXJlICAoYW55b25lLCBvbmNlIG5vdyA+PSBFeHBpcmVzQXQpCi8vCi8vIENsYWltYWJpbGl0eSBpcyB0aGUgaGFsZi1vcGVuIGludGVydmFsIFtEdWVBdCwgRXhwaXJlc0F0KTogZHVlIGF0IER1ZUF0LAovLyBubyBsb25nZXIgY2xhaW1hYmxlIGF0IEV4cGlyZXNBdC4gQSBkZWZlcnJhbCBzY2hlZHVsZWQgd2l0aCB0dGwgPT0gMAovLyBuZXZlciBleHBpcmVzIGFuZCBoYXMgRXhwaXJlc0F0ID09IDAuCi8vCi8vICMgU3RhdGUgZ3Jvd3RoCi8vCi8vIENvbnN1bWVkIGRlZmVycmFscyBhcmUgcmVtb3ZlZCwgbm90IGFyY2hpdmVkIOKAlCB0aGUgSUQgY291bnRlciwgbm90IGEKLy8gdG9tYnN0b25lLCBpcyB3aGF0IHByZXZlbnRzIHJlcGxheSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBrZWVwLiBPcGVuCi8vIGRlZmVycmFscyBhcmUgY2FwcGVkIHBlciBCb29rIGF0IGNvbnN0cnVjdGlvbi4gU3RvcmFnZSBpcyB0aGVyZWZvcmUKLy8gYm91bmRlZCBieSBtYXhPcGVuIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZGVmZXJyYWxzIGhhdmUgZXZlciBleGlzdGVkLgovLyBBdWRpdCBoaXN0b3J5IGJlbG9uZ3MgaW4gdGhlIGNvbnN1bWluZyByZWFsbSdzIGV2ZW50cy4KLy8KLy8gIyBDb25zdW1lciBjb250cmFjdCAodGhlIHBhcnRzIHRoZSBwYWNrYWdlIGNhbm5vdCBlbmZvcmNlKQovLwovLyAgMS4gU1VQUExZIEEgUkVBTCBDTE9DSy4gZHVlYm9vayBjYW5ub3QgdmVyaWZ5IHRoYXQgYG5vd2AgY2FtZSBmcm9tCi8vICAgICBydW50aW1lLkNoYWluSGVpZ2h0KCkgb3IgdGltZS5Ob3coKS5Vbml4KCkuIEEgcmVhbG0gdGhhdCBsZXRzIGEgY2FsbGVyCi8vICAgICBjaG9vc2UgYG5vd2AgaGFzIG5vIGRlbGF5IGF0IGFsbC4gUGFzcyB0aGUgY2hhaW4ncyBjbG9jaywgbmV2ZXIgYQovLyAgICAgdHJhbnNhY3Rpb24gcGFyYW1ldGVyLiBUaGlzIGlzIHRoZSBzaW5nbGUgbW9zdCBpbXBvcnRhbnQgb2JsaWdhdGlvbgovLyAgICAgYW5kIHRoZSBvbmUgbW9zdCBjb21tb25seSBnb3Qgd3JvbmcuCi8vICAyLiBVU0UgT05FIENMT0NLIENPTlNJU1RFTlRMWS4gSGVpZ2h0cyBhbmQgc2Vjb25kcyBtdXN0IG5vdCBiZSBtaXhlZAovLyAgICAgd2l0aGluIGEgQm9vazsgZGVsYXksIHR0bCBhbmQgbm93IGFyZSBhbGwgaW4gdGhlIGNhbGxlcidzIGNob3NlbgovLyAgICAgdW5pdC4KLy8gIDMuIERPIE5PVCBFWFBPUlQgVEhFIEJPT0suIEEgKkJvb2sgaXMgYSBtdXRhYmxlIGhhbmRsZS4gUmV0dXJuaW5nIG9uZQovLyAgICAgYWNyb3NzIGEgcmVhbG0gYm91bmRhcnkgaGFuZHMgb3V0IHRoZSByaWdodCB0byBzY2hlZHVsZSwgY2FuY2VsIGFuZAovLyAgICAgY2xhaW0uIEV4cG9zZSB5b3VyIG93biBjcm9zc2luZyBmdW5jdGlvbnMgaW5zdGVhZDsgdGhpcyBwYWNrYWdlCi8vICAgICByZXR1cm5zIERlZmVycmFsIHZhbHVlcywgbmV2ZXIgcG9pbnRlcnMgaW50byBpdHMgc3RhdGUuCi8vICA0LiBBVVRIT1JJWkUgVEhFIEFDVE9SLiBkdWVib29rIGF1dGhlbnRpY2F0ZXMgbm90aGluZyBidXQgb3duZXJzaGlwIG9uCi8vICAgICBDYW5jZWwuIFdobyBtYXkgU2NoZWR1bGUsIGFuZCB3aG8gbWF5IENsYWltLCBhcmUgdGhlIHJlYWxtJ3MgcG9saWN5IOKAlAovLyAgICAgZGVyaXZlIHRoZSBjYWxsZXIgZnJvbSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIG5vdCBmcm9tIGFuIGFyZ3VtZW50LgovLyAgNS4gQUNUIEFGVEVSIEEgU1VDQ0VTU0ZVTCBDTEFJTSwgSU4gVEhFIFNBTUUgVFJBTlNBQ1RJT04uIENsYWltJ3MKLy8gICAgIHJldHVybiB2YWx1ZSBpcyB0aGUgYXV0aG9yaXphdGlvbi4gU3RvcmluZyBpdCB0byBhY3Qgb24gbGF0ZXIKLy8gICAgIHJlaW50cm9kdWNlcyB0aGUgcmVwbGF5IHdpbmRvdyB0aGlzIHBhY2thZ2UgZXhpc3RzIHRvIGNsb3NlLgovLwovLyBBbGwgZmFpbHVyZXMgYXJlIHJldHVybmVkIGFzIGVycm9ycyBhbmQgbGVhdmUgdGhlIEJvb2sgQ09NUExFVEVMWQovLyBVTkNIQU5HRUQuIE11c3QqIHdyYXBwZXJzIGFyZSB0aGUgb25seSBmdW5jdGlvbnMgaGVyZSB0aGF0IHBhbmljLgovLwovLyBUaGUgQm9vayBpcyBhZGRyZXNzLWFnbm9zdGljOiBvd25lcnMgYXJlIG5vbi1lbXB0eSBzdHJpbmdzLiBSZWFsbXMKLy8gbm9ybWFsbHkgdXNlIGFkZHJlc3MuU3RyaW5nKCkuCnBhY2thZ2UgZHVlYm9vawoKaW1wb3J0ICgKCSJlcnJvcnMiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIE1heFBheWxvYWRMZW4gYm91bmRzIGEgc2luZ2xlIGRlZmVycmFsJ3MgcGF5bG9hZC4gVGhlIHBheWxvYWQgaXMgb3BhcXVlCi8vIHRvIGR1ZWJvb2sg4oCUIGl0IGV4aXN0cyBzbyBhIHJlYWxtIGNhbiByZWNvdmVyIHdoYXQgaXQgc2NoZWR1bGVkIHdpdGhvdXQKLy8ga2VlcGluZyBhIHBhcmFsbGVsIHRhYmxlLgpjb25zdCBNYXhQYXlsb2FkTGVuID0gNDA5NgoKLy8gTWF4T3BlbkxpbWl0IGlzIHRoZSBsYXJnZXN0IG1heE9wZW4gYSBCb29rIG1heSBiZSBjb25zdHJ1Y3RlZCB3aXRoLiBJdAovLyBib3VuZHMgdGhlIHdvcnN0LWNhc2UgY29zdCBvZiBEdWUgYW5kIEl0ZXJhdGVPcGVuLCB3aGljaCBzY2FuIHRoZSBvcGVuCi8vIHNldC4KY29uc3QgTWF4T3BlbkxpbWl0ID0gMTAwMDAKCi8vIEVycm9ycyByZXR1cm5lZCBieSBCb29rIG9wZXJhdGlvbnMuCnZhciAoCglFcnJFbXB0eU93bmVyICAgID0gZXJyb3JzLk5ldygiZHVlYm9vazogZW1wdHkgb3duZXIga2V5IikKCUVyclBheWxvYWRUb29CaWcgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBwYXlsb2FkIGV4Y2VlZHMgTWF4UGF5bG9hZExlbiIpCglFcnJJbnZhbGlkTm93ICAgID0gZXJyb3JzLk5ldygiZHVlYm9vazogbm93IG11c3QgYmUgbm9uLW5lZ2F0aXZlIikKCUVyckludmFsaWREZWxheSAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBkZWxheSBvdXRzaWRlIFttaW5EZWxheSwgbWF4RGVsYXldIikKCUVyckludmFsaWRUVEwgICAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiB0dGwgbXVzdCBiZSBub24tbmVnYXRpdmUiKQoJRXJySW52YWxpZENvbmZpZyA9IGVycm9ycy5OZXcoImR1ZWJvb2s6IGludmFsaWQgYm9vayBjb25maWd1cmF0aW9uIikKCUVyckJvb2tGdWxsICAgICAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBvcGVuIGRlZmVycmFsIGNhcCByZWFjaGVkIikKCUVyck5vdEZvdW5kICAgICAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBubyBzdWNoIG9wZW4gZGVmZXJyYWwiKQoJRXJyTm90RHVlICAgICAgICA9IGVycm9ycy5OZXcoImR1ZWJvb2s6IG5vdCBkdWUgeWV0IikKCUVyckV4cGlyZWQgICAgICAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBkZWZlcnJhbCBoYXMgZXhwaXJlZCIpCglFcnJOb3RFeHBpcmVkICAgID0gZXJyb3JzLk5ldygiZHVlYm9vazogZGVmZXJyYWwgaGFzIG5vdCBleHBpcmVkIikKCUVyck5vdE93bmVyICAgICAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBjYWxsZXIgZG9lcyBub3Qgb3duIHRoaXMgZGVmZXJyYWwiKQoJRXJyT3ZlcmZsb3cgICAgICA9IGVycm9ycy5OZXcoImR1ZWJvb2s6IGludDY0IG92ZXJmbG93IikKCUVycklERXhoYXVzdGVkICAgPSBlcnJvcnMuTmV3KCJkdWVib29rOiBpZGVudGlmaWVyIHNwYWNlIGV4aGF1c3RlZCIpCikKCi8vIERlZmVycmFsIGlzIGEgc2NoZWR1bGVkIGFjdGlvbi4gSXQgaXMgcmV0dXJuZWQgQlkgVkFMVUU6IGhvbGRlcnMgY2Fubm90Ci8vIHJlYWNoIGludG8gYSBCb29rIHRocm91Z2ggaXQuIFBheWxvYWQgaXMgb3BhcXVlIHRvIHRoaXMgcGFja2FnZS4KLy8KLy8gRXhwaXJlc0F0ID09IDAgbWVhbnMgdGhlIGRlZmVycmFsIG5ldmVyIGV4cGlyZXMuIE90aGVyd2lzZSB0aGUgZGVmZXJyYWwKLy8gaXMgY2xhaW1hYmxlIGV4YWN0bHkgb24gW0R1ZUF0LCBFeHBpcmVzQXQpLgp0eXBlIERlZmVycmFsIHN0cnVjdCB7CglJRCAgICAgICAgdWludDY0CglPd25lciAgICAgc3RyaW5nCglQYXlsb2FkICAgc3RyaW5nCglDcmVhdGVkQXQgaW50NjQKCUR1ZUF0ICAgICBpbnQ2NAoJRXhwaXJlc0F0IGludDY0Cn0KCi8vIElzRHVlIHJlcG9ydHMgd2hldGhlciB0aGUgZGVmZXJyYWwgaGFzIHJlYWNoZWQgaXRzIGR1ZSB0aW1lIGF0IG5vdy4KZnVuYyAoZCBEZWZlcnJhbCkgSXNEdWUobm93IGludDY0KSBib29sIHsgcmV0dXJuIG5vdyA+PSBkLkR1ZUF0IH0KCi8vIElzRXhwaXJlZCByZXBvcnRzIHdoZXRoZXIgdGhlIGRlZmVycmFsIGlzIHBhc3QgaXRzIGV4cGlyeSBhdCBub3cuCi8vIEEgZGVmZXJyYWwgd2l0aCBubyBleHBpcnkgaXMgbmV2ZXIgZXhwaXJlZC4KZnVuYyAoZCBEZWZlcnJhbCkgSXNFeHBpcmVkKG5vdyBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gZC5FeHBpcmVzQXQgIT0gMCAmJiBub3cgPj0gZC5FeHBpcmVzQXQKfQoKLy8gSXNDbGFpbWFibGUgcmVwb3J0cyB3aGV0aGVyIENsYWltIHdvdWxkIHN1Y2NlZWQgYXQgbm93LCBhc3N1bWluZyB0aGUKLy8gZGVmZXJyYWwgaXMgc3RpbGwgb3Blbi4KZnVuYyAoZCBEZWZlcnJhbCkgSXNDbGFpbWFibGUobm93IGludDY0KSBib29sIHsKCXJldHVybiBkLklzRHVlKG5vdykgJiYgIWQuSXNFeHBpcmVkKG5vdykKfQoKLy8gQm9vayBob2xkcyB0aGUgb3BlbiBkZWZlcnJhbHMgb2Ygb25lIGNvbnN1bWluZyByZWFsbS4gVGhlIHplcm8gdmFsdWUgaXMKLy8gbm90IHVzYWJsZTsgY29uc3RydWN0IHdpdGggTmV3Lgp0eXBlIEJvb2sgc3RydWN0IHsKCW1pbkRlbGF5IGludDY0CgltYXhEZWxheSBpbnQ2NAoJbWF4T3BlbiAgaW50CgluZXh0SUQgICB1aW50NjQgICAgLy8gbmV2ZXIgZGVjcmVhc2VzOyBJRHMgYXJlIG5ldmVyIHJldXNlZAoJb3BlbiAgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiBEZWZlcnJhbAp9CgovLyBOZXcgcmV0dXJucyBhbiBlbXB0eSBCb29rLgovLwovLyBtaW5EZWxheSBpcyB0aGUgZmxvb3Igb24gaG93IGZhciBhaGVhZCBhIGRlZmVycmFsIG1heSBiZSBzY2hlZHVsZWQ7IDAKLy8gcGVybWl0cyBzYW1lLWluc3RhbnQgc2NoZWR1bGluZy4gbWF4RGVsYXkgaXMgdGhlIGNlaWxpbmcsIGFuZCBkb3VibGVzIGFzCi8vIHRoZSBvdmVyZmxvdyBndWFyZCBvbiBub3crZGVsYXkuIG1heE9wZW4gY2FwcyBzaW11bHRhbmVvdXNseSBvcGVuCi8vIGRlZmVycmFscyBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4T3BlbkxpbWl0XS4KLy8KLy8gVW5pdHMgYXJlIHRoZSBjYWxsZXIncyBjaG9pY2Ug4oCUIGJsb2NrIGhlaWdodHMgb3Igc2Vjb25kcyDigJQgYnV0IG11c3QgYmUKLy8gdXNlZCBjb25zaXN0ZW50bHkgZm9yIHRoZSBsaWZlIG9mIHRoZSBCb29rLgpmdW5jIE5ldyhtaW5EZWxheSwgbWF4RGVsYXkgaW50NjQsIG1heE9wZW4gaW50KSAoKkJvb2ssIGVycm9yKSB7CglpZiBtaW5EZWxheSA8IDAgfHwgbWF4RGVsYXkgPCBtaW5EZWxheSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZENvbmZpZwoJfQoJaWYgbWF4T3BlbiA8IDEgfHwgbWF4T3BlbiA+IE1heE9wZW5MaW1pdCB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZENvbmZpZwoJfQoJcmV0dXJuICZCb29rewoJCW1pbkRlbGF5OiBtaW5EZWxheSwKCQltYXhEZWxheTogbWF4RGVsYXksCgkJbWF4T3BlbjogIG1heE9wZW4sCgkJbmV4dElEOiAgIDEsCgkJb3BlbjogICAgIGF2bC5OZXdUcmVlKCksCgl9LCBuaWwKfQoKLy8gTXVzdE5ldyBpcyBOZXcgYnV0IHBhbmljcyBvbiBlcnJvci4KZnVuYyBNdXN0TmV3KG1pbkRlbGF5LCBtYXhEZWxheSBpbnQ2NCwgbWF4T3BlbiBpbnQpICpCb29rIHsKCWIsIGVyciA6PSBOZXcobWluRGVsYXksIG1heERlbGF5LCBtYXhPcGVuKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGIKfQoKLy8gTWluRGVsYXkgcmV0dXJucyB0aGUgQm9vaydzIHNjaGVkdWxpbmcgZmxvb3IuCmZ1bmMgKGIgKkJvb2spIE1pbkRlbGF5KCkgaW50NjQgeyByZXR1cm4gYi5taW5EZWxheSB9CgovLyBNYXhEZWxheSByZXR1cm5zIHRoZSBCb29rJ3Mgc2NoZWR1bGluZyBjZWlsaW5nLgpmdW5jIChiICpCb29rKSBNYXhEZWxheSgpIGludDY0IHsgcmV0dXJuIGIubWF4RGVsYXkgfQoKLy8gTWF4T3BlbiByZXR1cm5zIHRoZSBCb29rJ3MgY2FwIG9uIHNpbXVsdGFuZW91c2x5IG9wZW4gZGVmZXJyYWxzLgpmdW5jIChiICpCb29rKSBNYXhPcGVuKCkgaW50IHsgcmV0dXJuIGIubWF4T3BlbiB9CgovLyBPcGVuQ291bnQgcmV0dXJucyBob3cgbWFueSBkZWZlcnJhbHMgYXJlIGN1cnJlbnRseSBvcGVuLgpmdW5jIChiICpCb29rKSBPcGVuQ291bnQoKSBpbnQgeyByZXR1cm4gYi5vcGVuLlNpemUoKSB9CgovLyBOZXh0SUQgcmV0dXJucyB0aGUgaWRlbnRpZmllciB0aGUgbmV4dCBTY2hlZHVsZSB3aWxsIGFsbG9jYXRlLiBJdCBvbmx5Ci8vIGV2ZXIgaW5jcmVhc2VzLCB3aGljaCBpcyB3aGF0IG1ha2VzIGEgY29uc3VtZWQgSUQgdW5yZXVzYWJsZS4KZnVuYyAoYiAqQm9vaykgTmV4dElEKCkgdWludDY0IHsgcmV0dXJuIGIubmV4dElEIH0KCi8vIFNjaGVkdWxlIG9wZW5zIGEgZGVmZXJyYWwgb3duZWQgYnkgb3duZXIsIGR1ZSBhdCBub3crZGVsYXksIGV4cGlyaW5nCi8vIHR0bCBhZnRlciB0aGF0ICh0dGwgPT0gMCBtZWFucyBpdCBuZXZlciBleHBpcmVzKS4gSXQgcmV0dXJucyB0aGUgbmV3Ci8vIGRlZmVycmFsJ3MgSUQuCi8vCi8vIEZhaWxzIHdpdGggRXJyRW1wdHlPd25lciwgRXJyUGF5bG9hZFRvb0JpZywgRXJySW52YWxpZE5vdyAobm93IDwgMCksCi8vIEVyckludmFsaWREZWxheSAoZGVsYXkgb3V0c2lkZSBbTWluRGVsYXksIE1heERlbGF5XSksIEVyckludmFsaWRUVEwKLy8gKHR0bCA8IDApLCBFcnJCb29rRnVsbCwgRXJyT3ZlcmZsb3csIG9yIEVycklERXhoYXVzdGVkLiBPbiBlcnJvcgovLyBub3RoaW5nIGlzIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBTY2hlZHVsZShvd25lciwgcGF5bG9hZCBzdHJpbmcsIG5vdywgZGVsYXksIHR0bCBpbnQ2NCkgKHVpbnQ2NCwgZXJyb3IpIHsKCWlmIG93bmVyID09ICIiIHsKCQlyZXR1cm4gMCwgRXJyRW1wdHlPd25lcgoJfQoJaWYgbGVuKHBheWxvYWQpID4gTWF4UGF5bG9hZExlbiB7CgkJcmV0dXJuIDAsIEVyclBheWxvYWRUb29CaWcKCX0KCWlmIG5vdyA8IDAgewoJCXJldHVybiAwLCBFcnJJbnZhbGlkTm93Cgl9CglpZiBkZWxheSA8IGIubWluRGVsYXkgfHwgZGVsYXkgPiBiLm1heERlbGF5IHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZERlbGF5Cgl9CglpZiB0dGwgPCAwIHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZFRUTAoJfQoJaWYgYi5vcGVuLlNpemUoKSA+PSBiLm1heE9wZW4gewoJCXJldHVybiAwLCBFcnJCb29rRnVsbAoJfQoJaWYgYi5uZXh0SUQgPT0gMCB7CgkJcmV0dXJuIDAsIEVycklERXhoYXVzdGVkCgl9CgoJZHVlQXQsIG9rIDo9IGNoZWNrZWRBZGQobm93LCBkZWxheSkKCWlmICFvayB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CglleHBpcmVzQXQgOj0gaW50NjQoMCkKCWlmIHR0bCA+IDAgewoJCWV4cGlyZXNBdCwgb2sgPSBjaGVja2VkQWRkKGR1ZUF0LCB0dGwpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIDAsIEVyck92ZXJmbG93CgkJfQoJfQoKCWlkIDo9IGIubmV4dElECgliLm5leHRJRCsrCgliLm9wZW4uU2V0KGlkS2V5KGlkKSwgRGVmZXJyYWx7CgkJSUQ6ICAgICAgICBpZCwKCQlPd25lcjogICAgIG93bmVyLAoJCVBheWxvYWQ6ICAgcGF5bG9hZCwKCQlDcmVhdGVkQXQ6IG5vdywKCQlEdWVBdDogICAgIGR1ZUF0LAoJCUV4cGlyZXNBdDogZXhwaXJlc0F0LAoJfSkKCXJldHVybiBpZCwgbmlsCn0KCi8vIE11c3RTY2hlZHVsZSBpcyBTY2hlZHVsZSBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0U2NoZWR1bGUob3duZXIsIHBheWxvYWQgc3RyaW5nLCBub3csIGRlbGF5LCB0dGwgaW50NjQpIHVpbnQ2NCB7CglpZCwgZXJyIDo9IGIuU2NoZWR1bGUob3duZXIsIHBheWxvYWQsIG5vdywgZGVsYXksIHR0bCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBpZAp9CgovLyBDbGFpbSBjb25zdW1lcyB0aGUgZGVmZXJyYWwgYW5kIHJldHVybnMgaXQsIGF1dGhvcml6aW5nIHRoZSBjYWxsZXIgdG8KLy8gcGVyZm9ybSB0aGUgZGVmZXJyZWQgYWN0aW9uIE5PVywgaW4gdGhpcyB0cmFuc2FjdGlvbi4KLy8KLy8gSXQgc3VjY2VlZHMgb25seSB3aGlsZSB0aGUgZGVmZXJyYWwgaXMgb3BlbiBhbmQgbm93IGlzIGluCi8vIFtEdWVBdCwgRXhwaXJlc0F0KS4gVGhlIGRlZmVycmFsIGlzIHJlbW92ZWQgQkVGT1JFIENsYWltIHJldHVybnMsIHNvIGEKLy8gcmUtZW50cmFudCBvciBsYXRlciBDbGFpbSBvZiB0aGUgc2FtZSBJRCBmaW5kcyBub3RoaW5nOyBjb21iaW5lZCB3aXRoCi8vIG5vbi1yZXVzZWQgSURzLCBhdCBtb3N0IG9uZSBDbGFpbSBwZXIgSUQgZXZlciBzdWNjZWVkcy4KLy8KLy8gRmFpbHMgd2l0aCBFcnJJbnZhbGlkTm93LCBFcnJOb3RGb3VuZCAobmV2ZXIgZXhpc3RlZCwgb3IgYWxyZWFkeQovLyBjb25zdW1lZCBieSBDbGFpbS9DYW5jZWwvRXhwaXJlKSwgRXJyTm90RHVlLCBvciBFcnJFeHBpcmVkLiBPbiBlcnJvcgovLyBub3RoaW5nIGlzIG1vZGlmaWVkLgovLwovLyBkdWVib29rIGRvZXMgTk9UIGNoZWNrIHdobyBpcyBjbGFpbWluZzogd2hldGhlciBhIGRlZmVycmFsIGlzCi8vIHBlcm1pc3Npb25sZXNzbHkgY2xhaW1hYmxlIG9yIHJlc3RyaWN0ZWQgdG8gaXRzIG93bmVyIGlzIHRoZSBjb25zdW1pbmcKLy8gcmVhbG0ncyBwb2xpY3ksIGFwcGxpZWQgYmVmb3JlIGNhbGxpbmcgQ2xhaW0uCmZ1bmMgKGIgKkJvb2spIENsYWltKGlkIHVpbnQ2NCwgbm93IGludDY0KSAoRGVmZXJyYWwsIGVycm9yKSB7CglpZiBub3cgPCAwIHsKCQlyZXR1cm4gRGVmZXJyYWx7fSwgRXJySW52YWxpZE5vdwoJfQoJZCwgb2sgOj0gYi5nZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBEZWZlcnJhbHt9LCBFcnJOb3RGb3VuZAoJfQoJaWYgIWQuSXNEdWUobm93KSB7CgkJcmV0dXJuIERlZmVycmFse30sIEVyck5vdER1ZQoJfQoJaWYgZC5Jc0V4cGlyZWQobm93KSB7CgkJcmV0dXJuIERlZmVycmFse30sIEVyckV4cGlyZWQKCX0KCS8vIENvbnN1bWUgYmVmb3JlIHJldHVybmluZzogdGhlIGNhbGxlciBhY3RzIG9ubHkgYWZ0ZXIgdGhpcyBwb2ludCwgc28KCS8vIHRoZSBkZWZlcnJhbCBpcyBhbHJlYWR5IGdvbmUgd2hlbiB0aGUgZWZmZWN0IHJ1bnMuCgliLm9wZW4uUmVtb3ZlKGlkS2V5KGlkKSkKCXJldHVybiBkLCBuaWwKfQoKLy8gTXVzdENsYWltIGlzIENsYWltIGJ1dCBwYW5pY3Mgb24gZXJyb3IuCmZ1bmMgKGIgKkJvb2spIE11c3RDbGFpbShpZCB1aW50NjQsIG5vdyBpbnQ2NCkgRGVmZXJyYWwgewoJZCwgZXJyIDo9IGIuQ2xhaW0oaWQsIG5vdykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBkCn0KCi8vIENhbmNlbCBjb25zdW1lcyBhbiBvcGVuIGRlZmVycmFsIHdpdGhvdXQgcGVyZm9ybWluZyBpdC4gT25seSBpdHMgb3duZXIKLy8gbWF5IGNhbmNlbCwgYW5kIGNhbmNlbGxhdGlvbiBpcyBwZXJtaXR0ZWQgYXQgYW55IHRpbWUgd2hpbGUgdGhlIGRlZmVycmFsCi8vIGlzIG9wZW4g4oCUIGluY2x1ZGluZyBhZnRlciBpdCBiZWNhbWUgZHVlIGJ1dCBiZWZvcmUgYW55b25lIGNsYWltZWQgaXQuCi8vCi8vIEZhaWxzIHdpdGggRXJyRW1wdHlPd25lciwgRXJyTm90Rm91bmQsIG9yIEVyck5vdE93bmVyLiBPbiBlcnJvciBub3RoaW5nCi8vIGlzIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBDYW5jZWwoaWQgdWludDY0LCBvd25lciBzdHJpbmcpIChEZWZlcnJhbCwgZXJyb3IpIHsKCWlmIG93bmVyID09ICIiIHsKCQlyZXR1cm4gRGVmZXJyYWx7fSwgRXJyRW1wdHlPd25lcgoJfQoJZCwgb2sgOj0gYi5nZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBEZWZlcnJhbHt9LCBFcnJOb3RGb3VuZAoJfQoJaWYgZC5Pd25lciAhPSBvd25lciB7CgkJcmV0dXJuIERlZmVycmFse30sIEVyck5vdE93bmVyCgl9CgliLm9wZW4uUmVtb3ZlKGlkS2V5KGlkKSkKCXJldHVybiBkLCBuaWwKfQoKLy8gTXVzdENhbmNlbCBpcyBDYW5jZWwgYnV0IHBhbmljcyBvbiBlcnJvci4KZnVuYyAoYiAqQm9vaykgTXVzdENhbmNlbChpZCB1aW50NjQsIG93bmVyIHN0cmluZykgRGVmZXJyYWwgewoJZCwgZXJyIDo9IGIuQ2FuY2VsKGlkLCBvd25lcikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBkCn0KCi8vIEV4cGlyZSBjb25zdW1lcyBhIGRlZmVycmFsIHRoYXQgaXMgcGFzdCBpdHMgZXhwaXJ5LCByZWNsYWltaW5nIGl0cwovLyBzdG9yYWdlLiBJdCBpcyBkZWxpYmVyYXRlbHkgcGVybWlzc2lvbmxlc3M6IGFuIGV4cGlyZWQgZGVmZXJyYWwgY2FuCi8vIG5ldmVyIGJlIGNsYWltZWQgYWdhaW4sIHNvIGxldHRpbmcgYW55b25lIGNsZWFyIGl0IGtlZXBzIGEgQm9vayBmcm9tCi8vIHNpbHRpbmcgdXAgd2l0aCBkZWFkIGVudHJpZXMgdGhhdCBibG9jayBTY2hlZHVsZSBhZ2FpbnN0IG1heE9wZW4uCi8vCi8vIEZhaWxzIHdpdGggRXJySW52YWxpZE5vdywgRXJyTm90Rm91bmQsIG9yIEVyck5vdEV4cGlyZWQgKGluY2x1ZGluZyBmb3IKLy8gZGVmZXJyYWxzIHdpdGggbm8gZXhwaXJ5LCB3aGljaCBuZXZlciBleHBpcmUpLiBPbiBlcnJvciBub3RoaW5nIGlzCi8vIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBFeHBpcmUoaWQgdWludDY0LCBub3cgaW50NjQpIChEZWZlcnJhbCwgZXJyb3IpIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBEZWZlcnJhbHt9LCBFcnJJbnZhbGlkTm93Cgl9CglkLCBvayA6PSBiLmdldChpZCkKCWlmICFvayB7CgkJcmV0dXJuIERlZmVycmFse30sIEVyck5vdEZvdW5kCgl9CglpZiAhZC5Jc0V4cGlyZWQobm93KSB7CgkJcmV0dXJuIERlZmVycmFse30sIEVyck5vdEV4cGlyZWQKCX0KCWIub3Blbi5SZW1vdmUoaWRLZXkoaWQpKQoJcmV0dXJuIGQsIG5pbAp9CgovLyBNdXN0RXhwaXJlIGlzIEV4cGlyZSBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0RXhwaXJlKGlkIHVpbnQ2NCwgbm93IGludDY0KSBEZWZlcnJhbCB7CglkLCBlcnIgOj0gYi5FeHBpcmUoaWQsIG5vdykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBkCn0KCi8vIEdldCByZXR1cm5zIGFuIG9wZW4gZGVmZXJyYWwgYnkgSUQuIFRoZSBzZWNvbmQgcmVzdWx0IGlzIGZhbHNlIGlmIHRoZQovLyBkZWZlcnJhbCBuZXZlciBleGlzdGVkIG9yIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQg4oCUIEdldCBjYW5ub3QgdGVsbAovLyB0aG9zZSBhcGFydCwgYnkgZGVzaWduOiBjb25zdW1lZCBkZWZlcnJhbHMgbGVhdmUgbm8gdG9tYnN0b25lLgovLwovLyBHZXQgaXMgYSByZWFkLW9ubHkgcHJldmlldyBhbmQgbmV2ZXIgYXV0aG9yaXplcyBhbnl0aGluZy4gT25seSBDbGFpbSdzCi8vIHJldHVybiB2YWx1ZSBhdXRob3JpemVzIGFuIGFjdGlvbi4KZnVuYyAoYiAqQm9vaykgR2V0KGlkIHVpbnQ2NCkgKERlZmVycmFsLCBib29sKSB7IHJldHVybiBiLmdldChpZCkgfQoKLy8gRHVlIHJldHVybnMgdXAgdG8gbGltaXQgb3BlbiBkZWZlcnJhbHMgdGhhdCBhcmUgY2xhaW1hYmxlIGF0IG5vdywgaW4KLy8gYXNjZW5kaW5nIElEIG9yZGVyIChvbGRlc3QgZmlyc3QpLiBBIGxpbWl0IDw9IDAgcmV0dXJucyBub3RoaW5nLgovLwovLyBJdCBzY2FucyB0aGUgb3BlbiBzZXQsIHNvIGl0cyBjb3N0IGlzIGJvdW5kZWQgYnkgTWF4T3Blbi4KZnVuYyAoYiAqQm9vaykgRHVlKG5vdyBpbnQ2NCwgbGltaXQgaW50KSBbXURlZmVycmFsIHsKCW91dCA6PSBbXURlZmVycmFse30KCWlmIGxpbWl0IDw9IDAgfHwgbm93IDwgMCB7CgkJcmV0dXJuIG91dAoJfQoJYi5vcGVuLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWQgOj0gdmFsdWUuKERlZmVycmFsKQoJCWlmIGQuSXNDbGFpbWFibGUobm93KSB7CgkJCW91dCA9IGFwcGVuZChvdXQsIGQpCgkJfQoJCXJldHVybiBsZW4ob3V0KSA+PSBsaW1pdAoJfSkKCXJldHVybiBvdXQKfQoKLy8gRXhwaXJhYmxlIHJldHVybnMgdXAgdG8gbGltaXQgb3BlbiBkZWZlcnJhbHMgdGhhdCBFeHBpcmUgd291bGQgYWNjZXB0IGF0Ci8vIG5vdywgaW4gYXNjZW5kaW5nIElEIG9yZGVyLiBBIGxpbWl0IDw9IDAgcmV0dXJucyBub3RoaW5nLgpmdW5jIChiICpCb29rKSBFeHBpcmFibGUobm93IGludDY0LCBsaW1pdCBpbnQpIFtdRGVmZXJyYWwgewoJb3V0IDo9IFtdRGVmZXJyYWx7fQoJaWYgbGltaXQgPD0gMCB8fCBub3cgPCAwIHsKCQlyZXR1cm4gb3V0Cgl9CgliLm9wZW4uSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJZCA6PSB2YWx1ZS4oRGVmZXJyYWwpCgkJaWYgZC5Jc0V4cGlyZWQobm93KSB7CgkJCW91dCA9IGFwcGVuZChvdXQsIGQpCgkJfQoJCXJldHVybiBsZW4ob3V0KSA+PSBsaW1pdAoJfSkKCXJldHVybiBvdXQKfQoKLy8gSXRlcmF0ZU9wZW4gY2FsbHMgZm4gZm9yIGV2ZXJ5IG9wZW4gZGVmZXJyYWwgaW4gYXNjZW5kaW5nIElEIG9yZGVyLgovLyBJdGVyYXRpb24gc3RvcHMgZWFybHkgd2hlbiBmbiByZXR1cm5zIHRydWUuCi8vCi8vIGZuIHJlY2VpdmVzIGEgQ09QWTogRGVmZXJyYWwgaXMgcGFzc2VkIGJ5IHZhbHVlIGFuZCBob2xkcyBvbmx5IHNjYWxhcnMKLy8gYW5kIHN0cmluZ3MsIHNvIGZuIGdldHMgbm8gcG9pbnRlciBpbnRvIHRoZSBCb29rIGFuZCBjYW5ub3QgcmVhY2ggcGFzdAovLyBpdCDigJQgQm9vaydzIGZpZWxkcyBhcmUgYWxsIHVuZXhwb3J0ZWQuCi8vCi8vIFR3byBydWxlcyBmb3IgZm4sIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3MuCi8vCi8vICAgLSBEbyBub3QgU2NoZWR1bGUsIENsYWltLCBDYW5jZWwgb3IgRXhwaXJlIGZyb20gaW5zaWRlIGZuOiBtdXRhdGluZwovLyAgICAgdGhlIHRyZWUgd2hpbGUgaXRlcmF0aW5nIGl0IGlzIHVuZGVmaW5lZC4gQ29sbGVjdCBJRHMgZmlyc3QsIHRoZW4KLy8gICAgIGFjdCBhZnRlciBJdGVyYXRlT3BlbiByZXR1cm5zLgovLwovLyAgIC0gZm4gcnVucyB1bmRlciB0aGUgQ0FMTElORyBSRUFMTSdTIFNUT1JBR0UgQVVUSE9SSVRZLiBUaGlzIG1ldGhvZCdzCi8vICAgICByZWNlaXZlciBpcyBzdGFtcGVkIHdpdGggdGhlIGltcG9ydGluZyByZWFsbSdzIFBrZ0lELCBzbyB0aGUgYm9ycm93Ci8vICAgICBydWxlcyBsZWF2ZSB0aGUgcmVhbG0gY29udGV4dCBzZXQgdG8gdGhhdCByZWFsbSBmb3IgdGhlIHdob2xlCi8vICAgICBjYWxsYmFjaywgYW5kIGEgdG9wLWxldmVsIGZuIGhhcyBubyByZWNlaXZlciBhbmQgbm8gZGVjbGFyaW5nIHJlYWxtCi8vICAgICB0byBhbmNob3IgaXQgZWxzZXdoZXJlLiBBIGNhbGxiYWNrIHRoYXQgcmUtZW50ZXJzIHRoZSBjYWxsaW5nCi8vICAgICByZWFsbSdzIG93biBtdXRhdG9ycyB0aGVyZWZvcmUgZG9lcyBzbyB3aXRoIHRoYXQgcmVhbG0ncyBhdXRob3JpdHkuCi8vICAgICBOZXZlciBwYXNzIGEgY2FsbGVyLXN1cHBsaWVkIGZ1bmN0aW9uIGhlcmUgZnJvbSBpbnNpZGUgYQovLyAgICAgcGVybWlzc2lvbi1nYXRlZCBwYXRoOyBwYXNzIG9ubHkgYSBjbG9zdXJlIHRoaXMgcGFja2FnZSdzIGNvbnN1bWVyCi8vICAgICB3cm90ZSBpdHNlbGYuCmZ1bmMgKGIgKkJvb2spIEl0ZXJhdGVPcGVuKGZuIGZ1bmMoRGVmZXJyYWwpIGJvb2wpIHsKCWIub3Blbi5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gZm4odmFsdWUuKERlZmVycmFsKSkKCX0pCn0KCi8vIGdldCBsb29rcyB1cCBhbiBvcGVuIGRlZmVycmFsIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHRyZWUgb3RoZXJ3aXNlLgpmdW5jIChiICpCb29rKSBnZXQoaWQgdWludDY0KSAoRGVmZXJyYWwsIGJvb2wpIHsKCXYgOj0gYi5vcGVuLkdldChpZEtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIERlZmVycmFse30sIGZhbHNlCgl9CglyZXR1cm4gdi4oRGVmZXJyYWwpLCB0cnVlCn0KCi8vIGlkS2V5IGVuY29kZXMgYW4gSUQgc28gdGhhdCBhdmwncyBsZXhpY2FsIGtleSBvcmRlciBtYXRjaGVzIG51bWVyaWMgSUQKLy8gb3JkZXIuIG1hdGguTWF4VWludDY0IGlzIDIwIGRpZ2l0cywgc28gYSBmaXhlZCAyMC13aWRlIHplcm8tcGFkZGVkCi8vIGRlY2ltYWwgaXMgYm90aCBzdWZmaWNpZW50IGFuZCB1bmFtYmlndW91cy4KZnVuYyBpZEtleShpZCB1aW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApCgljb25zdCB3aWR0aCA9IDIwCglpZiBsZW4ocykgPj0gd2lkdGggewoJCXJldHVybiBzCgl9CglyZXR1cm4gemVyb3NbOndpZHRoLWxlbihzKV0gKyBzCn0KCmNvbnN0IHplcm9zID0gIjAwMDAwMDAwMDAwMDAwMDAwMDAwIgoKLy8gY2hlY2tlZEFkZCByZXR1cm5zIGErYiBhbmQgcmVwb3J0cyB3aGV0aGVyIHRoZSBhZGRpdGlvbiBkaWQgbm90Ci8vIG92ZXJmbG93IGludDY0LgpmdW5jIGNoZWNrZWRBZGQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglzdW0gOj0gYSArIGIKCWlmIChiID4gMCAmJiBzdW0gPCBhKSB8fCAoYiA8IDAgJiYgc3VtID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHN1bSwgdHJ1ZQp9ChqwbQoQZHVlYm9va190ZXN0LmdubxKbbXBhY2thZ2UgZHVlYm9vawoKaW1wb3J0ICJ0ZXN0aW5nIgoKY29uc3QgKAoJYWxpY2UgPSAiZzFhbGljZSIKCWJvYiAgID0gImcxYm9iIgopCgovLyBuZXdCb29rIGlzIHRoZSBkZWZhdWx0IGZpeHR1cmU6IGRlbGF5IGluIFsxMCwgMTAwMF0sIDggb3BlbiBzbG90cy4KZnVuYyBuZXdCb29rKHQgKnRlc3RpbmcuVCkgKkJvb2sgewoJdC5IZWxwZXIoKQoJYiwgZXJyIDo9IE5ldygxMCwgMTAwMCwgOCkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJOZXc6ICV2IiwgZXJyKQoJfQoJcmV0dXJuIGIKfQoKLy8gLS0tIGNvbnN0cnVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdE5ld1JlamVjdHNCYWRDb25maWcodCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgICAgICAgICAgICBzdHJpbmcKCQltaW4sIG1heCAgICAgICAgICAgIGludDY0CgkJbWF4T3BlbiAgICAgICAgICAgICBpbnQKCX17CgkJeyJuZWdhdGl2ZSBtaW4iLCAtMSwgMTAwLCA0fSwKCQl7Im1heCBiZWxvdyBtaW4iLCAxMDAsIDk5LCA0fSwKCQl7Inplcm8gbWF4T3BlbiIsIDAsIDEwMCwgMH0sCgkJeyJuZWdhdGl2ZSBtYXhPcGVuIiwgMCwgMTAwLCAtMX0sCgkJeyJtYXhPcGVuIG92ZXIgbGltaXQiLCAwLCAxMDAsIE1heE9wZW5MaW1pdCArIDF9LAoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgY2FzZXMgewoJCWlmIF8sIGVyciA6PSBOZXcoYy5taW4sIGMubWF4LCBjLm1heE9wZW4pOyBlcnIgIT0gRXJySW52YWxpZENvbmZpZyB7CgkJCXQuRXJyb3JmKCIlczogZ290ICV2LCB3YW50IEVyckludmFsaWRDb25maWciLCBjLm5hbWUsIGVycikKCQl9Cgl9Cn0KCmZ1bmMgVGVzdE5ld0FjY2VwdHNaZXJvTWluRGVsYXkodCAqdGVzdGluZy5UKSB7CgliLCBlcnIgOj0gTmV3KDAsIDAsIDEpCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiTmV3KDAsMCwxKTogJXYiLCBlcnIpCgl9CglpZCwgZXJyIDo9IGIuU2NoZWR1bGUoYWxpY2UsICIiLCAxMDAsIDAsIDApCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiU2NoZWR1bGU6ICV2IiwgZXJyKQoJfQoJLy8gbWluID09IG1heCA9PSAwIG1lYW5zIGR1ZSBpbW1lZGlhdGVseS4KCWlmIF8sIGVyciA6PSBiLkNsYWltKGlkLCAxMDApOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQ2xhaW0gYXQgZHVlIGluc3RhbnQ6ICV2IiwgZXJyKQoJfQp9CgovLyAtLS0gc2NoZWR1bGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0U2NoZWR1bGVDb21wdXRlc1dpbmRvdyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWQsIGVyciA6PSBiLlNjaGVkdWxlKGFsaWNlLCAicGF5bG9hZCIsIDEwMDAsIDUwLCAyMDApCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiU2NoZWR1bGU6ICV2IiwgZXJyKQoJfQoJZCwgb2sgOj0gYi5HZXQoaWQpCglpZiAhb2sgewoJCXQuRmF0YWwoIkdldDogbm90IGZvdW5kIikKCX0KCWlmIGQuQ3JlYXRlZEF0ICE9IDEwMDAgfHwgZC5EdWVBdCAhPSAxMDUwIHx8IGQuRXhwaXJlc0F0ICE9IDEyNTAgewoJCXQuRXJyb3JmKCJ3aW5kb3cgPSAoJWQsJWQsJWQpLCB3YW50ICgxMDAwLDEwNTAsMTI1MCkiLCBkLkNyZWF0ZWRBdCwgZC5EdWVBdCwgZC5FeHBpcmVzQXQpCgl9CglpZiBkLk93bmVyICE9IGFsaWNlIHx8IGQuUGF5bG9hZCAhPSAicGF5bG9hZCIgewoJCXQuRXJyb3JmKCJvd25lci9wYXlsb2FkID0gJXEvJXEiLCBkLk93bmVyLCBkLlBheWxvYWQpCgl9Cn0KCmZ1bmMgVGVzdFNjaGVkdWxlWmVyb1RUTE5ldmVyRXhwaXJlcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWQgOj0gYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgMCkKCWQsIF8gOj0gYi5HZXQoaWQpCglpZiBkLkV4cGlyZXNBdCAhPSAwIHsKCQl0LkZhdGFsZigiRXhwaXJlc0F0ID0gJWQsIHdhbnQgMCIsIGQuRXhwaXJlc0F0KQoJfQoJaWYgZC5Jc0V4cGlyZWQoMSA8PCA2MikgewoJCXQuRXJyb3IoInR0bD09MCBkZWZlcnJhbCByZXBvcnRlZCBleHBpcmVkIikKCX0KCS8vIFN0aWxsIGNsYWltYWJsZSBpbiB0aGUgZmFyIGZ1dHVyZS4KCWlmIF8sIGVyciA6PSBiLkNsYWltKGlkLCAxPDw2Mik7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJDbGFpbSBmYXIgZnV0dXJlOiAldiIsIGVycikKCX0KfQoKZnVuYyBUZXN0U2NoZWR1bGVWYWxpZGF0aW9uKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBuZXdCb29rKHQpCgliaWcgOj0gbWFrZShbXWJ5dGUsIE1heFBheWxvYWRMZW4rMSkKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgIHN0cmluZwoJCW93bmVyICAgc3RyaW5nCgkJcGF5bG9hZCBzdHJpbmcKCQlub3cgICAgIGludDY0CgkJZGVsYXkgICBpbnQ2NAoJCXR0bCAgICAgaW50NjQKCQl3YW50ICAgIGVycm9yCgl9ewoJCXsiZW1wdHkgb3duZXIiLCAiIiwgIiIsIDAsIDEwLCAwLCBFcnJFbXB0eU93bmVyfSwKCQl7InBheWxvYWQgdG9vIGJpZyIsIGFsaWNlLCBzdHJpbmcoYmlnKSwgMCwgMTAsIDAsIEVyclBheWxvYWRUb29CaWd9LAoJCXsibmVnYXRpdmUgbm93IiwgYWxpY2UsICIiLCAtMSwgMTAsIDAsIEVyckludmFsaWROb3d9LAoJCXsiZGVsYXkgYmVsb3cgbWluIiwgYWxpY2UsICIiLCAwLCA5LCAwLCBFcnJJbnZhbGlkRGVsYXl9LAoJCXsiZGVsYXkgYWJvdmUgbWF4IiwgYWxpY2UsICIiLCAwLCAxMDAxLCAwLCBFcnJJbnZhbGlkRGVsYXl9LAoJCXsibmVnYXRpdmUgZGVsYXkiLCBhbGljZSwgIiIsIDAsIC01LCAwLCBFcnJJbnZhbGlkRGVsYXl9LAoJCXsibmVnYXRpdmUgdHRsIiwgYWxpY2UsICIiLCAwLCAxMCwgLTEsIEVyckludmFsaWRUVEx9LAoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgY2FzZXMgewoJCWlmIF8sIGVyciA6PSBiLlNjaGVkdWxlKGMub3duZXIsIGMucGF5bG9hZCwgYy5ub3csIGMuZGVsYXksIGMudHRsKTsgZXJyICE9IGMud2FudCB7CgkJCXQuRXJyb3JmKCIlczogZ290ICV2LCB3YW50ICV2IiwgYy5uYW1lLCBlcnIsIGMud2FudCkKCQl9Cgl9CglpZiBiLk9wZW5Db3VudCgpICE9IDAgewoJCXQuRXJyb3JmKCJmYWlsZWQgU2NoZWR1bGVzIG11dGF0ZWQgdGhlIGJvb2s6IE9wZW5Db3VudCA9ICVkIiwgYi5PcGVuQ291bnQoKSkKCX0KCWlmIGIuTmV4dElEKCkgIT0gMSB7CgkJdC5FcnJvcmYoImZhaWxlZCBTY2hlZHVsZXMgY29uc3VtZWQgSURzOiBOZXh0SUQgPSAlZCIsIGIuTmV4dElEKCkpCgl9Cn0KCmZ1bmMgVGVzdFNjaGVkdWxlT3ZlcmZsb3dHdWFyZCh0ICp0ZXN0aW5nLlQpIHsKCWIsIGVyciA6PSBOZXcoMCwgMTw8NjIsIDQpCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiTmV3OiAldiIsIGVycikKCX0KCWNvbnN0IGh1Z2UgPSBpbnQ2NCgxPDw2MyAtIDEpCgkvLyBub3cgKyBkZWxheSBvdmVyZmxvd3MuCglpZiBfLCBlcnIgOj0gYi5TY2hlZHVsZShhbGljZSwgIiIsIGh1Z2UtMTAsIDE8PDYyLCAwKTsgZXJyICE9IEVyck92ZXJmbG93IHsKCQl0LkVycm9yZigiZHVlQXQgb3ZlcmZsb3c6IGdvdCAldiwgd2FudCBFcnJPdmVyZmxvdyIsIGVycikKCX0KCS8vIGR1ZUF0ICsgdHRsIG92ZXJmbG93cy4KCWlmIF8sIGVyciA6PSBiLlNjaGVkdWxlKGFsaWNlLCAiIiwgaHVnZS0xPDw2MiwgMTw8NjIsIGh1Z2UpOyBlcnIgIT0gRXJyT3ZlcmZsb3cgewoJCXQuRXJyb3JmKCJleHBpcmVzQXQgb3ZlcmZsb3c6IGdvdCAldiwgd2FudCBFcnJPdmVyZmxvdyIsIGVycikKCX0KCWlmIGIuT3BlbkNvdW50KCkgIT0gMCB7CgkJdC5FcnJvcmYoIm92ZXJmbG93IGxlZnQgc3RhdGUgYmVoaW5kOiBPcGVuQ291bnQgPSAlZCIsIGIuT3BlbkNvdW50KCkpCgl9Cn0KCmZ1bmMgVGVzdFNjaGVkdWxlUmVzcGVjdHNDYXAodCAqdGVzdGluZy5UKSB7CgliLCBfIDo9IE5ldygwLCAxMDAsIDIpCgliLk11c3RTY2hlZHVsZShhbGljZSwgIiIsIDAsIDEwLCAwKQoJYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgMCkKCWlmIF8sIGVyciA6PSBiLlNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDApOyBlcnIgIT0gRXJyQm9va0Z1bGwgewoJCXQuRmF0YWxmKCJ0aGlyZCBTY2hlZHVsZTogZ290ICV2LCB3YW50IEVyckJvb2tGdWxsIiwgZXJyKQoJfQoJLy8gQ29uc3VtaW5nIG9uZSBmcmVlcyBleGFjdGx5IG9uZSBzbG90LgoJYi5NdXN0Q2xhaW0oMSwgMTApCglpZiBfLCBlcnIgOj0gYi5TY2hlZHVsZShhbGljZSwgIiIsIDAsIDEwLCAwKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIlNjaGVkdWxlIGFmdGVyIENsYWltOiAldiIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLlNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDApOyBlcnIgIT0gRXJyQm9va0Z1bGwgewoJCXQuRmF0YWxmKCJjYXAgbm90IHJlLWFwcGxpZWQ6IGdvdCAldiwgd2FudCBFcnJCb29rRnVsbCIsIGVycikKCX0KfQoKLy8gLS0tIHRoZSBjZW50cmFsIGNsYWltOiBleGFjdGx5LW9uY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RDbGFpbVN1Y2NlZWRzRXhhY3RseU9uY2UodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWlkIDo9IGIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiZG8tdGhlLXRoaW5nIiwgMCwgMTAsIDApCgoJZCwgZXJyIDo9IGIuQ2xhaW0oaWQsIDEwKQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoImZpcnN0IENsYWltOiAldiIsIGVycikKCX0KCWlmIGQuUGF5bG9hZCAhPSAiZG8tdGhlLXRoaW5nIiB7CgkJdC5FcnJvcmYoInBheWxvYWQgPSAlcSIsIGQuUGF5bG9hZCkKCX0KCWZvciBpIDo9IDA7IGkgPCA1OyBpKysgewoJCWlmIF8sIGVyciA6PSBiLkNsYWltKGlkLCAxMCk7IGVyciAhPSBFcnJOb3RGb3VuZCB7CgkJCXQuRmF0YWxmKCJyZXBsYXkgJWQ6IGdvdCAldiwgd2FudCBFcnJOb3RGb3VuZCIsIGksIGVycikKCQl9Cgl9Cn0KCmZ1bmMgVGVzdElEc0FyZU5ldmVyUmV1c2VkKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBuZXdCb29rKHQpCglpZDEgOj0gYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgMCkKCWIuTXVzdENsYWltKGlkMSwgMTApCglpZiBiLk9wZW5Db3VudCgpICE9IDAgewoJCXQuRmF0YWxmKCJPcGVuQ291bnQgPSAlZCBhZnRlciBjbGFpbSIsIGIuT3BlbkNvdW50KCkpCgl9CgkvLyBUaGUgYm9vayBpcyBlbXB0eSBhZ2FpbiwgYnV0IHRoZSBuZXh0IElEIG11c3Qgc3RpbGwgbW92ZSBmb3J3YXJkLgoJaWQyIDo9IGIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDApCglpZiBpZDIgPT0gaWQxIHsKCQl0LkZhdGFsZigiSUQgJWQgcmV1c2VkIGFmdGVyIHRoZSBib29rIGVtcHRpZWQiLCBpZDIpCgl9CgkvLyBTbyB0aGUgb2xkIElEIHN0YXlzIHBlcm1hbmVudGx5IHVuY2xhaW1hYmxlLgoJaWYgXywgZXJyIDo9IGIuQ2xhaW0oaWQxLCAxMCk7IGVyciAhPSBFcnJOb3RGb3VuZCB7CgkJdC5FcnJvcmYoIm9sZCBJRCBjbGFpbWFibGUgYWdhaW46ICV2IiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RDb25zdW1lZEJ5QW55UGF0aFN0YXlzQ29uc3VtZWQodCAqdGVzdGluZy5UKSB7CgkvLyBFdmVyeSB0ZXJtaW5hbCBwYXRoIG11c3QgY2xvc2UgdGhlIElEIHRvIGFsbCB0aHJlZSB0cmFuc2l0aW9ucy4KCXBhdGhzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgIHN0cmluZwoJCWNvbnN1bWUgZnVuYyhiICpCb29rLCBpZCB1aW50NjQpCgl9ewoJCXsiY2xhaW0iLCBmdW5jKGIgKkJvb2ssIGlkIHVpbnQ2NCkgeyBiLk11c3RDbGFpbShpZCwgMTApIH19LAoJCXsiY2FuY2VsIiwgZnVuYyhiICpCb29rLCBpZCB1aW50NjQpIHsgYi5NdXN0Q2FuY2VsKGlkLCBhbGljZSkgfX0sCgkJeyJleHBpcmUiLCBmdW5jKGIgKkJvb2ssIGlkIHVpbnQ2NCkgeyBiLk11c3RFeHBpcmUoaWQsIDEwMCkgfX0sCgl9Cglmb3IgXywgcCA6PSByYW5nZSBwYXRocyB7CgkJYiA6PSBuZXdCb29rKHQpCgkJaWQgOj0gYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgNTApIC8vIGR1ZSAxMCwgZXhwaXJlcyA2MAoJCXAuY29uc3VtZShiLCBpZCkKCgkJaWYgXywgZXJyIDo9IGIuQ2xhaW0oaWQsIDEwKTsgZXJyICE9IEVyck5vdEZvdW5kIHsKCQkJdC5FcnJvcmYoIiVzIHRoZW4gQ2xhaW06IGdvdCAldiwgd2FudCBFcnJOb3RGb3VuZCIsIHAubmFtZSwgZXJyKQoJCX0KCQlpZiBfLCBlcnIgOj0gYi5DYW5jZWwoaWQsIGFsaWNlKTsgZXJyICE9IEVyck5vdEZvdW5kIHsKCQkJdC5FcnJvcmYoIiVzIHRoZW4gQ2FuY2VsOiBnb3QgJXYsIHdhbnQgRXJyTm90Rm91bmQiLCBwLm5hbWUsIGVycikKCQl9CgkJaWYgXywgZXJyIDo9IGIuRXhwaXJlKGlkLCAxMDApOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCQl0LkVycm9yZigiJXMgdGhlbiBFeHBpcmU6IGdvdCAldiwgd2FudCBFcnJOb3RGb3VuZCIsIHAubmFtZSwgZXJyKQoJCX0KCQlpZiBfLCBvayA6PSBiLkdldChpZCk7IG9rIHsKCQkJdC5FcnJvcmYoIiVzOiBkZWZlcnJhbCBzdGlsbCB2aXNpYmxlIiwgcC5uYW1lKQoJCX0KCX0KfQoKLy8gLS0tIHRoZSBjbGFpbSB3aW5kb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdENsYWltV2luZG93SXNIYWxmT3Blbih0ICp0ZXN0aW5nLlQpIHsKCS8vIFNjaGVkdWxlIGF0IDAsIGRlbGF5IDEwLCB0dGwgNSA9PiBjbGFpbWFibGUgb24gWzEwLCAxNSkuCgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbm93ICBpbnQ2NAoJCXdhbnQgZXJyb3IKCX17CgkJezAsIEVyck5vdER1ZX0sCgkJezksIEVyck5vdER1ZX0sCgkJezEwLCBuaWx9LCAvLyBkdWUgaW5zdGFudCBpcyBjbGFpbWFibGUKCQl7MTQsIG5pbH0sCgkJezE1LCBFcnJFeHBpcmVkfSwgLy8gZXhwaXJ5IGluc3RhbnQgaXMgTk9UIGNsYWltYWJsZQoJCXsxNiwgRXJyRXhwaXJlZH0sCgl9Cglmb3IgXywgYyA6PSByYW5nZSBjYXNlcyB7CgkJYiA6PSBuZXdCb29rKHQpCgkJaWQgOj0gYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgNSkKCQlfLCBlcnIgOj0gYi5DbGFpbShpZCwgYy5ub3cpCgkJaWYgZXJyICE9IGMud2FudCB7CgkJCXQuRXJyb3JmKCJDbGFpbSBhdCBub3c9JWQ6IGdvdCAldiwgd2FudCAldiIsIGMubm93LCBlcnIsIGMud2FudCkKCQl9CgkJLy8gQSByZWZ1c2VkIENsYWltIG11c3Qgbm90IGNvbnN1bWUgdGhlIGRlZmVycmFsLgoJCWlmIGMud2FudCAhPSBuaWwgewoJCQlpZiBfLCBvayA6PSBiLkdldChpZCk7ICFvayB7CgkJCQl0LkVycm9yZigicmVmdXNlZCBDbGFpbSBhdCBub3c9JWQgY29uc3VtZWQgdGhlIGRlZmVycmFsIiwgYy5ub3cpCgkJCX0KCQl9Cgl9Cn0KCmZ1bmMgVGVzdENsYWltUmVqZWN0c05lZ2F0aXZlTm93KHQgKnRlc3RpbmcuVCkgewoJYiA6PSBuZXdCb29rKHQpCglpZCA6PSBiLk11c3RTY2hlZHVsZShhbGljZSwgIiIsIDAsIDEwLCAwKQoJaWYgXywgZXJyIDo9IGIuQ2xhaW0oaWQsIC0xKTsgZXJyICE9IEVyckludmFsaWROb3cgewoJCXQuRmF0YWxmKCJnb3QgJXYsIHdhbnQgRXJySW52YWxpZE5vdyIsIGVycikKCX0KCWlmIF8sIG9rIDo9IGIuR2V0KGlkKTsgIW9rIHsKCQl0LkVycm9yKCJuZWdhdGl2ZSBub3cgY29uc3VtZWQgdGhlIGRlZmVycmFsIikKCX0KfQoKZnVuYyBUZXN0Q2xhaW1Vbmtub3duSUQodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWlmIF8sIGVyciA6PSBiLkNsYWltKDk5OSwgMTApOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCXQuRmF0YWxmKCJnb3QgJXYsIHdhbnQgRXJyTm90Rm91bmQiLCBlcnIpCgl9Cn0KCi8vIC0tLSBjYW5jZWxsYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RDYW5jZWxPd25lck9ubHkodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWlkIDo9IGIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDApCgoJaWYgXywgZXJyIDo9IGIuQ2FuY2VsKGlkLCBib2IpOyBlcnIgIT0gRXJyTm90T3duZXIgewoJCXQuRmF0YWxmKCJib2IgY2FuY2VsbGluZyBhbGljZSdzIGRlZmVycmFsOiBnb3QgJXYsIHdhbnQgRXJyTm90T3duZXIiLCBlcnIpCgl9CglpZiBfLCBvayA6PSBiLkdldChpZCk7ICFvayB7CgkJdC5GYXRhbCgicmVmdXNlZCBDYW5jZWwgY29uc3VtZWQgdGhlIGRlZmVycmFsIikKCX0KCWlmIF8sIGVyciA6PSBiLkNhbmNlbChpZCwgIiIpOyBlcnIgIT0gRXJyRW1wdHlPd25lciB7CgkJdC5FcnJvcmYoImVtcHR5IG93bmVyOiBnb3QgJXYsIHdhbnQgRXJyRW1wdHlPd25lciIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLkNhbmNlbChpZCwgYWxpY2UpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigib3duZXIgY2FuY2VsOiAldiIsIGVycikKCX0KfQoKZnVuYyBUZXN0Q2FuY2VsV29ya3NBZnRlckR1ZSh0ICp0ZXN0aW5nLlQpIHsKCS8vIENhbmNlbGxhdGlvbiBpcyBhbGxvd2VkIHdoaWxlIE9QRU4sIG5vdCBvbmx5IHdoaWxlIHBlbmRpbmcg4oCUIGFuIG93bmVyCgkvLyBjYW4gc3RpbGwgcHVsbCBhIGRlZmVycmFsIGJhY2sgYWZ0ZXIgaXQgYmVjYW1lIGNsYWltYWJsZSwgYXMgbG9uZyBhcwoJLy8gbm9ib2R5IGNsYWltZWQgaXQgZmlyc3QuCgliIDo9IG5ld0Jvb2sodCkKCWlkIDo9IGIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDApCglpZiBfLCBlcnIgOj0gYi5DYW5jZWwoaWQsIGFsaWNlKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoImNhbmNlbCBhZnRlciBkdWU6ICV2IiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RDYW5jZWxMb3Nlc1JhY2VUb0NsYWltKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBuZXdCb29rKHQpCglpZCA6PSBiLk11c3RTY2hlZHVsZShhbGljZSwgIiIsIDAsIDEwLCAwKQoJYi5NdXN0Q2xhaW0oaWQsIDEwKQoJaWYgXywgZXJyIDo9IGIuQ2FuY2VsKGlkLCBhbGljZSk7IGVyciAhPSBFcnJOb3RGb3VuZCB7CgkJdC5GYXRhbGYoImNhbmNlbCBhZnRlciBjbGFpbTogZ290ICV2LCB3YW50IEVyck5vdEZvdW5kIiwgZXJyKQoJfQp9CgovLyAtLS0gZXhwaXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0RXhwaXJlUmVxdWlyZXNFeHBpcnkodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCS8vIE5vdCB5ZXQgZXhwaXJlZC4KCWlkIDo9IGIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDUpIC8vIGV4cGlyZXMgMTUKCWlmIF8sIGVyciA6PSBiLkV4cGlyZShpZCwgMTQpOyBlcnIgIT0gRXJyTm90RXhwaXJlZCB7CgkJdC5FcnJvcmYoImF0IDE0OiBnb3QgJXYsIHdhbnQgRXJyTm90RXhwaXJlZCIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLkV4cGlyZShpZCwgMTUpOyBlcnIgIT0gbmlsIHsKCQl0LkVycm9yZigiYXQgMTU6ICV2IiwgZXJyKQoJfQoKCS8vIHR0bCA9PSAwIGNhbiBuZXZlciBiZSBleHBpcmVkIGF3YXkuCgluZXZlciA6PSBiLk11c3RTY2hlZHVsZShhbGljZSwgIiIsIDAsIDEwLCAwKQoJaWYgXywgZXJyIDo9IGIuRXhwaXJlKG5ldmVyLCAxPDw2Mik7IGVyciAhPSBFcnJOb3RFeHBpcmVkIHsKCQl0LkVycm9yZigibm8tZXhwaXJ5IGRlZmVycmFsOiBnb3QgJXYsIHdhbnQgRXJyTm90RXhwaXJlZCIsIGVycikKCX0KfQoKZnVuYyBUZXN0RXhwaXJlSXNQZXJtaXNzaW9ubGVzcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWQgOj0gYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgNSkKCS8vIE5vIG93bmVyIGFyZ3VtZW50IGF0IGFsbCDigJQgYW55b25lIG1heSBjbGVhciBhIGRlYWQgZW50cnkuCglpZiBfLCBlcnIgOj0gYi5FeHBpcmUoaWQsIDIwKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkV4cGlyZTogJXYiLCBlcnIpCgl9Cn0KCmZ1bmMgVGVzdEV4cGlyZWREZWZlcnJhbENhbm5vdEJlQ2xhaW1lZE9yR3JpZWZUaGVDYXAodCAqdGVzdGluZy5UKSB7CgliLCBfIDo9IE5ldygwLCAxMDAsIDEpCglpZCA6PSBiLk11c3RTY2hlZHVsZShhbGljZSwgIiIsIDAsIDEwLCA1KSAvLyBleHBpcmVzIDE1CgkvLyBDYXAgaXMgZnVsbCBhbmQgdGhlIGVudHJ5IGlzIGRlYWQuCglpZiBfLCBlcnIgOj0gYi5TY2hlZHVsZShib2IsICIiLCAyMCwgMTAsIDApOyBlcnIgIT0gRXJyQm9va0Z1bGwgewoJCXQuRmF0YWxmKCJnb3QgJXYsIHdhbnQgRXJyQm9va0Z1bGwiLCBlcnIpCgl9CglpZiBfLCBlcnIgOj0gYi5DbGFpbShpZCwgMjApOyBlcnIgIT0gRXJyRXhwaXJlZCB7CgkJdC5GYXRhbGYoImdvdCAldiwgd2FudCBFcnJFeHBpcmVkIiwgZXJyKQoJfQoJLy8gQW55b25lIGNhbiB1bnN0aWNrIGl0LgoJYi5NdXN0RXhwaXJlKGlkLCAyMCkKCWlmIF8sIGVyciA6PSBiLlNjaGVkdWxlKGJvYiwgIiIsIDIwLCAxMCwgMCk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJTY2hlZHVsZSBhZnRlciBFeHBpcmU6ICV2IiwgZXJyKQoJfQp9CgovLyAtLS0gcXVlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0RHVlUmV0dXJuc09ubHlDbGFpbWFibGVJbklET3JkZXIodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiYSIsIDAsIDEwLCAwKSAgLy8gMTogZHVlIDEwCgliLk11c3RTY2hlZHVsZShhbGljZSwgImIiLCAwLCA1MDAsIDApIC8vIDI6IGR1ZSA1MDAsIG5vdCB5ZXQKCWIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiYyIsIDAsIDEwLCA1KSAgLy8gMzogZHVlIDEwLCBleHBpcmVkIGF0IDE1CgliLk11c3RTY2hlZHVsZShhbGljZSwgImQiLCAwLCAyMCwgMCkgIC8vIDQ6IGR1ZSAyMAoKCWdvdCA6PSBiLkR1ZSgyMCwgMTApCglpZiBsZW4oZ290KSAhPSAyIHsKCQl0LkZhdGFsZigiRHVlIHJldHVybmVkICVkIGVudHJpZXMsIHdhbnQgMiIsIGxlbihnb3QpKQoJfQoJaWYgZ290WzBdLklEICE9IDEgfHwgZ290WzFdLklEICE9IDQgewoJCXQuRXJyb3JmKCJJRHMgPSAlZCwlZDsgd2FudCAxLDQiLCBnb3RbMF0uSUQsIGdvdFsxXS5JRCkKCX0KfQoKZnVuYyBUZXN0RHVlUmVzcGVjdHNMaW1pdCh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJZm9yIGkgOj0gMDsgaSA8IDU7IGkrKyB7CgkJYi5NdXN0U2NoZWR1bGUoYWxpY2UsICIiLCAwLCAxMCwgMCkKCX0KCWlmIGdvdCA6PSBiLkR1ZSgxMCwgMik7IGxlbihnb3QpICE9IDIgewoJCXQuRXJyb3JmKCJsaW1pdCAyIHJldHVybmVkICVkIiwgbGVuKGdvdCkpCgl9CglpZiBnb3QgOj0gYi5EdWUoMTAsIDApOyBsZW4oZ290KSAhPSAwIHsKCQl0LkVycm9yZigibGltaXQgMCByZXR1cm5lZCAlZCIsIGxlbihnb3QpKQoJfQoJaWYgZ290IDo9IGIuRHVlKDEwLCAtMSk7IGxlbihnb3QpICE9IDAgewoJCXQuRXJyb3JmKCJsaW1pdCAtMSByZXR1cm5lZCAlZCIsIGxlbihnb3QpKQoJfQp9CgpmdW5jIFRlc3RFeHBpcmFibGUodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDUpIC8vIDE6IGV4cGlyZXMgMTUKCWIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDApIC8vIDI6IG5ldmVyIGV4cGlyZXMKCWIuTXVzdFNjaGVkdWxlKGFsaWNlLCAiIiwgMCwgMTAsIDUpIC8vIDM6IGV4cGlyZXMgMTUKCglnb3QgOj0gYi5FeHBpcmFibGUoMTUsIDEwKQoJaWYgbGVuKGdvdCkgIT0gMiB8fCBnb3RbMF0uSUQgIT0gMSB8fCBnb3RbMV0uSUQgIT0gMyB7CgkJdC5GYXRhbGYoIkV4cGlyYWJsZSA9ICV2IiwgZ290KQoJfQoJaWYgbGVuKGIuRXhwaXJhYmxlKDE0LCAxMCkpICE9IDAgewoJCXQuRXJyb3IoIkV4cGlyYWJsZSBiZWZvcmUgZXhwaXJ5IHJldHVybmVkIGVudHJpZXMiKQoJfQp9CgpmdW5jIFRlc3RJdGVyYXRlT3BlbklzSURPcmRlcmVkKHQgKnRlc3RpbmcuVCkgewoJYiwgXyA6PSBOZXcoMCwgMTAwLCAzMikKCS8vIFNjaGVkdWxlIGVub3VnaCB0byBjcm9zcyB0aGUgMS0+MiBkaWdpdCBib3VuZGFyeSwgd2hlcmUgbmFpdmUgc3RyaW5nCgkvLyBrZXlzIHdvdWxkIG9yZGVyICIxMCIgYmVmb3JlICI5Ii4KCWZvciBpIDo9IDA7IGkgPCAxMjsgaSsrIHsKCQliLk11c3RTY2hlZHVsZShhbGljZSwgIiIsIDAsIDEsIDApCgl9CglwcmV2IDo9IHVpbnQ2NCgwKQoJbiA6PSAwCgliLkl0ZXJhdGVPcGVuKGZ1bmMoZCBEZWZlcnJhbCkgYm9vbCB7CgkJaWYgZC5JRCA8PSBwcmV2IHsKCQkJdC5GYXRhbGYoIm91dCBvZiBvcmRlcjogJWQgYWZ0ZXIgJWQiLCBkLklELCBwcmV2KQoJCX0KCQlwcmV2ID0gZC5JRAoJCW4rKwoJCXJldHVybiBmYWxzZQoJfSkKCWlmIG4gIT0gMTIgewoJCXQuRXJyb3JmKCJpdGVyYXRlZCAlZCwgd2FudCAxMiIsIG4pCgl9Cn0KCmZ1bmMgVGVzdEdldFJldHVybnNBQ29weSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWQgOj0gYi5NdXN0U2NoZWR1bGUoYWxpY2UsICJvcmlnaW5hbCIsIDAsIDEwLCAwKQoJZCwgXyA6PSBiLkdldChpZCkKCWQuUGF5bG9hZCA9ICJ0YW1wZXJlZCIKCWQuT3duZXIgPSBib2IKCglhZ2FpbiwgXyA6PSBiLkdldChpZCkKCWlmIGFnYWluLlBheWxvYWQgIT0gIm9yaWdpbmFsIiB8fCBhZ2Fpbi5Pd25lciAhPSBhbGljZSB7CgkJdC5GYXRhbGYoIm11dGF0aW5nIGEgcmV0dXJuZWQgRGVmZXJyYWwgY2hhbmdlZCB0aGUgYm9vazogJSt2IiwgYWdhaW4pCgl9Cn0KCi8vIC0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RJREtleU9yZGVyaW5nKHQgKnRlc3RpbmcuVCkgewoJaWYgaWRLZXkoOSkgPj0gaWRLZXkoMTApIHsKCQl0LkVycm9yZigiaWRLZXkoOSk9JXEgbm90IDwgaWRLZXkoMTApPSVxIiwgaWRLZXkoOSksIGlkS2V5KDEwKSkKCX0KCWlmIGxlbihpZEtleSgxKSkgIT0gMjAgewoJCXQuRXJyb3JmKCJpZEtleSgxKSB3aWR0aCA9ICVkLCB3YW50IDIwIiwgbGVuKGlkS2V5KDEpKSkKCX0KCS8vIExhcmdlc3QgdWludDY0IGlzIGV4YWN0bHkgMjAgZGlnaXRzIGFuZCBtdXN0IG5vdCBiZSB0cnVuY2F0ZWQuCgljb25zdCBtYXhVNjQgPSBedWludDY0KDApCglpZiBnb3QgOj0gaWRLZXkobWF4VTY0KTsgZ290ICE9ICIxODQ0Njc0NDA3MzcwOTU1MTYxNSIgewoJCXQuRXJyb3JmKCJpZEtleShtYXgpID0gJXEiLCBnb3QpCgl9CglpZiBpZEtleShtYXhVNjQtMSkgPj0gaWRLZXkobWF4VTY0KSB7CgkJdC5FcnJvcigib3JkZXJpbmcgYnJlYWtzIGF0IHRoZSB0b3Agb2YgdGhlIHJhbmdlIikKCX0KfQoKZnVuYyBUZXN0Q2hlY2tlZEFkZCh0ICp0ZXN0aW5nLlQpIHsKCWNvbnN0IG1heCA9IGludDY0KDE8PDYzIC0gMSkKCWNvbnN0IG1pbiA9IGludDY0KC0xIDw8IDYzKQoJaWYgXywgb2sgOj0gY2hlY2tlZEFkZChtYXgsIDEpOyBvayB7CgkJdC5FcnJvcigibWF4KzEgcmVwb3J0ZWQgb2siKQoJfQoJaWYgXywgb2sgOj0gY2hlY2tlZEFkZChtaW4sIC0xKTsgb2sgewoJCXQuRXJyb3IoIm1pbi0xIHJlcG9ydGVkIG9rIikKCX0KCWlmIHYsIG9rIDo9IGNoZWNrZWRBZGQoNSwgNyk7ICFvayB8fCB2ICE9IDEyIHsKCQl0LkVycm9yZigiNSs3ID0gJWQsJXYiLCB2LCBvaykKCX0KfQoKZnVuYyBUZXN0RGVmZXJyYWxQcmVkaWNhdGVzKHQgKnRlc3RpbmcuVCkgewoJZCA6PSBEZWZlcnJhbHtEdWVBdDogMTAsIEV4cGlyZXNBdDogMjB9CglpZiBkLklzRHVlKDkpIHx8ICFkLklzRHVlKDEwKSB7CgkJdC5FcnJvcigiSXNEdWUgYm91bmRhcnkiKQoJfQoJaWYgZC5Jc0V4cGlyZWQoMTkpIHx8ICFkLklzRXhwaXJlZCgyMCkgewoJCXQuRXJyb3IoIklzRXhwaXJlZCBib3VuZGFyeSIpCgl9CglpZiBkLklzQ2xhaW1hYmxlKDkpIHx8ICFkLklzQ2xhaW1hYmxlKDEwKSB8fCAhZC5Jc0NsYWltYWJsZSgxOSkgfHwgZC5Jc0NsYWltYWJsZSgyMCkgewoJCXQuRXJyb3IoIklzQ2xhaW1hYmxlIHdpbmRvdyIpCgl9Cn0KGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2R1ZWJvb2siCmdubyA9ICIwLjkiCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTAwMDAwMDB1Z25vdBITCICI3r4BEgsyMDAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQI+F/3SD44LzJd5QXHh1vF/QcCo6KniXCcPaMD4J5RVpxJAn/IBdX+Vnu2vq+86LRSMlYsYG4gwb7kMly+61/Ca2cMiNe1dlF/AOI41H0+6r4GTz+cLjIcz74IaY3BW2yEgehooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data