Transaction executed successfully

Transaction Details

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

Transaction hash
5F5C7EFCD265D417098F8A713EDEF794CCEBC06D9ED53FB0C2ACBF8F7E14FEE3

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
128,000,000
Requested gas limit
GAS USED
85,219,496
Gas consumed
FEE
128000ugnot
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

CsD8AwoML3ZtLm1fYWRkcGtnEq78AwooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLx+wMKCWNyb3dkZnVuZBI9Z25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2Nyb3dkZnVuZBrRoAIKDWNyb3dkZnVuZC5nbm8SvqACLy8gUmVhbG0gY3Jvd2RmdW5kIGlzIHBlcm1pc3Npb25sZXNzIGFsbC1vci1ub3RoaW5nIGNyb3dkZnVuZGluZyBpbiBHTk9UOgovLyBhIGNyZWF0b3Igb3BlbnMgYSBjYW1wYWlnbiB3aXRoIGEgZnVuZGluZyBnb2FsIGFuZCBhIGJsb2NrIGRlYWRsaW5lLAovLyBiYWNrZXJzIHBsZWRnZSByZWFsIGNvaW5zIHRoYXQgdGhlIHJlYWxtIGhvbGRzLCBhbmQgc2V0dGxlbWVudCBpcwovLyBjb25kaXRpb25hbCDigJQgaWYgdGhlIGdvYWwgaXMgcmVhY2hlZCBieSB0aGUgZGVhZGxpbmUgdGhlIGNyZWF0b3IgbWF5Ci8vIGNvbGxlY3QgdGhlIHBvdCAobWludXMgYSBib3VuZGVkIHN1Y2Nlc3MgZmVlKSwgYW5kIGlmIGl0IGlzIG5vdCwgZXZlcnkKLy8gYmFja2VyIHJlY2xhaW1zIGV4YWN0bHkgd2hhdCB0aGV5IHBsZWRnZWQsIGZlZS1mcmVlLgovLwovLyBXSFkgVEhJUyBFWElTVFMgKHNlZSBESVNDT1ZFUlkubWQpOiBhdCB0aGUgaGVpZ2h0cyByZWNvcmRlZCB0aGVyZSwKLy8gbm90aGluZyBvbiBvbnl4LTEgaG9sZHMgYmFja2VyIGNvaW5zIGFnYWluc3QgYSBnb2FsLWFuZC1kZWFkbGluZQovLyBjb25kaXRpb24gYXQgYWxsLCBhbmQgdGhlIG9uZSBsaXZlIGNyb3dkZnVuZGluZyByZWFsbSBpbiB0aGUgd2lkZXIKLy8gZWNvc3lzdGVtIChtYWlubmV0IHIvbW91bC94L2RhaWx5L2Nyb3dkZnVuZCwgcmVhZCBpbiBmdWxsKSBpcwovLyBleHBsaWNpdGx5IGFjY291bnRpbmctb25seSDigJQgaXRzIG93biBkb2Mgc2F5cyAiTm8gcmVhbCBjb2luIG1vdmVzIi4KLy8gVGhlIG9uZSByZWFsLWNvaW4gaW1wbGVtZW50YXRpb24gZm91bmQgYW55d2hlcmUgcmFuIG9uIHJldGlyZWQgcGVhcmwtMQovLyB1bmRlciBhIHRoaXJkLXBhcnR5IG5hbWVzcGFjZSBhbmQgaXMgdW5yZWFjaGFibGUuIFRoaXMgcmVhbG0ncyBkZWx0YQovLyBpcyBzdGF0ZWQgYXQgdGhhdCBzaXplIGFuZCBubyBsYXJnZXI6IGl0IGlzIHRoZSBhc3N1cmFuY2UtY29udHJhY3QKLy8gbWVjaGFuaWMg4oCUIGNvbmRpdGlvbmFsIGN1c3RvZHkgd2l0aCBhIGZlZS1mcmVlIHJlZnVuZCBwYXRoIOKAlCBkb25lIHdpdGgKLy8gdGhpcyBwb3J0Zm9saW8ncyBsaXZlLXZhbGlkYXRlZCBjdXN0b2R5IGRpc2NpcGxpbmUsIG5vdCBhIG5ldyBpZGVhLgovLwovLyBDT01QT1NJVElPTjogY29pbiBtb3ZlbWVudCBpcyBkZWxlZ2F0ZWQgdG8gY29pbmlvLCBmZWUgYXJpdGhtZXRpYyBhbmQKLy8gdGhlIGZlZSBwb3QgdG8gZmVlbGVkZ2VyLCBzZXR0bGVtZW50IHRpbWluZyBhbmQgZXhhY3RseS1vbmNlCi8vIGF1dGhvcml6YXRpb24gdG8gZHVlYm9vaywgb3JkZXJlZCBzdG9yYWdlIHRvIHAvbnQvYXZsL3YwLCBhbmQKLy8gZnJlZS10ZXh0IHJlbmRlciBvdXRwdXQgdG8gdGhlIGVjb3N5c3RlbSBzYW5pdGl6ZXIKLy8gcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MC4gVGhpcyByZWFsbSBvd25zIG9ubHkgdGhlIGNhbXBhaWduIHN0YXRlCi8vIG1hY2hpbmUgYW5kIHRoZSBjb25zZXJ2YXRpb24gYm9va2tlZXBpbmcuCi8vCi8vIFRIRSBTRVRUTEVNRU5UIElTIE9ORSBERUZFUlJBTC4gTGF1bmNoIHNjaGVkdWxlcyBleGFjdGx5IG9uZSBkdWVib29rCi8vIGRlZmVycmFsIHBlciBjYW1wYWlnbiDigJQgb3duZXI6IHRoZSBjcmVhdG9yLCBkdWU6IHRoZSBkZWFkbGluZSwgZXhwaXJ5OgovLyB0aGUgZW5kIG9mIHRoZSBjbGFpbSB3aW5kb3cg4oCUIGFuZCBldmVyeSB0ZXJtaW5hbCB0cmFuc2l0aW9uIGlzIG9uZSBvZgovLyB0aGUgd2F5cyB0aGF0IGRlZmVycmFsIGNhbiBiZSBjb25zdW1lZDoKLy8KLy8JQ3JlYXRvckNsYWltICAtPiBib29rLkNsYWltICAgKGR1ZSwgZ29hbCBtZXQsIGNyZWF0b3IgY29sbGVjdHMpCi8vCVNldHRsZUZhaWxlZCAgLT4gYm9vay5DbGFpbSAgIChkdWUsIGdvYWwgVU5NRVQsIGFueW9uZTsgZHVlYm9vawovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmVzIGNsYWltIHBvbGljeSB0byBpdHMgY29uc3VtZXIpCi8vCUNyZWF0b3JDYW5jZWwgLT4gYm9vay5DYW5jZWwgIChvd25lciByZW5vdW5jZXMsIGFueSB0aW1lIHdoaWxlIG9wZW4pCi8vCUxhcHNlICAgICAgICAgLT4gYm9vay5FeHBpcmUgIChhbnlvbmUsIG9uY2UgdGhlIGNsYWltIHdpbmRvdyBpcyBvdmVyKQovLwovLyBCZWNhdXNlIGR1ZWJvb2sgY29uc3VtZXMgYSBkZWZlcnJhbCBiZWZvcmUgcmV0dXJuaW5nIGFuZCBuZXZlciByZXVzZXMKLy8gYW4gSUQsIGEgY2FtcGFpZ24gY2FuIHNldHRsZSBBVCBNT1NUIE9OQ0UsIHN0cnVjdHVyYWxseSDigJQgZG91YmxlLWNsYWltCi8vIGlzIG5vdCBndWFyZGVkIGFnYWluc3QsIGl0IGlzIHVucmVwcmVzZW50YWJsZS4gVGhlIGJvb2sncyBvcGVuLQovLyBkZWZlcnJhbCBjYXAgaXMgbGlrZXdpc2UgdGhpcyByZWFsbSdzIGNhcCBvbiBvcGVuIGNhbXBhaWducy4KLy8KLy8gTElGRUNZQ0xFIChzdG9yZWQgc3RhdGUgaW4gYnJhY2tldHM7ICJzdWNjZWVkZWQiLyJmYWlsZWQiIGFyZSBkZXJpdmVkCi8vIHZpZXdzIG9mIGFuIG9wZW4gY2FtcGFpZ24gYWZ0ZXIgaXRzIGRlYWRsaW5lLCBub3Qgc3RvcmVkIHN0YXRlcyk6Ci8vCi8vCUxhdW5jaCAoYW55b25lKSAgICAgICAgICA6IG9wZW5zIFtmdW5kaW5nXTsgc2NoZWR1bGVzIHRoZSBkZWZlcnJhbC4KLy8JUGxlZGdlIChiYWNrZXIsICtzZW5kKSAgIDogd2hpbGUgaGVpZ2h0IDwgZGVhZGxpbmUuIFJlYWwgY29pbnMuCi8vCVVucGxlZGdlIChiYWNrZXIpICAgICAgICA6IGZ1bGwgb3duIHBsZWRnZSBiYWNrLCB3aGlsZSBoZWlnaHQgPAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFkbGluZS4gQWxsLW9yLW5vdGhpbmcgaG9sZHM6IG5vdGhpbmcKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbG9ja2VkIHVudGlsIHRoZSBkZWFkbGluZSBwYXNzZXMuCi8vCUNyZWF0b3JDbGFpbSAoY3JlYXRvcikgICA6IGhlaWdodCBpbiBbZGVhZGxpbmUsIGNsYWltRGVhZGxpbmUpLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZWQgPj0gZ29hbCAtPiBbcGFpZF0uIFBheXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VkIC0gZmVlIHRvIHRoZSBjcmVhdG9yLCBhY2NydWVzIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWUuIFRoZSBPTkxZIHRyYW5zaXRpb24gdGhhdCBjaGFyZ2VzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueXRoaW5nLgovLwlTZXR0bGVGYWlsZWQgKEFOWU9ORSkgICAgOiBoZWlnaHQgPj0gZGVhZGxpbmUsIHJhaXNlZCA8IGdvYWwgLT4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZhaWxlZF0uIE1ha2VzIHRoZSBmYWlsdXJlIHRlcm1pbmFsIGFuZAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlcyB0aGUgY2FtcGFpZ24ncyBzbG90cyBpbW1lZGlhdGVseTsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmdW5kcyB3ZXJlIGFscmVhZHkgb3BlbiBvbiB0aGlzIHBhdGguCi8vCUNyZWF0b3JDYW5jZWwgKGNyZWF0b3IpICA6IHdoaWxlIHRoZSBkZWZlcnJhbCBpcyBvcGVuIC0+IFtjYW5jZWxsZWRdLgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZ1bmRzIG9wZW4uIEEgY3JlYXRvciB3aG8gY2FuY2VscyBhZnRlcgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZWVkaW5nIGlzIHJlbm91bmNpbmcgdGhlIHBvdC4KLy8JTGFwc2UgKEFOWU9ORSkgICAgICAgICAgIDogaGVpZ2h0ID49IGNsYWltRGVhZGxpbmUgLT4gW2xhcHNlZF0uCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnVuZHMgb3Blbi4gVGhlIHBlcm1pc3Npb25sZXNzIHZhbHZlOiBhCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3Igd2hvIG5ldmVyIGNvbGxlY3RzIGNhbm5vdCBzdHJhbmQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VyIG1vbmV5LCBhbmQgYSBkZWFkIGNhbXBhaWduIGNhbm5vdAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkIGl0cyBkdWVib29rIHNsb3QgZm9yZXZlci4KLy8JUmVmdW5kIChiYWNrZXIpICAgICAgICAgIDogb3duIHBsZWRnZSBiYWNrLCBmZWUtZnJlZSwgd2hlbmV2ZXIgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduIGlzIFtjYW5jZWxsZWRdLCBbbGFwc2VkXSwgb3Igb3BlbgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0IGl0cyBkZWFkbGluZSB3aXRoIHJhaXNlZCA8IGdvYWwuCi8vCVBydW5lIChBTllPTkUpICAgICAgICAgICA6IHJlbW92ZXMgYSBzZXR0bGVkLCBmdWxseS1kcmFpbmVkIGNhbXBhaWduCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC4gVGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCBpcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZCBieSB0aGUgY2hhaW4gdG8gdGhlIENBTExFUiwgd2hpY2gKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIGluY2VudGl2ZSB0byBjYWxsIGl0LgovLwlXaXRoZHJhd0ZlZXMgKEFOWU9ORSkgICAgOiBwYXlzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUtdGltZSBGZWVDb2xsZWN0b3IuIFBlcm1pc3Npb25sZXNzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIGRlc3RpbmF0aW9uIGlzIGZpeGVkLgovLwlTd2VlcFN1cnBsdXMgKEFOWU9ORSkgICAgOiBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgRmVlQ29sbGVjdG9yLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXZlciB0b3VjaGluZyB0cmFja2VkIGxpYWJpbGl0aWVzLgovLwovLyBSRUZVTkRTIE5FVkVSIFJBQ0UgVEhFIENMQUlNOiB3aGlsZSBhIHN1Y2NlZWRlZCBjYW1wYWlnbiBpcyBpbnNpZGUgaXRzCi8vIGNsYWltIHdpbmRvdywgUmVmdW5kIHJlZnVzZXMg4oCUIHRoZSBwb3QgaXMgdGhlIGNyZWF0b3IncyB0byBjb2xsZWN0LgovLyBUaGUgbW9tZW50IHRoZSB3aW5kb3cgZW5kcyAoTGFwc2UpIG9yIHRoZSBjcmVhdG9yIHJlbm91bmNlcyAoQ2FuY2VsKSwKLy8gYW5kIGF0IGFueSB0aW1lIGFmdGVyIGEgZmFpbGVkIGRlYWRsaW5lLCBSZWZ1bmQgcGF5cyBlYWNoIGJhY2tlcgovLyBleGFjdGx5IHRoZWlyIHBsZWRnZS4gVGhlcmUgaXMgbm8gcGFydGlhbCBvdXRjb21lIGFuZCBubyBmZWUgb24gYW55Ci8vIHJlZnVuZCBwYXRoLCBzbyBhIGJhY2tlcidzIHdvcnN0IGNhc2UgaXMgdGhlaXIgbW9uZXkgYmFjay4KLy8KLy8gVEhFIEZFRSwgcHJlY2lzZWx5OiBmZWVCcHMgaXMgc25hcHNob3R0ZWQgYXQgTGF1bmNoIGZyb20gdGhlCi8vIGNvbXBpbGUtdGltZSBTdWNjZXNzRmVlQnBzLCBzbyBhIGNhbXBhaWduJ3MgdGVybXMgYXJlIGZpeGVkIHdoZW4gaXQgaXMKLy8gY3JlYXRlZCBhbmQgdmlzaWJsZSBpbiBDYW1wYWlnbkluZm8gZnJvbSB0aGF0IG1vbWVudC4gVGhlIGZlZSBpcwovLyBjaGFyZ2VkIE9OQ0UsIGF0IENyZWF0b3JDbGFpbSwgb24gdGhlIHJhaXNlZCBhbW91bnQsIHdpdGggZmVlbGVkZ2VyJ3MKLy8gZmxvb3Igcm91bmRpbmcgKHJvdW5kaW5nIGZhdm9ycyB0aGUgY3JlYXRvcikuIFRoZSBsZWRnZXIgaXMKLy8gY29uc3RydWN0ZWQgd2l0aCB0aGUgY29tcGlsZS10aW1lIE1heEZlZUJwcyBjYXAsIHNvIGEgZmVlIGFib3ZlIHRoZQovLyBjYXAgaXMgcmVmdXNlZCBieSB0aGUgcHJpbWl0aXZlLCBub3QgYnkgYSBjaGVjayBpbiB0aGlzIGZpbGUuIFRoZXJlIGlzCi8vIG5vIGZlZSBvbiBwbGVkZ2VzLCBubyBmZWUgb24gcmVmdW5kcywgYW5kIG5vIGZlZSBvbiBmYWlsdXJlLgovLwovLyBUSEVSRSBJUyBOTyBBRE1JTi4gVGhlIGZlZSByYXRlLCB0aGUgZmVlIGNvbGxlY3RvciwgZXZlcnkgYm91bmQgYW5kCi8vIGV2ZXJ5IHdpbmRvdyBhcmUgY29tcGlsZS10aW1lIGNvbnN0YW50czsgbm8gYWRkcmVzcyBjYW4gY2hhbmdlIHRlcm1zLAovLyBwYXVzZSB0aGUgcmVhbG0sIG9yIHRvdWNoIGEgY2FtcGFpZ24gaXQgZG9lcyBub3Qgb3duLiBUaGUgZGVwbG95ZXIgaGFzCi8vIG5vIHByaXZpbGVnZSBvZiBhbnkga2luZCBhZnRlciBkZXBsb3ltZW50LgovLwovLyBNT05FVEFSWSBJTlZBUklBTlQgKGNvbnNlcnZhdGlvbik6IGxldCBIIGJlIHRoZSB1Z25vdCBoZWxkIGF0IHRoaXMKLy8gcmVhbG0ncyBhZGRyZXNzLCBCIHRoZSBzdW0gb2YgcmFpc2VkIGFtb3VudHMgYWNyb3NzIGFsbCBzdG9yZWQKLy8gY2FtcGFpZ25zICh0cmFja2VkIE8oMSkgYXMgdG90YWxCYWNrZWQpLCBGIHRoZSBhY2NydWVkIGZlZSBwb3QsIGFuZAovLyBTID49IDAgdGhlIG91dC1vZi1iYW5kIHN1cnBsdXM6Ci8vCi8vCUggPT0gQiArIEYgKyBTCi8vCi8vIEV2ZXJ5IHRyYW5zaXRpb24gbW92ZXMgdmFsdWUgYmV0d2VlbiBleGFjdGx5IHR3byB0ZXJtcyBpbnNpZGUgb25lCi8vIHRyYW5zYWN0aW9uOiBQbGVkZ2UgcmFpc2VzIEggYW5kIEIgdG9nZXRoZXIgKGNvaW5pby5SZWNlaXZlIGlzIHRoZQovLyByZWNlaXB0LWd1YXJhbnRlZWQgc2hhcGUpOyBVbnBsZWRnZSBhbmQgUmVmdW5kIGRlYml0IEIgYmVmb3JlIHRoZQovLyBpZGVudGljYWwgYW1vdW50IGxlYXZlcyBIIChjaGVja3MtZWZmZWN0cy1pbnRlcmFjdGlvbnMpOyBDcmVhdG9yQ2xhaW0KLy8gbW92ZXMgb25lIGNhbXBhaWduJ3MgcmFpc2VkIG91dCBvZiBCLCBzcGxpdHMgaXQgaW50byBhIGNyZWF0b3IgcGF5b3V0Ci8vIChsZWF2ZXMgSCkgYW5kIGEgZmVlIChlbnRlcnMgRik7IFdpdGhkcmF3RmVlcyBkZWJpdHMgRiBiZWZvcmUgdGhlCi8vIHBheW91dDsgYW55IHBhbmljIGFib3J0cyB0aGUgd2hvbGUgdHJhbnNhY3Rpb247IHRoaXMgcmVhbG0gbmV2ZXIKLy8gaXNzdWVzIG9yIHJlbW92ZXMgY29pbnMuCi8vCi8vIE9OTFkgR05PVCBJUyBBQ0NFUFRFRDogUGxlZGdlIHJlamVjdHMgYW55IGVudmVsb3BlIHRoYXQgaXMgbm90IGV4YWN0bHkKLy8gb25lIHBvc2l0aXZlIHVnbm90IGNvaW4gKGNvaW5pby5SZWNlaXZlKS4gRXZlcnkgb3RoZXIgZW50cnlwb2ludAovLyByZWplY3RzIGF0dGFjaGVkIGNvaW5zIG91dHJpZ2h0IHJhdGhlciB0aGFuIGNvbnZlcnRpbmcgdGhlbSBpbnRvCi8vIHN3ZWVwYWJsZSBzdXJwbHVzLgovLwovLyBBVVRIT1JJWkFUSU9OOiBldmVyeSBpZGVudGl0eSBpcyBkZXJpdmVkIGZyb20gdGhlIGNyb3NzaW5nCi8vIGVudHJ5cG9pbnQncyBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkuIE5vIGZ1bmN0aW9uIHRha2VzIGEgY2FsbGVyCi8vIGlkZW50aXR5IGFzIGEgcGFyYW1ldGVyLCBzbyBwbGVkZ2luZyBhcyBhbm90aGVyIGJhY2tlciwgY2xhaW1pbmcKLy8gYW5vdGhlciBjcmVhdG9yJ3MgY2FtcGFpZ24sIG9yIHJlZnVuZGluZyBhbm90aGVyIGJhY2tlcidzIHBsZWRnZSBpcwovLyBpbXBvc3NpYmxlIGJ5IGNvbnN0cnVjdGlvbi4KLy8KLy8gU1RPUkFHRTogYSBiYWNrZXIncyBwbGVkZ2UgZW50cnkgaXMgcGFpZCBmb3IgYnkgdGhlIGJhY2tlcidzIG93bgovLyB0cmFuc2FjdGlvbiBkZXBvc2l0OyBhIGNhbXBhaWduIHJlY29yZCBieSB0aGUgY3JlYXRvcidzLiBDcmVhdG9yQ2xhaW0KLy8gZHJvcHMgdGhlIHdob2xlIHBsZWRnZSB0YWJsZSBpbiBvbmUgYXNzaWdubWVudCwgYW5kIFBydW5lIHJlbW92ZXMgdGhlCi8vIHNldHRsZWQgcmVjb3JkIOKAlCBib3RoIGZyZWUgc3RvcmFnZSwgYW5kIHRoZSBjaGFpbiByZWZ1bmRzIGZyZWVkCi8vIGRlcG9zaXRzIHRvIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGZyZWVzIHRoZW0uCnBhY2thZ2UgY3Jvd2RmdW5kCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZHVlYm9vayIKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZmVlbGVkZ2VyIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9jcm93ZGZ1bmQiCgovLyBEZW5vbSBpcyB0aGUgb25seSBhc3NldCB0aGlzIHJlYWxtIGhvbGRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBjZWlsaW5nIG9uIGFueSBzdWNjZXNzIGZlZSB0aGlzIHJlYWxtIGNvdWxkIGV2ZXIKLy8gY2hhcmdlLCBlbmZvcmNlZCBieSB0aGUgZmVlbGVkZ2VyIHRoZSByZWFsbSBpcyBjb25zdHJ1Y3RlZCB3aXRoIOKAlCBhCi8vIGZlZUJwcyBhYm92ZSBpdCBpcyByZWZ1c2VkIGJ5IHRoZSBwcmltaXRpdmUncyBvd24gdmFsaWRhdGlvbiwgbm90IGJ5IGEKLy8gY2hlY2sgaW4gdGhpcyBmaWxlLiA1MDAgYnBzID0gNSUuCmNvbnN0IE1heEZlZUJwcyA9IGludDY0KDUwMCkKCi8vIFN1Y2Nlc3NGZWVCcHMgaXMgdGhlIGZlZSBhY3R1YWxseSBzbmFwc2hvdHRlZCBpbnRvIGV2ZXJ5IGNhbXBhaWduIGF0Ci8vIExhdW5jaDogMTAwIGJwcyA9IDElLCBjaGFyZ2VkIG9uY2UsIG9uIENyZWF0b3JDbGFpbSwgb24gdGhlIHJhaXNlZAovLyBhbW91bnQsIGZsb29yLXJvdW5kZWQgaW4gdGhlIGNyZWF0b3IncyBmYXZvci4gZmVlX3NwbGl0IHByZWNlZGVudDoKLy8gdGhlIG1vc3QgY29uc2VydmF0aXZlIGxpdmUgZmVlIGluIHRoaXMgcG9ydGZvbGlvIGlzIGFsc28gMSUuCmNvbnN0IFN1Y2Nlc3NGZWVCcHMgPSBpbnQ2NCgxMDApCgovLyBGZWVDb2xsZWN0b3IgcmVjZWl2ZXMgd2l0aGRyYXduIGZlZXMgYW5kIHN3ZXB0IHN1cnBsdXMuIENvbXBpbGUtdGltZQovLyBjb25zdGFudDogdGhlcmUgaXMgbm8gc2V0dGVyIGFuZCBubyB0cmFuc2ZlciBwYXRoLiBJdCBpcyB0aGUgZGVwbG95aW5nCi8vIG5hbWVzcGFjZSdzIGFkZHJlc3Mg4oCUIHN0YXRlZCBwbGFpbmx5OiB0aGUgb3BlcmF0b3Igb2YgdGhpcyByZWFsbS4KY29uc3QgRmVlQ29sbGVjdG9yID0gYWRkcmVzcygiZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOSIpCgovLyBNaW5Hb2FsIGtlZXBzIGR1c3QgY2FtcGFpZ25zIG91dDogMSBHTk9ULgpjb25zdCBNaW5Hb2FsID0gaW50NjQoMV8wMDBfMDAwKQoKLy8gTWluUGxlZGdlIGJvdW5kcyBwbGVkZ2UtdGFibGUgZ3Jvd3RoIHBlciBHTk9UIG9mIGhvc3RpbGUgY2FwaXRhbAovLyAoYXVkaXQgb3BlbiBxdWVzdGlvbiAxKTogYXQgMC4wMSBHTk9UIHBlciBlbnRyeSwgYmxvYXRpbmcgb25lCi8vIGNhbXBhaWduJ3MgdGFibGUgdG8gZXZlbiAxMCwwMDAgZW50cmllcyBjb3N0cyAxMDAgcmVmdW5kYWJsZS1idXQtCi8vIGxvY2tlZCBHTk9UIHBsdXMgZ2FzLiBIb25lc3QgbWljcm8tYmFja2luZyBzdXJ2aXZlczogMC4wMSBHTk9UIGlzCi8vIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGJlbG93IE1pbkdvYWwuCmNvbnN0IE1pblBsZWRnZSA9IGludDY0KDEwXzAwMCkKCi8vIE1pbkR1cmF0aW9uQmxvY2tzIGFuZCBNYXhEdXJhdGlvbkJsb2NrcyBib3VuZCBhIGNhbXBhaWduJ3MgZnVuZGluZwovLyBwZXJpb2QsIGVuZm9yY2VkIHN0cnVjdHVyYWxseTogdGhleSBhcmUgdGhlIGR1ZWJvb2sncyBtaW5EZWxheSBhbmQKLy8gbWF4RGVsYXksIHNvIGFuIG91dC1vZi1yYW5nZSBkdXJhdGlvbiBpcyByZWZ1c2VkIGJ5IHRoZSBwcmltaXRpdmUuCi8vIEF0IG9ueXgtMSdzIHJvdWdobHkgMy01cyBibG9ja3MsIH4xLDIwMCBibG9ja3MgaXMgb24gdGhlIG9yZGVyIG9mIGFuCi8vIGhvdXIgb3IgdHdvLCBhbmQgfjEsMzAwLDAwMCBibG9ja3MgaXMgb24gdGhlIG9yZGVyIG9mIDQ1LTc1IGRheXMuCmNvbnN0ICgKCU1pbkR1cmF0aW9uQmxvY2tzID0gaW50NjQoMV8yMDApCglNYXhEdXJhdGlvbkJsb2NrcyA9IGludDY0KDFfMzAwXzAwMCkKKQoKLy8gQ2xhaW1XaW5kb3dCbG9ja3MgaXMgaG93IGxvbmcgYWZ0ZXIgdGhlIGRlYWRsaW5lIGEgc3VjY2Vzc2Z1bCBjcmVhdG9yCi8vIG1heSBjb2xsZWN0IGJlZm9yZSB0aGUgY2FtcGFpZ24gYmVjb21lcyBwZXJtaXNzaW9ubGVzc2x5IGxhcHNhYmxlIGFuZAovLyB0aGUgcG90IHJlZnVuZGFibGUuIEl0IGlzIGV2ZXJ5IGNhbXBhaWduJ3MgZGVmZXJyYWwgdHRsLgpjb25zdCBDbGFpbVdpbmRvd0Jsb2NrcyA9IGludDY0KDY1MF8wMDApCgovLyBNYXhPcGVuQ2FtcGFpZ25zIGNhcHMgc2ltdWx0YW5lb3VzbHkgdW5zZXR0bGVkIGNhbXBhaWducywgdmlhIHRoZQovLyBkdWVib29rJ3Mgb3duIG9wZW4tZGVmZXJyYWwgY2FwLiBUaGUgQVZBSUxBQklMSVRZIEJPVU5EIHRoaXMgaW1wbGllcwovLyBpcyBkb2N1bWVudGVkIHJhdGhlciB0aGFuIGhpZGRlbjogTGF1bmNoIGlzIHBlcm1pc3Npb25sZXNzLCBzbyB0aGUKLy8gY2FwIGlzIGV4aGF1c3RpYmxlIGluIHByaW5jaXBsZS4gV2hhdCBlYWNoIHVuc2V0dGxlZCBzbG90IGNvc3RzIGFuCi8vIGF0dGFja2VyIGlzIHRoZSBtaXRpZ2F0aW9uIOKAlCBhIGZhaWxlZCBjYW1wYWlnbiBpcyBwZXJtaXNzaW9ubGVzc2x5Ci8vIHNldHRsZWFibGUgKFNldHRsZUZhaWxlZCkgdGhlIG1vbWVudCBpdHMgZGVhZGxpbmUgcGFzc2VzLCBzbyBob2xkaW5nCi8vIGEgc2xvdCBwYXN0IGl0cyBkZWFkbGluZSByZXF1aXJlcyBNRUVUSU5HIFRIRSBHT0FMLCBpLmUuIGxvY2tpbmcgYXQKLy8gbGVhc3QgTWluR29hbCBvZiByZWFsIGNhcGl0YWwgcGVyIHNsb3QgZm9yIHRoZSBjbGFpbSB3aW5kb3cuIEZpbGxpbmcKLy8gdGhlIHdob2xlIHRhYmxlIHRoZXJlZm9yZSBjb3N0cyA+PSAxLDAyNCBHTk9UIGxvY2tlZCBmb3IgfmEgbW9udGgKLy8gcGVyIGN5Y2xlLCBhZ2FpbnN0IGEgcmVhbG0gd2hvc2UgZXhpc3RpbmcgY2FtcGFpZ25zIGtlZXAgd29ya2luZwovLyByZWdhcmRsZXNzLiBBY2NlcHRlZCBmb3IgYSB0ZXN0bmV0IGRlcGxveW1lbnQgYW5kIHJlY29yZGVkIGluIHRoZQovLyBkZXBsb3ltZW50IHJlY29yZCAoYXVkaXQgZmluZGluZyBZMSkuCmNvbnN0IE1heE9wZW5DYW1wYWlnbnMgPSAxMDI0CgovLyBNYXhPcGVuUGVyQ3JlYXRvciBib3VuZHMgaG93IG11Y2ggb2YgdGhlIGdsb2JhbCBjYXAgb25lIGNyZWF0b3IgY2FuCi8vIG9jY3VweSAocGVybWlzc2lvbl9yZWdpc3RyeSBSMSBwcmVjZWRlbnQ6IGFuIHVuY2FwcGVkIHBlci1wcmluY2lwYWwKLy8gY291bnQgbGV0cyBvbmUga2V5IG1vbm9wb2xpemUgYSBzaGFyZWQgYm91bmQpLgpjb25zdCBNYXhPcGVuUGVyQ3JlYXRvciA9IGludDY0KDgpCgovLyBJbnB1dCBib3VuZHMuIEJvdGggZmllbGRzIGFyZSBmcmVlIHRleHQgYW5kIGFyZSBzYW5pdGl6ZWQgYmVmb3JlCi8vIHJlYWNoaW5nIG1hcmtkb3duLgpjb25zdCAoCglNYXhUaXRsZUxlbiA9IDEwMAoJTWF4TWVtb0xlbiAgPSAyNTYKKQoKLy8gTWF4UmVuZGVyUm93cyBib3VuZHMgdGhlIGNhbXBhaWduIGxpc3Qgb24gdGhlIGluZGV4IHBhZ2UuCmNvbnN0IE1heFJlbmRlclJvd3MgPSAyMAoKLy8gQ2FtcGFpZ24gc3RhdGVzLiBzdGF0ZVBhaWQsIHN0YXRlRmFpbGVkLCBzdGF0ZUNhbmNlbGxlZCBhbmQKLy8gc3RhdGVMYXBzZWQgYXJlIHRlcm1pbmFsOiB0aGUgY2FtcGFpZ24ncyBkZWZlcnJhbCBoYXMgYmVlbiBjb25zdW1lZAovLyBhbmQgY2FuIG5ldmVyIGJlIGNvbnN1bWVkIGFnYWluLgpjb25zdCAoCglzdGF0ZUZ1bmRpbmcgICA9ICJmdW5kaW5nIgoJc3RhdGVQYWlkICAgICAgPSAicGFpZCIKCXN0YXRlRmFpbGVkICAgID0gImZhaWxlZCIKCXN0YXRlQ2FuY2VsbGVkID0gImNhbmNlbGxlZCIKCXN0YXRlTGFwc2VkICAgID0gImxhcHNlZCIKKQoKdHlwZSBjYW1wYWlnbiBzdHJ1Y3QgewoJaWQgICAgICAgIGludDY0CgljcmVhdG9yICAgYWRkcmVzcwoJdGl0bGUgICAgIHN0cmluZwoJbWVtbyAgICAgIHN0cmluZwoJZ29hbCAgICAgIGludDY0CglmZWVCcHMgICAgaW50NjQgLy8gc25hcHNob3R0ZWQgYXQgTGF1bmNoCgljcmVhdGVkQXQgaW50NjQKCWRlYWRsaW5lICBpbnQ2NCAvLyBjcmVhdGVkQXQgKyBkdXJhdGlvbjsgcGxlZGdpbmcgd2hpbGUgaGVpZ2h0IDwgZGVhZGxpbmUKCWNsYWltRW5kICBpbnQ2NCAvLyBkZWFkbGluZSArIENsYWltV2luZG93QmxvY2tzOyA9PSBkZWZlcnJhbCBFeHBpcmVzQXQKCWRlZklEICAgICB1aW50NjQKCXN0YXRlICAgICBzdHJpbmcKCglyYWlzZWQgIGludDY0ICAgICAvLyBjb2lucyBjdXJyZW50bHkgaGVsZCBmb3IgdGhpcyBjYW1wYWlnbgoJcGxlZGdlcyAqYXZsLlRyZWUgLy8gYmFja2VyIGFkZHJlc3Mgc3RyaW5nIC0+IGludDY0ICg+IDApOyBuaWwgYWZ0ZXIgcGF5b3V0CgliYWNrZXJzIGludCAgICAgICAvLyBmaW5hbCBjb3VudCwgZnJvemVuIHdoZW4gcGxlZGdlcyBpcyBkcm9wcGVkCn0KCnZhciAoCglzZWxmIGFkZHJlc3MKCgljYW1wYWlnbnMgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKGlkKSAtPiAqY2FtcGFpZ24KCW5leHRJRCAgICBpbnQ2NAoKCS8vIG9wZW5CeUNyZWF0b3IgdHJhY2tzIGVhY2ggY3JlYXRvcidzIHVuc2V0dGxlZCBjYW1wYWlnbnM6CgkvLyBhZGRyZXNzIHN0cmluZyAtPiBpbnQ2NCBjb3VudCAoPiAwKS4KCW9wZW5CeUNyZWF0b3IgPSBhdmwuTmV3VHJlZSgpCgoJLy8gdG90YWxCYWNrZWQgaXMgdGhlIEIgdGVybSBvZiBIID09IEIgKyBGICsgUzogdGhlIHN1bSBvZiByYWlzZWQKCS8vIGFjcm9zcyBhbGwgc3RvcmVkIGNhbXBhaWducywgbWFpbnRhaW5lZCBPKDEpIGF0IGV2ZXJ5IHRyYW5zaXRpb24uCgl0b3RhbEJhY2tlZCBpbnQ2NAoKCS8vIGxpZmV0aW1lIGNvdW50ZXJzLCByZW5kZXJlZCBmb3Igb3BlcmF0b3JzLgoJbGlmZXRpbWVQbGVkZ2VkICBpbnQ2NAoJbGlmZXRpbWVQYWlkT3V0ICBpbnQ2NCAvLyBjcmVhdG9yIHBheW91dHMsIG5ldCBvZiBmZWUKCWxpZmV0aW1lUmV0dXJuZWQgaW50NjQgLy8gdW5wbGVkZ2VzICsgcmVmdW5kcwoKCS8vIGxlZGdlciBwcm92aWRlcyB0aGUgZmVlIGFyaXRobWV0aWMsIHRoZSBmZWUgY2FwLCBhbmQgdGhlIGZlZSBwb3QuCgkvLyBJdHMgdXNlci1iYWxhbmNlIHNpZGUgaXMgdXNlZCBvbmx5IHRyYW5zaWVudGx5IGluc2lkZQoJLy8gQ3JlYXRvckNsYWltLCBzbyBVc2Vyc1RvdGFsKCkgaXMgMCBiZXR3ZWVuIHRyYW5zYWN0aW9ucy4KCWxlZGdlciA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKCgkvLyBib29rIGhvbGRzIG9uZSBvcGVuIGRlZmVycmFsIHBlciB1bnNldHRsZWQgY2FtcGFpZ24uIFRoZSBib3VuZHMKCS8vIGFyZSB0aGUgcHJpbWl0aXZlJ3Mgb3duIHZhbGlkYXRpb246IGEgZHVyYXRpb24gb3V0c2lkZQoJLy8gW01pbkR1cmF0aW9uQmxvY2tzLCBNYXhEdXJhdGlvbkJsb2Nrc10gaXMgcmVmdXNlZCBieSBTY2hlZHVsZS4KCWJvb2sgPSBkdWVib29rLk11c3ROZXcoTWluRHVyYXRpb25CbG9ja3MsIE1heER1cmF0aW9uQmxvY2tzLCBNYXhPcGVuQ2FtcGFpZ25zKQopCgpmdW5jIGluaXQoKSB7CglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgbm9uLXBheWFibGUgY2FsbC4KLy8gVGhpcyByZWFsbSBob2xkcyBmdW5kcywgc28gYSBzdHJheSBzZW5kIHdvdWxkIGJlY29tZSBzd2VlcGFibGUKLy8gc3VycGx1cywgc2lsZW50bHkgY29udmVydGluZyBhIHVzZXIncyBjb2lucyBpbnRvIG9wZXJhdG9yIGZ1bmRzLgovLyBBYm9ydGluZyByZXZlcnRzIHRoZSB0cmFuc2ZlciBpbnN0ZWFkLiBHdWFyZGVkIG9uIElzVXNlckNhbGwsIG5vdAovLyBJc1VzZXIsIGJlY2F1c2UgYSBNc2dSdW4gZXBoZW1lcmFsIGNhbiBjb25zdW1lIHRoZSBPcmlnaW5TZW5kIGVudmVsb3BlCi8vIGJlZm9yZSBmb3J3YXJkaW5nIGNvbnRyb2w7IGZvciBhIHJlYWxtLXJvdXRlZCBjYWxsIHRoZSBlbnZlbG9wZSBsYW5kcwovLyBhdCB0aGUgaW50ZXJtZWRpYXJ5LCBzbyB0aGVyZSBpcyBub3RoaW5nIGhlcmUgdG8gcmVqZWN0IGFuZCB0aGUgZ3VhcmQKLy8gZGVsaWJlcmF0ZWx5IGZhaWxzIG9wZW4gKHRyZWFzdXJ5X2JvYXJkIGRvY3VtZW50cyB0aGUgc2FtZSBzY29wZSkuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJLy8gRXZlcnkgY2FsbCBzaXRlIGZvcndhcmRzIGEgY3Jvc3NpbmcgZW50cnlwb2ludCdzIG93biBsaXZlIGN1ciwKCQkvLyBzbyB0aGlzIGNhbm5vdCBmaXJlIHRvZGF5OyBpdCBleGlzdHMgc28gYSBmdXR1cmUgcmVmYWN0b3IgdGhhdAoJCS8vIGhhbmRzIHRoaXMgZ3VhcmQgYSBzdGFsZSByZWFsbSB2YWx1ZSBmYWlscyBjbG9zZWQsIG5vdCBvcGVuCgkJLy8gKGNvaW5pbyBuYW1lcyBJc0N1cnJlbnQgYXMgdGhlIGd1YXJkIHNlY29uZGFyeSByZWFsbQoJCS8vIHBhcmFtZXRlcnMgcmVxdWlyZSwgYW5kIHRoaXMgaGVscGVyIGZvbGxvd3MgdGhhdCBkaXNjaXBsaW5lKS4KCQlwYW5pYygiY3Jvd2RmdW5kOiByZWFsbSBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50IikKCX0KCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygidGhpcyBlbnRyeXBvaW50IGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCi8vIC0tLSBjYW1wYWlnbiBsaWZlY3ljbGUgLS0tCgovLyBMYXVuY2ggb3BlbnMgYSBjYW1wYWlnbiBhbmQgcmV0dXJucyBpdHMgaWQuIEFueW9uZSBtYXkgbGF1bmNoOyB0aGUKLy8gY2FsbGVyIGJlY29tZXMgdGhlIGNyZWF0b3IuIFRoZSBmZWUgdGVybXMgKFN1Y2Nlc3NGZWVCcHMgYXQgdGhpcwovLyBtb21lbnQg4oCUIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBzbyBhbHdheXMgU3VjY2Vzc0ZlZUJwcykgYXJlCi8vIHNuYXBzaG90dGVkIGludG8gdGhlIGNhbXBhaWduIGFuZCBhcmUgZml4ZWQgZnJvbSBoZXJlIG9uLiBUaGUgZnVuZGluZwovLyBkdXJhdGlvbiBpcyBnaXZlbiBpbiBibG9ja3MgYW5kIG11c3QgYmUgd2l0aGluCi8vIFtNaW5EdXJhdGlvbkJsb2NrcywgTWF4RHVyYXRpb25CbG9ja3NdIOKAlCBlbmZvcmNlZCBieSB0aGUgZHVlYm9vay4KZnVuYyBMYXVuY2goY3VyIHJlYWxtLCB0aXRsZSwgbWVtbyBzdHJpbmcsIGdvYWwsIGR1cmF0aW9uQmxvY2tzIGludDY0KSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY3JlYXRvciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCglpZiB0aXRsZSA9PSAiIiB7CgkJcGFuaWMoInRpdGxlIG11c3Qgbm90IGJlIGVtcHR5IikKCX0KCWlmIGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWMoInRpdGxlIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhUaXRsZUxlbikgKyAiIGJ5dGVzIikKCX0KCWlmIGxlbihtZW1vKSA+IE1heE1lbW9MZW4gewoJCXBhbmljKCJtZW1vIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhNZW1vTGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgZ29hbCA8IE1pbkdvYWwgewoJCXBhbmljKCJnb2FsIG11c3QgYmUgYXQgbGVhc3QgIiArIGl0b2EoTWluR29hbCkgKyBEZW5vbSkKCX0KCWtleSA6PSBjcmVhdG9yLlN0cmluZygpCglpZiBjcmVhdG9yT3BlbihrZXkpID49IE1heE9wZW5QZXJDcmVhdG9yIHsKCQlwYW5pYygiY3JlYXRvciBhbHJlYWR5IGhhcyAiICsgaXRvYShNYXhPcGVuUGVyQ3JlYXRvcikgKyAiIHVuc2V0dGxlZCBjYW1wYWlnbnMiKQoJfQoKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlkIDo9IG5leHRJRCArIDEKCgkvLyBUaGUgZGVmZXJyYWwgaXMgdGhlIHNldHRsZW1lbnQgYXV0aG9yaXphdGlvbjogZHVlIGF0IHRoZSBkZWFkbGluZSwKCS8vIGV4cGlyaW5nIHdoZW4gdGhlIGNsYWltIHdpbmRvdyBjbG9zZXMuIER1cmF0aW9uIGJvdW5kcyBhbmQgdGhlCgkvLyBnbG9iYWwgb3Blbi1jYW1wYWlnbiBjYXAgYXJlIGVuZm9yY2VkIGhlcmUgYnkgdGhlIHByaW1pdGl2ZS4KCWRlZklEIDo9IGJvb2suTXVzdFNjaGVkdWxlKGtleSwgaXRvYShpZCksIG5vdywgZHVyYXRpb25CbG9ja3MsIENsYWltV2luZG93QmxvY2tzKQoKCWMgOj0gJmNhbXBhaWduewoJCWlkOiAgICAgICAgaWQsCgkJY3JlYXRvcjogICBjcmVhdG9yLAoJCXRpdGxlOiAgICAgdGl0bGUsCgkJbWVtbzogICAgICBtZW1vLAoJCWdvYWw6ICAgICAgZ29hbCwKCQlmZWVCcHM6ICAgIFN1Y2Nlc3NGZWVCcHMsCgkJY3JlYXRlZEF0OiBub3csCgkJZGVhZGxpbmU6ICBub3cgKyBkdXJhdGlvbkJsb2NrcywKCQljbGFpbUVuZDogIG5vdyArIGR1cmF0aW9uQmxvY2tzICsgQ2xhaW1XaW5kb3dCbG9ja3MsCgkJZGVmSUQ6ICAgICBkZWZJRCwKCQlzdGF0ZTogICAgIHN0YXRlRnVuZGluZywKCQlwbGVkZ2VzOiAgIGF2bC5OZXdUcmVlKCksCgl9CgluZXh0SUQgPSBpZAoJY2FtcGFpZ25zLlNldChwYWRJRChpZCksIGMpCglzZXRDcmVhdG9yT3BlbihrZXksIGNyZWF0b3JPcGVuKGtleSkrMSkKCgljaGFpbi5FbWl0KCJMYXVuY2hlZCIsICJpZCIsIGl0b2EoaWQpLCAiY3JlYXRvciIsIGtleSwKCQkiZ29hbCIsIGl0b2EoZ29hbCksICJkZWFkbGluZSIsIGl0b2EoYy5kZWFkbGluZSksCgkJImZlZUJwcyIsIGl0b2EoYy5mZWVCcHMpKQoJcmV0dXJuIGlkCn0KCi8vIFBsZWRnZSBiYWNrcyBhIGNhbXBhaWduIHdpdGggdGhlIGF0dGFjaGVkIGNvaW5zLiBEaXJlY3QgRU9BIGNhbGxzCi8vIHdpdGggLXNlbmQgb25seSAodGhlIHJlY2VpcHQtZ3VhcmFudGVlZCBzaGFwZSk7IGV4YWN0bHkgb25lIHBvc2l0aXZlCi8vIHVnbm90IGNvaW4uIE9wZW4gd2hpbGUgaGVpZ2h0IDwgZGVhZGxpbmUuCmZ1bmMgUGxlZGdlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCWJhY2tlciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCgljIDo9IG11c3RHZXQoaWQpCglpZiBjLnN0YXRlICE9IHN0YXRlRnVuZGluZyB7CgkJcGFuaWMoImNhbXBhaWduIGlzIHNldHRsZWQiKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpID49IGMuZGVhZGxpbmUgewoJCXBhbmljKCJmdW5kaW5nIGlzIGNsb3NlZCIpCgl9CglpZiBhbW91bnQgPCBNaW5QbGVkZ2UgewoJCXBhbmljKCJwbGVkZ2UgYXQgbGVhc3QgIiArIGl0b2EoTWluUGxlZGdlKSArIERlbm9tKQoJfQoKCWtleSA6PSBiYWNrZXIuU3RyaW5nKCkKCW5ld1BsZWRnZSwgb2sgOj0gY2hlY2tlZEFkZChwbGVkZ2VPZihjLCBrZXkpLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJwbGVkZ2Ugd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3UmFpc2VkLCBvayA6PSBjaGVja2VkQWRkKGMucmFpc2VkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJyYWlzZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3QmFja2VkLCBvayA6PSBjaGVja2VkQWRkKHRvdGFsQmFja2VkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJ0b3RhbCBiYWNrZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3TGlmZXRpbWUsIG9rIDo9IGNoZWNrZWRBZGQobGlmZXRpbWVQbGVkZ2VkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBwbGVkZ2VkIHdvdWxkIG92ZXJmbG93IikKCX0KCgljLnBsZWRnZXMuU2V0KGtleSwgbmV3UGxlZGdlKQoJYy5yYWlzZWQgPSBuZXdSYWlzZWQKCXRvdGFsQmFja2VkID0gbmV3QmFja2VkCglsaWZldGltZVBsZWRnZWQgPSBuZXdMaWZldGltZQoKCWNoYWluLkVtaXQoIlBsZWRnZWQiLCAiaWQiLCBpdG9hKGMuaWQpLCAiYmFja2VyIiwga2V5LAoJCSJhbW91bnQiLCBpdG9hKGFtb3VudCksICJyYWlzZWQiLCBpdG9hKGMucmFpc2VkKSkKfQoKLy8gVW5wbGVkZ2UgcmV0dXJucyB0aGUgY2FsbGVyJ3MgZW50aXJlIHBsZWRnZSB3aGlsZSBmdW5kaW5nIGlzIHN0aWxsCi8vIG9wZW4uIEFsbC1vci1ub3RoaW5nIG1lYW5zIG5vdGhpbmcgaXMgY29tbWl0dGVkIGJlZm9yZSB0aGUgZGVhZGxpbmUsCi8vIHNvIGJhY2tpbmcgb3V0IGlzIGFsd2F5cyB3aG9sZSBhbmQgYWx3YXlzIGZyZWUuCmZ1bmMgVW5wbGVkZ2UoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWMgOj0gbXVzdEdldChpZCkKCWlmIGMuc3RhdGUgIT0gc3RhdGVGdW5kaW5nIHsKCQlwYW5pYygiY2FtcGFpZ24gaXMgc2V0dGxlZCIpCgl9CglpZiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPj0gYy5kZWFkbGluZSB7CgkJcGFuaWMoImZ1bmRpbmcgaXMgY2xvc2VkOyB1c2UgUmVmdW5kIGlmIHRoZSBjYW1wYWlnbiBmYWlsZWQiKQoJfQoJcGF5QmFjayhjdXIsIGMsIGNhbGxlciwgIlVucGxlZGdlZCIpCn0KCi8vIENyZWF0b3JDbGFpbSBjb2xsZWN0cyBhIHN1Y2Nlc3NmdWwgY2FtcGFpZ246IGNyZWF0b3Igb25seSwgZnJvbSB0aGUKLy8gZGVhZGxpbmUgdW50aWwgdGhlIGNsYWltIHdpbmRvdyBjbG9zZXMsIGFuZCBvbmx5IHdpdGggdGhlIGdvYWwKLy8gcmVhY2hlZC4gUGF5cyByYWlzZWQgbWludXMgdGhlIHNuYXBzaG90dGVkIGZlZSB0byB0aGUgY3JlYXRvciBhbmQKLy8gYWNjcnVlcyB0aGUgZmVlLiBUaGUgZHVlYm9vayBDbGFpbSBjb25zdW1lcyB0aGUgY2FtcGFpZ24ncyBkZWZlcnJhbCwKLy8gc28gdGhpcyBjYW4gc3VjY2VlZCBhdCBtb3N0IG9uY2UgcGVyIGNhbXBhaWduLCBldmVyLgpmdW5jIENyZWF0b3JDbGFpbShjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYyA6PSBtdXN0R2V0KGlkKQoJaWYgY2FsbGVyICE9IGMuY3JlYXRvciB7CgkJcGFuaWMoImNyZWF0b3Igb25seSIpCgl9CglpZiBjLnN0YXRlICE9IHN0YXRlRnVuZGluZyB7CgkJcGFuaWMoImNhbXBhaWduIGlzIHNldHRsZWQiKQoJfQoJaWYgYy5yYWlzZWQgPCBjLmdvYWwgewoJCXBhbmljKCJnb2FsIG5vdCByZWFjaGVkIikKCX0KCgkvLyBUaW1pbmcgKG5vdCBkdWUgLyBleHBpcmVkKSBpcyB0aGUgcHJpbWl0aXZlJ3MgdmVyZGljdDsgaXRzIGVycm9yCgkvLyBuYW1lcyB0aGUgcmVhc29uLiBBIHN1Y2Nlc3MgY29uc3VtZXMgdGhlIGRlZmVycmFsIGJlZm9yZSByZXR1cm5pbmcuCglkIDo9IGJvb2suTXVzdENsYWltKGMuZGVmSUQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCWlmIGQuT3duZXIgIT0gYy5jcmVhdG9yLlN0cmluZygpIHsKCQkvLyBVbnJlYWNoYWJsZSBieSBjb25zdHJ1Y3Rpb24gKHRoZSBkZWZlcnJhbCB3YXMgc2NoZWR1bGVkIHdpdGgKCQkvLyB0aGlzIGNhbXBhaWduJ3MgY3JlYXRvciBhcyBvd25lcik7IGNoZWNrZWQgYmVjYXVzZSB0aGUgcGF5b3V0CgkJLy8gYmVsb3cgaXMgaXJyZXZlcnNpYmxlLgoJCXBhbmljKCJzZXR0bGVtZW50IG93bmVyIG1pc21hdGNoIikKCX0KCglhbW91bnQgOj0gYy5yYWlzZWQKCWNyZWRpdGVkLCBmZWUgOj0gbGVkZ2VyLk11c3REZXBvc2l0KGMuY3JlYXRvci5TdHJpbmcoKSwgYW1vdW50LCBjLmZlZUJwcykKCWxlZGdlci5NdXN0V2l0aGRyYXcoYy5jcmVhdG9yLlN0cmluZygpLCBjcmVkaXRlZCkKCgkvLyBEZWJpdCB0aGUgY2FtcGFpZ24gYmVmb3JlIHRoZSBjb2lucyBtb3ZlLgoJYy5yYWlzZWQgPSAwCgl0b3RhbEJhY2tlZCAtPSBhbW91bnQKCWMuYmFja2VycyA9IGMucGxlZGdlcy5TaXplKCkKCWMucGxlZGdlcyA9IG5pbCAvLyBkcm9wIHRoZSB3aG9sZSB0YWJsZTsgZW50aXRsZW1lbnRzIGFyZSBzZXR0bGVkCgljLnN0YXRlID0gc3RhdGVQYWlkCglkZWNDcmVhdG9yT3BlbihjLmNyZWF0b3IuU3RyaW5nKCkpCgluZXdQYWlkLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lUGFpZE91dCwgY3JlZGl0ZWQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBwYWlkIHdvdWxkIG92ZXJmbG93IikKCX0KCWxpZmV0aW1lUGFpZE91dCA9IG5ld1BhaWQKCgljb2luaW8uUGF5b3V0KDAsIGN1ciwgYy5jcmVhdG9yLCBEZW5vbSwgY3JlZGl0ZWQpCgoJY2hhaW4uRW1pdCgiQ2xhaW1lZCIsICJpZCIsIGl0b2EoYy5pZCksICJjcmVhdG9yIiwgYy5jcmVhdG9yLlN0cmluZygpLAoJCSJhbW91bnQiLCBpdG9hKGNyZWRpdGVkKSwgImZlZSIsIGl0b2EoZmVlKSkKfQoKLy8gQ3JlYXRvckNhbmNlbCBzZXR0bGVzIHRoZSBjYWxsZXIncyBvd24gY2FtcGFpZ24gYXMgY2FuY2VsbGVkIGFuZCBvcGVucwovLyByZWZ1bmRzLiBQZXJtaXR0ZWQgYXQgYW55IHRpbWUgd2hpbGUgdGhlIHNldHRsZW1lbnQgZGVmZXJyYWwgaXMgb3BlbiDigJQKLy8gZHVyaW5nIGZ1bmRpbmcsIGFuZCBlcXVhbGx5IGFmdGVyIGEgc3VjY2Vzc2Z1bCBkZWFkbGluZSAocmVub3VuY2luZwovLyB0aGUgcG90KS4gVGhlIGR1ZWJvb2sgQ2FuY2VsIGlzIG93bmVyLWdhdGVkIGFuZCBjb25zdW1lcyB0aGUgZGVmZXJyYWwuCmZ1bmMgQ3JlYXRvckNhbmNlbChjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYyA6PSBtdXN0R2V0KGlkKQoJaWYgY2FsbGVyICE9IGMuY3JlYXRvciB7CgkJcGFuaWMoImNyZWF0b3Igb25seSIpCgl9CglpZiBjLnN0YXRlICE9IHN0YXRlRnVuZGluZyB7CgkJcGFuaWMoImNhbXBhaWduIGlzIHNldHRsZWQiKQoJfQoKCWJvb2suTXVzdENhbmNlbChjLmRlZklELCBjYWxsZXIuU3RyaW5nKCkpCgljLnN0YXRlID0gc3RhdGVDYW5jZWxsZWQKCWRlY0NyZWF0b3JPcGVuKGMuY3JlYXRvci5TdHJpbmcoKSkKCgljaGFpbi5FbWl0KCJDYW5jZWxsZWQiLCAiaWQiLCBpdG9hKGMuaWQpLCAiY3JlYXRvciIsIGMuY3JlYXRvci5TdHJpbmcoKSwKCQkicmFpc2VkIiwgaXRvYShjLnJhaXNlZCkpCn0KCi8vIFNldHRsZUZhaWxlZCBzZXR0bGVzIGEgY2FtcGFpZ24gdGhhdCByZWFjaGVkIGl0cyBkZWFkbGluZSB3aXRoIHRoZQovLyBnb2FsIHVubWV0LiBBbnlvbmUgbWF5IGNhbGwgaXQg4oCUIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3RlZXI6IHJlZnVuZHMKLy8gd2VyZSBhbHJlYWR5IG9wZW4gb24gdGhpcyBwYXRoLCBzbyB0aGUgb25seSBlZmZlY3RzIGFyZSBtYWtpbmcgdGhlCi8vIGZhaWx1cmUgdGVybWluYWwgYW5kIGZyZWVpbmcgdGhlIGNhbXBhaWduJ3MgZHVlYm9vayBzbG90IChhbmQgaXRzCi8vIGNyZWF0b3IncyBjYXAgc2xvdCkgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiBhdCB0aGUgZW5kIG9mIHRoZSBjbGFpbQovLyB3aW5kb3cuIFRoaXMgaXMgd2hhdCBtYWtlcyBzbG90LXNxdWF0dGluZyB3aXRoIHVuZnVuZGVkIGNhbXBhaWducwovLyBwb2ludGxlc3M6IGhvbGRpbmcgYSBzbG90IHBhc3QgdGhlIGRlYWRsaW5lIHJlcXVpcmVzIG1lZXRpbmcgdGhlCi8vIGdvYWwsIGkuZS4gcmVhbCBsb2NrZWQgY2FwaXRhbC4KLy8KLy8gVGhlIGRlZmVycmFsIGlzIGNvbnN1bWVkIHdpdGggdGhlIGR1ZWJvb2sncyBDbGFpbSB1bmRlciB0aGlzIHJlYWxtJ3MKLy8gcG9saWN5IChnb2FsIHVubWV0KSwgd2hpY2ggdGhlIHByaW1pdGl2ZSBleHBsaWNpdGx5IGxlYXZlcyB0byBpdHMKLy8gY29uc3VtZXI7IHRoZSB0aW1pbmcgdmVyZGljdCAobm90IGR1ZSBiZWZvcmUgdGhlIGRlYWRsaW5lKSBpcyB0aGUKLy8gcHJpbWl0aXZlJ3Mgb3duLgpmdW5jIFNldHRsZUZhaWxlZChjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJYyA6PSBtdXN0R2V0KGlkKQoJaWYgYy5zdGF0ZSAhPSBzdGF0ZUZ1bmRpbmcgewoJCXBhbmljKCJjYW1wYWlnbiBpcyBzZXR0bGVkIikKCX0KCWlmIGMucmFpc2VkID49IGMuZ29hbCB7CgkJcGFuaWMoImdvYWwgcmVhY2hlZDsgdGhlIGNsYWltIHdpbmRvdyBpcyB0aGUgY3JlYXRvcidzIikKCX0KCglib29rLk11c3RDbGFpbShjLmRlZklELCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCgljLnN0YXRlID0gc3RhdGVGYWlsZWQKCWRlY0NyZWF0b3JPcGVuKGMuY3JlYXRvci5TdHJpbmcoKSkKCgljaGFpbi5FbWl0KCJGYWlsZWQiLCAiaWQiLCBpdG9hKGMuaWQpLCAiYnkiLAoJCWN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS5TdHJpbmcoKSwgInJhaXNlZCIsIGl0b2EoYy5yYWlzZWQpKQp9CgovLyBMYXBzZSBzZXR0bGVzIGEgY2FtcGFpZ24gd2hvc2UgY2xhaW0gd2luZG93IGhhcyBjbG9zZWQuIEFueW9uZSBtYXkKLy8gY2FsbCBpdCDigJQgYSBsYXBzZWQgY2FtcGFpZ24ncyBwb3QgYmVsb25ncyB0byBpdHMgYmFja2VycywgYW5kIHRoZQovLyBjYWxsZXIgaXMgZG9pbmcgdGhlbSAoYW5kIHRoZSBkdWVib29rJ3Mgb3Blbi1zbG90IGJ1ZGdldCkgYSBzZXJ2aWNlLgovLyBUaGUgZHVlYm9vayBFeHBpcmUgcmVmdXNlcyB3aGlsZSB0aGUgd2luZG93IGlzIHN0aWxsIG9wZW4uCmZ1bmMgTGFwc2UoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWMgOj0gbXVzdEdldChpZCkKCWlmIGMuc3RhdGUgIT0gc3RhdGVGdW5kaW5nIHsKCQlwYW5pYygiY2FtcGFpZ24gaXMgc2V0dGxlZCIpCgl9CgoJYm9vay5NdXN0RXhwaXJlKGMuZGVmSUQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCWMuc3RhdGUgPSBzdGF0ZUxhcHNlZAoJZGVjQ3JlYXRvck9wZW4oYy5jcmVhdG9yLlN0cmluZygpKQoKCWNoYWluLkVtaXQoIkxhcHNlZCIsICJpZCIsIGl0b2EoYy5pZCksICJieSIsCgkJY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLlN0cmluZygpLCAicmFpc2VkIiwgaXRvYShjLnJhaXNlZCkpCn0KCi8vIFJlZnVuZCByZXR1cm5zIHRoZSBjYWxsZXIncyBlbnRpcmUgcGxlZGdlIGZyb20gYSBjYW1wYWlnbiB0aGF0IHdpbGwKLy8gbmV2ZXIgcGF5IGl0cyBjcmVhdG9yOiBjYW5jZWxsZWQsIGxhcHNlZCwgb3IgcGFzdCBpdHMgZGVhZGxpbmUgd2l0aAovLyB0aGUgZ29hbCB1bm1ldC4gQWx3YXlzIHdob2xlLCBhbHdheXMgZmVlLWZyZWUuIFdoaWxlIGEgc3VjY2VlZGVkCi8vIGNhbXBhaWduIGlzIGluc2lkZSBpdHMgY2xhaW0gd2luZG93IHRoZSBwb3QgaXMgdGhlIGNyZWF0b3IncyB0bwovLyBjb2xsZWN0LCBzbyBSZWZ1bmQgcmVmdXNlcyDigJQgaWYgdGhlIGNyZWF0b3IgbmV2ZXIgY29sbGVjdHMsIExhcHNlCi8vIHJlb3BlbnMgdGhpcyBwYXRoLgpmdW5jIFJlZnVuZChjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYyA6PSBtdXN0R2V0KGlkKQoJaWYgIXJlZnVuZGFibGUoYywgcnVudGltZS5DaGFpbkhlaWdodCgpKSB7CgkJcGFuaWMoImNhbXBhaWduIGlzIG5vdCByZWZ1bmRhYmxlIikKCX0KCXBheUJhY2soY3VyLCBjLCBjYWxsZXIsICJSZWZ1bmRlZCIpCn0KCi8vIFBydW5lIHJlbW92ZXMgYSBzZXR0bGVkIGNhbXBhaWduIHJlY29yZCB0aGF0IGhvbGRzIG5vIGNvaW5zLAovLyByZWNsYWltaW5nIGl0cyBzdG9yYWdlLiBBbnlvbmUgbWF5IGNhbGwgaXQ6IHRoZSBjaGFpbiByZWZ1bmRzIHRoZQovLyBmcmVlZCBzdG9yYWdlIGRlcG9zaXQgdG8gdGhlIHBydW5pbmcgdHJhbnNhY3Rpb24sIHdoaWNoIGlzIHRoZQovLyBpbmNlbnRpdmUuIEEgcmVjb3JkIHdpdGggcmFpc2VkID4gMCBzdGlsbCBjYXJyaWVzIGJhY2tlciBlbnRpdGxlbWVudHMKLy8gYW5kIGlzIG5vdCBwcnVuYWJsZS4KZnVuYyBQcnVuZShjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJYyA6PSBtdXN0R2V0KGlkKQoJaWYgYy5zdGF0ZSA9PSBzdGF0ZUZ1bmRpbmcgewoJCXBhbmljKCJjYW1wYWlnbiBpcyBub3Qgc2V0dGxlZCIpCgl9CglpZiBjLnJhaXNlZCAhPSAwIHsKCQlwYW5pYygiY2FtcGFpZ24gc3RpbGwgaG9sZHMgYmFja2VyIGZ1bmRzIikKCX0KCWNhbXBhaWducy5SZW1vdmUocGFkSUQoYy5pZCkpCgljaGFpbi5FbWl0KCJQcnVuZWQiLCAiaWQiLCBpdG9hKGMuaWQpLCAiYnkiLAoJCWN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS5TdHJpbmcoKSkKfQoKLy8gLS0tIGZlZXMgYW5kIHN1cnBsdXMgLS0tCgovLyBXaXRoZHJhd0ZlZXMgcGF5cyB0aGUgZW50aXJlIGFjY3J1ZWQgZmVlIHBvdCB0byB0aGUgY29tcGlsZS10aW1lCi8vIEZlZUNvbGxlY3Rvci4gQW55b25lIG1heSBjYWxsIGl0OiB0aGUgZGVzdGluYXRpb24gaXMgZml4ZWQsIHNvIHRoZXJlCi8vIGlzIG5vdGhpbmcgZm9yIGEgY2FsbGVyIHRvIHN0ZWVyLgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglmZWVzIDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgZmVlcyA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBGZWVDb2xsZWN0b3IsIERlbm9tLCBmZWVzKQoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoZmVlcykpCglyZXR1cm4gZmVlcwp9CgovLyBTd2VlcFN1cnBsdXMgc2VuZHMgb3V0LW9mLWJhbmQgY29pbnMgdG8gdGhlIEZlZUNvbGxlY3RvcjogZm9yIHRoZSBwb3QKLy8gZGVub20sIGV2ZXJ5dGhpbmcgYWJvdmUgdHJhY2tlZCBsaWFiaWxpdGllczsgZm9yIGFueSBmb3JlaWduIGRlbm9tLAovLyB0aGUgZnVsbCBiYWxhbmNlLiBUcmFja2VkIGJhY2tlciBtb25leSBhbmQgdGhlIGZlZSBwb3QgYXJlCi8vIHVudG91Y2hhYmxlIGJ5IGNvbnN0cnVjdGlvbiAoY29pbmlvLlN3ZWVwIHJlZnVzZXMgdG8gZGlwIGJlbG93IHRoZQovLyByZXNlcnZlKS4gQW55b25lIG1heSBjYWxsIGl0LgpmdW5jIFN3ZWVwU3VycGx1cyhjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gTGlhYmlsaXRpZXMoKQoJfQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgRmVlQ29sbGVjdG9yLCBkZW5vbSwgcmVzZXJ2ZSkKCWNoYWluLkVtaXQoIlN3ZXB0IiwgImRlbm9tIiwgZGVub20sICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShzd2VwdCkpCglyZXR1cm4gc3dlcHQKfQoKLy8gLS0tIHZpZXdzIC0tLQoKLy8gQ2FtcGFpZ25JbmZvIHJldHVybnMgYSBjYW1wYWlnbidzIGZpeGVkIHRlcm1zIGFuZCBsaXZlIHRhbGxpZXMuCmZ1bmMgQ2FtcGFpZ25JbmZvKGlkIGludDY0KSAoY3JlYXRvciBhZGRyZXNzLCBnb2FsLCByYWlzZWQsIGZlZUJwcywKCWNyZWF0ZWRBdCwgZGVhZGxpbmUsIGNsYWltRW5kIGludDY0LCBiYWNrZXJzIGludCwgc3RhdGUgc3RyaW5nKSB7CgljIDo9IG11c3RHZXQoaWQpCglyZXR1cm4gYy5jcmVhdG9yLCBjLmdvYWwsIGMucmFpc2VkLCBjLmZlZUJwcywKCQljLmNyZWF0ZWRBdCwgYy5kZWFkbGluZSwgYy5jbGFpbUVuZCwgYmFja2VyQ291bnQoYyksIGMuc3RhdGUKfQoKLy8gQ2FtcGFpZ25UaXRsZSByZXR1cm5zIGEgY2FtcGFpZ24ncyByYXcgdGl0bGUgKHVuc2FuaXRpemVkOiBjYWxsZXJzCi8vIHJlbmRlcmluZyBpdCBpbnRvIG1hcmtkb3duIG11c3Qgc2FuaXRpemUsIGFzIHRoaXMgcmVhbG0ncyBSZW5kZXIgZG9lcykuCmZ1bmMgQ2FtcGFpZ25UaXRsZShpZCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RHZXQoaWQpLnRpdGxlIH0KCi8vIENhbXBhaWduTWVtbyByZXR1cm5zIGEgY2FtcGFpZ24ncyByYXcgbWVtbyAoc2FtZSBjYXZlYXQgYXMgdGhlIHRpdGxlKS4KZnVuYyBDYW1wYWlnbk1lbW8oaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0R2V0KGlkKS5tZW1vIH0KCi8vIFN0YXR1cyByZXR1cm5zIHRoZSBodW1hbiB2ZXJkaWN0IGZvciBhIGNhbXBhaWduIHJpZ2h0IG5vdzogImZ1bmRpbmciLAovLyAic3VjY2VlZGVkIChhd2FpdGluZyBjcmVhdG9yIGNsYWltKSIsICJmYWlsZWQgKHJlZnVuZHMgb3BlbikiLAovLyAicGFpZCIsICJjYW5jZWxsZWQiLCBvciAibGFwc2VkIi4KZnVuYyBTdGF0dXMoaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBzdGF0dXMobXVzdEdldChpZCksIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgfQoKLy8gUGxlZGdlT2YgcmV0dXJucyBhZGRyJ3MgbGl2ZSBwbGVkZ2UgaW4gYSBjYW1wYWlnbiAoMCBpZiBub25lLCBhbmQgMAovLyBmb3Igc2V0dGxlZCBjYW1wYWlnbnMgd2hvc2UgcGxlZGdlIHRhYmxlIGhhcyBiZWVuIGRyb3BwZWQpLgpmdW5jIFBsZWRnZU9mKGlkIGludDY0LCBhZGRyIGFkZHJlc3MpIGludDY0IHsKCWMgOj0gbXVzdEdldChpZCkKCWlmIGMucGxlZGdlcyA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gcGxlZGdlT2YoYywgYWRkci5TdHJpbmcoKSkKfQoKLy8gSXNSZWZ1bmRhYmxlIHJlcG9ydHMgd2hldGhlciBSZWZ1bmQgd291bGQgY3VycmVudGx5IGFjY2VwdCB0aGlzCi8vIGNhbXBhaWduIChmb3IgYW55IGJhY2tlciB3aXRoIGEgbGl2ZSBwbGVkZ2UpLgpmdW5jIElzUmVmdW5kYWJsZShpZCBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gcmVmdW5kYWJsZShtdXN0R2V0KGlkKSwgcnVudGltZS5DaGFpbkhlaWdodCgpKQp9CgovLyBOdW1DYW1wYWlnbnMgcmV0dXJucyBob3cgbWFueSBjYW1wYWlnbnMgaGF2ZSBldmVyIGJlZW4gbGF1bmNoZWQuCi8vIFBydW5lIHJlbW92ZXMgcmVjb3JkcyBidXQgbmV2ZXIgcmV1c2VzIGlkcy4KZnVuYyBOdW1DYW1wYWlnbnMoKSBpbnQ2NCB7IHJldHVybiBuZXh0SUQgfQoKLy8gT3BlbkNhbXBhaWducyByZXR1cm5zIGhvdyBtYW55IGNhbXBhaWducyBhcmUgY3VycmVudGx5IHVuc2V0dGxlZC4KZnVuYyBPcGVuQ2FtcGFpZ25zKCkgaW50NjQgeyByZXR1cm4gaW50NjQoYm9vay5PcGVuQ291bnQoKSkgfQoKLy8gT3Blbk9mIHJldHVybnMgaG93IG1hbnkgdW5zZXR0bGVkIGNhbXBhaWducyBhZGRyIGN1cnJlbnRseSBoYXMuCmZ1bmMgT3Blbk9mKGFkZHIgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gY3JlYXRvck9wZW4oYWRkci5TdHJpbmcoKSkgfQoKLy8gVG90YWxCYWNrZWQgcmV0dXJucyB0aGUgQiB0ZXJtOiBjb2lucyBoZWxkIGZvciBjYW1wYWlnbnMuCmZ1bmMgVG90YWxCYWNrZWQoKSBpbnQ2NCB7IHJldHVybiB0b3RhbEJhY2tlZCB9CgovLyBGZWVzQWNjcnVlZCByZXR1cm5zIHRoZSBGIHRlcm06IGNoYXJnZWQsIG5vdCB5ZXQgd2l0aGRyYXduLgpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkZlZXNBY2NydWVkKCkgfQoKLy8gTGlhYmlsaXRpZXMgcmV0dXJucyBCICsgRiDigJQgZXZlcnl0aGluZyB0aGlzIHJlYWxtIG93ZXMuCmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCB7IHJldHVybiB0b3RhbEJhY2tlZCArIGxlZGdlci5MaWFiaWxpdGllcygpIH0KCi8vIEhlbGQgcmV0dXJucyBIOiB0aGUgdWdub3QgYWN0dWFsbHkgYXQgdGhpcyByZWFsbSdzIGFkZHJlc3MuCmZ1bmMgSGVsZCgpIGludDY0IHsgcmV0dXJuIGNvaW5pby5IZWxkQXQoc2VsZiwgRGVub20pIH0KCi8vIFN1cnBsdXMgcmV0dXJucyBIIC0gKEIgKyBGKSDigJQgb3V0LW9mLWJhbmQgY29pbnMsIHN3ZWVwYWJsZS4KZnVuYyBTdXJwbHVzKCkgaW50NjQgeyByZXR1cm4gSGVsZCgpIC0gTGlhYmlsaXRpZXMoKSB9CgovLyBBZGRyZXNzIHJldHVybnMgdGhpcyByZWFsbSdzIG93biBhZGRyZXNzLgpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIHNlbGYgfQoKLy8gSGVpZ2h0IHJldHVybnMgdGhlIGN1cnJlbnQgY2hhaW4gaGVpZ2h0LCB0aGUgY2xvY2sgZXZlcnkgZGVhZGxpbmUgaXMKLy8gbWVhc3VyZWQgYWdhaW5zdC4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIHJlbmRlciAtLS0KCi8vIFJlbmRlciBzaG93cyB0aGUgcmVhbG0gYXQgIiIgYW5kIGEgY2FtcGFpZ24gcGFnZSBhdCAiPGlkPiIuIFRpdGxlcwovLyBhbmQgbWVtb3MgYXJlIGZyZWUgdGV4dCBhbmQgcGFzcyB0aHJvdWdoIHRoZSBlY29zeXN0ZW0gc2FuaXRpemVyCi8vIGJlZm9yZSBoaXR0aW5nIG1hcmtkb3duLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiByZW5kZXJDYW1wYWlnbihwYXRoKQoJfQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaGVsZCA6PSBIZWxkKCkKCWxpYWIgOj0gTGlhYmlsaXRpZXMoKQoJY29uc2VydmF0aW9uIDo9ICJPSyIKCWlmIGhlbGQgPCBsaWFiIHsKCQljb25zZXJ2YXRpb24gPSAiVklPTEFURUQiCgl9CglvdXQgOj0gIiMgQ3Jvd2RmdW5kXG5cbiIKCW91dCArPSAiQWxsLW9yLW5vdGhpbmcgY3Jvd2RmdW5kaW5nIGluIEdOT1Q6IGhpdCB0aGUgZ29hbCBieSB0aGUgZGVhZGxpbmUgIiArCgkJImFuZCB0aGUgY3JlYXRvciBjb2xsZWN0cyAobWludXMgYSAiICsgYnBzKFN1Y2Nlc3NGZWVCcHMpICsKCQkiIHN1Y2Nlc3MgZmVlKTsgbWlzcyBpdCBhbmQgZXZlcnkgYmFja2VyIHJlY2xhaW1zIGV4YWN0bHkgd2hhdCB0aGV5ICIgKwoJCSJwbGVkZ2VkLCBmZWUtZnJlZS5cblxuIgoJb3V0ICs9ICIjIyBUZXJtcyAoZml4ZWQgYXQgZGVwbG95OyBubyBhZG1pbiwgbm8gc2V0dGVycylcblxuIgoJb3V0ICs9ICItIHN1Y2Nlc3MgZmVlOiAiICsgYnBzKFN1Y2Nlc3NGZWVCcHMpICsgIiBvZiByYWlzZWQsIGNoYXJnZWQgb25seSBvbiBhIHN1Y2Nlc3NmdWwgY2xhaW0gKGhhcmQgY2FwICIgKyBicHMoTWF4RmVlQnBzKSArICIpXG4iCglvdXQgKz0gIi0gcmVmdW5kcyBhbmQgdW5wbGVkZ2VzOiBhbHdheXMgd2hvbGUsIGFsd2F5cyBmZWUtZnJlZVxuIgoJb3V0ICs9ICItIGdvYWw6IGF0IGxlYXN0ICIgKyBpdG9hKE1pbkdvYWwpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gZnVuZGluZyBkdXJhdGlvbjogIiArIGl0b2EoTWluRHVyYXRpb25CbG9ja3MpICsgIiB0byAiICsgaXRvYShNYXhEdXJhdGlvbkJsb2NrcykgKyAiIGJsb2Nrc1xuIgoJb3V0ICs9ICItIGNsYWltIHdpbmRvdyBhZnRlciBkZWFkbGluZTogIiArIGl0b2EoQ2xhaW1XaW5kb3dCbG9ja3MpICsgIiBibG9ja3MsIHRoZW4gYW55b25lIG1heSBMYXBzZVxuIgoJb3V0ICs9ICItIG9wZW4gY2FtcGFpZ25zOiAiICsgaXRvYShPcGVuQ2FtcGFpZ25zKCkpICsgIiBvZiAiICsgc3RyY29udi5JdG9hKE1heE9wZW5DYW1wYWlnbnMpICsKCQkiIChwZXIgY3JlYXRvcjogIiArIGl0b2EoTWF4T3BlblBlckNyZWF0b3IpICsgIilcbiIKCW91dCArPSAiLSBjdXJyZW50IGhlaWdodDogIiArIGl0b2Eobm93KSArICJcblxuIgoJb3V0ICs9ICIjIyBBY2NvdW50aW5nIChIID09IEIgKyBGICsgUylcblxuIgoJb3V0ICs9ICItIGJhY2tlZCAoQik6ICIgKyBpdG9hKHRvdGFsQmFja2VkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGZlZSBwb3QgKEYpOiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBoZWxkIChIKTogIiArIGl0b2EoaGVsZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBzdXJwbHVzIChTKTogIiArIGl0b2EoaGVsZC1saWFiKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGNvbnNlcnZhdGlvbjogIiArIGNvbnNlcnZhdGlvbiArICJcbiIKCW91dCArPSAiLSBsaWZldGltZSBwbGVkZ2VkIC8gcGFpZCBvdXQgLyByZXR1cm5lZDogIiArIGl0b2EobGlmZXRpbWVQbGVkZ2VkKSArCgkJIiAvICIgKyBpdG9hKGxpZmV0aW1lUGFpZE91dCkgKyAiIC8gIiArIGl0b2EobGlmZXRpbWVSZXR1cm5lZCkgKyBEZW5vbSArICJcblxuIgoJb3V0ICs9ICIjIyBMYXRlc3QgY2FtcGFpZ25zXG5cbiIKCWlmIGNhbXBhaWducy5TaXplKCkgPT0gMCB7CgkJb3V0ICs9ICJOb25lIHlldC4gTGF1bmNoIG9uZS5cbiIKCX0gZWxzZSB7CgkJc2hvd24gOj0gMAoJCWNhbXBhaWducy5SZXZlcnNlSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQkJYyA6PSB2LigqY2FtcGFpZ24pCgkJCW91dCArPSAiLSBbIyIgKyBpdG9hKGMuaWQpICsgIl0oIiArIFJlYWxtUGF0aCArICI6IiArIGl0b2EoYy5pZCkgKyAiKSBbIiArCgkJCQlzdGF0dXMoYywgbm93KSArICJdICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGMudGl0bGUpICsgIiDigJQgIiArCgkJCQlpdG9hKGMucmFpc2VkKSArICIgLyAiICsgaXRvYShjLmdvYWwpICsgRGVub20gKyAiXG4iCgkJCXNob3duKysKCQkJcmV0dXJuIHNob3duID49IE1heFJlbmRlclJvd3MKCQl9KQoJCWlmIGludDY0KHNob3duKSA8IG5leHRJRCB7CgkJCW91dCArPSAiXG4+IFshTk9URV1cbj4gU2hvd2luZyB0aGUgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKwoJCQkJIiBtb3N0IHJlY2VudCBvZiAiICsgaXRvYShuZXh0SUQpICsKCQkJCSIgZXZlciBsYXVuY2hlZCAoc2V0dGxlZCByZWNvcmRzIG1heSBoYXZlIGJlZW4gcHJ1bmVkKS4gIiArCgkJCQkiVXNlIENhbXBhaWduSW5mbyhpZCkgZm9yIGFueSBzcGVjaWZpYyBjYW1wYWlnbi5cbiIKCQl9Cgl9CglkdWUgOj0gYm9vay5EdWUobm93LCA1KQoJbGFwc2FibGUgOj0gYm9vay5FeHBpcmFibGUobm93LCA1KQoJaWYgbGVuKGR1ZSkgPiAwIHx8IGxlbihsYXBzYWJsZSkgPiAwIHsKCQlvdXQgKz0gIlxuIyMgS2VlcGVyIHdvcmtcblxuIgoJfQoJaWYgbGVuKGR1ZSkgPiAwIHsKCQlvdXQgKz0gIlNldHRsZW1lbnRzIGR1ZSDigJQgdGhlIGNyZWF0b3IgbWF5IENyZWF0b3JDbGFpbShpZCkgaWYgdGhlICIgKwoJCQkiZ29hbCBpcyBtZXQ7IGFueW9uZSBtYXkgU2V0dGxlRmFpbGVkKGlkKSBpZiBpdCBpcyBub3Q6XG5cbiIKCQlmb3IgXywgZCA6PSByYW5nZSBkdWUgewoJCQlvdXQgKz0gIi0gY2FtcGFpZ24gIyIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGQuUGF5bG9hZCkgKyAiXG4iCgkJfQoJfQoJaWYgbGVuKGxhcHNhYmxlKSA+IDAgewoJCW91dCArPSAiU2V0dGxlbWVudHMgcGFzdCB0aGVpciBjbGFpbSB3aW5kb3cg4oCUIGFueW9uZSBtYXkgY2FsbCBMYXBzZShpZCkgIiArCgkJCSJ0byBvcGVuIHJlZnVuZHM6XG5cbiIKCQlmb3IgXywgZCA6PSByYW5nZSBsYXBzYWJsZSB7CgkJCW91dCArPSAiLSBjYW1wYWlnbiAjIiArIHNhbml0aXplLklubGluZVRleHQoZC5QYXlsb2FkKSArICJcbiIKCQl9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyQ2FtcGFpZ24ocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocGF0aCwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gaW52YWxpZCBjYW1wYWlnbiBpZFxuIgoJfQoJdiA6PSBjYW1wYWlnbnMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiB1bmtub3duIGNhbXBhaWduIGlkIChuZXZlciBsYXVuY2hlZCwgb3Igc2V0dGxlZCBhbmQgcHJ1bmVkKVxuIgoJfQoJYyA6PSB2LigqY2FtcGFpZ24pCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJb3V0IDo9ICIjICMiICsgaXRvYShjLmlkKSArICI6ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGMudGl0bGUpICsgIlxuXG4iCglvdXQgKz0gIi0gc3RhdHVzOiAqKiIgKyBzdGF0dXMoYywgbm93KSArICIqKlxuIgoJb3V0ICs9ICItIGNyZWF0b3I6IGAiICsgYy5jcmVhdG9yLlN0cmluZygpICsgImBcbiIKCW91dCArPSAiLSByYWlzZWQ6ICIgKyBpdG9hKGMucmFpc2VkKSArICIgLyAiICsgaXRvYShjLmdvYWwpICsgRGVub20gKwoJCSIgKCIgKyBwZXJjZW50KGMucmFpc2VkLCBjLmdvYWwpICsgIilcbiIKCW91dCArPSAiLSBiYWNrZXJzOiAiICsgc3RyY29udi5JdG9hKGJhY2tlckNvdW50KGMpKSArICJcbiIKCW91dCArPSAiLSBzdWNjZXNzIGZlZTogIiArIGJwcyhjLmZlZUJwcykgKyAiIChzbmFwc2hvdHRlZCBhdCBsYXVuY2gpXG4iCglvdXQgKz0gIi0gY3JlYXRlZCBhdCBibG9jazogIiArIGl0b2EoYy5jcmVhdGVkQXQpICsgIlxuIgoJb3V0ICs9ICItIGRlYWRsaW5lOiBibG9jayAiICsgaXRvYShjLmRlYWRsaW5lKSArICJcbiIKCW91dCArPSAiLSBjbGFpbSB3aW5kb3cgY2xvc2VzOiBibG9jayAiICsgaXRvYShjLmNsYWltRW5kKSArICJcbiIKCW91dCArPSAiLSBjdXJyZW50IGhlaWdodDogIiArIGl0b2Eobm93KSArICJcblxuIgoJc3dpdGNoIHsKCWNhc2UgYy5zdGF0ZSA9PSBzdGF0ZUZ1bmRpbmcgJiYgbm93IDwgYy5kZWFkbGluZToKCQlvdXQgKz0gIlBsZWRnZSgiICsgaXRvYShjLmlkKSArICIpIHdpdGggLXNlbmQgdG8gYmFjayBpdDsgIiArCgkJCSJVbnBsZWRnZSgiICsgaXRvYShjLmlkKSArICIpIHRvIGJhY2sgb3V0LiAiICsKCQkJaXRvYShjLmRlYWRsaW5lLW5vdykgKyAiIGJsb2NrcyByZW1haW4uXG4iCgljYXNlIGMuc3RhdGUgPT0gc3RhdGVGdW5kaW5nICYmIGMucmFpc2VkID49IGMuZ29hbCAmJiBub3cgPCBjLmNsYWltRW5kOgoJCW91dCArPSAiKipHb2FsIHJlYWNoZWQuKiogVGhlIGNyZWF0b3IgbWF5IENyZWF0b3JDbGFpbSgiICsgaXRvYShjLmlkKSArCgkJCSIpIHVudGlsIGJsb2NrICIgKyBpdG9hKGMuY2xhaW1FbmQpICsgIi5cbiIKCWNhc2UgYy5zdGF0ZSA9PSBzdGF0ZUZ1bmRpbmcgJiYgYy5yYWlzZWQgPj0gYy5nb2FsOgoJCW91dCArPSAiKipDbGFpbSB3aW5kb3cgb3Zlci4qKiBBbnlvbmUgbWF5IExhcHNlKCIgKyBpdG9hKGMuaWQpICsKCQkJIikgdG8gb3BlbiByZWZ1bmRzLlxuIgoJY2FzZSBjLnN0YXRlID09IHN0YXRlRnVuZGluZyAmJiBub3cgPCBjLmNsYWltRW5kOgoJCW91dCArPSAiKipHb2FsIG5vdCByZWFjaGVkLioqIEJhY2tlcnMgbWF5IFJlZnVuZCgiICsgaXRvYShjLmlkKSArCgkJCSIpOyBhbnlvbmUgbWF5IFNldHRsZUZhaWxlZCgiICsgaXRvYShjLmlkKSArCgkJCSIpIHRvIGNsb3NlIGl0IG91dC5cbiIKCWNhc2UgYy5zdGF0ZSA9PSBzdGF0ZUZ1bmRpbmc6CgkJLy8gUGFzdCB0aGUgY2xhaW0gd2luZG93IHRoZSBkZWZlcnJhbCBpcyBleHBpcmVkLCBzbyB0aGUgZmFpbGVkCgkJLy8gcGF0aCBjbG9zZXMgdmlhIExhcHNlLCBub3QgU2V0dGxlRmFpbGVkIChhdWRpdCBHMSkuCgkJb3V0ICs9ICIqKkdvYWwgbm90IHJlYWNoZWQuKiogQmFja2VycyBtYXkgUmVmdW5kKCIgKyBpdG9hKGMuaWQpICsKCQkJIik7IGFueW9uZSBtYXkgTGFwc2UoIiArIGl0b2EoYy5pZCkgKyAiKSB0byBjbG9zZSBpdCBvdXQuXG4iCgljYXNlIGMucmFpc2VkID4gMDoKCQlvdXQgKz0gIkJhY2tlcnMgbWF5IFJlZnVuZCgiICsgaXRvYShjLmlkKSArICIpLlxuIgoJZGVmYXVsdDoKCQlvdXQgKz0gIkZ1bGx5IHNldHRsZWQuIEFueW9uZSBtYXkgUHJ1bmUoIiArIGl0b2EoYy5pZCkgKwoJCQkiKSB0byByZWNsYWltIHRoZSByZWNvcmQncyBzdG9yYWdlLlxuIgoJfQoJaWYgYy5tZW1vICE9ICIiIHsKCQlvdXQgKz0gIlxuIyMgQWJvdXRcblxuIiArIHNhbml0aXplLklubGluZVRleHQoYy5tZW1vKSArICJcbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIGludGVybmFscyAtLS0KCmZ1bmMgbXVzdEdldChpZCBpbnQ2NCkgKmNhbXBhaWduIHsKCXYgOj0gY2FtcGFpZ25zLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gY2FtcGFpZ24gaWQiKQoJfQoJcmV0dXJuIHYuKCpjYW1wYWlnbikKfQoKLy8gcGF5QmFjayBpcyB0aGUgc2hhcmVkIHdob2xlLXBsZWRnZSByZXR1cm4gcGF0aCBmb3IgVW5wbGVkZ2UgYW5kCi8vIFJlZnVuZDogZGViaXQgdGhlIGJhY2tlcidzIGVudHJ5IGFuZCB0aGUgY2FtcGFpZ24gYmVmb3JlIHRoZQovLyBpZGVudGljYWwgYW1vdW50IGxlYXZlcyB0aGUgcmVhbG0uCmZ1bmMgcGF5QmFjayhjdXIgcmVhbG0sIGMgKmNhbXBhaWduLCBiYWNrZXIgYWRkcmVzcywgZXZlbnQgc3RyaW5nKSB7CglrZXkgOj0gYmFja2VyLlN0cmluZygpCglhbW91bnQgOj0gcGxlZGdlT2YoYywga2V5KQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBwbGVkZ2UgdG8gcmV0dXJuIikKCX0KCWMucGxlZGdlcy5SZW1vdmUoa2V5KQoJYy5yYWlzZWQgLT0gYW1vdW50Cgl0b3RhbEJhY2tlZCAtPSBhbW91bnQKCW5ld1JldHVybmVkLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lUmV0dXJuZWQsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIHJldHVybmVkIHdvdWxkIG92ZXJmbG93IikKCX0KCWxpZmV0aW1lUmV0dXJuZWQgPSBuZXdSZXR1cm5lZAoKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBiYWNrZXIsIERlbm9tLCBhbW91bnQpCgoJY2hhaW4uRW1pdChldmVudCwgImlkIiwgaXRvYShjLmlkKSwgImJhY2tlciIsIGtleSwKCQkiYW1vdW50IiwgaXRvYShhbW91bnQpLCAicmFpc2VkIiwgaXRvYShjLnJhaXNlZCkpCn0KCi8vIHJlZnVuZGFibGU6IGZhaWxlZCwgY2FuY2VsbGVkIGFuZCBsYXBzZWQgY2FtcGFpZ25zIGFsd2F5czsgYW4KLy8gdW5zZXR0bGVkIGNhbXBhaWduIG9uY2UgaXRzIGRlYWRsaW5lIGhhcyBwYXNzZWQgd2l0aCB0aGUgZ29hbCB1bm1ldC4KLy8gQSBzdWNjZWVkZWQgY2FtcGFpZ24gaW5zaWRlIGl0cyBjbGFpbSB3aW5kb3cgaXMgTk9UIHJlZnVuZGFibGUg4oCUIHRoZQovLyBwb3QgaXMgdGhlIGNyZWF0b3IncyB0byBjb2xsZWN0IHVudGlsIENhbmNlbCBvciBMYXBzZSBzYXlzIG90aGVyd2lzZS4KZnVuYyByZWZ1bmRhYmxlKGMgKmNhbXBhaWduLCBub3cgaW50NjQpIGJvb2wgewoJc3dpdGNoIGMuc3RhdGUgewoJY2FzZSBzdGF0ZUZhaWxlZCwgc3RhdGVDYW5jZWxsZWQsIHN0YXRlTGFwc2VkOgoJCXJldHVybiB0cnVlCgljYXNlIHN0YXRlRnVuZGluZzoKCQlyZXR1cm4gbm93ID49IGMuZGVhZGxpbmUgJiYgYy5yYWlzZWQgPCBjLmdvYWwKCWRlZmF1bHQ6CgkJcmV0dXJuIGZhbHNlCgl9Cn0KCmZ1bmMgc3RhdHVzKGMgKmNhbXBhaWduLCBub3cgaW50NjQpIHN0cmluZyB7CglpZiBjLnN0YXRlICE9IHN0YXRlRnVuZGluZyB7CgkJcmV0dXJuIGMuc3RhdGUKCX0KCXN3aXRjaCB7CgljYXNlIG5vdyA8IGMuZGVhZGxpbmU6CgkJcmV0dXJuIHN0YXRlRnVuZGluZwoJY2FzZSBjLnJhaXNlZCA+PSBjLmdvYWw6CgkJcmV0dXJuICJzdWNjZWVkZWQgKGF3YWl0aW5nIGNyZWF0b3IgY2xhaW0pIgoJZGVmYXVsdDoKCQlyZXR1cm4gImZhaWxlZCAocmVmdW5kcyBvcGVuKSIKCX0KfQoKZnVuYyBwbGVkZ2VPZihjICpjYW1wYWlnbiwga2V5IHN0cmluZykgaW50NjQgewoJdiA6PSBjLnBsZWRnZXMuR2V0KGtleSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHYuKGludDY0KQp9CgpmdW5jIGJhY2tlckNvdW50KGMgKmNhbXBhaWduKSBpbnQgewoJaWYgYy5wbGVkZ2VzID09IG5pbCB7CgkJcmV0dXJuIGMuYmFja2VycwoJfQoJcmV0dXJuIGMucGxlZGdlcy5TaXplKCkKfQoKZnVuYyBjcmVhdG9yT3BlbihrZXkgc3RyaW5nKSBpbnQ2NCB7Cgl2IDo9IG9wZW5CeUNyZWF0b3IuR2V0KGtleSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHYuKGludDY0KQp9CgpmdW5jIHNldENyZWF0b3JPcGVuKGtleSBzdHJpbmcsIG4gaW50NjQpIHsKCWlmIG4gPD0gMCB7CgkJb3BlbkJ5Q3JlYXRvci5SZW1vdmUoa2V5KQoJCXJldHVybgoJfQoJb3BlbkJ5Q3JlYXRvci5TZXQoa2V5LCBuKQp9CgpmdW5jIGRlY0NyZWF0b3JPcGVuKGtleSBzdHJpbmcpIHsgc2V0Q3JlYXRvck9wZW4oa2V5LCBjcmVhdG9yT3BlbihrZXkpLTEpIH0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KCi8vIGJwcyByZW5kZXJzIGEgYmFzaXMtcG9pbnQgZmlndXJlIGFzIGEgaHVtYW4gcGVyY2VudGFnZSwgZXhhY3RseS4KZnVuYyBicHMobiBpbnQ2NCkgc3RyaW5nIHsKCXdob2xlIDo9IG4gLyAxMDAKCWZyYWMgOj0gbiAlIDEwMAoJaWYgZnJhYyA9PSAwIHsKCQlyZXR1cm4gaXRvYSh3aG9sZSkgKyAiJSIKCX0KCWlmIGZyYWMlMTAgPT0gMCB7CgkJcmV0dXJuIGl0b2Eod2hvbGUpICsgIi4iICsgaXRvYShmcmFjLzEwKSArICIlIgoJfQoJcGFkIDo9ICIiCglpZiBmcmFjIDwgMTAgewoJCXBhZCA9ICIwIgoJfQoJcmV0dXJuIGl0b2Eod2hvbGUpICsgIi4iICsgcGFkICsgaXRvYShmcmFjKSArICIlIgp9CgovLyBwZXJjZW50IHJlbmRlcnMgcmFpc2VkL2dvYWwgYXMgYW4gaW50ZWdlciBwZXJjZW50YWdlIChmbG9vcikuCi8vIGdvYWwgPj0gTWluR29hbCA+IDAgYnkgY29uc3RydWN0aW9uLCBzbyBubyBkaXZpZGUgZ3VhcmQgaXMgbmVlZGVkLgpmdW5jIHBlcmNlbnQocmFpc2VkLCBnb2FsIGludDY0KSBzdHJpbmcgewoJcSA6PSByYWlzZWQgLyBnb2FsCglyIDo9IHJhaXNlZCAlIGdvYWwKCXZhciBwIGludDY0CglpZiByIDw9IChpbnQ2NCgxKTw8NjIpLzEwMCB7CgkJcCA9IHEqMTAwICsgcioxMDAvZ29hbAoJfSBlbHNlIHsKCQkvLyBnb2FsICg+IHIpIGlzIHNvIGxhcmdlIHRoYXQgcioxMDAgd291bGQgb3ZlcmZsb3c7IHRoZSBzY2FsZWQKCQkvLyBmb3JtIGxvc2VzIGF0IG1vc3QgYSByb3VuZGluZyBzdGVwLCB3aGljaCBpcyBjb3NtZXRpYyBoZXJlLgoJCXAgPSBxKjEwMCArIHIvKGdvYWwvMTAwKQoJfQoJcmV0dXJuIGl0b2EocCkgKyAiJSIKfQoKLy8gcGFkSUQgZW5jb2RlcyBhbiBpZCBzbyBhdmwncyBsZXhpY2FsIG9yZGVyIG1hdGNoZXMgbnVtZXJpYyBvcmRlci4KZnVuYyBwYWRJRChpZCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRJbnQoaWQsIDEwKQoJY29uc3Qgd2lkdGggPSAyMAoJaWYgbGVuKHMpID49IHdpZHRoIHsKCQlyZXR1cm4gcwoJfQoJcmV0dXJuIHplcm9zWzp3aWR0aC1sZW4ocyldICsgcwp9Cgpjb25zdCB6ZXJvcyA9ICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIKCi8vIGNoZWNrZWRBZGQgcmV0dXJucyBhK2IgYW5kIHJlcG9ydHMgd2hldGhlciB0aGUgYWRkaXRpb24gZGlkIG5vdAovLyBvdmVyZmxvdyBpbnQ2NC4KZnVuYyBjaGVja2VkQWRkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJc3VtIDo9IGEgKyBiCglpZiAoYiA+IDAgJiYgc3VtIDwgYSkgfHwgKGIgPCAwICYmIHN1bSA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBzdW0sIHRydWUKfQoaxNkBChJjcm93ZGZ1bmRfdGVzdC5nbm8SrNkBcGFja2FnZSBjcm93ZGZ1bmQKCmltcG9ydCAoCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJjaGFpbiIKCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2NvaW5pbyIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCgljcmVhdG9yMSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiY2ZjcmVhdG9yMSIpCgljcmVhdG9yMiA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiY2ZjcmVhdG9yMiIpCgliYWNrZXJBICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiY2ZiYWNrZXJhIikKCWJhY2tlckIgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJjZmJhY2tlcmIiKQoJbWFsbG9yeSAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImNmbWFsbG9yeSIpCikKCi8vIEhBUk5FU1MgTk9URVMsIGNhcnJpZWQgZnJvbSB0aGUgdHJlYXN1cnlfYm9hcmQsIHZlc3RpbmcgYW5kIGdyYW50cwovLyBzdWl0ZXMgKG1lYXN1cmVkIHRoZXJlLCByZWxpZWQgb24gaGVyZSk6Ci8vCi8vICAgLSB0ZXN0aW5nLlNldFJlYWxtIHJlY29yZHMgdGhlIG92ZXJyaWRlIHBlciBGUkFNRSBJTkRFWDogc3RhZ2UgdGhlCi8vICAgICBjYWxsZXIgSU5MSU5FIGluIHRoZSB0ZXN0IGZ1bmN0aW9uJ3MgZnJhbWUgYmVmb3JlIGEgdWFzc2VydCBjYWxsLAovLyAgICAgb3IgaW5zaWRlIGEgaGVscGVyIHRoYXQgc3RhZ2VzIGFuZCBjYWxscyBpbiBvbmUgZnJhbWUgb2YgaXRzIG93bi4KLy8gICAgIE5ldmVyIGluc2lkZSBhIHVhc3NlcnQgY2xvc3VyZSDigJQgdGhhdCBzdGFnaW5nIGRvZXMgbm90IHRha2UuCi8vCi8vICAgLSB0ZXN0aW5nLlNraXBIZWlnaHRzIFJFUExBQ0VTIHRoZSB3aG9sZSBjb250ZXh0IChPcmlnaW5DYWxsZXIsCi8vICAgICBDdXJyZW50UmVhbG0sIE9yaWdpblNlbmQgaW5jbHVkZWQpLiBSZS1zdGFnZSBhZnRlciBldmVyeSBza2lwLgovLwovLyAgIC0gUmVhbG0gZ2xvYmFscyBQRVJTSVNUIGFjcm9zcyB0ZXN0cyB3aGlsZSBiYW5rZXIgc3RhdGUgcmVzZXRzIHBlcgovLyAgICAgdGVzdC4gYmVnaW4oKSBkaXNhcm1zIGFueSBsZWZ0b3ZlciBlbnZlbG9wZSBhbmQgcmUtc2VlZHMgdGhlCi8vICAgICByZWFsbSdzIGJhbmsgdG8gaXRzIGNhcnJpZWQgbGlhYmlsaXRpZXMsIHNvIGNvbnNlcnZhdGlvbiBpcwovLyAgICAgYXNzZXJ0ZWQgaW4gREVMVEEgZm9ybS4KLy8KLy8gICAtIEEgcGFuaWMgY2F1Z2h0IGJ5IHVhc3NlcnQgZG9lcyBOT1Qgcm9sbCBiYWNrIHJlYWxtIGdsb2JhbHMgaGVyZSwKLy8gICAgIHdoZXJlYXMgb24tY2hhaW4gdGhlIHdob2xlIHRyYW5zYWN0aW9uIHJldmVydHMuIEV2ZXJ5IGFib3J0Ci8vICAgICBhc3NlcnRlZCBiZWxvdyBoYXBwZW5zIHN0cmljdGx5IEJFRk9SRSB0aGlzIHJlYWxtIHdyaXRlcyBzdGF0ZSwKLy8gICAgIHdpdGggb25lIG1lYXN1cmVkIGV4Y2VwdGlvbiBkb2N1bWVudGVkIGlubGluZQovLyAgICAgKFRlc3RDbGFpbVRpbWluZ0lzVGhlRHVlYm9va3NWZXJkaWN0KS4KLy8KLy8gICAtIFRoZSBTRU5EIGVudmVsb3BlIGlzIHByb2Nlc3MtZ2xvYmFsOiBhIHN0YWdlZCBlbnZlbG9wZSBtdXN0IGJlCi8vICAgICBjbGVhcmVkIChTZXRPcmlnaW5TZW5kKG5pbCkpIGJlZm9yZSB0aGUgbmV4dCBub24tcGF5YWJsZSBjYWxsLCBvcgovLyAgICAgcmVqZWN0U3RyYXlTZW5kIGZpcmVzIGFuZCB0aGUgdGVzdCBhc3NlcnRzIHRoZSBoYXJuZXNzIGxlYWssIG5vdAovLyAgICAgdGhlIGd1YXJkLgpmdW5jIGluaXQoKSB7CglzZWxmID0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9jcm93ZGZ1bmQiKQp9Cgp0eXBlIGJhc2VsaW5lIHN0cnVjdCB7CgloZWxkICAgaW50NjQKCWJhY2tlZCBpbnQ2NAoJZmVlcyAgIGludDY0Cn0KCmZ1bmMgYmVnaW4oKSBiYXNlbGluZSB7Cgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJaWYgbCA6PSBMaWFiaWxpdGllcygpOyBsID4gMCB7CgkJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QobCkpCgl9CglyZXR1cm4gYmFzZWxpbmV7aGVsZDogSGVsZCgpLCBiYWNrZWQ6IFRvdGFsQmFja2VkKCksIGZlZXM6IEZlZXNBY2NydWVkKCl9Cn0KCmZ1bmMgdWdub3QobiBpbnQ2NCkgY2hhaW4uQ29pbnMgewoJcmV0dXJuIGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oRGVub20sIG4pKQp9CgovLyBsYXVuY2hBcyBzdGFnZXMgYGZyb21gIGFuZCBsYXVuY2hlcyBhIE1pbkdvYWwgeCBNaW5EdXJhdGlvbiBjYW1wYWlnbi4KZnVuYyBsYXVuY2hBcyhjdXIgcmVhbG0sIGZyb20gYWRkcmVzcywgdGl0bGUgc3RyaW5nKSBpbnQ2NCB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZyb20pKQoJcmV0dXJuIExhdW5jaChjcm9zcyhjdXIpLCB0aXRsZSwgIiIsIE1pbkdvYWwsIE1pbkR1cmF0aW9uQmxvY2tzKQp9CgovLyBwbGVkZ2VBcyBzdGFnZXMgYSBkaXJlY3QgRU9BIGNhbGwgd2l0aCAtc2VuZCBhbmQgbWlycm9ycyB0aGUKLy8gZW52ZWxvcGUgaW50byB0aGUgcmVhbG0ncyBiYW5rLCBhcyB0aGUgY2hhaW4gd291bGQuCmZ1bmMgcGxlZGdlQXMoY3VyIHJlYWxtLCBmcm9tIGFkZHJlc3MsIGlkLCBhbW91bnQgaW50NjQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoYW1vdW50KSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KGFtb3VudCkpCglQbGVkZ2UoY3Jvc3MoY3VyKSwgaWQpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQp9CgpmdW5jIGJhbGFuY2VPZihhZGRyIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBjb2luaW8uSGVsZEF0KGFkZHIsIERlbm9tKQp9CgovLyAtLS0gbGF1bmNoIC0tLQoKZnVuYyBUZXN0TGF1bmNoQmFzaWNzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCgliZWZvcmUgOj0gTnVtQ2FtcGFpZ25zKCkKCW9wZW5CZWZvcmUgOj0gT3BlbkNhbXBhaWducygpCgoJaWQgOj0gbGF1bmNoQXMoY3VyLCBjcmVhdG9yMSwgIlNvbGFyIHBhbmVscyBmb3IgdGhlIGhhY2tlcnNwYWNlIikKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlKzEsIGlkKQoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUrMSwgTnVtQ2FtcGFpZ25zKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIG9wZW5CZWZvcmUrMSwgT3BlbkNhbXBhaWducygpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgT3Blbk9mKGNyZWF0b3IxKSkKCgljciwgZ29hbCwgcmFpc2VkLCBmZWVCcHMsIGNyZWF0ZWRBdCwgZGVhZGxpbmUsIGNsYWltRW5kLCBiYWNrZXJzLCBzdGF0ZSA6PSBDYW1wYWlnbkluZm8oaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGNyZWF0b3IxLCBjcikKCXVhc3NlcnQuRXF1YWwodCwgTWluR29hbCwgZ29hbCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHJhaXNlZCkKCXVhc3NlcnQuRXF1YWwodCwgU3VjY2Vzc0ZlZUJwcywgZmVlQnBzKQoJdWFzc2VydC5FcXVhbCh0LCBjcmVhdGVkQXQrTWluRHVyYXRpb25CbG9ja3MsIGRlYWRsaW5lKQoJdWFzc2VydC5FcXVhbCh0LCBkZWFkbGluZStDbGFpbVdpbmRvd0Jsb2NrcywgY2xhaW1FbmQpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGJhY2tlcnMpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0YXRlRnVuZGluZywgc3RhdGUpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0YXRlRnVuZGluZywgU3RhdHVzKGlkKSkKCgkvLyBDbGVhbiB1cCB0aGUgb3BlbiBzbG90IHNvIGxhdGVyIHBlci1jcmVhdG9yLWNhcCB0ZXN0cyBzZWUgYSBrbm93bgoJLy8gY291bnQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBPcGVuT2YoY3JlYXRvcjEpKQp9CgpmdW5jIFRlc3RMYXVuY2hWYWxpZGF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGl0bGUgbXVzdCBub3QgYmUgZW1wdHkiLCBmdW5jKCkgewoJCUxhdW5jaChjcm9zcyhjdXIpLCAiIiwgIiIsIE1pbkdvYWwsIE1pbkR1cmF0aW9uQmxvY2tzKQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ0aXRsZSBleGNlZWRzIDEwMCBieXRlcyIsIGZ1bmMoKSB7CgkJTGF1bmNoKGNyb3NzKGN1ciksIHN0cmluZ3MuUmVwZWF0KCJ4IiwgTWF4VGl0bGVMZW4rMSksICIiLCBNaW5Hb2FsLCBNaW5EdXJhdGlvbkJsb2NrcykKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibWVtbyBleGNlZWRzIDI1NiBieXRlcyIsIGZ1bmMoKSB7CgkJTGF1bmNoKGNyb3NzKGN1ciksICJ0Iiwgc3RyaW5ncy5SZXBlYXQoIngiLCBNYXhNZW1vTGVuKzEpLCBNaW5Hb2FsLCBNaW5EdXJhdGlvbkJsb2NrcykKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZ29hbCBtdXN0IGJlIGF0IGxlYXN0IDEwMDAwMDB1Z25vdCIsIGZ1bmMoKSB7CgkJTGF1bmNoKGNyb3NzKGN1ciksICJ0IiwgIiIsIE1pbkdvYWwtMSwgTWluRHVyYXRpb25CbG9ja3MpCgl9KQoJLy8gRHVyYXRpb24gYm91bmRzIGFyZSB0aGUgZHVlYm9vaydzIG93biB2YWxpZGF0aW9uLCBub3QgYSBjaGVjayBpbgoJLy8gdGhpcyByZWFsbSDigJQgYXNzZXJ0ZWQgYWdhaW5zdCB0aGUgcHJpbWl0aXZlJ3MgZXJyb3IgdGV4dC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJkdWVib29rOiBkZWxheSBvdXRzaWRlIFttaW5EZWxheSwgbWF4RGVsYXldIiwgZnVuYygpIHsKCQlMYXVuY2goY3Jvc3MoY3VyKSwgInQiLCAiIiwgTWluR29hbCwgTWluRHVyYXRpb25CbG9ja3MtMSkKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZHVlYm9vazogZGVsYXkgb3V0c2lkZSBbbWluRGVsYXksIG1heERlbGF5XSIsIGZ1bmMoKSB7CgkJTGF1bmNoKGNyb3NzKGN1ciksICJ0IiwgIiIsIE1pbkdvYWwsIE1heER1cmF0aW9uQmxvY2tzKzEpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgT3Blbk9mKGNyZWF0b3IxKSkKfQoKZnVuYyBUZXN0TGF1bmNoUGVyQ3JlYXRvckNhcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgT3Blbk9mKGNyZWF0b3IyKSkKCWlkcyA6PSBbXWludDY0e30KCWZvciBpIDo9IGludDY0KDApOyBpIDwgTWF4T3BlblBlckNyZWF0b3I7IGkrKyB7CgkJaWRzID0gYXBwZW5kKGlkcywgbGF1bmNoQXMoY3VyLCBjcmVhdG9yMiwgImNhcCBmaWxsZXIiKSkKCX0KCXVhc3NlcnQuRXF1YWwodCwgTWF4T3BlblBlckNyZWF0b3IsIE9wZW5PZihjcmVhdG9yMikpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmVhdG9yMikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNyZWF0b3IgYWxyZWFkeSBoYXMgOCB1bnNldHRsZWQgY2FtcGFpZ25zIiwgZnVuYygpIHsKCQlMYXVuY2goY3Jvc3MoY3VyKSwgIm9uZSB0b28gbWFueSIsICIiLCBNaW5Hb2FsLCBNaW5EdXJhdGlvbkJsb2NrcykKCX0pCgoJLy8gQSBzZXR0bGVkIGNhbXBhaWduIHJlbGVhc2VzIGl0cyBzbG90LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmVhdG9yMikpCglDcmVhdG9yQ2FuY2VsKGNyb3NzKGN1ciksIGlkc1swXSkKCXVhc3NlcnQuRXF1YWwodCwgTWF4T3BlblBlckNyZWF0b3ItMSwgT3Blbk9mKGNyZWF0b3IyKSkKCWlkTmV3IDo9IGxhdW5jaEFzKGN1ciwgY3JlYXRvcjIsICJzbG90IHJlb3BlbmVkIikKCXVhc3NlcnQuRXF1YWwodCwgTWF4T3BlblBlckNyZWF0b3IsIE9wZW5PZihjcmVhdG9yMikpCgoJLy8gRHJhaW4gdGhlIHNsb3RzIHNvIGxhdGVyIHRlc3RzIHN0YXJ0IGZyb20gYSBjbGVhbiBjb3VudC4KCWZvciBfLCBpZCA6PSByYW5nZSBhcHBlbmQoaWRzWzE6XSwgaWROZXcpIHsKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IyKSkKCQlDcmVhdG9yQ2FuY2VsKGNyb3NzKGN1ciksIGlkKQoJfQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgT3Blbk9mKGNyZWF0b3IyKSkKfQoKLy8gLS0tIHBsZWRnaW5nIC0tLQoKZnVuYyBUZXN0UGxlZGdlQW5kQ29uc2VydmF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCWlkIDo9IGxhdW5jaEFzKGN1ciwgY3JlYXRvcjEsICJjb25zZXJ2YXRpb24gY2FzZSIpCgoJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgNDAwXzAwMCkKCXBsZWRnZUFzKGN1ciwgYmFja2VyQiwgaWQsIDI1MF8wMDApCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCAxMDBfMDAwKSAvLyBzYW1lIGJhY2tlciBhY2N1bXVsYXRlcwoKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTAwXzAwMCksIFBsZWRnZU9mKGlkLCBiYWNrZXJBKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMjUwXzAwMCksIFBsZWRnZU9mKGlkLCBiYWNrZXJCKSkKCV8sIF8sIHJhaXNlZCwgXywgXywgXywgXywgYmFja2VycywgXyA6PSBDYW1wYWlnbkluZm8oaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDc1MF8wMDApLCByYWlzZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGJhY2tlcnMpCgoJLy8gQ29uc2VydmF0aW9uLCBkZWx0YSBmb3JtOiBldmVyeSBwbGVkZ2VkIGNvaW4gaXMgaW4gQiBhbmQgaW4gSC4KCXVhc3NlcnQuRXF1YWwodCwgYi5iYWNrZWQrNzUwXzAwMCwgVG90YWxCYWNrZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5oZWxkKzc1MF8wMDAsIEhlbGQoKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5mZWVzLCBGZWVzQWNjcnVlZCgpKQoJdWFzc2VydC5UcnVlKHQsIEhlbGQoKSA+PSBMaWFiaWxpdGllcygpKQoKCS8vIENsZWFuIHVwOiBiYWNrIG91dCBib3RoIHBsZWRnZXMsIGNhbmNlbC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCglVbnBsZWRnZShjcm9zcyhjdXIpLCBpZCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQikpCglVbnBsZWRnZShjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgYi5iYWNrZWQsIFRvdGFsQmFja2VkKCkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCn0KCmZ1bmMgVGVzdFBsZWRnZUd1YXJkcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJaWQgOj0gbGF1bmNoQXMoY3VyLCBjcmVhdG9yMSwgImd1YXJkIGNhc2UiKQoKCS8vIFRoZSBwYXltZW50LWd1YXJkIHJlZ3Jlc3Npb246IGEgcmVhbG0tcm91dGVkIHBsZWRnZSBpcyByZWZ1c2VkIGJ5CgkvLyBjb2luaW8ncyByZWNlaXB0IHNoYXBlLCBub3QgYnkgYW55dGhpbmcgdGhpcyBmaWxlIGNvdWxkIGZvcmdldC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZGVtby9hdHRhY2tlciIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMDApKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNvaW5pbzogcGF5bWVudCBtdXN0IGJlIGEgZGlyZWN0IEVPQSBjYWxsIHdpdGggLXNlbmQgKHJlYWxtcyBhbmQgbWFrZXR4LXJ1biBhcmUgcmVqZWN0ZWQpIiwKCQlmdW5jKCkgeyBQbGVkZ2UoY3Jvc3MoY3VyKSwgaWQpIH0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCS8vIFdyb25nIGRlbm9taW5hdGlvbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbigiZm9vY29pbiIsIDEwMDApKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY29pbmlvOiBzZW5kIGV4YWN0bHkgb25lIGNvaW4gdHlwZTogdWdub3QiLCBmdW5jKCkgewoJCVBsZWRnZShjcm9zcyhjdXIpLCBpZCkKCX0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCS8vIE5vIGVudmVsb3BlIGF0IGFsbC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvaW5pbzogc2VuZCBleGFjdGx5IG9uZSBjb2luIHR5cGU6IHVnbm90IiwgZnVuYygpIHsKCQlQbGVkZ2UoY3Jvc3MoY3VyKSwgaWQpCgl9KQoKCS8vIFVua25vd24gY2FtcGFpZ24uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJhY2tlckEpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMDApKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIGNhbXBhaWduIGlkIiwgZnVuYygpIHsKCQlQbGVkZ2UoY3Jvc3MoY3VyKSwgOTk5Xzk5OSkKCX0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCS8vIEJlbG93IHRoZSBwbGVkZ2UgbWluaW11bSAoYXVkaXQgb3BlbiBxdWVzdGlvbiAxOiBkdXN0LWVudHJ5CgkvLyBibG9hdCk7IGV4YWN0bHkgdGhlIG1pbmltdW0gaXMgYWNjZXB0ZWQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJhY2tlckEpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KE1pblBsZWRnZSAtIDEpKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoTWluUGxlZGdlLTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwbGVkZ2UgYXQgbGVhc3QgMTAwMDB1Z25vdCIsIGZ1bmMoKSB7CgkJUGxlZGdlKGNyb3NzKGN1ciksIGlkKQoJfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCBNaW5QbGVkZ2UpCgl1YXNzZXJ0LkVxdWFsKHQsIE1pblBsZWRnZSwgUGxlZGdlT2YoaWQsIGJhY2tlckEpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCVVucGxlZGdlKGNyb3NzKGN1ciksIGlkKQoKCS8vIFNldHRsZWQgY2FtcGFpZ24uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJhY2tlckEpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMDApKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjYW1wYWlnbiBpcyBzZXR0bGVkIiwgZnVuYygpIHsKCQlQbGVkZ2UoY3Jvc3MoY3VyKSwgaWQpCgl9KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKfQoKZnVuYyBUZXN0UGxlZGdlQ2xvc2VzQXREZWFkbGluZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJaWQgOj0gbGF1bmNoQXMoY3VyLCBjcmVhdG9yMSwgImRlYWRsaW5lIGNhc2UiKQoJdGVzdGluZy5Ta2lwSGVpZ2h0cyhNaW5EdXJhdGlvbkJsb2NrcykgLy8gaGVpZ2h0ID09IGRlYWRsaW5lIGV4YWN0bHkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJhY2tlckEpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMDApKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoMTAwMCkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImZ1bmRpbmcgaXMgY2xvc2VkIiwgZnVuYygpIHsKCQlQbGVkZ2UoY3Jvc3MoY3VyKSwgaWQpCgl9KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCgkvLyBVbnBsZWRnZSBpcyBsaWtld2lzZSBjbG9zZWQgYXQgdGhlIGRlYWRsaW5lICh0aGUgZmFpbGVkIHBhdGggaXMKCS8vIFJlZnVuZCdzKS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiZnVuZGluZyBpcyBjbG9zZWQ7IHVzZSBSZWZ1bmQgaWYgdGhlIGNhbXBhaWduIGZhaWxlZCIsCgkJZnVuYygpIHsgVW5wbGVkZ2UoY3Jvc3MoY3VyKSwgaWQpIH0pCgoJLy8gRmFpbGVkICgwIDwgZ29hbCkgYW5kIHBhc3QgZGVhZGxpbmU6IHJlZnVuZHMgb3Blbiwgbm90aGluZyB0byBwYXkuCgl1YXNzZXJ0LlRydWUodCwgSXNSZWZ1bmRhYmxlKGlkKSkKCXVhc3NlcnQuRXF1YWwodCwgImZhaWxlZCAocmVmdW5kcyBvcGVuKSIsIFN0YXR1cyhpZCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmVhdG9yMSkpCglDcmVhdG9yQ2FuY2VsKGNyb3NzKGN1ciksIGlkKQp9CgovLyAtLS0gdW5wbGVkZ2UgLS0tCgpmdW5jIFRlc3RVbnBsZWRnZVJldHVybnNXaG9sZVBsZWRnZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAidW5wbGVkZ2UgY2FzZSIpCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCAzMDBfMDAwKQoKCXdhbGxldEJlZm9yZSA6PSBiYWxhbmNlT2YoYmFja2VyQSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCglVbnBsZWRnZShjcm9zcyhjdXIpLCBpZCkKCgl1YXNzZXJ0LkVxdWFsKHQsIHdhbGxldEJlZm9yZSszMDBfMDAwLCBiYWxhbmNlT2YoYmFja2VyQSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQbGVkZ2VPZihpZCwgYmFja2VyQSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGIuYmFja2VkLCBUb3RhbEJhY2tlZCgpKQoJdWFzc2VydC5FcXVhbCh0LCBiLmhlbGQsIEhlbGQoKSkKCgkvLyBOb3RoaW5nIGxlZnQgdG8gdW5wbGVkZ2UuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJhY2tlckEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBwbGVkZ2UgdG8gcmV0dXJuIiwgZnVuYygpIHsKCQlVbnBsZWRnZShjcm9zcyhjdXIpLCBpZCkKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCn0KCi8vIC0tLSBjbGFpbSAtLS0KCmZ1bmMgVGVzdENsYWltUGF5c0NyZWF0b3JNaW51c0ZlZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAiZnVuZGVkIHByb2plY3QiKQoJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgOTAwXzAwMCkKCXBsZWRnZUFzKGN1ciwgYmFja2VyQiwgaWQsIDM1MF8wMDApIC8vIHJhaXNlZCAxXzI1MF8wMDAgPj0gZ29hbCAxXzAwMF8wMDAKCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzKQoJdWFzc2VydC5FcXVhbCh0LCAic3VjY2VlZGVkIChhd2FpdGluZyBjcmVhdG9yIGNsYWltKSIsIFN0YXR1cyhpZCkpCgl1YXNzZXJ0LkZhbHNlKHQsIElzUmVmdW5kYWJsZShpZCkpIC8vIHRoZSBwb3QgaXMgdGhlIGNyZWF0b3IncyB0byBjb2xsZWN0CgoJLy8gQSBiYWNrZXIgY2Fubm90IHJlZnVuZCBvdXQgb2YgYSBzdWNjZWVkZWQgY2FtcGFpZ24gaW4td2luZG93LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY2FtcGFpZ24gaXMgbm90IHJlZnVuZGFibGUiLCBmdW5jKCkgewoJCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKCX0pCgoJLy8gT25seSB0aGUgY3JlYXRvciBtYXkgY2xhaW0uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjcmVhdG9yIG9ubHkiLCBmdW5jKCkgewoJCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKCX0pCgoJd2FsbGV0QmVmb3JlIDo9IGJhbGFuY2VPZihjcmVhdG9yMSkKCW9wZW5CZWZvcmUgOj0gT3BlbkNhbXBhaWducygpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKCgkvLyBmZWUgPSBmbG9vcigxXzI1MF8wMDAgKiAxMDAgLyAxMF8wMDApID0gMTJfNTAwOyBjcmVkaXRlZCB0aGUgcmVzdC4KCXVhc3NlcnQuRXF1YWwodCwgd2FsbGV0QmVmb3JlKzFfMjM3XzUwMCwgYmFsYW5jZU9mKGNyZWF0b3IxKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5mZWVzKzEyXzUwMCwgRmVlc0FjY3J1ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5iYWNrZWQsIFRvdGFsQmFja2VkKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0YXRlUGFpZCwgU3RhdHVzKGlkKSkKCXVhc3NlcnQuRXF1YWwodCwgb3BlbkJlZm9yZS0xLCBPcGVuQ2FtcGFpZ25zKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBPcGVuT2YoY3JlYXRvcjEpKQoKCS8vIFRoZSBwbGVkZ2UgdGFibGUgaXMgZHJvcHBlZDsgdGhlIGZpbmFsIGJhY2tlciBjb3VudCBpcyBmcm96ZW4uCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQbGVkZ2VPZihpZCwgYmFja2VyQSkpCglfLCBfLCByYWlzZWQsIF8sIF8sIF8sIF8sIGJhY2tlcnMsIHN0YXRlIDo9IENhbXBhaWduSW5mbyhpZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHJhaXNlZCkKCXVhc3NlcnQuRXF1YWwodCwgMiwgYmFja2VycykKCXVhc3NlcnQuRXF1YWwodCwgc3RhdGVQYWlkLCBzdGF0ZSkKCgkvLyBTZXR0bGVtZW50IGlzIGV4YWN0bHktb25jZTogdGhlIGRlZmVycmFsIGlzIGNvbnN1bWVkLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmVhdG9yMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNhbXBhaWduIGlzIHNldHRsZWQiLCBmdW5jKCkgewoJCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKCX0pCgkvLyBDb25zZXJ2YXRpb246IEggZ2FpbmVkIHRoZSBmZWUsIEIgaXMgZmxhdCwgdGhlIHBheW91dCBsZWZ0LgoJdWFzc2VydC5FcXVhbCh0LCBiLmhlbGQrMTJfNTAwLCBIZWxkKCkpCgl1YXNzZXJ0LlRydWUodCwgSGVsZCgpID49IExpYWJpbGl0aWVzKCkpCn0KCmZ1bmMgVGVzdENsYWltRmVlUm91bmRpbmdGYXZvcnNDcmVhdG9yKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJaWQgOj0gTGF1bmNoKGNyb3NzKGN1ciksICJyb3VuZGluZyBjYXNlIiwgIiIsIE1pbkdvYWwsIE1pbkR1cmF0aW9uQmxvY2tzKQoJLy8gMV8wMDBfMDUwIGF0IDEwMCBicHM6IGV4YWN0IGZlZSAxMF8wMDAuNSAtPiBmbG9vciAxMF8wMDAuCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCAxXzAwMF8wNTApCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzKQoKCXdhbGxldEJlZm9yZSA6PSBiYWxhbmNlT2YoY3JlYXRvcjEpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgd2FsbGV0QmVmb3JlKzk5MF8wNTAsIGJhbGFuY2VPZihjcmVhdG9yMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGIuZmVlcysxMF8wMDAsIEZlZXNBY2NydWVkKCkpCn0KCmZ1bmMgVGVzdENsYWltR29hbE5vdFJlYWNoZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWlkIDo9IGxhdW5jaEFzKGN1ciwgY3JlYXRvcjEsICJ1bmRlcmZ1bmRlZCIpCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCBNaW5Hb2FsLTEpCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJnb2FsIG5vdCByZWFjaGVkIiwgZnVuYygpIHsKCQlDcmVhdG9yQ2xhaW0oY3Jvc3MoY3VyKSwgaWQpCgl9KQoKCS8vIFRoZSBmYWlsZWQgcG90IGlzIHJlZnVuZGFibGUgaW1tZWRpYXRlbHkg4oCUIG5vIHNldHRsZW1lbnQgbmVlZGVkLgoJdWFzc2VydC5UcnVlKHQsIElzUmVmdW5kYWJsZShpZCkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJhY2tlckEpKQoJUmVmdW5kKGNyb3NzKGN1ciksIGlkKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCVNldHRsZUZhaWxlZChjcm9zcyhjdXIpLCBpZCkgLy8gYW55b25lIGNsb3NlcyBpdCBvdXQ7IHNsb3QgZnJlZWQKfQoKZnVuYyBUZXN0Q2xhaW1UaW1pbmdJc1RoZUR1ZWJvb2tzVmVyZGljdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJaWQgOj0gbGF1bmNoQXMoY3VyLCBjcmVhdG9yMSwgInRpbWluZyBjYXNlIikKCXBsZWRnZUFzKGN1ciwgYmFja2VyQSwgaWQsIE1pbkdvYWwpCgoJLy8gQmVmb3JlIHRoZSBkZWFkbGluZTogdGhlIGR1ZWJvb2sgcmVmdXNlcywgYW5kIG9uLWNoYWluIHRoZSB3aG9sZQoJLy8gdHJhbnNhY3Rpb24gd291bGQgcmV2ZXJ0LiBJbiB0aGUgdGVzdCBWTSB0aGUgYWJvcnQgZG9lcyBub3Qgcm9sbAoJLy8gYmFjayByZWFsbSBnbG9iYWxzLCBidXQgTXVzdENsYWltIGFib3J0cyBCRUZPUkUgdGhpcyByZWFsbSB3cml0ZXMKCS8vIGFueSBzdGF0ZSwgc28gdGhlIGNhbXBhaWduIGlzIG9ic2VydmFibHkgdW50b3VjaGVkIGVpdGhlciB3YXkg4oCUCgkvLyBhc3NlcnRlZCBiZWxvdy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJkdWVib29rOiBub3QgZHVlIHlldCIsIGZ1bmMoKSB7CgkJQ3JlYXRvckNsYWltKGNyb3NzKGN1ciksIGlkKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgc3RhdGVGdW5kaW5nLCBTdGF0dXMoaWQpKSAvLyBzdGlsbCBmdW5kaW5nLCB1bnRvdWNoZWQKCXVhc3NlcnQuRXF1YWwodCwgTWluR29hbCwgUGxlZGdlT2YoaWQsIGJhY2tlckEpKQoKCS8vIFBhc3QgdGhlIGNsYWltIHdpbmRvdzogZXhwaXJlZCwgdGhlIGNyZWF0b3IncyBhdXRob3JpemF0aW9uIGRpZWQuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzICsgQ2xhaW1XaW5kb3dCbG9ja3MpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZHVlYm9vazogZGVmZXJyYWwgaGFzIGV4cGlyZWQiLCBmdW5jKCkgewoJCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKCX0pCgoJLy8gV2hpY2ggaXMgZXhhY3RseSB3aGVuIExhcHNlIHN0YXJ0cyB3b3JraW5nIOKAlCBieSBhbnlvbmUuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJTGFwc2UoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0YXRlTGFwc2VkLCBTdGF0dXMoaWQpKQoJdWFzc2VydC5UcnVlKHQsIElzUmVmdW5kYWJsZShpZCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKfQoKLy8gLS0tIHNldHRsZS1mYWlsZWQgKGF1ZGl0IFkxIHJlbWVkaWF0aW9uKSAtLS0KCmZ1bmMgVGVzdFNldHRsZUZhaWxlZEZyZWVzVGhlU2xvdEF0VGhlRGVhZGxpbmUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWlkIDo9IGxhdW5jaEFzKGN1ciwgY3JlYXRvcjEsICJkb29tZWQgcHJvamVjdCIpCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCBNaW5Hb2FsLTEwXzAwMCkKCgkvLyBOb3QgYmVmb3JlIHRoZSBkZWFkbGluZSDigJQgdGhlIHRpbWluZyB2ZXJkaWN0IGlzIHRoZSBkdWVib29rJ3MuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJkdWVib29rOiBub3QgZHVlIHlldCIsIGZ1bmMoKSB7CgkJU2V0dGxlRmFpbGVkKGNyb3NzKGN1ciksIGlkKQoJfSkKCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzKQoJb3BlbkJlZm9yZSA6PSBPcGVuQ2FtcGFpZ25zKCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIE9wZW5PZihjcmVhdG9yMSkpCgoJLy8gQW55b25lIG1heSBzZXR0bGUgYSBmYWlsZWQgY2FtcGFpZ24gdGhlIG1vbWVudCBpdCBpcyBkdWUuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJU2V0dGxlRmFpbGVkKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5FcXVhbCh0LCBzdGF0ZUZhaWxlZCwgU3RhdHVzKGlkKSkKCXVhc3NlcnQuRXF1YWwodCwgb3BlbkJlZm9yZS0xLCBPcGVuQ2FtcGFpZ25zKCkpIC8vIGR1ZWJvb2sgc2xvdCBmcmVlZAoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgT3Blbk9mKGNyZWF0b3IxKSkgICAgLy8gY3JlYXRvciBzbG90IGZyZWVkCgl1YXNzZXJ0LlRydWUodCwgSXNSZWZ1bmRhYmxlKGlkKSkKCgkvLyBTZXR0bGVtZW50IGlzIGV4YWN0bHktb25jZSBoZXJlIHRvby4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNhbXBhaWduIGlzIHNldHRsZWQiLCBmdW5jKCkgewoJCVNldHRsZUZhaWxlZChjcm9zcyhjdXIpLCBpZCkKCX0pCgkvLyBBbmQgdGhlIGNyZWF0b3IgY2Fubm90IGNsYWltIGEgc2V0dGxlZCBjYW1wYWlnbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjYW1wYWlnbiBpcyBzZXR0bGVkIiwgZnVuYygpIHsKCQlDcmVhdG9yQ2xhaW0oY3Jvc3MoY3VyKSwgaWQpCgl9KQoKCS8vIFJlZnVuZHMgd29yayBleGFjdGx5IGFzIG9uIHRoZSB1bi1zZXR0bGVkIGZhaWxlZCBwYXRoLCBhbmQgdGhlCgkvLyBkcmFpbmVkIHJlY29yZCBpcyBwcnVuYWJsZS4KCXdhbGxldEJlZm9yZSA6PSBiYWxhbmNlT2YoYmFja2VyQSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCglSZWZ1bmQoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIHdhbGxldEJlZm9yZStNaW5Hb2FsLTEwXzAwMCwgYmFsYW5jZU9mKGJhY2tlckEpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCVBydW5lKGNyb3NzKGN1ciksIGlkKQp9CgpmdW5jIFRlc3RTZXR0bGVGYWlsZWRFeHBpcmVzSW50b0xhcHNlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAibmV2ZXIgc2V0dGxlZCIpCglwbGVkZ2VBcyhjdXIsIGJhY2tlckEsIGlkLCBNaW5QbGVkZ2UpCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzICsgQ2xhaW1XaW5kb3dCbG9ja3MpCgoJLy8gUGFzdCB0aGUgY2xhaW0gd2luZG93IHRoZSBkZWZlcnJhbCBpcyBleHBpcmVkOiBTZXR0bGVGYWlsZWQncwoJLy8gcGF0aCBpcyBnb25lICh0aGUgcHJpbWl0aXZlJ3MgdmVyZGljdCkgYW5kIExhcHNlIGlzIHRoZSB2YWx2ZSDigJQKCS8vIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGUgY2FtcGFpZ24gcGFnZSBub3cgYWR2aXNlcyAoYXVkaXQgRzEpLgoJcGFnZSA6PSBSZW5kZXIoaXRvYShpZCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiTGFwc2UoIitpdG9hKGlkKSsiKSIpKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJTZXR0bGVGYWlsZWQoIikpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZHVlYm9vazogZGVmZXJyYWwgaGFzIGV4cGlyZWQiLCBmdW5jKCkgewoJCVNldHRsZUZhaWxlZChjcm9zcyhjdXIpLCBpZCkKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJTGFwc2UoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0YXRlTGFwc2VkLCBTdGF0dXMoaWQpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKfQoKZnVuYyBUZXN0U2V0dGxlRmFpbGVkUmVmdXNlc0FNZXRHb2FsKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAiZnVuZGVkLCBub3QgZmFpbGVkIikKCXBsZWRnZUFzKGN1ciwgYmFja2VyQSwgaWQsIE1pbkdvYWwpCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiZ29hbCByZWFjaGVkOyB0aGUgY2xhaW0gd2luZG93IGlzIHRoZSBjcmVhdG9yJ3MiLAoJCWZ1bmMoKSB7IFNldHRsZUZhaWxlZChjcm9zcyhjdXIpLCBpZCkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKfQoKLy8gLS0tIGNhbmNlbCAtLS0KCmZ1bmMgVGVzdENhbmNlbE9wZW5zUmVmdW5kcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAiY2FuY2VsbGVkIHByb2plY3QiKQoJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgNjAwXzAwMCkKCgkvLyBNYWxsb3J5IGNhbm5vdCBjYW5jZWwgc29tZW9uZSBlbHNlJ3MgY2FtcGFpZ24uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjcmVhdG9yIG9ubHkiLCBmdW5jKCkgewoJCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJQ3JlYXRvckNhbmNlbChjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgc3RhdGVDYW5jZWxsZWQsIFN0YXR1cyhpZCkpCgl1YXNzZXJ0LlRydWUodCwgSXNSZWZ1bmRhYmxlKGlkKSkKCgkvLyBDYW5jZWxsaW5nIHR3aWNlOiB0aGUgZGVmZXJyYWwgaXMgZ29uZSwgdGhlIHN0YXRlIHNheXMgc28gZmlyc3QuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY2FtcGFpZ24gaXMgc2V0dGxlZCIsIGZ1bmMoKSB7CgkJQ3JlYXRvckNhbmNlbChjcm9zcyhjdXIpLCBpZCkKCX0pCgoJd2FsbGV0QmVmb3JlIDo9IGJhbGFuY2VPZihiYWNrZXJBKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgd2FsbGV0QmVmb3JlKzYwMF8wMDAsIGJhbGFuY2VPZihiYWNrZXJBKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5iYWNrZWQsIFRvdGFsQmFja2VkKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGIuZmVlcywgRmVlc0FjY3J1ZWQoKSkgLy8gcmVmdW5kcyBhcmUgZmVlLWZyZWUKfQoKZnVuYyBUZXN0Q2FuY2VsQWZ0ZXJTdWNjZXNzUmVub3VuY2VzVGhlUG90KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAicmVub3VuY2VkIHByb2plY3QiKQoJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgTWluR29hbCkKCXRlc3RpbmcuU2tpcEhlaWdodHMoTWluRHVyYXRpb25CbG9ja3MpCgl1YXNzZXJ0LkVxdWFsKHQsICJzdWNjZWVkZWQgKGF3YWl0aW5nIGNyZWF0b3IgY2xhaW0pIiwgU3RhdHVzKGlkKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LlRydWUodCwgSXNSZWZ1bmRhYmxlKGlkKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCglSZWZ1bmQoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQbGVkZ2VPZihpZCwgYmFja2VyQSkpCn0KCi8vIC0tLSBsYXBzZSAtLS0KCmZ1bmMgVGVzdExhcHNlUmVmdXNlc1doaWxlQ2xhaW1XaW5kb3dJc09wZW4oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWlkIDo9IGxhdW5jaEFzKGN1ciwgY3JlYXRvcjEsICJsYXBzZSB0aW1pbmciKQoJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgTWluR29hbCkKCXRlc3RpbmcuU2tpcEhlaWdodHMoTWluRHVyYXRpb25CbG9ja3MpIC8vIGR1ZSwgYnV0IHdpbmRvdyBvcGVuCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZHVlYm9vazogZGVmZXJyYWwgaGFzIG5vdCBleHBpcmVkIiwgZnVuYygpIHsKCQlMYXBzZShjcm9zcyhjdXIpLCBpZCkKCX0pCgoJdGVzdGluZy5Ta2lwSGVpZ2h0cyhDbGFpbVdpbmRvd0Jsb2NrcykKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCglMYXBzZShjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgc3RhdGVMYXBzZWQsIFN0YXR1cyhpZCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY2FtcGFpZ24gaXMgc2V0dGxlZCIsIGZ1bmMoKSB7CgkJTGFwc2UoY3Jvc3MoY3VyKSwgaWQpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKfQoKLy8gLS0tIHJlZnVuZCBndWFyZHMgLS0tCgpmdW5jIFRlc3RSZWZ1bmRHdWFyZHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWlkIDo9IGxhdW5jaEFzKGN1ciwgY3JlYXRvcjEsICJyZWZ1bmQgZ3VhcmRzIikKCXBsZWRnZUFzKGN1ciwgYmFja2VyQSwgaWQsIDEwMF8wMDApCgoJLy8gTm90IHJlZnVuZGFibGUgd2hpbGUgZnVuZGluZyBpcyBvcGVuLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY2FtcGFpZ24gaXMgbm90IHJlZnVuZGFibGUiLCBmdW5jKCkgewoJCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmVhdG9yMSkpCglDcmVhdG9yQ2FuY2VsKGNyb3NzKGN1ciksIGlkKQoKCS8vIEEgc3RyYW5nZXIgd2l0aCBubyBwbGVkZ2UgZ2V0cyBub3RoaW5nLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibm8gcGxlZGdlIHRvIHJldHVybiIsIGZ1bmMoKSB7CgkJUmVmdW5kKGNyb3NzKGN1ciksIGlkKQoJfSkKCgkvLyBUaGUgYmFja2VyIHJlZnVuZHMgb25jZSwgdGhlbiBoYXMgbm90aGluZyBsZWZ0LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWNrZXJBKSkKCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm5vIHBsZWRnZSB0byByZXR1cm4iLCBmdW5jKCkgewoJCVJlZnVuZChjcm9zcyhjdXIpLCBpZCkKCX0pCn0KCi8vIC0tLSBwcnVuZSAtLS0KCmZ1bmMgVGVzdFBydW5lKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAicHJ1bmFibGUiKQoJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgNTBfMDAwKQoKCS8vIE5vdCB3aGlsZSB1bnNldHRsZWQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjYW1wYWlnbiBpcyBub3Qgc2V0dGxlZCIsIGZ1bmMoKSB7CgkJUHJ1bmUoY3Jvc3MoY3VyKSwgaWQpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJQ3JlYXRvckNhbmNlbChjcm9zcyhjdXIpLCBpZCkKCgkvLyBOb3Qgd2hpbGUgYmFja2VyIGZ1bmRzIHJlbWFpbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNhbXBhaWduIHN0aWxsIGhvbGRzIGJhY2tlciBmdW5kcyIsIGZ1bmMoKSB7CgkJUHJ1bmUoY3Jvc3MoY3VyKSwgaWQpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFja2VyQSkpCglSZWZ1bmQoY3Jvc3MoY3VyKSwgaWQpCgoJbkJlZm9yZSA6PSBOdW1DYW1wYWlnbnMoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCVBydW5lKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5FcXVhbCh0LCBuQmVmb3JlLCBOdW1DYW1wYWlnbnMoKSkgLy8gaWRzIGFyZSBuZXZlciByZXVzZWQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gY2FtcGFpZ24gaWQiLCBmdW5jKCkgewoJCVBydW5lKGNyb3NzKGN1ciksIGlkKQoJfSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAidW5rbm93biBjYW1wYWlnbiBpZCIsIGZ1bmMoKSB7CgkJQ2FtcGFpZ25JbmZvKGlkKQoJfSkKfQoKLy8gLS0tIGZlZXMgYW5kIHN1cnBsdXMgLS0tCgpmdW5jIFRlc3RXaXRoZHJhd0ZlZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJaWYgYi5mZWVzID09IDAgewoJCS8vIEFjY3J1ZSBhIGZlZTogZnVuZCBhbmQgY2xhaW0gYSBjYW1wYWlnbi4KCQlpZCA6PSBsYXVuY2hBcyhjdXIsIGNyZWF0b3IxLCAiZmVlIHNvdXJjZSIpCgkJcGxlZGdlQXMoY3VyLCBiYWNrZXJBLCBpZCwgTWluR29hbCkKCQl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkR1cmF0aW9uQmxvY2tzKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcjEpKQoJCUNyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkKCX0KCWZlZXMgOj0gRmVlc0FjY3J1ZWQoKQoJdWFzc2VydC5UcnVlKHQsIGZlZXMgPiAwKQoKCWNvbGxlY3RvckJlZm9yZSA6PSBiYWxhbmNlT2YoRmVlQ29sbGVjdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkgLy8gYW55b25lIG1heSB0cmlnZ2VyCglnb3QgOj0gV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpCgl1YXNzZXJ0LkVxdWFsKHQsIGZlZXMsIGdvdCkKCXVhc3NlcnQuRXF1YWwodCwgY29sbGVjdG9yQmVmb3JlK2ZlZXMsIGJhbGFuY2VPZihGZWVDb2xsZWN0b3IpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgRmVlc0FjY3J1ZWQoKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBmZWVzIGFjY3J1ZWQiLCBmdW5jKCkgewoJCVdpdGhkcmF3RmVlcyhjcm9zcyhjdXIpKQoJfSkKfQoKZnVuYyBUZXN0U3dlZXBTdXJwbHVzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCgkvLyBObyBzdXJwbHVzOiBjb2luaW8gcmVmdXNlcy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvaW5pbzogbm8gc3VycGx1cyB0byBzd2VlcCBmb3IgdWdub3QiLCBmdW5jKCkgewoJCVN3ZWVwU3VycGx1cyhjcm9zcyhjdXIpLCBEZW5vbSkKCX0pCgoJLy8gRm9yY2Utc2VuZCAzM18wMDAgdWdub3Qgb3V0LW9mLWJhbmQsIHRoZW4gc3dlZXAgaXQuCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgzM18wMDApKQoJbGlhYkJlZm9yZSA6PSBMaWFiaWxpdGllcygpCgljb2xsZWN0b3JCZWZvcmUgOj0gYmFsYW5jZU9mKEZlZUNvbGxlY3RvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCglzd2VwdCA6PSBTd2VlcFN1cnBsdXMoY3Jvc3MoY3VyKSwgRGVub20pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMzXzAwMCksIHN3ZXB0KQoJdWFzc2VydC5FcXVhbCh0LCBjb2xsZWN0b3JCZWZvcmUrMzNfMDAwLCBiYWxhbmNlT2YoRmVlQ29sbGVjdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgbGlhYkJlZm9yZSwgTGlhYmlsaXRpZXMoKSkgLy8gdHJhY2tlZCBtb25leSB1bnRvdWNoZWQKCgkvLyBBIGZvcmVpZ24gZGVub21pbmF0aW9uIHN3ZWVwcyBpbiBmdWxsLgoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbigiZm9vY29pbiIsIDRfMjAwKSkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg0XzIwMCksIFN3ZWVwU3VycGx1cyhjcm9zcyhjdXIpLCAiZm9vY29pbiIpKQp9CgovLyAtLS0gc3RyYXkgc2VuZHMgLS0tCgpmdW5jIFRlc3ROb25QYXlhYmxlRW50cnlwb2ludHNSZWplY3RDb2lucyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJaWQgOj0gbGF1bmNoQXMoY3VyLCBjcmVhdG9yMSwgInN0cmF5IHNlbmQgY2FzZSIpCgoJY2FzZXMgOj0gW11mdW5jKCl7CgkJZnVuYygpIHsgTGF1bmNoKGNyb3NzKGN1ciksICJ0IiwgIiIsIE1pbkdvYWwsIE1pbkR1cmF0aW9uQmxvY2tzKSB9LAoJCWZ1bmMoKSB7IFVucGxlZGdlKGNyb3NzKGN1ciksIGlkKSB9LAoJCWZ1bmMoKSB7IENyZWF0b3JDbGFpbShjcm9zcyhjdXIpLCBpZCkgfSwKCQlmdW5jKCkgeyBDcmVhdG9yQ2FuY2VsKGNyb3NzKGN1ciksIGlkKSB9LAoJCWZ1bmMoKSB7IFNldHRsZUZhaWxlZChjcm9zcyhjdXIpLCBpZCkgfSwKCQlmdW5jKCkgeyBMYXBzZShjcm9zcyhjdXIpLCBpZCkgfSwKCQlmdW5jKCkgeyBSZWZ1bmQoY3Jvc3MoY3VyKSwgaWQpIH0sCgkJZnVuYygpIHsgUHJ1bmUoY3Jvc3MoY3VyKSwgaWQpIH0sCgkJZnVuYygpIHsgV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpIH0sCgkJZnVuYygpIHsgU3dlZXBTdXJwbHVzKGNyb3NzKGN1ciksIERlbm9tKSB9LAoJfQoJZm9yIF8sIGNhbGwgOj0gcmFuZ2UgY2FzZXMgewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgkJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEpKQoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGhpcyBlbnRyeXBvaW50IGRvZXMgbm90IGFjY2VwdCBjb2lucyIsIGNhbGwpCgl9Cgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjcmVhdG9yMSkpCglDcmVhdG9yQ2FuY2VsKGNyb3NzKGN1ciksIGlkKQp9CgovLyAtLS0gcmVuZGVyIC0tLQoKZnVuYyBUZXN0UmVuZGVySW5kZXhBbmRDYW1wYWlnbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJLy8gQSBob3N0aWxlIHRpdGxlIG11c3QgY29tZSBvdXQgb2YgdGhlIHNhbml0aXplciBkZWZhbmdlZC4KCWhvc3RpbGUgOj0gIltldmlsXShodHRwczovL3gpIDxzY3JpcHQ+YWxlcnQoMSk8L3NjcmlwdD4iCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCWlkIDo9IExhdW5jaChjcm9zcyhjdXIpLCBob3N0aWxlLCAibWVtbyB3aXRoIFtsaW5rXSh4KSBpbnNpZGUiLCBNaW5Hb2FsLCBNaW5EdXJhdGlvbkJsb2NrcykKCglpbmRleCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgIiMgQ3Jvd2RmdW5kIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgImNvbnNlcnZhdGlvbjogT0siKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgIjxzY3JpcHQ+IikpCgoJcGFnZSA6PSBSZW5kZXIoaXRvYShpZCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAic3RhdHVzOiAqKmZ1bmRpbmcqKiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIjAlIikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIjxzY3JpcHQ+IikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIltldmlsXShodHRwczovL3gpIikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIltsaW5rXSh4KSIpKQoKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigibm90YW51bWJlciIpLCAiaW52YWxpZCBjYW1wYWlnbiBpZCIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCI5OTk5OTkiKSwgInVua25vd24gY2FtcGFpZ24gaWQiKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNyZWF0b3IxKSkKCUNyZWF0b3JDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpCn0KCmZ1bmMgVGVzdFBlcmNlbnRBbmRCcHModCAqdGVzdGluZy5UKSB7Cgl1YXNzZXJ0LkVxdWFsKHQsICIwJSIsIHBlcmNlbnQoMCwgTWluR29hbCkpCgl1YXNzZXJ0LkVxdWFsKHQsICI1MCUiLCBwZXJjZW50KDUwMF8wMDAsIE1pbkdvYWwpKQoJdWFzc2VydC5FcXVhbCh0LCAiOTklIiwgcGVyY2VudCg5OTlfOTk5LCBNaW5Hb2FsKSkKCXVhc3NlcnQuRXF1YWwodCwgIjEwMCUiLCBwZXJjZW50KE1pbkdvYWwsIE1pbkdvYWwpKQoJdWFzc2VydC5FcXVhbCh0LCAiMjUwJSIsIHBlcmNlbnQoMl81MDBfMDAwLCBNaW5Hb2FsKSkKCS8vIFRoZSBvdmVyZmxvdy1ndWFyZCBicmFuY2g6IHIqMTAwIHdvdWxkIG5vdCBmaXQgaW4gaW50NjQuIFRocmVlCgkvLyBxdWFydGVycyBvZiAyXjYyIGlzIGV4YWN0bHkgNzUlLCBhbmQgdGhlIHNjYWxlZCBmb3JtIGxhbmRzIG9uIGl0LgoJaHVnZSA6PSBpbnQ2NCgxKSA8PCA2MgoJdWFzc2VydC5FcXVhbCh0LCAiNzUlIiwgcGVyY2VudCgzKihodWdlLzQpLCBodWdlKSkKCgl1YXNzZXJ0LkVxdWFsKHQsICIxJSIsIGJwcygxMDApKQoJdWFzc2VydC5FcXVhbCh0LCAiNSUiLCBicHMoNTAwKSkKCXVhc3NlcnQuRXF1YWwodCwgIjAuNSUiLCBicHMoNTApKQoJdWFzc2VydC5FcXVhbCh0LCAiMC4wMSUiLCBicHMoMSkpCgl1YXNzZXJ0LkVxdWFsKHQsICIyLjI1JSIsIGJwcygyMjUpKQp9ChpkCgtnbm9tb2QudG9tbBJVbW9kdWxlID0gImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9jcm93ZGZ1bmQiCmdubyA9ICIwLjkiCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTAwMDAwMDB1Z25vdBISCICAiXoSCzEyODAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAj4X/dIPjgvMl3lBceHW8X9BwKjoqeJcJw9owPgnlFWnEkCBA9fwj1j7CWM/PNWEnDGyTDXVS5wQ9ONCLMi/+fEpIDVqXOdPatGrdqTSEm2zzB8M+yabZGtXrR/t87jICiPBGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data