Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
36BB933D6BA9D0F5E6ABE22D6839E29091F3F6FBF899F2AEEBB2F86BC908D926
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
100,000,000
Requested gas limit
GAS USED
54,489,698
Gas consumed
FEE
100000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf14000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpiqAgoML3ZtLm1fYWRkcGtnEoaqAgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLJqQIKCGNvbm5lY3Q0Ehtnbm8ubGFuZC9yL3NhbWNyZXcvY29ubmVjdDQa3BEKC2FkZHJlc3MuZ25vEswRcGFja2FnZSBjb25uZWN0NAoKLy8gVGhlIGNoYWluIGRlY29kZXMgZm91ciB0ZXh0cyB0byB0aGUgc2FtZSBhZGRyZXNzOiB0aGUgYmVjaDMyIGZvcm0gaXQgZ2l2ZXMKLy8gYSBjYWxsZXIsIHRoYXQgZm9ybSBpbiBjYXBpdGFscywgYW5kIHRoZSBiZWNoMzJtIGNoZWNrc3VtIGluIGVpdGhlciBjYXNlLgovLyBBbiBhZGRyZXNzIGFyZ3VtZW50IHN0b3JlZCBhcyB0ZXh0IGFuZCBsYXRlciBjb21wYXJlZCB3aXRoIGEgY2FsbGVyJ3MKLy8gYWRkcmVzcyBtdXN0IGJlIHRoYXQgZmlyc3QgZm9ybS4gY2Fub25pY2FsIHJlYWRzIHRoZSB0ZXh0IGl0c2VsZiwgd2hpY2gKLy8gY29zdHMgZmFyIGxlc3MgZ2FzIHRoYW4gZGVjb2RpbmcgYW5kIHJlLWVuY29kaW5nIGl0LiBJdCBpcyB0aGUgY2hlY2sgb2YKLy8gZ25vLmxhbmQvcC9zYW1jcmV3L2xhdW5jaHBhZC9tZXRhL3YxIChWYWxpZEFkZHJlc3MpLCBjb3BpZWQgc28gdGhpcyByZWFsbQovLyBkb2VzIG5vdCBkZXBlbmQgb24gdGhhdCBwYWNrYWdlIGJlaW5nIHB1Ymxpc2hlZC4KCi8vIGJlY2gzMlZhbHVlIGhvbGRzLCBmb3IgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlIGJlY2gzMiBhbHBoYWJldAovLyAicXB6cnk5eDhnZjJ0dmR3MHMzam41NGtoY2U2bXVhN2wiLCBpdHMgNS1iaXQgdmFsdWUgcGx1cyBvbmUuIFplcm8gbWFya3MKLy8gZXZlcnkgb3RoZXIgYnl0ZSwgY2FwaXRhbHMgaW5jbHVkZWQuCnZhciBiZWNoMzJWYWx1ZSA9IFsyNTZdYnl0ZXsKCSdxJzogMSwgJ3AnOiAyLCAneic6IDMsICdyJzogNCwgJ3knOiA1LCAnOSc6IDYsICd4JzogNywgJzgnOiA4LAoJJ2cnOiA5LCAnZic6IDEwLCAnMic6IDExLCAndCc6IDEyLCAndic6IDEzLCAnZCc6IDE0LCAndyc6IDE1LCAnMCc6IDE2LAoJJ3MnOiAxNywgJzMnOiAxOCwgJ2onOiAxOSwgJ24nOiAyMCwgJzUnOiAyMSwgJzQnOiAyMiwgJ2snOiAyMywgJ2gnOiAyNCwKCSdjJzogMjUsICdlJzogMjYsICc2JzogMjcsICdtJzogMjgsICd1JzogMjksICdhJzogMzAsICc3JzogMzEsICdsJzogMzIsCn0KCi8vIGJlY2gzMkdlblt0XSBpcyB0aGUgWE9SIG9mIHRoZSBCSVAtMTczIGdlbmVyYXRvcnMgc2VsZWN0ZWQgYnkgdGhlIGZpdmUKLy8gYml0cyBvZiB0OiBvbmUgdGFibGUgcmVhZCBwZXIgY2hhcmFjdGVyIGluc3RlYWQgb2YgZml2ZSB0ZXN0cy4KdmFyIGJlY2gzMkdlbiA9IFszMl11aW50MzJ7CgkweDAwMDAwMDAwLCAweDNiNmE1N2IyLCAweDI2NTA4ZTZkLCAweDFkM2FkOWRmLAoJMHgxZWExMTlmYSwgMHgyNWNiNGU0OCwgMHgzOGYxOTc5NywgMHgwMzliYzAyNSwKCTB4M2Q0MjMzZGQsIDB4MDYyODY0NmYsIDB4MWIxMmJkYjAsIDB4MjA3OGVhMDIsCgkweDIzZTMyYTI3LCAweDE4ODk3ZDk1LCAweDA1YjNhNDRhLCAweDNlZDlmM2Y4LAoJMHgyYTE0NjJiMywgMHgxMTdlMzUwMSwgMHgwYzQ0ZWNkZSwgMHgzNzJlYmI2YywKCTB4MzRiNTdiNDksIDB4MGZkZjJjZmIsIDB4MTJlNWY1MjQsIDB4Mjk4ZmEyOTYsCgkweDE3NTY1MTZlLCAweDJjM2MwNmRjLCAweDMxMDZkZjAzLCAweDBhNmM4OGIxLAoJMHgwOWY3NDg5NCwgMHgzMjlkMWYyNiwgMHgyZmE3YzZmOSwgMHgxNGNkOTE0YiwKfQoKLy8gVGhlIGNoZWNrc3VtIHN0YXRlIG9uY2UgdGhlIGFkZHJlc3MgcHJlZml4ICJnIiBoYXMgYmVlbiBhYnNvcmJlZCwgd2hpY2gKLy8gQklQLTE3MyBleHBhbmRzIHRvIHRoZSB2YWx1ZXMgMywgMCwgNy4KY29uc3QgYmVjaDMyUHJlZml4U3RhdGUgdWludDMyID0gMHg4YzA3CgovLyBjYW5vbmljYWwgcmVwb3J0cyB3aGV0aGVyIGEgaXMgImcxIiwgdGhlbiAzOCBsb3dlcmNhc2UgYmVjaDMyIGNoYXJhY3RlcnMKLy8gd2hvc2UgY2hlY2tzdW0gaXMgdGhlIG9yaWdpbmFsIGJlY2gzMiBvbmU6IHRoZSBmb3JtIGEgY2FsbGVyJ3MgYWRkcmVzcyBoYXMuCmZ1bmMgY2Fub25pY2FsKGEgYWRkcmVzcykgYm9vbCB7CglzIDo9IHN0cmluZyhhKQoJaWYgbGVuKHMpICE9IDQwIHx8IHNbMF0gIT0gJ2cnIHx8IHNbMV0gIT0gJzEnIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWNoayA6PSBiZWNoMzJQcmVmaXhTdGF0ZQoJZm9yIGkgOj0gMjsgaSA8IDQwOyBpKysgewoJCXYgOj0gYmVjaDMyVmFsdWVbc1tpXV0KCQlpZiB2ID09IDAgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJY2hrID0gKGNoayYweDFmZmZmZmYpPDw1IF4gdWludDMyKHYtMSkgXiBiZWNoMzJHZW5bY2hrPj4yNV0KCX0KCXJldHVybiBjaGsgPT0gMSAvLyAxIGlzIGJlY2gzMjsgYmVjaDMybSBlbmRzIG9uIDB4MmJjODMwYTMKfQoauAoKCWJvYXJkLmdubxKqCnBhY2thZ2UgY29ubmVjdDQKCmNvbnN0ICgKCWNvbHMgPSA3Cglyb3dzID0gNgopCgovLyBib2FyZCBpcyBpbmRleGVkIFtjb2x1bW5dW3Jvd107IHJvdyAwIGlzIHRoZSBib3R0b20uIDAgPSBlbXB0eSwgMS8yID0gcGxheWVyLgp0eXBlIGJvYXJkIFtjb2xzXVtyb3dzXWJ5dGUKCi8vIGRyb3AgcGxhY2VzIHBpZWNlIHAgaW4gY29sdW1uIGMgKDAtYmFzZWQpIGFuZCByZXR1cm5zIGl0cyByb3csIG9yIC0xIGlmIHRoZSBjb2x1bW4gaXMgZnVsbC4KZnVuYyAoYiAqYm9hcmQpIGRyb3AoYyBpbnQsIHAgYnl0ZSkgaW50IHsKCWZvciByIDo9IDA7IHIgPCByb3dzOyByKysgewoJCWlmIGJbY11bcl0gPT0gMCB7CgkJCWJbY11bcl0gPSBwCgkJCXJldHVybiByCgkJfQoJfQoJcmV0dXJuIC0xCn0KCi8vIHdpbnMgcmVwb3J0cyB3aGV0aGVyIHRoZSBwaWVjZSBhdCAoYywgcikgaXMgcGFydCBvZiBmb3VyIGluIGEgcm93LgpmdW5jIChiICpib2FyZCkgd2lucyhjLCByIGludCkgYm9vbCB7IHJldHVybiBiLndpbkxpbmUoYywgcikgIT0gbmlsIH0KCi8vIHdpbkxpbmUgcmV0dXJucyB0aGUgY2VsbHMgb2YgdGhlIGZvdXItb3ItbW9yZSBsaW5lIHRocm91Z2ggKGMsIHIpLCBpbiBvcmRlcgovLyBhbG9uZyB0aGUgbGluZSwgb3IgbmlsIGlmIHRoZSBwaWVjZSB0aGVyZSBjb21wbGV0ZXMgbm9uZS4KZnVuYyAoYiAqYm9hcmQpIHdpbkxpbmUoYywgciBpbnQpIFtdWzJdaW50IHsKCXAgOj0gYltjXVtyXQoJZm9yIF8sIGQgOj0gcmFuZ2UgWzRdWzJdaW50e3sxLCAwfSwgezAsIDF9LCB7MSwgMX0sIHsxLCAtMX19IHsKCQliYWNrIDo9IGIuY291bnQoYywgciwgLWRbMF0sIC1kWzFdLCBwKQoJCW4gOj0gMSArIGJhY2sgKyBiLmNvdW50KGMsIHIsIGRbMF0sIGRbMV0sIHApCgkJaWYgbiA+PSA0IHsKCQkJbGluZSA6PSBtYWtlKFtdWzJdaW50LCBuKQoJCQlmb3IgaSA6PSByYW5nZSBsaW5lIHsKCQkJCWsgOj0gaSAtIGJhY2sKCQkJCWxpbmVbaV0gPSBbMl1pbnR7YyArIGsqZFswXSwgciArIGsqZFsxXX0KCQkJfQoJCQlyZXR1cm4gbGluZQoJCX0KCX0KCXJldHVybiBuaWwKfQoKLy8gY291bnQgcmV0dXJucyBob3cgbWFueSBjb25zZWN1dGl2ZSBwIHBpZWNlcyBmb2xsb3cgKGMsIHIpIGluIGRpcmVjdGlvbiAoZGMsIGRyKS4KZnVuYyAoYiAqYm9hcmQpIGNvdW50KGMsIHIsIGRjLCBkciBpbnQsIHAgYnl0ZSkgaW50IHsKCW4gOj0gMAoJZm9yIHsKCQljLCByID0gYytkYywgcitkcgoJCWlmIGMgPCAwIHx8IGMgPj0gY29scyB8fCByIDwgMCB8fCByID49IHJvd3MgfHwgYltjXVtyXSAhPSBwIHsKCQkJcmV0dXJuIG4KCQl9CgkJbisrCgl9Cn0KGq2DAQoMY29ubmVjdDQuZ25vEpuDAS8vIFBhY2thZ2UgY29ubmVjdDQgaXMgYSBzdGFrZWQgQ29ubmVjdCA0IGdhbWUuIEEgY3JlYXRvciBwb3N0cyBhbiBvZmZlciB3aXRoCi8vIGEgdWdub3Qgc3Rha2U7IGFueW9uZSAob3IgYSBuYW1lZCBvcHBvbmVudCkgYWNjZXB0cyB3aXRoIHRoZSBzYW1lIHN0YWtlOwovLyB0aGUgd2lubmVyIHRha2VzIHRoZSBwb3QgbWludXMgYSBmbGF0IGhvdXNlIGZlZS4KLy8KLy8gVGhlIGZpcnN0IG1vdmVyIGlzIHBpY2tlZCBieSBhIHR3by1zaWRlZCBjb21taXQtcmV2ZWFsLiBUaGUgY3JlYXRvciBvZmZlcnMKLy8gd2l0aCBzaGEyNTYocGFzc3BocmFzZSksIHRoZSBhY2NlcHRvciBhY2NlcHRzIHdpdGggc2hhMjU2KHNlZWQpLiBUaGVuIHRoZQovLyBjcmVhdG9yIHJldmVhbHMgdGhlIHBhc3NwaHJhc2UgKFJldmVhbCkgYW5kIHRoZSBhY2NlcHRvciB0aGUgc2VlZAovLyAoUmV2ZWFsU2VlZCksIGVhY2ggd2l0aGluIDkwcywgYW5kIHRoZSBmaXJzdCBtb3ZlciBpcyBkcmF3biBmcm9tIGJvdGguIFdoZW4KLy8gYSBwbGF5ZXIgY29tbWl0cywgdGhlIG90aGVyIHNpZGUncyBzZWNyZXQgaXMgc3RpbGwgaGlkZGVuLCBzbyBuZWl0aGVyIGNhbgovLyBncmluZCBmb3IgYW4gb3V0Y29tZSwgYW5kIG9uY2UgaXRzIHNlY3JldCBpcyByZXZlYWxlZCBub2JvZHkgY2FuIGNoYW5nZSBpdDsKLy8gdGhlIG9ubHkgd2F5IG91dCBpcyB0byBub3QgcmV2ZWFsLCB3aGljaCBmb3JmZWl0cy4gV2F0Y2hpbmcgYSBwZW5kaW5nIEFjY2VwdAovLyB0ZWxscyB0aGUgY3JlYXRvciBub3RoaW5nIGVpdGhlciwgc28gaXQgY2Fubm90IGNhbmNlbCB1bmZhdm91cmFibGUgZ2FtZXMuCi8vIEVhY2ggYWRkcmVzcyBtYXkgdXNlIGEgY29tbWl0bWVudCBvbmNlOiBhIHJldXNlZCBzZWNyZXQgaXMgYWxyZWFkeSBwdWJsaWMuCi8vCi8vIENhbGxzIHNpZ25lZCBieSBhbiBhY2NvdW50IHNlc3Npb24ga2V5IChRdWljayBwbGF5KSBtYXkgb25seSBQbGF5LCBSZXZlYWwsCi8vIFJldmVhbFNlZWQsIENsYWltVGltZW91dCBhbmQgQ2FuY2VsOiBhIHN0b2xlbiBzZXNzaW9uIGtleSBtdXN0IG5vdCByZXNpZ24KLy8gZ2FtZXMsIG1vdmUgc3Rha2VzIG9yIGFjdCBhcyB0aGUgb3duZXIuCi8vCi8vIEV2ZXJ5IG1vdmUgaGFzIGEgOTBzIGNsb2NrIG1lYXN1cmVkIGluIGJsb2NrIHRpbWUuIE5vdGhpbmcgb24tY2hhaW4gZmlyZXMKLy8gYnkgaXRzZWxmLCBzbyBhbiBleHBpcmVkIGNsb2NrIGlzIHNldHRsZWQgYnkgYW55b25lIGNhbGxpbmcgQ2xhaW1UaW1lb3V0OgovLyB3aG9ldmVyIGRpZCBub3QgcmV2ZWFsIGluIHRpbWUgZm9yZmVpdHMsIGEgZ2FtZSB3aG9zZSBmaXJzdCBtb3ZlciBuZXZlcgovLyBtb3ZlZCBpcyB2b2lkIGFuZCBib3RoIHN0YWtlcyBhcmUgcmVmdW5kZWQsIG90aGVyd2lzZSB0aGUgcGxheWVyIHdobyByYW4KLy8gb3V0IG9mIHRpbWUgZm9yZmVpdHMuCnBhY2thZ2UgY29ubmVjdDQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvb3duYWJsZS92MCIKKQoKY29uc3QgKAoJbW92ZVRpbWVvdXQgPSA5MCAqIHRpbWUuU2Vjb25kCgltYXhPZmZlclRUTCA9IDYwIC8vIG1pbnV0ZXMKCWZlZUNhcCAgICAgID0gbWluU3Rha2UgLyAyCgltaW5TdGFrZSAgICA9IDFfMDAwXzAwMCAvLyB1Z25vdAoJZGVub20gICAgICAgPSAidWdub3QiCikKCnR5cGUgU3RhdHVzIGludAoKY29uc3QgKAoJT3BlbiBTdGF0dXMgPSBpb3RhCglQbGF5aW5nCglXb24KCURyYXcKCVZvaWQKCUNhbmNlbGxlZAopCgpmdW5jIChzIFN0YXR1cykgU3RyaW5nKCkgc3RyaW5nIHsKCXJldHVybiBbLi4uXXN0cmluZ3sib3BlbiIsICJwbGF5aW5nIiwgIndvbiIsICJkcmF3IiwgInZvaWQiLCAiY2FuY2VsbGVkIn1bc10KfQoKdHlwZSBHYW1lIHN0cnVjdCB7CglJRCAgICAgICAgaW50CglDcmVhdG9yICAgYWRkcmVzcwoJT3Bwb25lbnQgIGFkZHJlc3MgLy8gb3B0aW9uYWw7IGlmIHNldCwgb25seSB0aGlzIGFkZHJlc3MgbWF5IGFjY2VwdAoJQWNjZXB0b3IgIGFkZHJlc3MKCVN0YWtlICAgICBpbnQ2NCAvLyB1Z25vdCwgcGVyIHBsYXllcgoJRmVlICAgICAgIGludDY0IC8vIHVnbm90IGhvdXNlIGZlZSwgZml4ZWQgYXQgb2ZmZXIgdGltZQoJRXhwaXJlc0F0IHRpbWUuVGltZQoJLy8gQ29tbWl0bWVudCBpcyB0aGUgbG93ZXJjYXNlIGhleCBzaGEyNTYgb2YgdGhlIGNyZWF0b3IncyBwYXNzcGhyYXNlOwoJLy8gU2VlZENvbW1pdG1lbnQgdGhhdCBvZiB0aGUgYWNjZXB0b3IncyBzZWVkLCBnaXZlbiB3aXRoIEFjY2VwdC4KCUNvbW1pdG1lbnQgICAgIHN0cmluZwoJU2VlZENvbW1pdG1lbnQgc3RyaW5nCgkvLyBQYXNzcGhyYXNlIGlzIHNldCBieSBSZXZlYWw7IHRoZSBkcmF3IHdhaXRzIGZvciBSZXZlYWxTZWVkLgoJUGFzc3BocmFzZSBzdHJpbmcKCVJldmVhbGVkICAgYm9vbAoKCUJvYXJkICAgIGJvYXJkCglUdXJuICAgICBieXRlIC8vIDAgPSBhd2FpdGluZyB0aGUgcmV2ZWFscywgMSA9IGNyZWF0b3IsIDIgPSBhY2NlcHRvcgoJTW92ZXMgICAgaW50CglMYXN0Q29sICBpbnQgLy8gY29sdW1uIGFuZCByb3cgb2YgdGhlIGxhc3QgcGllY2UgZHJvcHBlZCwgdmFsaWQgaWYgTW92ZXMgPiAwCglMYXN0Um93ICBpbnQKCUxhc3RNb3ZlIHRpbWUuVGltZQoJU3RhdHVzICAgU3RhdHVzCglXaW5uZXIgICBhZGRyZXNzCn0KCnR5cGUgU3RhdHMgc3RydWN0IHsKCUdhbWVzLCBXaW5zLCBEcmF3cyBpbnQKCUdub3RXb24gICAgICAgICAgICBpbnQ2NCAvLyB0b3RhbCBuZXQgdWdub3Qgd29uOiB0aGUgb3Bwb25lbnQncyBzdGFrZSBtaW51cyB0aGUgZmVlCn0KCnZhciAoCglnYW1lcyAgICAgICAgIGF2bC5UcmVlIC8vIGtleShpZCkgLT4gKkdhbWUKCWFjdGl2ZSAgICAgICAgYXZsLlRyZWUgLy8ga2V5KGlkKSAtPiAqR2FtZSwgb25seSBPcGVuIGFuZCBQbGF5aW5nCglzdGF0cyAgICAgICAgIGF2bC5UcmVlIC8vIGFkZHJlc3MgLT4gKlN0YXRzCgluZXh0SUQgICAgICAgIGludAoJZmVlICAgICAgICAgICBpbnQ2NCA9IDEwMF8wMDAgLy8gdWdub3QgcGVyIGRlY2lzaXZlIGdhbWUKCWZlZXNDb2xsZWN0ZWQgaW50NjQKCW93bmVyICAgICAgICAgKm93bmFibGUuT3duYWJsZSAvLyB0aGUgZGVwbG95ZXI7IG5pbCAobm8gb3duZXIpIGlmIGRlcGxveWVkIHNvbWUgb3RoZXIgd2F5CglwZW5kaW5nT3duZXIgIGFkZHJlc3MgICAgICAgICAgLy8gc2V0IGJ5IFRyYW5zZmVyT3duZXJzaGlwLCBtYWRlIG93bmVyIGJ5IEFjY2VwdE93bmVyc2hpcAoJdXNlZCAgICAgICAgICBhdmwuVHJlZSAgICAgICAgIC8vIGFkZHJlc3MgKyAiOiIgKyBjb21taXRtZW50IC0+IHRydWUsIGJvdGgga2luZHMKCS8vIHRlc3RTZXNzaW9uIG1ha2VzIHRlc3RzIHNlZSBldmVyeSBjYWxsIGFzIHNlc3Npb24tc2lnbmVkIChubyB0ZXN0IGhvb2sgc2V0cyBvbmUpLgoJdGVzdFNlc3Npb24gYm9vbAopCgovLyBUaGUgZGVwbG95ZXIgb3ducyB0aGUgcmVhbG06IGRlcGxveSBmcm9tIHRoZSBtdWx0aXNpZyB0aGF0IHNob3VsZCBvd24gaXQuCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJb3duZXIgPSBvd25hYmxlLk5ld1dpdGhBZGRyZXNzKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCX0KfQoKLy8gT2ZmZXIgcG9zdHMgYSBnYW1lIG9wZW4gZm9yIHZhbGlkRm9yIG1pbnV0ZXMuIFRoZSBzdGFrZSBpcyB0aGUgdWdub3Qgc2VudAovLyB3aXRoIHRoZSBjYWxsLiBBIG5vbi1lbXB0eSBvcHBvbmVudCBtYWtlcyB0aGUgb2ZmZXIgcHJpdmF0ZS4gY29tbWl0bWVudCBpcwovLyB0aGUgbG93ZXJjYXNlIGhleCBzaGEyNTYgb2YgYSBzZWNyZXQgcGFzc3BocmFzZSwgcmV2ZWFsZWQgYWZ0ZXIgQWNjZXB0LgpmdW5jIE9mZmVyKGN1ciByZWFsbSwgb3Bwb25lbnQgYWRkcmVzcywgdmFsaWRGb3IgaW50LCBjb21taXRtZW50IHN0cmluZywgbWF4RmVlIGludDY0KSBpbnQgewoJbm9TZXNzaW9uKCJPZmZlciIpCglzdGFrZSA6PSByZWNlaXZlZChjdXIpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBvcHBvbmVudCA9PSBjYWxsZXIgewoJCXBhbmljKCJjYW5ub3QgY2hhbGxlbmdlIHlvdXJzZWxmIikKCX0KCWlmIGVycnMgOj0gdmFsaWRhdGVPZmZlcihzdGFrZSwgdmFsaWRGb3IsIG9wcG9uZW50LCBjb21taXRtZW50KTsgbGVuKGVycnMpID4gMCB7CgkJcGFuaWMoZXJyc1swXSkKCX0KCS8vIFRoZSBmZWUgaXMgc25hcHNob3R0ZWQgaW50byB0aGUgZ2FtZTogbWF4RmVlIGlzIHRoZSBtb3N0IHRoZSBjcmVhdG9yCgkvLyBhZ3JlZWQgdG8sIHNvIGEgZmVlIHJhaXNlZCB3aGlsZSB0aGUgb2ZmZXIgd2FzIGluIGZsaWdodCBpcyByZWZ1c2VkLgoJaWYgZmVlID4gbWF4RmVlIHsKCQlwYW5pYygidGhlIGhvdXNlIGZlZSBpcyAiICsgZ25vdChmZWUpICsgIiwgYWJvdmUgeW91ciBtYXhpbXVtIG9mICIgKyBnbm90KG1heEZlZSkpCgl9Cgl1c2VDb21taXRtZW50KGNhbGxlciwgY29tbWl0bWVudCkKCW5leHRJRCsrCglnIDo9ICZHYW1lewoJCUlEOiAgICAgICAgbmV4dElELAoJCUNyZWF0b3I6ICAgY2FsbGVyLAoJCU9wcG9uZW50OiAgb3Bwb25lbnQsCgkJU3Rha2U6ICAgICBzdGFrZSwKCQlGZWU6ICAgICAgIGZlZSwKCQlFeHBpcmVzQXQ6IHRpbWUuTm93KCkuQWRkKHRpbWUuRHVyYXRpb24odmFsaWRGb3IpICogdGltZS5NaW51dGUpLAoKCQlDb21taXRtZW50OiBjb21taXRtZW50LAoJfQoJZ2FtZXMuU2V0KGtleShnLklEKSwgZykKCWFjdGl2ZS5TZXQoa2V5KGcuSUQpLCBnKQoJcmV0dXJuIGcuSUQKfQoKLy8gdmFsaWRhdGVPZmZlciByZXR1cm5zIGV2ZXJ5IHJ1bGUgYW4gb2ZmZXIgYnJlYWtzLiBPZmZlciBwYW5pY3Mgd2l0aCB0aGUKLy8gZmlyc3Q7IHRoZSAibmV3IiBwYWdlIGxpc3RzIHRoZW0gYWxsIGJlZm9yZSBhbnlvbmUgc2lnbnMuCmZ1bmMgdmFsaWRhdGVPZmZlcihzdGFrZSBpbnQ2NCwgdmFsaWRGb3IgaW50LCBvcHBvbmVudCBhZGRyZXNzLCBjb21taXRtZW50IHN0cmluZykgW11zdHJpbmcgewoJdmFyIGVycnMgW11zdHJpbmcKCWlmIHN0YWtlIDwgbWluU3Rha2UgewoJCWVycnMgPSBhcHBlbmQoZXJycywgInN0YWtlIGJlbG93IG1pbmltdW0gb2YgIitnbm90KG1pblN0YWtlKSkKCX0KCWlmIHN0YWtlIDw9IGZlZSB7CgkJZXJycyA9IGFwcGVuZChlcnJzLCAic3Rha2UgbXVzdCBleGNlZWQgdGhlIGhvdXNlIGZlZSBvZiAiK2dub3QoZmVlKSkKCX0KCWlmIHZhbGlkRm9yIDwgMSB8fCB2YWxpZEZvciA+IG1heE9mZmVyVFRMIHsKCQllcnJzID0gYXBwZW5kKGVycnMsICJ2YWxpZEZvciBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNjAgbWludXRlcyIpCgl9CgkvLyBJc1ZhbGlkIGFsc28gYWNjZXB0cyBvdGhlciBzcGVsbGluZ3Mgb2YgYW4gYWRkcmVzcywgd2hpY2ggd291bGQgbmV2ZXIKCS8vIG1hdGNoIHRoZSBjYW5vbmljYWwgb25lIEFjY2VwdCBjb21wYXJlcyBhZ2FpbnN0LgoJaWYgb3Bwb25lbnQgIT0gIiIgJiYgIWNhbm9uaWNhbChvcHBvbmVudCkgewoJCWVycnMgPSBhcHBlbmQoZXJycywgImludmFsaWQgb3Bwb25lbnQgYWRkcmVzcyAodXNlIHRoZSBsb3dlci1jYXNlIGcx4oCmIGZvcm0pIikKCX0KCWlmICFpc0hleFNIQTI1Nihjb21taXRtZW50KSB7CgkJZXJycyA9IGFwcGVuZChlcnJzLCAiY29tbWl0bWVudCBtdXN0IGJlIDY0IGxvd2VyY2FzZSBoZXggY2hhcnMgKHNoYTI1NiBvZiB5b3VyIHBhc3NwaHJhc2UpIikKCX0KCXJldHVybiBlcnJzCn0KCi8vIEFjY2VwdCBqb2lucyBhbiBvcGVuIG9mZmVyIGJ5IHNlbmRpbmcgZXhhY3RseSBpdHMgc3Rha2UuIHNlZWRDb21taXRtZW50IGlzCi8vIHRoZSBsb3dlcmNhc2UgaGV4IHNoYTI1NiBvZiBhIHNlY3JldCBzZWVkLCByZXZlYWxlZCBhZnRlciB0aGUgY3JlYXRvcidzCi8vIHBhc3NwaHJhc2UuIFRoZSBjcmVhdG9yIHRoZW4gaGFzIDkwcyB0byBSZXZlYWwuCmZ1bmMgQWNjZXB0KGN1ciByZWFsbSwgaWQgaW50LCBzZWVkQ29tbWl0bWVudCBzdHJpbmcpIHsKCW5vU2Vzc2lvbigiQWNjZXB0IikKCXN0YWtlIDo9IHJlY2VpdmVkKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWcgOj0gbXVzdEdldChpZCkKCWlmIGcuU3RhdHVzICE9IE9wZW4gewoJCXBhbmljKCJnYW1lIGlzIG5vdCBvcGVuIikKCX0KCWlmICF0aW1lLk5vdygpLkJlZm9yZShnLkV4cGlyZXNBdCkgewoJCXBhbmljKCJvZmZlciBleHBpcmVkIikKCX0KCWlmIGNhbGxlciA9PSBnLkNyZWF0b3IgewoJCXBhbmljKCJjYW5ub3QgYWNjZXB0IHlvdXIgb3duIG9mZmVyIikKCX0KCWlmIGcuT3Bwb25lbnQgIT0gIiIgJiYgY2FsbGVyICE9IGcuT3Bwb25lbnQgewoJCXBhbmljKCJvZmZlciBpcyByZXNlcnZlZCBmb3IgYW5vdGhlciBwbGF5ZXIiKQoJfQoJaWYgc3Rha2UgIT0gZy5TdGFrZSB7CgkJcGFuaWMoIm11c3Qgc2VuZCBleGFjdGx5ICIgKyBzdHJjb252LkZvcm1hdEludChnLlN0YWtlLCAxMCkgKyBkZW5vbSkKCX0KCWlmICFpc0hleFNIQTI1NihzZWVkQ29tbWl0bWVudCkgewoJCXBhbmljKCJzZWVkQ29tbWl0bWVudCBtdXN0IGJlIDY0IGxvd2VyY2FzZSBoZXggY2hhcnMgKHNoYTI1NiBvZiB5b3VyIHNlZWQpIikKCX0KCXVzZUNvbW1pdG1lbnQoY2FsbGVyLCBzZWVkQ29tbWl0bWVudCkKCWcuQWNjZXB0b3IgPSBjYWxsZXIKCWcuU2VlZENvbW1pdG1lbnQgPSBzZWVkQ29tbWl0bWVudAoJZy5TdGF0dXMgPSBQbGF5aW5nCglnLkxhc3RNb3ZlID0gdGltZS5Ob3coKSAvLyBUdXJuIHN0YXlzIDAgdW50aWwgUmV2ZWFsCn0KCi8vIFJldmVhbCBkaXNjbG9zZXMgdGhlIGNyZWF0b3IncyBwYXNzcGhyYXNlLiBJdCBtdXN0IGNvbWUgd2l0aGluIDkwcyBvZgovLyBBY2NlcHQ7IHRoZSBhY2NlcHRvciB0aGVuIGhhcyA5MHMgdG8gUmV2ZWFsU2VlZC4KZnVuYyBSZXZlYWwoY3VyIHJlYWxtLCBpZCBpbnQsIHBhc3NwaHJhc2Ugc3RyaW5nKSB7Cglub0NvaW5zKCkKCWcgOj0gbXVzdEdldChpZCkKCWlmIGcuU3RhdHVzICE9IFBsYXlpbmcgfHwgZy5UdXJuICE9IDAgfHwgZy5SZXZlYWxlZCB7CgkJcGFuaWMoImdhbWUgaXMgbm90IGF3YWl0aW5nIHRoZSBjcmVhdG9yJ3MgcmV2ZWFsIikKCX0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBnLkNyZWF0b3IgewoJCXBhbmljKCJvbmx5IHRoZSBjcmVhdG9yIGNhbiByZXZlYWwiKQoJfQoJaWYgdGltZS5Ob3coKS5BZnRlcihnLmRlYWRsaW5lKCkpIHsKCQlwYW5pYygicmV2ZWFsIGNsb2NrIHJhbiBvdXQiKQoJfQoJaWYgbGVuKHBhc3NwaHJhc2UpID4gMTI4IHsKCQlwYW5pYygicGFzc3BocmFzZSBsb25nZXIgdGhhbiAxMjggYnl0ZXMiKQoJfQoJaWYgc2hhMjU2SGV4KHBhc3NwaHJhc2UpICE9IGcuQ29tbWl0bWVudCB7CgkJcGFuaWMoInBhc3NwaHJhc2UgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbW1pdG1lbnQiKQoJfQoJZy5QYXNzcGhyYXNlID0gcGFzc3BocmFzZQoJZy5SZXZlYWxlZCA9IHRydWUKCWcuTGFzdE1vdmUgPSB0aW1lLk5vdygpCn0KCi8vIFJldmVhbFNlZWQgZGlzY2xvc2VzIHRoZSBhY2NlcHRvcidzIHNlZWQsIHdoaWNoIHdpdGggdGhlIGNyZWF0b3IncwovLyBwYXNzcGhyYXNlIHBpY2tzIHRoZSBmaXJzdCBtb3Zlci4gSXQgbXVzdCBjb21lIHdpdGhpbiA5MHMgb2YgUmV2ZWFsLgpmdW5jIFJldmVhbFNlZWQoY3VyIHJlYWxtLCBpZCBpbnQsIHNlZWQgc3RyaW5nKSB7Cglub0NvaW5zKCkKCWcgOj0gbXVzdEdldChpZCkKCWlmIGcuU3RhdHVzICE9IFBsYXlpbmcgfHwgZy5UdXJuICE9IDAgfHwgIWcuUmV2ZWFsZWQgewoJCXBhbmljKCJnYW1lIGlzIG5vdCBhd2FpdGluZyB0aGUgYWNjZXB0b3IncyBzZWVkIikKCX0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBnLkFjY2VwdG9yIHsKCQlwYW5pYygib25seSB0aGUgYWNjZXB0b3IgY2FuIHJldmVhbCB0aGUgc2VlZCIpCgl9CglpZiB0aW1lLk5vdygpLkFmdGVyKGcuZGVhZGxpbmUoKSkgewoJCXBhbmljKCJyZXZlYWwgY2xvY2sgcmFuIG91dCIpCgl9CglpZiBzaGEyNTZIZXgoc2VlZCkgIT0gZy5TZWVkQ29tbWl0bWVudCB7CgkJcGFuaWMoInNlZWQgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbW1pdG1lbnQiKQoJfQoJZy5UdXJuID0gZmlyc3RNb3ZlcihnLlBhc3NwaHJhc2UsIHNlZWQsIGcpCglnLkxhc3RNb3ZlID0gdGltZS5Ob3coKQp9CgovLyBmaXJzdE1vdmVyIGRyYXdzIDEgKGNyZWF0b3IpIG9yIDIgKGFjY2VwdG9yKSBmcm9tIGJvdGggc2VjcmV0cy4KZnVuYyBmaXJzdE1vdmVyKHBhc3NwaHJhc2UsIHNlZWQgc3RyaW5nLCBnICpHYW1lKSBieXRlIHsKCWggOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUoc3RyaW5ncy5Kb2luKFtdc3RyaW5newoJCXBhc3NwaHJhc2UsIHNlZWQsIHN0cmNvbnYuSXRvYShnLklEKSwgZy5DcmVhdG9yLlN0cmluZygpLCBnLkFjY2VwdG9yLlN0cmluZygpLAoJfSwgInwiKSkpCglyZXR1cm4gMSArIGhbMF0mMQp9CgovLyBQbGF5IGRyb3BzIGEgcGllY2UgaW4gY29sdW1uICgxLTcpLiBtb3ZlIGlzIHRoZSBnYW1lJ3MgbW92ZSBjb3VudCB0aGUKLy8gcGxheWVyIHNhdyAoTW92ZXMgYmVmb3JlIHRoaXMgcGllY2UpOiBhIHJlc2VudCBvciBkZWxheWVkIG1vdmUgdGhhdCB0aGUgZ2FtZQovLyBoYXMgbW92ZWQgcGFzdCBpcyByZWZ1c2VkIGluc3RlYWQgb2YgYmVpbmcgcGxheWVkIG9uIGEgbGF0ZXIgdHVybi4KZnVuYyBQbGF5KGN1ciByZWFsbSwgaWQsIGNvbHVtbiwgbW92ZSBpbnQpIHsKCW5vQ29pbnMoKQoJZyA6PSBtdXN0R2V0KGlkKQoJaWYgZy5TdGF0dXMgIT0gUGxheWluZyB7CgkJcGFuaWMoImdhbWUgaXMgbm90IGluIHByb2dyZXNzIikKCX0KCWlmIGcuVHVybiA9PSAwIHsKCQlwYW5pYygid2FpdGluZyBmb3IgdGhlIGNyZWF0b3IgdG8gcmV2ZWFsIikKCX0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBnLnBsYXllcihnLlR1cm4pIHsKCQlwYW5pYygibm90IHlvdXIgdHVybiIpCgl9CglpZiB0aW1lLk5vdygpLkFmdGVyKGcuZGVhZGxpbmUoKSkgewoJCXBhbmljKCJtb3ZlIGNsb2NrIHJhbiBvdXQiKQoJfQoJaWYgbW92ZSAhPSBnLk1vdmVzIHsKCQlwYW5pYygic3RhbGUgbW92ZTogdGhlIGdhbWUgaXMgYXQgbW92ZSAiICsgc3RyY29udi5JdG9hKGcuTW92ZXMpKQoJfQoJaWYgY29sdW1uIDwgMSB8fCBjb2x1bW4gPiBjb2xzIHsKCQlwYW5pYygiY29sdW1uIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IikKCX0KCXIgOj0gZy5Cb2FyZC5kcm9wKGNvbHVtbi0xLCBnLlR1cm4pCglpZiByIDwgMCB7CgkJcGFuaWMoImNvbHVtbiBpcyBmdWxsIikKCX0KCWcuTW92ZXMrKwoJZy5MYXN0Q29sLCBnLkxhc3RSb3cgPSBjb2x1bW4tMSwgcgoJc3dpdGNoIHsKCWNhc2UgZy5Cb2FyZC53aW5zKGNvbHVtbi0xLCByKToKCQlzZXR0bGVXaW4oY3VyLCBnLCBnLnBsYXllcihnLlR1cm4pKQoJY2FzZSBnLk1vdmVzID09IGNvbHMqcm93czoKCQlzZXR0bGVEcmF3KGN1ciwgZykKCWRlZmF1bHQ6CgkJZy5UdXJuID0gMyAtIGcuVHVybgoJCWcuTGFzdE1vdmUgPSB0aW1lLk5vdygpCgl9Cn0KCi8vIENsYWltVGltZW91dCBzZXR0bGVzIGEgZ2FtZSB3aG9zZSBtb3ZlIGNsb2NrIHJhbiBvdXQuIEFueW9uZSBtYXkgY2FsbCBpdC4KZnVuYyBDbGFpbVRpbWVvdXQoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCW5vQ29pbnMoKQoJZyA6PSBtdXN0R2V0KGlkKQoJaWYgZy5TdGF0dXMgIT0gUGxheWluZyB7CgkJcGFuaWMoImdhbWUgaXMgbm90IGluIHByb2dyZXNzIikKCX0KCWlmICF0aW1lLk5vdygpLkFmdGVyKGcuZGVhZGxpbmUoKSkgewoJCXBhbmljKCJtb3ZlIGNsb2NrIGhhcyBub3QgcnVuIG91dCIpCgl9CglpZiBnLlR1cm4gPT0gMCB7IC8vIHdob2V2ZXIgZGlkIG5vdCByZXZlYWwgaW4gdGltZSBmb3JmZWl0cwoJCWlmIGcuUmV2ZWFsZWQgewoJCQlzZXR0bGVXaW4oY3VyLCBnLCBnLkNyZWF0b3IpCgkJfSBlbHNlIHsKCQkJc2V0dGxlV2luKGN1ciwgZywgZy5BY2NlcHRvcikKCQl9CgkJcmV0dXJuCgl9CglpZiBnLk1vdmVzID09IDAgewoJCXNldHRsZVZvaWQoY3VyLCBnKQoJCXJldHVybgoJfQoJc2V0dGxlV2luKGN1ciwgZywgZy5wbGF5ZXIoMy1nLlR1cm4pKQp9CgovLyBSZXNpZ24gY29uY2VkZXMgYSBnYW1lIGluIHByb2dyZXNzLgpmdW5jIFJlc2lnbihjdXIgcmVhbG0sIGlkIGludCkgewoJbm9Db2lucygpCglub1Nlc3Npb24oIlJlc2lnbiIpCglnIDo9IG11c3RHZXQoaWQpCglpZiBnLlN0YXR1cyAhPSBQbGF5aW5nIHsKCQlwYW5pYygiZ2FtZSBpcyBub3QgaW4gcHJvZ3Jlc3MiKQoJfQoJc3dpdGNoIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSB7CgljYXNlIGcuQ3JlYXRvcjoKCQlzZXR0bGVXaW4oY3VyLCBnLCBnLkFjY2VwdG9yKQoJY2FzZSBnLkFjY2VwdG9yOgoJCXNldHRsZVdpbihjdXIsIGcsIGcuQ3JlYXRvcikKCWRlZmF1bHQ6CgkJcGFuaWMoIm5vdCBhIHBsYXllciBpbiB0aGlzIGdhbWUiKQoJfQp9CgovLyBDYW5jZWwgd2l0aGRyYXdzIGFuIG9wZW4gb2ZmZXIgYW5kIHJlZnVuZHMgdGhlIGNyZWF0b3IuIFRoZSBjcmVhdG9yIG1heQovLyBjYW5jZWwgYXQgYW55IHRpbWU7IGFueW9uZSBtYXkgb25jZSB0aGUgb2ZmZXIgaGFzIGV4cGlyZWQuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgaWQgaW50KSB7Cglub0NvaW5zKCkKCWcgOj0gbXVzdEdldChpZCkKCWlmIGcuU3RhdHVzICE9IE9wZW4gewoJCXBhbmljKCJnYW1lIGlzIG5vdCBvcGVuIikKCX0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBnLkNyZWF0b3IgJiYgdGltZS5Ob3coKS5CZWZvcmUoZy5FeHBpcmVzQXQpIHsKCQlwYW5pYygib25seSB0aGUgY3JlYXRvciBjYW4gY2FuY2VsIGFuIHVuZXhwaXJlZCBvZmZlciIpCgl9CglmaW5pc2goZywgQ2FuY2VsbGVkKQoJc2VuZChjdXIsIGcuQ3JlYXRvciwgZy5TdGFrZSkKfQoKLy8gU2V0RmVlIGNoYW5nZXMgdGhlIGZsYXQgaG91c2UgZmVlLCBpbiB1Z25vdCwgZm9yIG5ldyBvZmZlcnMuIEdhbWVzIGFscmVhZHkKLy8gb2ZmZXJlZCBrZWVwIHRoZSBmZWUgdGhleSB3ZXJlIGNyZWF0ZWQgd2l0aC4KZnVuYyBTZXRGZWUoY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCW5vQ29pbnMoKQoJbm9TZXNzaW9uKCJTZXRGZWUiKQoJb3duZXIuQXNzZXJ0T3duZWRCeShjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgkvLyBDYXBwZWQgc28gdGhlIG93bmVyIGNhbid0IHJhaXNlIHRoZSBmZWUgdG8gdGFrZSBtb3N0IG9mIGEgc3Rha2UgYnkKCS8vIGNoYW5naW5nIGl0IGp1c3QgYmVmb3JlIGFuIG9mZmVyIGxhbmRzLgoJaWYgYW1vdW50IDwgMCB8fCBhbW91bnQgPiBmZWVDYXAgewoJCXBhbmljKCJmZWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICIgKyBnbm90KGZlZUNhcCkpCgl9CglmZWUgPSBhbW91bnQKfQoKLy8gV2l0aGRyYXdGZWVzIHNlbmRzIGFsbCBjb2xsZWN0ZWQgZmVlcyB0byB0by4KZnVuYyBXaXRoZHJhd0ZlZXMoY3VyIHJlYWxtLCB0byBhZGRyZXNzKSB7Cglub0NvaW5zKCkKCW5vU2Vzc2lvbigiV2l0aGRyYXdGZWVzIikKCW93bmVyLkFzc2VydE93bmVkQnkoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJYW1vdW50IDo9IGZlZXNDb2xsZWN0ZWQKCWZlZXNDb2xsZWN0ZWQgPSAwCglzZW5kKGN1ciwgdG8sIGFtb3VudCkKfQoKLy8gVHJhbnNmZXJPd25lcnNoaXAgbmFtZXMgdGhlIG5leHQgb3duZXIsIHdobyBiZWNvbWVzIG93bmVyIGJ5IGNhbGxpbmcKLy8gQWNjZXB0T3duZXJzaGlwLiBUd28gc3RlcHMsIHNvIGEgbWlzdHlwZWQgb3Igbm9uLWNhbm9uaWNhbCBhZGRyZXNzIGNhbgovLyBuZXZlciBzdHJhbmQgb3duZXJzaGlwIChhbmQgdGhlIGZlZXMpOiBvbmx5IGFuIGFkZHJlc3MgdGhhdCBzaWducyBjYW4KLy8gYWNjZXB0LCBhbmQgaXQgaXMgcmVjb3JkZWQgYXMgaXQgc2lnbnMuCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBuZXdPd25lciBhZGRyZXNzKSB7Cglub0NvaW5zKCkKCW5vU2Vzc2lvbigiVHJhbnNmZXJPd25lcnNoaXAiKQoJb3duZXIuQXNzZXJ0T3duZWRCeShjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiAhY2Fub25pY2FsKG5ld093bmVyKSB7CgkJcGFuaWMoImludmFsaWQgYWRkcmVzcyAodXNlIHRoZSBsb3dlci1jYXNlIGcx4oCmIGZvcm0pIikKCX0KCXBlbmRpbmdPd25lciA9IG5ld093bmVyCn0KCi8vIEFjY2VwdE93bmVyc2hpcCBjb21wbGV0ZXMgYSBUcmFuc2Zlck93bmVyc2hpcDsgb25seSB0aGUgbmFtZWQgYWRkcmVzcyBtYXkgY2FsbCBpdC4KZnVuYyBBY2NlcHRPd25lcnNoaXAoY3VyIHJlYWxtKSB7Cglub0NvaW5zKCkKCW5vU2Vzc2lvbigiQWNjZXB0T3duZXJzaGlwIikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHBlbmRpbmdPd25lciA9PSAiIiB8fCBjYWxsZXIgIT0gcGVuZGluZ093bmVyIHsKCQlwYW5pYygibm8gb3duZXJzaGlwIHRyYW5zZmVyIHBlbmRpbmcgZm9yIHRoaXMgYWRkcmVzcyIpCgl9Cglvd25lciA9IG93bmFibGUuTmV3V2l0aEFkZHJlc3MoY2FsbGVyKQoJcGVuZGluZ093bmVyID0gIiIKfQoKLy8gdXNlQ29tbWl0bWVudCByZWNvcmRzIGEgY29tbWl0bWVudCBmb3IgYWRkciwgcmVmdXNpbmcgb25lIGl0IGFscmVhZHkgdXNlZDoKLy8gYSByZXZlYWxlZCBzZWNyZXQgaXMgcHVibGljLCBzbyByZXVzaW5nIGl0IGhhbmRzIHRoZSBvdGhlciBzaWRlIHRoZSBkcmF3LgovLyBLZXllZCBieSBhZGRyZXNzLCBzbyBub2JvZHkgY2FuIGJsb2NrIGFub3RoZXIgcGxheWVyJ3MgY29tbWl0bWVudC4KZnVuYyB1c2VDb21taXRtZW50KGFkZHIgYWRkcmVzcywgY29tbWl0bWVudCBzdHJpbmcpIHsKCWsgOj0gYWRkci5TdHJpbmcoKSArICI6IiArIGNvbW1pdG1lbnQKCWlmIHVzZWQuSGFzKGspIHsKCQlwYW5pYygiY29tbWl0bWVudCBhbHJlYWR5IHVzZWQ6IGdlbmVyYXRlIGEgZnJlc2ggc2VjcmV0IikKCX0KCXVzZWQuU2V0KGssIHRydWUpCn0KCi8vIHJlY2VpdmVkIHJldHVybnMgdGhlIHVnbm90IHNlbnQgd2l0aCBhIGRpcmVjdCB1c2VyIGNhbGwuIE9yaWdpblNlbmQgb25seQovLyBkZXNjcmliZXMgYSByZWFsIHBheW1lbnQgdG8gdGhpcyByZWFsbSB3aGVuIHRoZSBjYWxsZXIgaXMgYW4gRU9BIHVzaW5nCi8vIG1ha2V0eCBjYWxsOyBzZWUgZG9jcy9yZXNvdXJjZXMvZWZmZWN0aXZlLWduby5tZC4KZnVuYyByZWNlaXZlZChjdXIgcmVhbG0pIGludDY0IHsKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJvbmx5IHVzZXItY2FsbCAobWFrZXR4IGNhbGwpIGFjY2VwdGVkIikKCX0KCXNlbnQgOj0gdW5zYWZlLk9yaWdpblNlbmQoKQoJaWYgbGVuKHNlbnQpICE9IDEgfHwgc2VudFswXS5EZW5vbSAhPSBkZW5vbSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSBvbmUgIiArIGRlbm9tICsgIiBjb2luIikKCX0KCXJldHVybiBzZW50WzBdLkFtb3VudAp9CgovLyBub0NvaW5zIGd1YXJkcyBjYWxscyB0aGF0IHRha2Ugbm8gcGF5bWVudDogY29pbnMgc2VudCB3aXRoIHRoZW0gd291bGQgYmUKLy8gc3R1Y2sgaW4gdGhlIHJlYWxtLgpmdW5jIG5vQ29pbnMoKSB7CglpZiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgIT0gMCB7CgkJcGFuaWMoInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKLy8gbm9TZXNzaW9uIHJlZnVzZXMgY2FsbHMgc2lnbmVkIGJ5IGFuIGFjY291bnQgc2Vzc2lvbiBrZXkuCmZ1bmMgbm9TZXNzaW9uKGFjdGlvbiBzdHJpbmcpIHsKCWlmIF8sIF8sIF8sIG9rIDo9IHJ1bnRpbWUuR2V0U2Vzc2lvbkluZm8oKTsgb2sgfHwgdGVzdFNlc3Npb24gewoJCXBhbmljKGFjdGlvbiArICIgbmVlZHMgdGhlIGFjY291bnQncyBvd24ga2V5LCBub3QgYSBzZXNzaW9uIGtleSIpCgl9Cn0KCmZ1bmMgc2hhMjU2SGV4KHMgc3RyaW5nKSBzdHJpbmcgewoJaCA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShzKSkKCXJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoaFs6XSkKfQoKZnVuYyBpc0hleFNIQTI1NihzIHN0cmluZykgYm9vbCB7CglpZiBsZW4ocykgIT0gNjQgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgcyB7CgkJaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykgJiYgKGMgPCAnYScgfHwgYyA+ICdmJykgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIHNldHRsZVdpbihjdXIgcmVhbG0sIGcgKkdhbWUsIHdpbm5lciBhZGRyZXNzKSB7Cglsb3NlciA6PSBnLkNyZWF0b3IKCWlmIHdpbm5lciA9PSBnLkNyZWF0b3IgewoJCWxvc2VyID0gZy5BY2NlcHRvcgoJfQoJcG90IDo9IDIgKiBnLlN0YWtlCglmaW5pc2goZywgV29uKQoJZy5XaW5uZXIgPSB3aW5uZXIKCWZlZXNDb2xsZWN0ZWQgKz0gZy5GZWUKCXcgOj0gc3RhdHNPZih3aW5uZXIpCgl3LkdhbWVzKysKCXcuV2lucysrCgl3Lkdub3RXb24gKz0gZy5TdGFrZSAtIGcuRmVlCgl0b3BXaW5zID0gYnVtcCh0b3BXaW5zLCB3aW5uZXIsIGludDY0KHcuV2lucykpCgl0b3BHbm90ID0gYnVtcCh0b3BHbm90LCB3aW5uZXIsIHcuR25vdFdvbikKCXN0YXRzT2YobG9zZXIpLkdhbWVzKysKCXNlbmQoY3VyLCB3aW5uZXIsIHBvdC1nLkZlZSkKfQoKZnVuYyBzZXR0bGVEcmF3KGN1ciByZWFsbSwgZyAqR2FtZSkgewoJZmluaXNoKGcsIERyYXcpCglmb3IgXywgcCA6PSByYW5nZSBbXWFkZHJlc3N7Zy5DcmVhdG9yLCBnLkFjY2VwdG9yfSB7CgkJcyA6PSBzdGF0c09mKHApCgkJcy5HYW1lcysrCgkJcy5EcmF3cysrCgkJc2VuZChjdXIsIHAsIGcuU3Rha2UpCgl9Cn0KCmZ1bmMgc2V0dGxlVm9pZChjdXIgcmVhbG0sIGcgKkdhbWUpIHsKCWZpbmlzaChnLCBWb2lkKQoJc2VuZChjdXIsIGcuQ3JlYXRvciwgZy5TdGFrZSkKCXNlbmQoY3VyLCBnLkFjY2VwdG9yLCBnLlN0YWtlKQp9CgovLyBsZWFkZXIgaXMgb25lIGxlYWRlcmJvYXJkIHJvdy4gVGhlIGJvYXJkcyBhcmUga2VwdCBhdCBzZXR0bGVtZW50IHNvIFJlbmRlcgovLyBuZXZlciB3YWxrcyBldmVyeSBwbGF5ZXIncyBzdGF0cy4KdHlwZSBsZWFkZXIgc3RydWN0IHsKCUFkZHIgIGFkZHJlc3MKCVNjb3JlIGludDY0Cn0KCnZhciB0b3BXaW5zLCB0b3BHbm90IFtdbGVhZGVyIC8vIGhpZ2hlc3QgZmlyc3QsIGF0IG1vc3QgdG9wTgoKY29uc3QgdG9wTiA9IDEwCgovLyBidW1wIG1vdmVzIGFkZHIgdG8gaXRzIG5ldyBzY29yZSBpbiBib2FyZC4gU2NvcmVzIG9ubHkgZ3Jvdywgc28gYSBwbGF5ZXIKLy8gYWxyZWFkeSBsaXN0ZWQgY2FuIG9ubHkgbW92ZSB1cDsgdGllcyBrZWVwIHRoZSBlYXJsaWVyIGhvbGRlciBmaXJzdC4KZnVuYyBidW1wKGJvYXJkIFtdbGVhZGVyLCBhZGRyIGFkZHJlc3MsIHNjb3JlIGludDY0KSBbXWxlYWRlciB7Cglmb3IgaSwgbCA6PSByYW5nZSBib2FyZCB7CgkJaWYgbC5BZGRyID09IGFkZHIgewoJCQlib2FyZCA9IGFwcGVuZChib2FyZFs6aV0sIGJvYXJkW2krMTpdLi4uKQoJCQlicmVhawoJCX0KCX0KCWkgOj0gbGVuKGJvYXJkKQoJZm9yIGkgPiAwICYmIGJvYXJkW2ktMV0uU2NvcmUgPCBzY29yZSB7CgkJaS0tCgl9CglpZiBpID49IHRvcE4gewoJCXJldHVybiBib2FyZAoJfQoJYm9hcmQgPSBhcHBlbmQoYm9hcmQsIGxlYWRlcnt9KQoJY29weShib2FyZFtpKzE6XSwgYm9hcmRbaTpdKQoJYm9hcmRbaV0gPSBsZWFkZXJ7YWRkciwgc2NvcmV9CglpZiBsZW4oYm9hcmQpID4gdG9wTiB7CgkJYm9hcmQgPSBib2FyZFs6dG9wTl0KCX0KCXJldHVybiBib2FyZAp9CgpmdW5jIGZpbmlzaChnICpHYW1lLCBzIFN0YXR1cykgewoJZy5TdGF0dXMgPSBzCglhY3RpdmUuUmVtb3ZlKGtleShnLklEKSkKfQoKZnVuYyBzZW5kKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7CglpZiBhbW91bnQgPT0gMCB7CgkJcmV0dXJuCgl9CgliYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpLgoJCVNlbmRDb2lucyhjdXIuQWRkcmVzcygpLCB0bywgY2hhaW4uQ29pbnN7e2Rlbm9tLCBhbW91bnR9fSkKfQoKZnVuYyAoZyAqR2FtZSkgcGxheWVyKHR1cm4gYnl0ZSkgYWRkcmVzcyB7CglpZiB0dXJuID09IDEgewoJCXJldHVybiBnLkNyZWF0b3IKCX0KCXJldHVybiBnLkFjY2VwdG9yCn0KCmZ1bmMgKGcgKkdhbWUpIGRlYWRsaW5lKCkgdGltZS5UaW1lIHsgcmV0dXJuIGcuTGFzdE1vdmUuQWRkKG1vdmVUaW1lb3V0KSB9CgpmdW5jIHN0YXRzT2YoYWRkciBhZGRyZXNzKSAqU3RhdHMgewoJaWYgdiA6PSBzdGF0cy5HZXQoYWRkci5TdHJpbmcoKSk7IHYgIT0gbmlsIHsKCQlyZXR1cm4gdi4oKlN0YXRzKQoJfQoJcyA6PSAmU3RhdHN7fQoJc3RhdHMuU2V0KGFkZHIuU3RyaW5nKCksIHMpCglyZXR1cm4gcwp9CgovLyBrZXkgemVyby1wYWRzIGlkcyBzbyBhdmwgaXRlcmF0aW9uIG9yZGVyIG1hdGNoZXMgY3JlYXRpb24gb3JkZXIuCmZ1bmMga2V5KGlkIGludCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5JdG9hKGlkKQoJaWYgbGVuKHMpIDwgMTAgewoJCXMgPSBzdHJpbmdzLlJlcGVhdCgiMCIsIDEwLWxlbihzKSkgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIGdldChpZCBpbnQpICpHYW1lIHsKCWlmIHYgOj0gZ2FtZXMuR2V0KGtleShpZCkpOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCpHYW1lKQoJfQoJcmV0dXJuIG5pbAp9CgpmdW5jIG11c3RHZXQoaWQgaW50KSAqR2FtZSB7CglnIDo9IGdldChpZCkKCWlmIGcgPT0gbmlsIHsKCQlwYW5pYygiZ2FtZSBub3QgZm91bmQiKQoJfQoJcmV0dXJuIGcKfQoaQgoLZ25vbW9kLnRvbWwSM21vZHVsZSA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvY29ubmVjdDQiCmdubyA9ICIwLjkiChqIHQoIanNvbi5nbm8S+xxwYWNrYWdlIGNvbm5lY3Q0CgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgopCgovLyBHYW1lSlNPTiByZXR1cm5zIHsibm93Ijo8dW5peD4sImdhbWUiOjxnYW1lPnxudWxsfS4gSXQgaXMgYSByZWFkLW9ubHkKLy8gYWNjZXNzb3IgZm9yIGNsaWVudHMgcXVlcnlpbmcgb3ZlciB2bS9xZXZhbDsgbm93IGlzIHRoZSBibG9jayB0aW1lLgpmdW5jIEdhbWVKU09OKGlkIGludCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJd3JpdGVOb3coJmIpCgliLldyaXRlU3RyaW5nKGAsImdhbWUiOmApCglpZiBnIDo9IGdldChpZCk7IGcgIT0gbmlsIHsKCQl3cml0ZUdhbWUoJmIsIGcpCgl9IGVsc2UgewoJCWIuV3JpdGVTdHJpbmcoIm51bGwiKQoJfQoJYi5Xcml0ZVN0cmluZygifSIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBBY3RpdmVKU09OIHJldHVybnMgeyJub3ciOjx1bml4PiwiZmVlIjo8dWdub3Q+LCJnYW1lcyI6Wy4uLl19OiB0aGUgaG91c2UgZmVlCi8vIGZvciBuZXcgb2ZmZXJzLCB0aGVuIE9wZW4gYW5kIFBsYXlpbmcgZ2FtZXMgaW4gaWQgb3JkZXIsIHNraXBwaW5nIG9mZnNldCBhbmQKLy8gcmV0dXJuaW5nIGF0IG1vc3QgbGltaXQgKGNsYW1wZWQgdG8gMS0xMDApLgpmdW5jIEFjdGl2ZUpTT04ob2Zmc2V0LCBsaW1pdCBpbnQpIHN0cmluZyB7CglpZiBvZmZzZXQgPCAwIHsKCQlvZmZzZXQgPSAwCgl9CglpZiBsaW1pdCA8IDEgewoJCWxpbWl0ID0gMQoJfQoJaWYgbGltaXQgPiAxMDAgewoJCWxpbWl0ID0gMTAwCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCXdyaXRlTm93KCZiKQoJd3JpdGVOdW0oJmIsICJmZWUiLCBmZWUpCgliLldyaXRlU3RyaW5nKGAsImdhbWVzIjpbYCkKCW4gOj0gMAoJYWN0aXZlLkl0ZXJhdGVCeU9mZnNldChvZmZzZXQsIGxpbWl0LCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJaWYgbiA+IDAgewoJCQliLldyaXRlU3RyaW5nKCIsIikKCQl9CgkJd3JpdGVHYW1lKCZiLCB2LigqR2FtZSkpCgkJbisrCgkJcmV0dXJuIGZhbHNlCgl9KQoJYi5Xcml0ZVN0cmluZygiXX0iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyB3cml0ZU5vdyhiICpzdHJpbmdzLkJ1aWxkZXIpIHsKCWIuV3JpdGVTdHJpbmcoYHsibm93IjpgKQoJYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludCh0aW1lLk5vdygpLlVuaXgoKSwgMTApKQp9CgovLyB3cml0ZUdhbWUgZW1pdHMgb25lIGdhbWUuIEV2ZXJ5IHN0b3JlZCBzdHJpbmcgaXMgdmFsaWRhdGVkIG9uIHdyaXRlCi8vIChhZGRyZXNzZXMgYnkgSXNWYWxpZCwgdGhlIGNvbW1pdG1lbnQgYXMgaGV4KSwgc28gUXVvdGUgaXMgZGVmZW5jZSBpbiBkZXB0aC4KZnVuYyB3cml0ZUdhbWUoYiAqc3RyaW5ncy5CdWlsZGVyLCBnICpHYW1lKSB7Cgl0dXJuUGxheWVyIDo9ICIiCglkZWFkbGluZSA6PSBpbnQ2NCgwKQoJaWYgZy5TdGF0dXMgPT0gUGxheWluZyB7CgkJZGVhZGxpbmUgPSBnLmRlYWRsaW5lKCkuVW5peCgpCgkJaWYgZy5UdXJuICE9IDAgewoJCQl0dXJuUGxheWVyID0gZy5wbGF5ZXIoZy5UdXJuKS5TdHJpbmcoKQoJCX0KCX0KCWIuV3JpdGVTdHJpbmcoYHsiaWQiOmApCgliLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShnLklEKSkKCXdyaXRlU3RyKGIsICJjcmVhdG9yIiwgZy5DcmVhdG9yLlN0cmluZygpKQoJd3JpdGVTdHIoYiwgIm9wcG9uZW50IiwgZy5PcHBvbmVudC5TdHJpbmcoKSkKCXdyaXRlU3RyKGIsICJhY2NlcHRvciIsIGcuQWNjZXB0b3IuU3RyaW5nKCkpCgl3cml0ZU51bShiLCAic3Rha2UiLCBnLlN0YWtlKQoJd3JpdGVOdW0oYiwgImZlZSIsIGcuRmVlKQoJd3JpdGVOdW0oYiwgImV4cGlyZXNBdCIsIGcuRXhwaXJlc0F0LlVuaXgoKSkKCXdyaXRlU3RyKGIsICJjb21taXRtZW50IiwgZy5Db21taXRtZW50KQoJd3JpdGVTdHIoYiwgInNlZWRDb21taXRtZW50IiwgZy5TZWVkQ29tbWl0bWVudCkKCS8vIHJldmVhbGVkOiB0aGUgY3JlYXRvcidzIHBhc3NwaHJhc2UgaXMgb3V0OyB3aXRoIHR1cm4gMCB0aGUgZ2FtZSB3YWl0cyBmb3IgUmV2ZWFsU2VlZC4KCWlmIGcuUmV2ZWFsZWQgewoJCWIuV3JpdGVTdHJpbmcoYCwicmV2ZWFsZWQiOnRydWVgKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKGAsInJldmVhbGVkIjpmYWxzZWApCgl9CgliLldyaXRlU3RyaW5nKGAsImJvYXJkIjoiYCkKCWZvciBjIDo9IDA7IGMgPCBjb2xzOyBjKysgewoJCWZvciByIDo9IDA7IHIgPCByb3dzOyByKysgewoJCQliLldyaXRlQnl0ZSgnMCcgKyBnLkJvYXJkW2NdW3JdKQoJCX0KCX0KCWIuV3JpdGVTdHJpbmcoYCJgKQoJd3JpdGVOdW0oYiwgInR1cm4iLCBpbnQ2NChnLlR1cm4pKQoJd3JpdGVTdHIoYiwgInR1cm5QbGF5ZXIiLCB0dXJuUGxheWVyKQoJd3JpdGVOdW0oYiwgIm1vdmVzIiwgaW50NjQoZy5Nb3ZlcykpCgl3cml0ZU51bShiLCAibGFzdENvbCIsIGludDY0KGcuTGFzdENvbCkpCgl3cml0ZU51bShiLCAibGFzdFJvdyIsIGludDY0KGcuTGFzdFJvdykpCgl3cml0ZU51bShiLCAiZGVhZGxpbmUiLCBkZWFkbGluZSkKCXdyaXRlU3RyKGIsICJzdGF0dXMiLCBnLlN0YXR1cy5TdHJpbmcoKSkKCXdyaXRlU3RyKGIsICJ3aW5uZXIiLCBnLldpbm5lci5TdHJpbmcoKSkKCWIuV3JpdGVTdHJpbmcoIn0iKQp9CgovLyB3cml0ZVN0ciBhbmQgd3JpdGVOdW0gYXBwZW5kIGAsImsiOnZgOyB0aGUgY2FsbGVyIHdyaXRlcyB0aGUgZmlyc3QgZmllbGQuCmZ1bmMgd3JpdGVTdHIoYiAqc3RyaW5ncy5CdWlsZGVyLCBrLCB2IHN0cmluZykgewoJYi5Xcml0ZVN0cmluZyhgLCJgKQoJYi5Xcml0ZVN0cmluZyhrKQoJYi5Xcml0ZVN0cmluZyhgIjpgKQoJYi5Xcml0ZVN0cmluZyhzdHJjb252LlF1b3RlKHYpKQp9CgpmdW5jIHdyaXRlTnVtKGIgKnN0cmluZ3MuQnVpbGRlciwgayBzdHJpbmcsIHYgaW50NjQpIHsKCWIuV3JpdGVTdHJpbmcoYCwiYCkKCWIuV3JpdGVTdHJpbmcoaykKCWIuV3JpdGVTdHJpbmcoYCI6YCkKCWIuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodiwgMTApKQp9CgovLyBMZWFkZXJzSlNPTiByZXR1cm5zIHsid2lucyI6Wy4uLl0sImdub3QiOlsuLi5dfTogdGhlIHRvcC0xMCBib2FyZHMgKG1vc3QKLy8gZ2FtZXMgd29uLCBtb3N0IHVnbm90IHdvbikga2VwdCBhdCBzZXR0bGVtZW50LCBoaWdoZXN0IGZpcnN0LiBFYWNoIGVudHJ5IGlzCi8vIHsiYWRkciI6PGFkZHJlc3M+LCJzY29yZSI6PGludD59LgpmdW5jIExlYWRlcnNKU09OKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyhgeyJ3aW5zIjpgKQoJd3JpdGVMZWFkZXJzKCZiLCB0b3BXaW5zKQoJYi5Xcml0ZVN0cmluZyhgLCJnbm90IjpgKQoJd3JpdGVMZWFkZXJzKCZiLCB0b3BHbm90KQoJYi5Xcml0ZVN0cmluZygifSIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHdyaXRlTGVhZGVycyhiICpzdHJpbmdzLkJ1aWxkZXIsIGJvYXJkIFtdbGVhZGVyKSB7CgliLldyaXRlU3RyaW5nKCJbIikKCWZvciBpLCBsIDo9IHJhbmdlIGJvYXJkIHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQliLldyaXRlU3RyaW5nKGB7ImFkZHIiOmApCgkJYi5Xcml0ZVN0cmluZyhzdHJjb252LlF1b3RlKGwuQWRkci5TdHJpbmcoKSkpCgkJd3JpdGVOdW0oYiwgInNjb3JlIiwgbC5TY29yZSkKCQliLldyaXRlU3RyaW5nKCJ9IikKCX0KCWIuV3JpdGVTdHJpbmcoIl0iKQp9ChrhawoKcmVuZGVyLmdubxLSa3BhY2thZ2UgY29ubmVjdDQKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJuZXQvdXJsIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9wL21vdWwvdHhsaW5rL3YwIgoJImduby5sYW5kL3AvbnQvc3ZnL3YwIgopCgovLyBsb2JieVJvd3MgY2FwcyB0aGUgZ2FtZXMgdGhlIGxvYmJ5IGxpc3RzLCBzbyBSZW5kZXIgc3RheXMgd2l0aGluIHF1ZXJ5IGdhcwovLyBob3dldmVyIG1hbnkgZ2FtZXMgYXJlIG9wZW47IGNsaWVudHMgcGFnZSB0aHJvdWdoIEFjdGl2ZUpTT04gaW5zdGVhZC4KY29uc3QgbG9iYnlSb3dzID0gNTAKCi8vIEJvYXJkIGNvbG91cnMuIGdub3dlYiBvbmx5IGVtYmVkcyBTVkcgYXMgZGF0YS1VUkkgaW1hZ2VzLCBzbyBlYWNoIGNvbHVtbiBpcwovLyBpdHMgb3duIGltYWdlLCB3cmFwcGVkIGluIGl0cyBQbGF5IGxpbmsgd2hpbGUgdGhlIGdhbWUgaXMgYmVpbmcgcGxheWVkLgpjb25zdCAoCglyZWQgICAgICAgICAgICA9ICIjZTUzOTM1IgoJeWVsbG93ICAgICAgICAgPSAiI2ZkZDgzNSIKCWhvbGUgICAgICAgICAgID0gIiNmZmZmZmYiCglib2FyZEJsdWUgICAgICA9ICIjMTU2NWMwIgoJbGFzdE1vdmVTdHJva2UgPSAiIzIxMjEyMSIKCXdpblN0cm9rZSAgICAgID0gIiMwMGU2NzYiCgljZWxsUHggICAgICAgICA9IDQ4CgloZWFkZXJQeCAgICAgICA9IDIwCikKCnZhciBwaWVjZUNvbG9yID0gWy4uLl1zdHJpbmd7aG9sZSwgcmVkLCB5ZWxsb3d9CnZhciBwaWVjZU5hbWUgPSBbLi4uXXN0cmluZ3siZW1wdHkiLCAicmVkIiwgInllbGxvdyJ9CgovLyBSZW5kZXIgc2VydmVzICIiIChsb2JieSBhbmQgbGVhZGVyYm9hcmRzKSwgIm5ldyIgKG9mZmVyIGZvcm0pIGFuZAovLyAiZ2FtZS88aWQ+IiAob25lIGdhbWUgd2l0aCBldmVyeSBhY3Rpb24gaXRzIHN0YXRlIGFsbG93cykuCi8vIEV2ZXJ5dGhpbmcgd3JpdHRlbiBjb21lcyBmcm9tIHJlYWxtIHN0YXRlIG9yIGZyb20gcXVlcnkgdmFsdWVzIHRoYXQgaGF2ZQovLyBiZWVuIHZhbGlkYXRlZCBhbmQgcmUtZm9ybWF0dGVkOyByYXcgcGF0aCBpbnB1dCBpcyBuZXZlciBlY2hvZWQuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcCwgcXVlcnksIF8gOj0gc3RyaW5ncy5DdXQocGF0aCwgIj8iKQoJc3dpdGNoIHsKCWNhc2UgcCA9PSAiIjoKCQlyZXR1cm4gcmVuZGVyTG9iYnkoKQoJY2FzZSBwID09ICJuZXciOgoJCXJldHVybiByZW5kZXJOZXcocXVlcnkpCgl9CglpZiBzLCBvayA6PSBzdHJpbmdzLkN1dFByZWZpeChwLCAiZ2FtZS8iKTsgb2sgewoJCWlmIGlkLCBlcnIgOj0gc3RyY29udi5BdG9pKHMpOyBlcnIgPT0gbmlsIHsKCQkJaWYgZyA6PSBnZXQoaWQpOyBnICE9IG5pbCB7CgkJCQlyZXR1cm4gcmVuZGVyR2FtZShnKQoJCQl9CgkJfQoJfQoJcmV0dXJuICIjIE5vdCBmb3VuZFxuIgp9CgovLyBwYWdlVVJMIGxpbmtzIHRvIG9uZSBvZiB0aGlzIHJlYWxtJ3MgUmVuZGVyIHBhZ2VzLiBUaGUgcmVhbG0gcGF0aCBpcyByZWFkCi8vIGF0IHJ1bnRpbWUsIGxpa2UgdHhsaW5rIGRvZXMsIHNvIGxpbmtzIHdvcmsgd2hlcmV2ZXIgdGhlIHJlYWxtIGlzIGRlcGxveWVkLgpmdW5jIHBhZ2VVUkwocGFnZSBzdHJpbmcpIHN0cmluZyB7CgliYXNlIDo9IHN0cmluZ3MuVHJpbVByZWZpeCh1bnNhZmUuQ3VycmVudFJlYWxtKCkuUGtnUGF0aCgpLCBydW50aW1lLkNoYWluRG9tYWluKCkpCglpZiBwYWdlID09ICIiIHsKCQlyZXR1cm4gYmFzZQoJfQoJcmV0dXJuIGJhc2UgKyAiOiIgKyBwYWdlCn0KCmZ1bmMgZ2FtZUxpbmsoYmFzZSBzdHJpbmcsIGlkIGludCkgc3RyaW5nIHsKCXJldHVybiAiWyMiICsgc3RyY29udi5JdG9hKGlkKSArICJdKCIgKyBiYXNlICsgIjpnYW1lLyIgKyBzdHJjb252Lkl0b2EoaWQpICsgIikiCn0KCmZ1bmMgcmVuZGVyTG9iYnkoKSBzdHJpbmcgewoJbm93IDo9IHRpbWUuTm93KCkKCWJhc2UgOj0gcGFnZVVSTCgiIikKCXZhciBvcGVuLCBsaXZlIHN0cmluZ3MuQnVpbGRlcgoJLy8gT25seSByb3dzIGFjdHVhbGx5IHdyaXR0ZW4gY291bnQgdG93YXJkIGxvYmJ5Um93czogZXhwaXJlZCBvZmZlcnMgbm9ib2R5CgkvLyBjYW5jZWxsZWQgbXVzdCBub3QgY3Jvd2Qgb3V0IGxpdmUgZ2FtZXMuCglzaG93biA6PSAwCglhY3RpdmUuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlnIDo9IHYuKCpHYW1lKQoJCXN3aXRjaCB7CgkJY2FzZSBnLlN0YXR1cyA9PSBPcGVuICYmIG5vdy5CZWZvcmUoZy5FeHBpcmVzQXQpOgoJCQlvcGVuLldyaXRlU3RyaW5nKCJ8ICIgKyBnYW1lTGluayhiYXNlLCBnLklEKSArICIgfCAiICsgZ25vdChnLlN0YWtlKSArICIgfCAiICsgZ25vdChnLkZlZSkgKyAiIHwgIiArIGcuQ3JlYXRvci5TdHJpbmcoKSArICIgfCAiICsgb3BlblRvKGcpICsKCQkJCSIgfCAiICsgcmVtYWluaW5nKGcuRXhwaXJlc0F0LlN1Yihub3cpKSArICIgfCBbQWNjZXB0XSgiICsgYWNjZXB0VVJMKGcpICsgIikgfFxuIikKCQljYXNlIGcuU3RhdHVzID09IFBsYXlpbmc6CgkJCWxpdmUuV3JpdGVTdHJpbmcoInwgIiArIGdhbWVMaW5rKGJhc2UsIGcuSUQpICsgIiB8ICIgKyBnbm90KDIqZy5TdGFrZSkgKyAiIHwgIiArIG9uVHVybihnKSArICIgfCAiICsgY2xvY2tMZWZ0KGcsIG5vdykgKyAiIHxcbiIpCgkJZGVmYXVsdDoKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCXNob3duKysKCQlyZXR1cm4gc2hvd24gPT0gbG9iYnlSb3dzCgl9KQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBDb25uZWN0IDRcblxuIikKCWIuV3JpdGVTdHJpbmcoIkJvdGggcGxheWVycyBzdGFrZSB0aGUgc2FtZSBhbW91bnQ7IHRoZSB3aW5uZXIgdGFrZXMgdGhlIHBvdCBtaW51cyB0aGUgaG91c2UgZmVlIHNob3duIG9uIGVhY2ggb2ZmZXIgIiArCgkJIigiICsgZ25vdChmZWUpICsgIiBmb3IgbmV3IG9mZmVycykuICIgKwoJCSI5MHMgcGVyIG1vdmU6IHJ1biBvdXQgYW5kIHlvdSBmb3JmZWl0LiBJZiB0aGUgZmlyc3QgbW92ZXIgbmV2ZXIgbW92ZXMsIGJvdGggc3Rha2VzIGFyZSByZWZ1bmRlZC5cblxuIikKCWIuV3JpdGVTdHJpbmcoIioqW1Bvc3QgYW4gb2ZmZXJdKCIgKyBiYXNlICsgIjpuZXcpKiogwrcgb3BlbiBhIGdhbWUgYmVsb3cgdG8gcGxheSBpdFxuXG4iKQoJYi5Xcml0ZVN0cmluZygiIyMgT3BlbiBvZmZlcnNcblxuIikKCWlmIG9wZW4uTGVuKCkgPT0gMCB7CgkJYi5Xcml0ZVN0cmluZygiTm8gb3BlbiBvZmZlcnMuXG5cbiIpCgl9IGVsc2UgewoJCWIuV3JpdGVTdHJpbmcoInwgR2FtZSB8IFN0YWtlIHwgRmVlIHwgQ3JlYXRvciB8IEZvciB8IEV4cGlyZXMgaW4gfCB8XG58LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIiArIG9wZW4uU3RyaW5nKCkgKyAiXG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiIyMgTGl2ZSBnYW1lc1xuXG4iKQoJaWYgbGl2ZS5MZW4oKSA9PSAwIHsKCQliLldyaXRlU3RyaW5nKCJObyBnYW1lcyBpbiBwcm9ncmVzcy5cblxuIikKCX0gZWxzZSB7CgkJYi5Xcml0ZVN0cmluZygifCBHYW1lIHwgUG90IHwgVHVybiB8IFRpbWUgbGVmdCB8XG58LS0tfC0tLXwtLS18LS0tfFxuIiArIGxpdmUuU3RyaW5nKCkgKyAiXG4iKQoJfQoJaWYgc2hvd24gPT0gbG9iYnlSb3dzIHsKCQliLldyaXRlU3RyaW5nKCJTaG93aW5nIHRoZSBmaXJzdCAiICsgc3RyY29udi5JdG9hKGxvYmJ5Um93cykgKyAiIGdhbWVzLlxuXG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiIyMgTW9zdCBnYW1lcyB3b25cblxuIikKCWIuV3JpdGVTdHJpbmcobGVhZGVyYm9hcmQodG9wV2lucywgZnVuYyh2IGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQodiwgMTApIH0pKQoJYi5Xcml0ZVN0cmluZygiIyMgTW9zdCBnbm90IHdvblxuXG4iKQoJYi5Xcml0ZVN0cmluZyhsZWFkZXJib2FyZCh0b3BHbm90LCBnbm90KSkKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIHJlbmRlck5ldyBzaG93cyB0aGUgb2ZmZXIgZm9ybSBhbmQsIG9uY2Ugc3VibWl0dGVkLCBhIHNpbmdsZSBPZmZlciBsaW5rCi8vIHdpdGggdGhlIHN0YWtlIGFuZCBldmVyeSBhcmd1bWVudCBwcmVmaWxsZWQgKGdub3dlYiBjYW5ub3QgZWRpdCAuc2VuZCkuCmZ1bmMgcmVuZGVyTmV3KHF1ZXJ5IHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBQb3N0IGFuIG9mZmVyXG5cblvihpAgTG9iYnldKCIgKyBwYWdlVVJMKCIiKSArICIpXG5cbiIpCgliLldyaXRlU3RyaW5nKCJHZW5lcmF0ZSBhIGZyZXNoIHJhbmRvbSBwYXNzcGhyYXNlIGZvciBldmVyeSBvZmZlciBhbmQga2VlcCBpdDogIiArCgkJIm9uY2Ugc29tZW9uZSBhY2NlcHRzIHlvdSBoYXZlIDkwcyB0byByZXZlYWwgaXQsIG9yIHlvdSBmb3JmZWl0LiAiICsKCQkiQSBndWVzc2FibGUgb25lIGxldHMgYW4gb3Bwb25lbnQgd29yayBvdXQgd2hvIG1vdmVzIGZpcnN0LiAiICsKCQkiUGFzdGUgb25seSBpdHMgc2hhMjU2IGJlbG93LCBuZXZlciB0aGUgcGFzc3BocmFzZSBpdHNlbGY6XG5cbiIgKwoJCSIgICAgcGFzcz0kKG9wZW5zc2wgcmFuZCAtaGV4IDMyKTsgZWNobyBcIiRwYXNzXCJcbiIgKwoJCSIgICAgcHJpbnRmICVzIFwiJHBhc3NcIiB8IHNoYXN1bSAtYSAyNTZcblxuIikKCWIuV3JpdGVTdHJpbmcoYDxnbm8tZm9ybSBwYXRoPSJuZXciPgo8Z25vLWlucHV0IG5hbWU9InN0YWtlIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iU3Rha2UgaW4gR05PVCwgZS5nLiAxMCAobWluIDEpIiAvPgo8Z25vLWlucHV0IG5hbWU9InZhbGlkRm9yIiB0eXBlPSJudW1iZXIiIHBsYWNlaG9sZGVyPSJNaW51dGVzIHRoZSBvZmZlciBzdGF5cyBvcGVuLCAxLTYwIChkZWZhdWx0IDE1KSIgLz4KPGduby1pbnB1dCBuYW1lPSJvcHBvbmVudCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Ik9wcG9uZW50IGFkZHJlc3MgKG9wdGlvbmFsLCBsZWF2ZSBlbXB0eSBmb3IgYW55b25lKSIgLz4KPGduby1pbnB1dCBuYW1lPSJjb21taXRtZW50IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0ic2hhMjU2IG9mIHlvdXIgcGFzc3BocmFzZSAoNjQgaGV4IGNoYXJzKSIgLz4KPC9nbm8tZm9ybT4KCmApCglpZiBxdWVyeSA9PSAiIiB7CgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCglxLCBlcnIgOj0gdXJsLlBhcnNlUXVlcnkocXVlcnkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gYi5TdHJpbmcoKSArICJDb3VsZCBub3QgcmVhZCB0aGUgZm9ybS5cbiIKCX0KCS8vIFBhcnNlIGZpcnN0OyB0aGUgb2ZmZXIgcnVsZXMgdGhlbXNlbHZlcyBsaXZlIGluIHZhbGlkYXRlT2ZmZXIgc28gdGhpcwoJLy8gcGFnZSBhbmQgT2ZmZXIgY2Fubm90IGRyaWZ0IGFwYXJ0LgoJdmFyIGVycnMgW11zdHJpbmcKCXN0YWtlLCBvayA6PSBwYXJzZUdOT1QocS5HZXQoInN0YWtlIikpCglpZiAhb2sgewoJCWVycnMgPSBhcHBlbmQoZXJycywgInN0YWtlIG11c3QgYmUgYSBHTk9UIGFtb3VudCB3aXRoIGF0IG1vc3QgNiBkZWNpbWFscywgZS5nLiAxMCBvciAyLjUiKQoJfQoJdmFsaWRGb3IgOj0gMTUKCWlmIHYgOj0gcS5HZXQoInZhbGlkRm9yIik7IHYgIT0gIiIgewoJCW4sIGVyciA6PSBzdHJjb252LkF0b2kodikKCQlpZiBlcnIgIT0gbmlsIHsKCQkJZXJycyA9IGFwcGVuZChlcnJzLCAidmFsaWRGb3IgbXVzdCBiZSBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzIikKCQl9CgkJdmFsaWRGb3IgPSBuCgl9CglvcHBvbmVudCA6PSBhZGRyZXNzKHEuR2V0KCJvcHBvbmVudCIpKQoJY29tbWl0bWVudCA6PSBxLkdldCgiY29tbWl0bWVudCIpCglpZiBsZW4oZXJycykgPT0gMCB7CgkJZXJycyA9IHZhbGlkYXRlT2ZmZXIoc3Rha2UsIHZhbGlkRm9yLCBvcHBvbmVudCwgY29tbWl0bWVudCkKCX0KCWlmIGxlbihlcnJzKSA+IDAgewoJCWIuV3JpdGVTdHJpbmcoIioqRml4IHRoZSBmb2xsb3dpbmc6KipcblxuIikKCQlmb3IgXywgZSA6PSByYW5nZSBlcnJzIHsKCQkJYi5Xcml0ZVN0cmluZygiLSAiICsgZSArICJcbiIpCgkJfQoJCXJldHVybiBiLlN0cmluZygpCgl9CgoJYi5Xcml0ZVN0cmluZygiIyMgUmVhZHlcblxuIikKCXdobyA6PSAiYW55b25lIgoJaWYgb3Bwb25lbnQgIT0gIiIgewoJCXdobyA9IG9wcG9uZW50LlN0cmluZygpCgl9CgliLldyaXRlU3RyaW5nKCJTdGFrZSAiICsgZ25vdChzdGFrZSkgKyAiLCBvcGVuIHRvICIgKyB3aG8gKyAiIGZvciAiICsgc3RyY29udi5JdG9hKHZhbGlkRm9yKSArICIgbWluLCAiICsKCQkiaG91c2UgZmVlIGF0IG1vc3QgIiArIGdub3QoZmVlKSArICIsIGNvbW1pdG1lbnQgYCIgKyBjb21taXRtZW50ICsgImAuICIgKwoJCSJDaGVjayBpdCBpcyB0aGUgc2hhMjU2IG9mIHlvdXIgb3duIHBhc3NwaHJhc2UgYmVmb3JlIHNpZ25pbmcuXG5cbiIpCgliLldyaXRlU3RyaW5nKCIqKltQb3N0IG9mZmVyIGZvciAiICsgZ25vdChzdGFrZSkgKyAiXSgiICsgdHhsaW5rLk5ld0xpbmsoIk9mZmVyIikuCgkJQWRkQXJncygib3Bwb25lbnQiLCBvcHBvbmVudC5TdHJpbmcoKSwgInZhbGlkRm9yIiwgc3RyY29udi5JdG9hKHZhbGlkRm9yKSwgImNvbW1pdG1lbnQiLCBjb21taXRtZW50LAoJCQkibWF4RmVlIiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLCAxMCkpLgoJCVNldFNlbmQoc3RyY29udi5Gb3JtYXRJbnQoc3Rha2UsIDEwKStkZW5vbSkuVVJMKCkgKyAiKSoqXG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJHYW1lKGcgKkdhbWUpIHN0cmluZyB7Cglub3cgOj0gdGltZS5Ob3coKQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglpZCA6PSBzdHJjb252Lkl0b2EoZy5JRCkKCWIuV3JpdGVTdHJpbmcoIiMgR2FtZSAjIiArIGlkICsgIiDigJQgIiArIGcuU3RhdHVzLlN0cmluZygpICsgIlxuXG5b4oaQIExvYmJ5XSgiICsgcGFnZVVSTCgiIikgKyAiKVxuXG4iKQoJYi5Xcml0ZVN0cmluZygi8J+UtCAiICsgZy5DcmVhdG9yLlN0cmluZygpICsgIiAgXG7wn5+hICIgKyBvck5vbmUoZy5BY2NlcHRvcikgKyAiICBcbiIpCgliLldyaXRlU3RyaW5nKCJTdGFrZTogIiArIGdub3QoZy5TdGFrZSkgKyAiIGVhY2ggwrcgZmVlICIgKyBnbm90KGcuRmVlKSArICJcblxuIikKCWIuV3JpdGVTdHJpbmcoYm9hcmRWaWV3KGcsIG5vdykgKyAiXG5cbiIpCgoJc3dpdGNoIGcuU3RhdHVzIHsKCWNhc2UgT3BlbjoKCQljYW5jZWwgOj0gIltDYW5jZWwgb2ZmZXJdKCIgKyB0eGxpbmsuTmV3TGluaygiQ2FuY2VsIikuQWRkQXJncygiaWQiLCBpZCkuVVJMKCkgKyAiKSIKCQlpZiBub3cuQmVmb3JlKGcuRXhwaXJlc0F0KSB7CgkJCWIuV3JpdGVTdHJpbmcoIk9wZW4gb2ZmZXIgZm9yICIgKyBvcGVuVG8oZykgKyAiLCBleHBpcmVzIGluICIgKyByZW1haW5pbmcoZy5FeHBpcmVzQXQuU3ViKG5vdykpICsgIi5cblxuIikKCQkJYi5Xcml0ZVN0cmluZygiKipbQWNjZXB0IGZvciAiICsgZ25vdChnLlN0YWtlKSArICJdKCIgKyBhY2NlcHRVUkwoZykgKyAiKSoqIHdpdGggdGhlIHNoYTI1NiBvZiBhIGZyZXNoIHJhbmRvbSBzZWVkICIgKwoJCQkJIihgb3BlbnNzbCByYW5kIC1oZXggMzJgKS4gS2VlcCB0aGUgc2VlZDogeW91IHJldmVhbCBpdCBhZnRlciB0aGUgY3JlYXRvciwgd2l0aGluIDkwcywgb3IgZm9yZmVpdC5cblxuIikKCQkJYi5Xcml0ZVN0cmluZyhjYW5jZWwgKyAiIChjcmVhdG9yKVxuIikKCQl9IGVsc2UgewoJCQliLldyaXRlU3RyaW5nKCJUaGlzIG9mZmVyIGV4cGlyZWQuIEFueW9uZSBjYW4gIiArIGNhbmNlbCArICIgdG8gcmVmdW5kIHRoZSBjcmVhdG9yLlxuIikKCQl9CgljYXNlIFBsYXlpbmc6CgkJbGVmdCA6PSBnLmRlYWRsaW5lKCkuU3ViKG5vdykKCQljbGFpbSA6PSAiQ2xvY2sgcmFuIG91dDogKipbQ2xhaW0gdGltZW91dF0oIiArIHR4bGluay5OZXdMaW5rKCJDbGFpbVRpbWVvdXQiKS5BZGRBcmdzKCJpZCIsIGlkKS5VUkwoKSArICIpKipcblxuIgoJCXJlc2lnbiA6PSAiW1Jlc2lnbl0oIiArIHR4bGluay5OZXdMaW5rKCJSZXNpZ24iKS5BZGRBcmdzKCJpZCIsIGlkKS5VUkwoKSArICIpXG4iCgkJaWYgZy5UdXJuID09IDAgewoJCQlpZiAhZy5SZXZlYWxlZCB7CgkJCQliLldyaXRlU3RyaW5nKCJXYWl0aW5nIGZvciB0aGUgY3JlYXRvciB0byByZXZlYWwgdGhlIHBhc3NwaHJhc2UuXG5cbiIpCgkJCX0gZWxzZSB7CgkJCQliLldyaXRlU3RyaW5nKCJQYXNzcGhyYXNlIHJldmVhbGVkLiBXYWl0aW5nIGZvciB0aGUgYWNjZXB0b3IgdG8gcmV2ZWFsIHRoZSBzZWVkLlxuXG4iKQoJCQl9CgkJCWlmIGxlZnQgPj0gMCB7CgkJCQliLldyaXRlU3RyaW5nKCJUaW1lIGxlZnQ6ICIgKyByZW1haW5pbmcobGVmdCkgKyAiXG5cbiIpCgkJCQlpZiAhZy5SZXZlYWxlZCB7CgkJCQkJYi5Xcml0ZVN0cmluZygiKipbUmV2ZWFsXSgiICsgdHhsaW5rLk5ld0xpbmsoIlJldmVhbCIpLkFkZEFyZ3MoImlkIiwgaWQsICJwYXNzcGhyYXNlIiwgIiIpLlVSTCgpICsgIikqKiAoY3JlYXRvcilcblxuIikKCQkJCX0gZWxzZSB7CgkJCQkJYi5Xcml0ZVN0cmluZygiKipbUmV2ZWFsIHNlZWRdKCIgKyB0eGxpbmsuTmV3TGluaygiUmV2ZWFsU2VlZCIpLkFkZEFyZ3MoImlkIiwgaWQsICJzZWVkIiwgIiIpLlVSTCgpICsgIikqKiAoYWNjZXB0b3IpXG5cbiIpCgkJCQl9CgkJCX0gZWxzZSB7CgkJCQliLldyaXRlU3RyaW5nKGNsYWltKQoJCQl9CgkJCWIuV3JpdGVTdHJpbmcocmVzaWduKQoJCQlicmVhawoJCX0KCQliLldyaXRlU3RyaW5nKCJUdXJuOiAiICsgWy4uLl1zdHJpbmd7IiIsICLwn5S0IiwgIvCfn6EifVtnLlR1cm5dICsgIiAiICsgZy5wbGF5ZXIoZy5UdXJuKS5TdHJpbmcoKSArICJcblxuIikKCQlpZiBsZWZ0ID49IDAgewoJCQliLldyaXRlU3RyaW5nKCJUaW1lIGxlZnQ6ICIgKyByZW1haW5pbmcobGVmdCkgKyAiIMK3IGNsaWNrIGEgY29sdW1uIHRvIGRyb3AgeW91ciBwaWVjZVxuXG4iKQoJCX0gZWxzZSB7CgkJCWIuV3JpdGVTdHJpbmcoY2xhaW0pCgkJfQoJCWIuV3JpdGVTdHJpbmcocmVzaWduKQoJY2FzZSBXb246CgkJYi5Xcml0ZVN0cmluZygiV2lubmVyOiAiICsgZy5XaW5uZXIuU3RyaW5nKCkgKyAiLCBwYWlkICIgKyBnbm90KDIqZy5TdGFrZS1nLkZlZSkgKyAiLlxuIikKCWNhc2UgRHJhdzoKCQliLldyaXRlU3RyaW5nKCJEcmF3OiBib3RoIHN0YWtlcyByZWZ1bmRlZC5cbiIpCgljYXNlIFZvaWQ6CgkJYi5Xcml0ZVN0cmluZygiVm9pZDogdGhlIGZpcnN0IG1vdmVyIG5ldmVyIG1vdmVkLCBib3RoIHN0YWtlcyByZWZ1bmRlZC5cbiIpCgljYXNlIENhbmNlbGxlZDoKCQliLldyaXRlU3RyaW5nKCJDYW5jZWxsZWQ6IHN0YWtlIHJlZnVuZGVkIHRvIHRoZSBjcmVhdG9yLlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIGJvYXJkVmlldyBkcmF3cyB0aGUgYm9hcmQuIFdoaWxlIGEgbW92ZSBjYW4gYmUgcGxheWVkIGl0IGlzIDcgY29sdW1uCi8vIGltYWdlcywgZWFjaCB3cmFwcGVkIGluIGl0cyBQbGF5IGxpbmsgKGdub3dlYiBsYXlzIGxpbmtlZCBpbWFnZXMgb3V0IHNpZGUgYnkKLy8gc2lkZSkuIE90aGVyd2lzZSBpdCBpcyBvbmUgaW1hZ2Ugb2YgYWxsIDcgY29sdW1ucywgc2luY2UgZ25vd2ViIHN0YWNrcyBiYXJlCi8vIGltYWdlcyB2ZXJ0aWNhbGx5LiBUaGUgbGFzdCBtb3ZlIGdldHMgYSBkYXJrIHJpbmcsIGEgd2lubmluZyBsaW5lIGEgZ3JlZW4gb25lLgpmdW5jIGJvYXJkVmlldyhnICpHYW1lLCBub3cgdGltZS5UaW1lKSBzdHJpbmcgewoJcGxheWFibGUgOj0gZy5TdGF0dXMgPT0gUGxheWluZyAmJiBnLlR1cm4gIT0gMCAmJiAhbm93LkFmdGVyKGcuZGVhZGxpbmUoKSkKCXZhciB3aW4gW2NvbHNdW3Jvd3NdYm9vbAoJaWYgZy5TdGF0dXMgPT0gV29uICYmIGcuTW92ZXMgPiAwIHsKCQlmb3IgXywgY2VsbCA6PSByYW5nZSBnLkJvYXJkLndpbkxpbmUoZy5MYXN0Q29sLCBnLkxhc3RSb3cpIHsKCQkJd2luW2NlbGxbMF1dW2NlbGxbMV1dID0gdHJ1ZQoJCX0KCX0KCWNvbnN0IGhlaWdodCA9IGhlYWRlclB4ICsgcm93cypjZWxsUHgKCWlmICFwbGF5YWJsZSB7CgkJY2FudmFzIDo9IHN2Zy5OZXdDYW52YXMoY29scypjZWxsUHgsIGhlaWdodCkuV2l0aFZpZXdCb3goMCwgMCwgY29scypjZWxsUHgsIGhlaWdodCkKCQlhbHQgOj0gImJvYXJkOiIKCQlmb3IgYyA6PSAwOyBjIDwgY29sczsgYysrIHsKCQkJYWx0ICs9ICIgIiArIGRyYXdDb2x1bW4oY2FudmFzLCBnLCAmd2luLCBjLCBjKmNlbGxQeCkgKyAiOyIKCQl9CgkJcmV0dXJuIGNhbnZhcy5SZW5kZXIoYWx0KQoJfQoJaWQgOj0gc3RyY29udi5JdG9hKGcuSUQpCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBjIDo9IDA7IGMgPCBjb2xzOyBjKysgewoJCWNhbnZhcyA6PSBzdmcuTmV3Q2FudmFzKGNlbGxQeCwgaGVpZ2h0KS5XaXRoVmlld0JveCgwLCAwLCBjZWxsUHgsIGhlaWdodCkKCQlhbHQgOj0gZHJhd0NvbHVtbihjYW52YXMsIGcsICZ3aW4sIGMsIDApCgkJYi5Xcml0ZVN0cmluZygiWyIgKyBjYW52YXMuUmVuZGVyKGFsdCkgKyAiXSgiICsKCQkJdHhsaW5rLk5ld0xpbmsoIlBsYXkiKS5BZGRBcmdzKCJpZCIsIGlkLCAiY29sdW1uIiwgc3RyY29udi5JdG9hKGMrMSksICJtb3ZlIiwgc3RyY29udi5JdG9hKGcuTW92ZXMpKS5VUkwoKSArICIpIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIGRyYXdDb2x1bW4gZHJhd3MgY29sdW1uIGMgYXQgaG9yaXpvbnRhbCBvZmZzZXQgeCBhbmQgcmV0dXJucyBpdHMgYWx0IHRleHQuCmZ1bmMgZHJhd0NvbHVtbihjYW52YXMgKnN2Zy5DYW52YXMsIGcgKkdhbWUsIHdpbiAqW2NvbHNdW3Jvd3NdYm9vbCwgYywgeCBpbnQpIHN0cmluZyB7CgliZyA6PSBzdmcuTmV3UmVjdGFuZ2xlKHgsIDAsIGNlbGxQeCwgaGVhZGVyUHgrcm93cypjZWxsUHgsIGJvYXJkQmx1ZSkKCWJnLkF0dHIuQ2xhc3MgPSAiY29sIgoJY2FudmFzLkFwcGVuZChiZywgc3ZnLk5ld1RleHQoeCtjZWxsUHgvMi00LCAxNSwgc3RyY29udi5JdG9hKGMrMSksIGhvbGUpKQoJYWx0IDo9ICJjb2x1bW4gIiArIHN0cmNvbnYuSXRvYShjKzEpICsgIjoiCglmb3IgciA6PSAwOyByIDwgcm93czsgcisrIHsKCQlkaXNjIDo9IHN2Zy5OZXdDaXJjbGUoeCtjZWxsUHgvMiwgaGVhZGVyUHgrKHJvd3MtMS1yKSpjZWxsUHgrY2VsbFB4LzIsIGNlbGxQeC8yLTUsIHBpZWNlQ29sb3JbZy5Cb2FyZFtjXVtyXV0pCgkJc3dpdGNoIHsKCQljYXNlIHdpbltjXVtyXToKCQkJZGlzYy5BdHRyLlN0cm9rZSwgZGlzYy5BdHRyLlN0cm9rZVdpZHRoID0gd2luU3Ryb2tlLCAiNSIKCQljYXNlIGcuTW92ZXMgPiAwICYmIGMgPT0gZy5MYXN0Q29sICYmIHIgPT0gZy5MYXN0Um93OgoJCQlkaXNjLkF0dHIuU3Ryb2tlLCBkaXNjLkF0dHIuU3Ryb2tlV2lkdGggPSBsYXN0TW92ZVN0cm9rZSwgIjMiCgkJfQoJCWNhbnZhcy5BcHBlbmQoZGlzYykKCQlhbHQgKz0gIiAiICsgcGllY2VOYW1lW2cuQm9hcmRbY11bcl1dCgl9CglyZXR1cm4gYWx0Cn0KCi8vIG9uVHVybiBuYW1lcyB3aG8gdGhlIGdhbWUgd2FpdHMgZm9yLgpmdW5jIG9uVHVybihnICpHYW1lKSBzdHJpbmcgewoJc3dpdGNoIHsKCWNhc2UgZy5UdXJuICE9IDA6CgkJcmV0dXJuIGcucGxheWVyKGcuVHVybikuU3RyaW5nKCkKCWNhc2UgZy5SZXZlYWxlZDoKCQlyZXR1cm4gZy5BY2NlcHRvci5TdHJpbmcoKSArICIgKHJldmVhbCBzZWVkKSIKCX0KCXJldHVybiBnLkNyZWF0b3IuU3RyaW5nKCkgKyAiIChyZXZlYWwpIgp9CgovLyBjbG9ja0xlZnQgaXMgdGhlIHRpbWUgbGVmdCBvbiB0aGUgbW92ZSBjbG9jaywgb3IgImNsb2NrIHJhbiBvdXQiLiBQbGF5IGlzCi8vIHN0aWxsIGFjY2VwdGVkIGluIHRoZSBkZWFkbGluZSBibG9jayBpdHNlbGYsIHNvIHplcm8gbGVmdCBpcyBub3QgZXhwaXJlZC4KZnVuYyBjbG9ja0xlZnQoZyAqR2FtZSwgbm93IHRpbWUuVGltZSkgc3RyaW5nIHsKCWlmIG5vdy5BZnRlcihnLmRlYWRsaW5lKCkpIHsKCQlyZXR1cm4gImNsb2NrIHJhbiBvdXQiCgl9CglyZXR1cm4gcmVtYWluaW5nKGcuZGVhZGxpbmUoKS5TdWIobm93KSkKfQoKZnVuYyBhY2NlcHRVUkwoZyAqR2FtZSkgc3RyaW5nIHsKCXJldHVybiB0eGxpbmsuTmV3TGluaygiQWNjZXB0IikuQWRkQXJncygiaWQiLCBzdHJjb252Lkl0b2EoZy5JRCksICJzZWVkQ29tbWl0bWVudCIsICIiKS4KCQlTZXRTZW5kKHN0cmNvbnYuRm9ybWF0SW50KGcuU3Rha2UsIDEwKSArIGRlbm9tKS5VUkwoKQp9CgpmdW5jIGRpZ2l0cyhzIHN0cmluZykgYm9vbCB7Cglmb3IgXywgYyA6PSByYW5nZSBzIHsKCQlpZiBjIDwgJzAnIHx8IGMgPiAnOScgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIG9wZW5UbyhnICpHYW1lKSBzdHJpbmcgewoJaWYgZy5PcHBvbmVudCAhPSAiIiB7CgkJcmV0dXJuIGcuT3Bwb25lbnQuU3RyaW5nKCkKCX0KCXJldHVybiAiYW55b25lIgp9CgovLyBwYXJzZUdOT1QgcGFyc2VzIGEgZGVjaW1hbCBHTk9UIGFtb3VudCAoIjEwIiwgIjIuNSIpIGludG8gdWdub3QuCmZ1bmMgcGFyc2VHTk9UKHMgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCXdob2xlLCBmcmFjLCBfIDo9IHN0cmluZ3MuQ3V0KHMsICIuIikKCWlmIHdob2xlID09ICIiIHx8IGxlbih3aG9sZSkgPiAxMiB8fCBsZW4oZnJhYykgPiA2IHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCWlmICFkaWdpdHMod2hvbGUpIHx8ICFkaWdpdHMoZnJhYykgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJdywgXyA6PSBzdHJjb252LlBhcnNlSW50KHdob2xlLCAxMCwgNjQpCglmLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoZnJhYytzdHJpbmdzLlJlcGVhdCgiMCIsIDYtbGVuKGZyYWMpKSwgMTAsIDY0KQoJcmV0dXJuIHcqMV8wMDBfMDAwICsgZiwgdHJ1ZQp9CgovLyBsZWFkZXJib2FyZCByZW5kZXJzIGEgYm9hcmQga2VwdCBhdCBzZXR0bGVtZW50ICh0b3BXaW5zLCB0b3BHbm90KS4KZnVuYyBsZWFkZXJib2FyZChib2FyZCBbXWxlYWRlciwgZm9ybWF0IGZ1bmMoaW50NjQpIHN0cmluZykgc3RyaW5nIHsKCWlmIGxlbihib2FyZCkgPT0gMCB7CgkJcmV0dXJuICJObyBmaW5pc2hlZCBnYW1lcyB5ZXQuXG5cbiIKCX0KCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygifCAjIHwgUGxheWVyIHwgfFxufC0tLXwtLS18LS0tfFxuIikKCWZvciBpLCByIDo9IHJhbmdlIGJvYXJkIHsKCQliLldyaXRlU3RyaW5nKCJ8ICIgKyBzdHJjb252Lkl0b2EoaSsxKSArICIgfCAiICsgci5BZGRyLlN0cmluZygpICsgIiB8ICIgKyBmb3JtYXQoci5TY29yZSkgKyAiIHxcbiIpCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBnbm90IGZvcm1hdHMgdWdub3QgYXMgR05PVCB3aXRoIHVwIHRvIDYgZGVjaW1hbHMuCmZ1bmMgZ25vdCh1Z25vdCBpbnQ2NCkgc3RyaW5nIHsKCXdob2xlIDo9IHN0cmNvbnYuRm9ybWF0SW50KHVnbm90LzFfMDAwXzAwMCwgMTApCglmcmFjIDo9IHVnbm90ICUgMV8wMDBfMDAwCglpZiBmcmFjID09IDAgewoJCXJldHVybiB3aG9sZSArICIgR05PVCIKCX0KCWYgOj0gc3RyY29udi5Gb3JtYXRJbnQoZnJhYywgMTApCglmID0gc3RyaW5ncy5UcmltUmlnaHQoc3RyaW5ncy5SZXBlYXQoIjAiLCA2LWxlbihmKSkrZiwgIjAiKQoJcmV0dXJuIHdob2xlICsgIi4iICsgZiArICIgR05PVCIKfQoKZnVuYyByZW1haW5pbmcoZCB0aW1lLkR1cmF0aW9uKSBzdHJpbmcgeyByZXR1cm4gZC5UcnVuY2F0ZSh0aW1lLlNlY29uZCkuU3RyaW5nKCkgfQoKZnVuYyBvck5vbmUoYSBhZGRyZXNzKSBzdHJpbmcgewoJaWYgYSA9PSAiIiB7CgkJcmV0dXJuICJ3YWl0aW5nIGZvciBvcHBvbmVudCIKCX0KCXJldHVybiBhLlN0cmluZygpCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0xNDAwMDAwMHVnbm90EhIIgISvXxILMTAwMDAwdWdub3QaiAMKzQEKEi90bS5QdWJLZXlNdWx0aXNpZxK2AQgCEjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohA11OyvOPLagDVsrHEKIBIExVRF5lt7wVCj+fUZRBL1/tEjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAyjjid64ZCYQ4EmlZ/C3lgV3/Xw9yB1LU+J1q+rdkaZ4EjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEAEosBCgUIAxIBoBJAP7Ulnb4wQ5/71py9rmk70Yg9tGVQL/sO+g2eMAKHqfU2rXCnPnqGtKsxz6r2AI71sIXD/hdMhCBl/U06aSHtshJATyyeA479dfHmSmeMPxgOOdNEMKFdSXaDrkv3qg/yzzgJkF/wja8Fz7T41JRVHXONuKsdeCTgT1hHf9JFOdYe9BooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==