Transaction executed successfully

Transaction Details

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

Transaction hash
7C64883ECAED7A2CE6240F836B36381B4D4D84ADEC51C38BA171EAE3B33E2D8D

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
75,859,960
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cr7DAwoML3ZtLm1fYWRkcGtnEqzDAwooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLvwgMKEXRpbWVsb2NrX2d1YXJkaWFuEkVnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvdGltZWxvY2tfZ3VhcmRpYW4abAoLZ25vbW9kLnRvbWwSXW1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvdGltZWxvY2tfZ3VhcmRpYW4iCmdubyA9ICIwLjkiChqywwEKFXRpbWVsb2NrX2d1YXJkaWFuLmdubxKXwwFwYWNrYWdlIHRpbWVsb2NrX2d1YXJkaWFuCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgopCgovLyBUYXJnZXRDb25maWcgYmluZHMgYSBuYW1lZCB0YXJnZXQgdG8gdGhlIG9ubHkgYWRkcmVzcyBhbGxvd2VkIHRvCi8vIHNjaGVkdWxlIGFjdGlvbnMgYWdhaW5zdCBpdCwgYW4gZW5mb3JjZWQgbWluaW11bSBkZWxheSwgYW5kIGFuCi8vIG9wdGlvbmFsIGd1YXJkaWFuIHdobyBjYW4gdmV0byBwZW5kaW5nIGFjdGlvbnMuIFdpdGhvdXQgdGhpcyBiaW5kaW5nCi8vIGEgdGltZWxvY2sgYXR0ZXN0cyBub3RoaW5nOiBhbnlvbmUgY291bGQgc2NoZWR1bGUgdGhlaXIgb3duCi8vIHNob3J0LWRlbGF5IGFjdGlvbiBhZ2FpbnN0IGFueSBuYW1lIGFuZCAiZXhlY3V0ZSIgaXQuCnR5cGUgVGFyZ2V0Q29uZmlnIHN0cnVjdCB7CglOYW1lICAgICBzdHJpbmcKCU93bmVyICAgIGFkZHJlc3MKCUd1YXJkaWFuIGFkZHJlc3MgLy8gZW1wdHkgPSBubyBndWFyZGlhbgoJTWluRGVsYXkgaW50NjQgICAvLyBzZWNvbmRzOyBldmVyeSBhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0IHdhaXRzIGF0IGxlYXN0IHRoaXMKCS8vIFBlbmRpbmdPd25lciBpcyB0aGUgb2ZmZXJlZC1idXQtbm90LWFjY2VwdGVkIG5ldyBvd25lciAoZml4IFk1OgoJLy8gb3duZXJzaGlwIG1vdmVzIGluIHR3byBzdGVwcywgc28gYSBzdHJhbmdlciBjYW4gbmV2ZXIgaGF2ZSBhCgkvLyB0YXJnZXQg4oCUIGFuZCBpdHMgcXVvdGEgc2xvdCBhbmQgcGVuZGluZyBvYmxpZ2F0aW9ucyDigJQgZHVtcGVkIG9uCgkvLyB0aGVtIHdpdGhvdXQgY29uc2VudGluZykuCglQZW5kaW5nT3duZXIgYWRkcmVzcwp9CgovLyBBY3Rpb24gcmVwcmVzZW50cyBhIHNjaGVkdWxlZCBvcGVyYXRpb24gdGhhdCBjYW4gb25seSBleGVjdXRlIGFmdGVyCi8vIGl0cyBkZWxheSBoYXMgZWxhcHNlZCwgYW5kIG9ubHkgd2l0aGluIGl0cyBncmFjZSB3aW5kb3cuCi8vCi8vIFN0YXRlIG1vZGVsIChyZS1hdWRpdCAyMDI2LTA5LTAyKTogb25seSBQRU5ESU5HIGFuZCBFWEVDVVRFRCBhY3Rpb25zCi8vIGFyZSBzdG9yZWQuIEV4ZWN1dGVkIHJlY29yZHMgYXJlIHBlcm1hbmVudCBhdHRlc3RhdGlvbnMgY29uc3VtZXJzCi8vIGNoZWNrIHZpYSBJc0V4ZWN1dGVkLiBDYW5jZWxsZWQsIHZldG9lZCwgYW5kIGV4cGlyZWQgYWN0aW9ucyBhcmUKLy8gUkVBUEVEIGZyb20gc3RhdGUg4oCUIHRoZWlyIGhpc3RvcnkgbGl2ZXMgaW4gZW1pdHRlZCBldmVudHMg4oCUIHNvIHRoZQovLyBsaXZlLWFjdGlvbiBjYXAgYm91bmRzIGxpdmUgZXhwb3N1cmUgYW5kIGNhbiBuZXZlciBiZSBjb25zdW1lZAovLyBwZXJtYW5lbnRseSBieSBzY2hlZHVsZS9jYW5jZWwgY3ljbGluZy4KdHlwZSBBY3Rpb24gc3RydWN0IHsKCUlEICAgICAgICAgICBzdHJpbmcKCVRhcmdldCAgICAgICBzdHJpbmcKCUNyZWF0b3IgICAgICBhZGRyZXNzCglEYXRhICAgICAgICAgc3RyaW5nIC8vIGVuY29kZWQgY2FsbCBkYXRhIG9yIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24KCVNjaGVkdWxlZEF0ICB0aW1lLlRpbWUKCUV4ZWN1dGVBZnRlciB0aW1lLlRpbWUKCUV4cGlyZXNBdCAgICB0aW1lLlRpbWUgLy8gRXhlY3V0ZUFmdGVyICsgR3JhY2VQZXJpb2Q7IG5vdCBleGVjdXRhYmxlIGFmdGVyCglFeGVjdXRlZCAgICAgYm9vbAp9Cgpjb25zdCAoCgkvLyBNaW5EZWxheUZsb29yIGlzIHRoZSBzbWFsbGVzdCBtaW5pbXVtIGRlbGF5IGEgdGFyZ2V0IG1heSByZWdpc3Rlci4KCS8vIEEgdGltZWxvY2sgd2l0aCBhIDEtc2Vjb25kIGRlbGF5IHByb3RlY3RzIG5vdGhpbmcuCglNaW5EZWxheUZsb29yID0gaW50NjQoNjApCgoJLy8gTWF4RGVsYXkgYm91bmRzIGJvdGggcmVnaXN0ZXJlZCBtaW5pbXVtIGRlbGF5cyBhbmQgcGVyLWFjdGlvbgoJLy8gZGVsYXlzLiBBbHNvIHRoZSBvdmVyZmxvdyBndWFyZDogTWF4RGVsYXkgc2Vjb25kcyBpbiBuYW5vc2Vjb25kcwoJLy8gaXMgZmFyIGJlbG93IGludDY0IHJhbmdlLCBzbyBFeGVjdXRlQWZ0ZXIgYXJpdGhtZXRpYyBjYW5ub3Qgd3JhcAoJLy8gaW50byB0aGUgcGFzdC4KCU1heERlbGF5ID0gaW50NjQoMTAgKiAzNjUgKiAyNCAqIDM2MDApIC8vIDEwIHllYXJzCgoJLy8gR3JhY2VQZXJpb2QgaXMgaG93IGxvbmcgYW4gYWN0aW9uIHN0YXlzIGV4ZWN1dGFibGUgb25jZSByZWFkeS4KCS8vIEFmdGVyIGl0LCB0aGUgYWN0aW9uIGV4cGlyZXM6IHNvbWV0aGluZyBzY2hlZHVsZWQgYW5kIGZvcmdvdHRlbgoJLy8gY2Fubm90IGJlIHNwcnVuZyBvbiBhIHRhcmdldCB5ZWFycyBsYXRlci4KCUdyYWNlUGVyaW9kID0gaW50NjQoMzAgKiAyNCAqIDM2MDApIC8vIDMwIGRheXMKCgkvLyBRdW90YXMgYXJlIFBFUi1PV05FUiBvbmx5IChyZS1hdWRpdCByb3VuZCAzKTogYW55IGdsb2JhbCBjYXAgaXMgYQoJLy8gc2hhcmVkIHJlc291cmNlIGEgZmV3IHN5YmlsIGFjY291bnRzIGNhbiBleGhhdXN0IGZvcmV2ZXIgKDEweQoJLy8gZGVsYXlzIGRlZmVhdCBleHBpcnkgc3dlZXBpbmcpLCBicmlja2luZyBldmVyeSBvdGhlciB0ZW5hbnQuIFdpdGgKCS8vIHBlci1vd25lciBxdW90YXMgYW4gYXR0YWNrZXIgb25seSBldmVyIGNvbnN1bWVzIHRoZWlyIG93biBidWRnZXQ7CgkvLyBzdGF0ZSBncm93dGggaXMgcHJpY2VkIGluIGdhcyBhbmQgZnVuZGVkIGFjY291bnRzLgoJTWF4VGFyZ2V0c1Blck93bmVyICA9IDEwCglNYXhQZW5kaW5nUGVyVGFyZ2V0ID0gMjAKCU1heFRhcmdldE5hbWVMZW4gICAgPSA2NAoJTWF4RGF0YUxlbiAgICAgICAgICA9IDIwMDAKCU1heFJlbmRlckFjdGlvbnMgICAgPSAxMDAKCS8vIFJlbmRlckluZGV4Q2FwIGJvdW5kcyB0aGUgcmVuZGVyLW9yZGVyaW5nIGluZGV4IChmaXggWTQpOiB0aGUKCS8vIGluZGV4IHNlbGYtdHJpbXMgdG8gdGhpcyBzaXplLCBzbyByZWFwaW5nIGFuIGVudHJ5IGZyb20gaXQgaXMgYQoJLy8gYm91bmRlZCBzY2FuIG5vIG1hdHRlciBob3cgbWFueSBhY3Rpb25zIHRoZSByZWFsbSBoYXMgZXZlciBzZWVuLgoJLy8gUmVjb3JkcyBvbGRlciB0aGFuIHRoZSB3aW5kb3cgc3RheSBpbiBzdGF0ZSAoR2V0QWN0aW9uL0lzRXhlY3V0ZWQKCS8vIGFyZSBtYXAgcmVhZHMgYW5kIHBlcm1hbmVudCk7IHRoZXkgb25seSBsZWF2ZSB0aGUgZnJvbnQgcGFnZS4KCVJlbmRlckluZGV4Q2FwID0gMiAqIE1heFJlbmRlckFjdGlvbnMKKQoKdmFyICgKCXRhcmdldHMgICAgICBtYXBbc3RyaW5nXSpUYXJnZXRDb25maWcKCXRhcmdldE5hbWVzICBbXXN0cmluZyAvLyBpbnNlcnRpb24tb3JkZXJlZCBmb3IgZGV0ZXJtaW5pc3RpYyBpdGVyYXRpb24KCW93bmVyVGFyZ2V0cyBtYXBbYWRkcmVzc11pbnQKCWFjdGlvbnMgICAgICBtYXBbc3RyaW5nXSpBY3Rpb24KCWFjdGlvbklEcyAgICBbXXN0cmluZyAvLyBpbnNlcnRpb24tb3JkZXJlZCByZW5kZXIgd2luZG93LCBzZWxmLXRyaW1tZWQgdG8gUmVuZGVySW5kZXhDYXAKCS8vIHBlbmRpbmcgaG9sZHMgZWFjaCB0YXJnZXQncyBMSVZFIHBlbmRpbmcgYWN0aW9uIElEcyBpbiBpbnNlcnRpb24KCS8vIG9yZGVyIChmaXggWTQpOiBldmVyeSBsaXN0IGlzIGJvdW5kZWQgYnkgTWF4UGVuZGluZ1BlclRhcmdldCwgc28KCS8vIHNjYW5zLCBzd2VlcHMsIGFuZCByZW1vdmFscyBhcmUgYm91bmRlZCBwZXIgY2FsbCByZWdhcmRsZXNzIG9mIGhvdwoJLy8gbXVjaCBzdGF0ZSBPVEhFUiB0ZW5hbnRzIGhhdmUgZ3Jvd24g4oCUIHF1ZXVlIHBvc2l0aW9uIGluIGEgZ2xvYmFsCgkvLyBsaXN0IGlzIG5vIGxvbmdlciBhIHNoYXJlZCByZXNvdXJjZS4KCXBlbmRpbmcgbWFwW3N0cmluZ11bXXN0cmluZwoJLy8gcGVuZGluZ1RhcmdldHMgbGlzdHMgdGhlIHRhcmdldHMgaG9sZGluZyA+PSAxIGxpdmUgcGVuZGluZyBhY3Rpb24sCgkvLyBtYWludGFpbmVkIHdpdGggTygxKSBzd2FwLXJlbW92ZSB2aWEgcHRJbmRleCAocm91bmQtMiBmaXggWS0xKTogbm8KCS8vIHdyaXRlIHBhdGggZXZlciBzY2FucyBhIGxpc3QgYW5vdGhlciB0ZW5hbnQgY2FuIGdyb3csIGFuZAoJLy8gR2V0UGVuZGluZy9SZW5kZXIgaXRlcmF0ZSBvbmx5IHRhcmdldHMgdGhhdCBhY3R1YWxseSBoYXZlIHdvcmsuCglwZW5kaW5nVGFyZ2V0cyBbXXN0cmluZwoJcHRJbmRleCAgICAgICAgbWFwW3N0cmluZ11pbnQKCW5leHRJRCAgICAgICAgIGludAopCgpmdW5jIGluaXQoKSB7Cgl0YXJnZXRzID0gbWFrZShtYXBbc3RyaW5nXSpUYXJnZXRDb25maWcpCgl0YXJnZXROYW1lcyA9IFtdc3RyaW5ne30KCW93bmVyVGFyZ2V0cyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJYWN0aW9ucyA9IG1ha2UobWFwW3N0cmluZ10qQWN0aW9uKQoJYWN0aW9uSURzID0gW11zdHJpbmd7fQoJcGVuZGluZyA9IG1ha2UobWFwW3N0cmluZ11bXXN0cmluZykKCXBlbmRpbmdUYXJnZXRzID0gW11zdHJpbmd7fQoJcHRJbmRleCA9IG1ha2UobWFwW3N0cmluZ11pbnQpCgluZXh0SUQgPSAxCn0KCmZ1bmMgbm93KCkgdGltZS5UaW1lIHsKCXJldHVybiB0aW1lLk5vdygpCn0KCi8vIC0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tCgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgY2FsbCAoZml4IFk2KToKLy8gdGhpcyByZWFsbSBoYW5kbGVzIG5vIGZ1bmRzIGFuZCBob2xkcyBubyBiYW5rZXIsIHNvIGFuIGF0dGFjaGVkIHNlbmQKLy8gd291bGQgc3RyYW5kIG9uIHRoZSByZWFsbSBhZGRyZXNzIGZvcmV2ZXIuIEFib3J0aW5nIHJldmVydHMgdGhlCi8vIHRyYW5zZmVyIGJhY2sgdG8gdGhlIHNlbmRlci4gRmFpbHMgb3BlbiBmb3IgcmVhbG0tcm91dGVkIGNhbGxzLCB3aG9zZQovLyBhdHRhY2hlZCBzZW5kIGxhbmRzIG9uIHRoZSBpbnRlcm1lZGlhcnkgcmVhbG0sIG5ldmVyIGhlcmUuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIHJlYWxtIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCmZ1bmMgbXVzdEdldFRhcmdldChuYW1lIHN0cmluZykgKlRhcmdldENvbmZpZyB7Cgl0LCBvayA6PSB0YXJnZXRzW25hbWVdCglpZiAhb2sgewoJCXBhbmljKCJ0YXJnZXQgbm90IGZvdW5kOiAiICsgbmFtZSkKCX0KCXJldHVybiB0Cn0KCmZ1bmMgbXVzdEdldChpZCBzdHJpbmcpICpBY3Rpb24gewoJYSwgb2sgOj0gYWN0aW9uc1tpZF0KCWlmICFvayB7CgkJcGFuaWMoImFjdGlvbiBub3QgZm91bmQ6ICIgKyBpZCkKCX0KCXJldHVybiBhCn0KCmZ1bmMgaXNWYWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiBNYXhUYXJnZXROYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgZXhwaXJlZChhICpBY3Rpb24pIGJvb2wgewoJcmV0dXJuICFhLkV4ZWN1dGVkICYmIG5vdygpLkFmdGVyKGEuRXhwaXJlc0F0KQp9CgpmdW5jIHJlbW92ZUlEKGxpc3QgW11zdHJpbmcsIGlkIHN0cmluZykgW11zdHJpbmcgewoJZm9yIGksIHggOj0gcmFuZ2UgbGlzdCB7CgkJaWYgeCA9PSBpZCB7CgkJCXJldHVybiBhcHBlbmQobGlzdFs6aV0sIGxpc3RbaSsxOl0uLi4pCgkJfQoJfQoJcmV0dXJuIGxpc3QKfQoKZnVuYyBhZGRQZW5kaW5nVGFyZ2V0KHRhcmdldCBzdHJpbmcpIHsKCWlmIF8sIG9rIDo9IHB0SW5kZXhbdGFyZ2V0XTsgb2sgewoJCXJldHVybgoJfQoJcHRJbmRleFt0YXJnZXRdID0gbGVuKHBlbmRpbmdUYXJnZXRzKQoJcGVuZGluZ1RhcmdldHMgPSBhcHBlbmQocGVuZGluZ1RhcmdldHMsIHRhcmdldCkKfQoKLy8gcmVtb3ZlUGVuZGluZ1RhcmdldCBkcm9wcyBhIHRhcmdldCBmcm9tIHRoZSB3aXRoLXBlbmRpbmdzIGxpc3QgaW4KLy8gTygxKSBieSBzd2FwcGluZyB0aGUgbGFzdCBlbnRyeSBpbnRvIGl0cyBzbG90LiBPcmRlciBhZnRlcndhcmRzIGlzCi8vIGRldGVybWluaXN0aWMgKGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkpLCB3aGljaCBpcwovLyBhbGwgaXRlcmF0aW9uIG5lZWRzLgpmdW5jIHJlbW92ZVBlbmRpbmdUYXJnZXQodGFyZ2V0IHN0cmluZykgewoJaSwgb2sgOj0gcHRJbmRleFt0YXJnZXRdCglpZiAhb2sgewoJCXJldHVybgoJfQoJbGFzdCA6PSBsZW4ocGVuZGluZ1RhcmdldHMpIC0gMQoJbW92ZWQgOj0gcGVuZGluZ1RhcmdldHNbbGFzdF0KCXBlbmRpbmdUYXJnZXRzW2ldID0gbW92ZWQKCXB0SW5kZXhbbW92ZWRdID0gaQoJcGVuZGluZ1RhcmdldHMgPSBwZW5kaW5nVGFyZ2V0c1s6bGFzdF0KCWRlbGV0ZShwdEluZGV4LCB0YXJnZXQpCn0KCi8vIGRyb3BQZW5kaW5nIHJlbW92ZXMgaWQgZnJvbSBpdHMgdGFyZ2V0J3MgcGVuZGluZyBsaXN0LiBCb3VuZGVkOiB0aGUKLy8gbGlzdCBuZXZlciBleGNlZWRzIE1heFBlbmRpbmdQZXJUYXJnZXQuCmZ1bmMgZHJvcFBlbmRpbmcodGFyZ2V0LCBpZCBzdHJpbmcpIHsKCWwgOj0gcmVtb3ZlSUQocGVuZGluZ1t0YXJnZXRdLCBpZCkKCWlmIGxlbihsKSA9PSAwIHsKCQlkZWxldGUocGVuZGluZywgdGFyZ2V0KQoJCXJlbW92ZVBlbmRpbmdUYXJnZXQodGFyZ2V0KQoJfSBlbHNlIHsKCQlwZW5kaW5nW3RhcmdldF0gPSBsCgl9Cn0KCi8vIHJlYXAgcmVtb3ZlcyBhIG5vbi1leGVjdXRlZCBhY3Rpb24gZnJvbSBzdGF0ZSBlbnRpcmVseTsgaXRzIGhpc3RvcnkKLy8gaXMgdGhlIGVtaXR0ZWQgZXZlbnQuIEV4ZWN1dGVkIHJlY29yZHMgYXJlIHBlcm1hbmVudCBhdHRlc3RhdGlvbnM6Ci8vIHJlYXAgcmVmdXNlcyB0aGVtIG91dHJpZ2h0IChyb3VuZC0yIGhhcmRlbmluZyksIHNvIG5vIGZ1dHVyZSBjYWxsZXIKLy8gY2FuIGVyYXNlIG9uZSBieSBtaXN0YWtlLgpmdW5jIHJlYXAoaWQgc3RyaW5nKSB7CglhIDo9IGFjdGlvbnNbaWRdCglpZiBhICE9IG5pbCAmJiBhLkV4ZWN1dGVkIHsKCQlyZXR1cm4KCX0KCWlmIGEgIT0gbmlsIHsKCQlkcm9wUGVuZGluZyhhLlRhcmdldCwgaWQpCgl9CglkZWxldGUoYWN0aW9ucywgaWQpCglhY3Rpb25JRHMgPSByZW1vdmVJRChhY3Rpb25JRHMsIGlkKQp9CgovLyBzd2VlcEV4cGlyZWQgcmVhcHMgdGhlIGV4cGlyZWQgcGVuZGluZyBhY3Rpb25zIG9mIE9ORSB0YXJnZXQgKGZpeAovLyBZNC9ZMjogdGhlIG9sZCBnbG9iYWwgYnVkZ2V0LXdpbmRvd2VkIHN3ZWVwIGxldCBsb25nLWRlbGF5IGVudHJpZXMgYXQKLy8gdGhlIGZyb250IG9mIGEgc2hhcmVkIHF1ZXVlIHN0YXJ2ZSBldmVyeXRoaW5nIGJlaGluZCB0aGVtKS4gQQovLyB0YXJnZXQncyBsaXN0IGlzIGJvdW5kZWQgYnkgTWF4UGVuZGluZ1BlclRhcmdldCwgc28gdGhlIHN3ZWVwIGlzIGEKLy8gYm91bmRlZCBzY2FuLiBFeHBpcnkgaGlzdG9yeSBpcyB0aGUgZW1pdHRlZCBldmVudC4KZnVuYyBzd2VlcEV4cGlyZWQodGFyZ2V0IHN0cmluZykgewoJdmFyIGxpdmUgW11zdHJpbmcKCWZvciBfLCBpZCA6PSByYW5nZSBwZW5kaW5nW3RhcmdldF0gewoJCWEgOj0gYWN0aW9uc1tpZF0KCQlpZiBhID09IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGV4cGlyZWQoYSkgewoJCQljaGFpbi5FbWl0KCJ0aW1lbG9ja19leHBpcmVkIiwgImlkIiwgaWQsICJ0YXJnZXQiLCBhLlRhcmdldCkKCQkJZGVsZXRlKGFjdGlvbnMsIGlkKQoJCQlhY3Rpb25JRHMgPSByZW1vdmVJRChhY3Rpb25JRHMsIGlkKQoJCQljb250aW51ZQoJCX0KCQlsaXZlID0gYXBwZW5kKGxpdmUsIGlkKQoJfQoJaWYgbGVuKGxpdmUpID09IDAgewoJCWRlbGV0ZShwZW5kaW5nLCB0YXJnZXQpCgkJcmVtb3ZlUGVuZGluZ1RhcmdldCh0YXJnZXQpCgl9IGVsc2UgewoJCXBlbmRpbmdbdGFyZ2V0XSA9IGxpdmUKCX0KfQoKLy8gcGVuZGluZ0NvdW50IGlzIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCdzIGxpdmUgbGlzdC4gVGhlIGNvdW50ZXIgaXQKLy8gcmVwbGFjZXMgKGZpeCBZNCkgY291bGQgZGVzeW5jIGZyb20gdGhlIGxpc3RzIGl0IG1pcnJvcmVkOyBhIGxlbmd0aAovLyBjYW5ub3QuIEl0IG1heSBicmllZmx5IGluY2x1ZGUgbm90LXlldC1zd2VwdCBleHBpcmVkIGFjdGlvbnM7IHRob3NlCi8vIGFyZSByZWFwZWQgYnkgdGhlIG5leHQgU2NoZWR1bGUncyBzd2VlcCBvciBieSBhbnlvbmUncyBFeHBpcmUsIGFuZCBpbgovLyB0aGUgd29yc3QgY2FzZSBhbiBvd25lciBicmllZmx5IHVuZGVyLXVzZXMgdGhlaXIgb3duIHF1b3RhIOKAlCBuZXZlcgovLyBhbm90aGVyIHRlbmFudCdzLgpmdW5jIHBlbmRpbmdDb3VudCh0YXJnZXQgc3RyaW5nKSBpbnQgewoJcmV0dXJuIGxlbihwZW5kaW5nW3RhcmdldF0pCn0KCi8vIHNhbml0aXplIG1ha2VzIGF0dGFja2VyLWNvbnRyb2xsZWQgdGV4dCBzYWZlIHRvIGVtYmVkIGluIG1hcmtkb3duIGFuZAovLyBzaW5nbGUtbGluZSBzdW1tYXJpZXM6IGJhY2t0aWNrcywgcGlwZXMsIG5ld2xpbmVzLCBsaW5rIHN5bnRheCwgYW5kCi8vIHJhdyBIVE1MIGJyYWNrZXRzIChmaXggWTM6IGdub3dlYiBoYXMgbm8gSFRNTCBzYW5pdGl6YXRpb24gbGF5ZXIsIHNvCi8vIGEgbGl0ZXJhbCA8c2NyaXB0PiB0YWcgbXVzdCBuZXZlciByZWFjaCB0aGUgcGFnZSkgYXJlIHJlcGxhY2VkIHNvIGEKLy8gRGF0YSBzdHJpbmcgY2Fubm90IGJyZWFrIG91dCBvZiBpdHMgY2VsbCwgaW5qZWN0IHJvd3Mgb3IgbWFya3VwLCBvcgovLyByZW5kZXIgYSBsaXZlIGxpbmsuCmZ1bmMgc2FuaXRpemUocyBzdHJpbmcpIHN0cmluZyB7CglyIDo9IHN0cmluZ3MuTmV3UmVwbGFjZXIoCgkJImAiLCAiJyIsICJ8IiwgIi8iLCAiXG4iLCAiICIsICJcciIsICIgIiwKCQkiWyIsICIoIiwgIl0iLCAiKSIsICIqIiwgIsK3IiwgIl8iLCAiLSIsCgkJIjwiLCAiKCIsICI+IiwgIikiLAoJKQoJcmV0dXJuIHIuUmVwbGFjZShzKQp9CgovLyB0cnVuY2F0ZSBzaG9ydGVucyBzIHRvIGF0IG1vc3QgbiBydW5lcyB3aXRob3V0IHNwbGl0dGluZyBhIG11bHRpYnl0ZQovLyBjaGFyYWN0ZXIuIG4gaXMgY2xhbXBlZCB0byBhIG1pbmltdW0gb2YgNCAocmUtYXVkaXQ6IG48PTIgc2xpY2VkIG91dAovLyBvZiBib3VuZHMpLgpmdW5jIHRydW5jYXRlKHMgc3RyaW5nLCBuIGludCkgc3RyaW5nIHsKCWlmIG4gPCA0IHsKCQluID0gNAoJfQoJcnVuZXMgOj0gW11ydW5lKHMpCglpZiBsZW4ocnVuZXMpIDw9IG4gewoJCXJldHVybiBzCgl9CglyZXR1cm4gc3RyaW5nKHJ1bmVzWzpuLTNdKSArICIuLi4iCn0KCi8vIC0tLS0tLS0tLS0gdGFyZ2V0IHJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0tCgovLyBSZWdpc3RlclRhcmdldCBjcmVhdGVzIGEgbmFtZWQgdGFyZ2V0LiBUaGUgY2FsbGVyIGJlY29tZXMgaXRzIG93bmVyIOKAlAovLyB0aGUgb25seSBhZGRyZXNzIHRoYXQgbWF5IHNjaGVkdWxlIGFjdGlvbnMgYWdhaW5zdCBpdC4gbWluRGVsYXkgaXMKLy8gdGhlIGVuZm9yY2VkIGZsb29yIGZvciBldmVyeSBhY3Rpb24ncyBkZWxheS4gZ3VhcmRpYW4gbWF5IGJlIGVtcHR5Ci8vIChubyBndWFyZGlhbikgb3IgYW4gYWRkcmVzcyBlbXBvd2VyZWQgdG8gdmV0byBwZW5kaW5nIGFjdGlvbnMuCmZ1bmMgUmVnaXN0ZXJUYXJnZXQoY3VyIHJlYWxtLCBuYW1lIHN0cmluZywgbWluRGVsYXkgaW50NjQsIGd1YXJkaWFuIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmICFpc1ZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoInRhcmdldCBuYW1lIG11c3QgYmUgMS0iICsgc3RyY29udi5JdG9hKE1heFRhcmdldE5hbWVMZW4pICsKCQkJIiBjaGFycywgbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzIG9ubHkiKQoJfQoJaWYgXywgZXhpc3RzIDo9IHRhcmdldHNbbmFtZV07IGV4aXN0cyB7CgkJcGFuaWMoInRhcmdldCBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICIgKyBuYW1lKQoJfQoJaWYgb3duZXJUYXJnZXRzW293bmVyXSA+PSBNYXhUYXJnZXRzUGVyT3duZXIgewoJCXBhbmljKCJwZXItb3duZXIgdGFyZ2V0IGxpbWl0IHJlYWNoZWQiKQoJfQoJaWYgbWluRGVsYXkgPCBNaW5EZWxheUZsb29yIHsKCQlwYW5pYygibWluaW11bSBkZWxheSBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzdHJjb252LkZvcm1hdEludChNaW5EZWxheUZsb29yLCAxMCkgKyAiIHNlY29uZHMiKQoJfQoJaWYgbWluRGVsYXkgPiBNYXhEZWxheSB7CgkJcGFuaWMoIm1pbmltdW0gZGVsYXkgZXhjZWVkcyB0aGUgbWF4aW11bSBvZiAiICsgc3RyY29udi5Gb3JtYXRJbnQoTWF4RGVsYXksIDEwKSArICIgc2Vjb25kcyIpCgl9CglpZiBndWFyZGlhbiAhPSAiIiAmJiAhZ3VhcmRpYW4uSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBndWFyZGlhbiBhZGRyZXNzOiAiICsgc3RyaW5nKGd1YXJkaWFuKSkKCX0KCgl0YXJnZXRzW25hbWVdID0gJlRhcmdldENvbmZpZ3sKCQlOYW1lOiAgICAgbmFtZSwKCQlPd25lcjogICAgb3duZXIsCgkJR3VhcmRpYW46IGd1YXJkaWFuLAoJCU1pbkRlbGF5OiBtaW5EZWxheSwKCX0KCXRhcmdldE5hbWVzID0gYXBwZW5kKHRhcmdldE5hbWVzLCBuYW1lKQoJb3duZXJUYXJnZXRzW293bmVyXSsrCgljaGFpbi5FbWl0KCJ0aW1lbG9ja190YXJnZXRfcmVnaXN0ZXJlZCIsICJ0YXJnZXQiLCBuYW1lLAoJCSJvd25lciIsIHN0cmluZyhvd25lciksICJndWFyZGlhbiIsIHN0cmluZyhndWFyZGlhbiksCgkJIm1pbl9kZWxheSIsIHN0cmNvbnYuRm9ybWF0SW50KG1pbkRlbGF5LCAxMCkpCn0KCi8vIFNldEd1YXJkaWFuIGNoYW5nZXMgKG9yIGNsZWFycywgd2l0aCAiIikgdGhlIHRhcmdldCdzIGd1YXJkaWFuLgovLyBPd25lciBvbmx5LCBhbmQgUkVGVVNFRCB3aGlsZSB0aGUgdGFyZ2V0IGhhcyBwZW5kaW5nIGFjdGlvbnM6IHRoZQovLyBndWFyZGlhbidzIHZldG8gcG93ZXIgZXhpc3RzIHByZWNpc2VseSB0byBjaGVjayB0aGUgb3duZXIgZHVyaW5nIGEKLy8gZGVsYXkgd2luZG93LCBzbyB0aGUgb3duZXIgbXVzdCBub3QgYmUgYWJsZSB0byBzdHJpcCBpdCBtaWQtd2luZG93LgovLwovLyBLTk9XTiBMSU1JVCAoZG9jdW1lbnRlZCwgcm91bmQtMyBhdWRpdCk6IHRoZSBvd25lciBjYW4gY2FuY2VsIGFsbAovLyBwZW5kaW5nIGFjdGlvbnMsIGNoYW5nZSB0aGUgZ3VhcmRpYW4sIGFuZCByZXNjaGVkdWxlIOKAlCB0aGUgcHJpY2UgaXMKLy8gYSBmdWxsIGZyZXNoIE1pbkRlbGF5IG9uIGV2ZXJ5IHJlc2NoZWR1bGVkIGFjdGlvbiwgYW5kIGV2ZXJ5IHN0ZXAKLy8gZW1pdHMgYW4gZXZlbnQgKGNhbmNlbGxhdGlvbnMgKyB0aGUgZ3VhcmRpYW4gY2hhbmdlIGJlbG93KSwgc28KLy8gb2JzZXJ2ZXJzIGFsd2F5cyBnZXQgTWluRGVsYXkgb2Ygd2FybmluZyB1bmRlciB0aGUgbmV3IGd1YXJkaWFuCi8vIHJlZ2ltZS4gR3VhcmRpYW5zIHByb3RlY3Qgb3BlbiB3aW5kb3dzLCBub3QgdGhlIG93bmVyJ3MgZnV0dXJlLgpmdW5jIFNldEd1YXJkaWFuKGN1ciByZWFsbSwgdGFyZ2V0TmFtZSBzdHJpbmcsIGd1YXJkaWFuIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBzZXQgdGhlIGd1YXJkaWFuIikKCX0KCS8vIGV4cGlyZWQtYnV0LXVuc3dlcHQgYWN0aW9ucyBwcm90ZWN0IG5vdGhpbmc7IHN3ZWVwIHRoZW0gc28gdGhleQoJLy8gY2Fubm90IGJsb2NrIGEgZ3VhcmRpYW4gcm90YXRpb24gKHJvdW5kLTIgaGFyZGVuaW5nKQoJc3dlZXBFeHBpcmVkKHRhcmdldE5hbWUpCglpZiBwZW5kaW5nQ291bnQodGFyZ2V0TmFtZSkgPiAwIHsKCQlwYW5pYygiY2Fubm90IGNoYW5nZSB0aGUgZ3VhcmRpYW4gd2hpbGUgYWN0aW9ucyBhcmUgcGVuZGluZyIpCgl9CglpZiBndWFyZGlhbiAhPSAiIiAmJiAhZ3VhcmRpYW4uSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBndWFyZGlhbiBhZGRyZXNzOiAiICsgc3RyaW5nKGd1YXJkaWFuKSkKCX0KCXQuR3VhcmRpYW4gPSBndWFyZGlhbgoJY2hhaW4uRW1pdCgidGltZWxvY2tfZ3VhcmRpYW5fY2hhbmdlZCIsICJ0YXJnZXQiLCB0YXJnZXROYW1lLAoJCSJndWFyZGlhbiIsIHN0cmluZyhndWFyZGlhbikpCn0KCi8vIFRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwIE9GRkVSUyBhIHRhcmdldCB0byBhIG5ldyBvd25lcjsgdGhlIG5vbWluZWUKLy8gbXVzdCBBY2NlcHRUYXJnZXRPd25lcnNoaXAgdG8gY29tcGxldGUgaXQgKGZpeCBZNTogYSBvbmUtc3RlcAovLyB0cmFuc2ZlciBsZXQgYW55b25lIGZpbGwgYSBzdHJhbmdlcidzIHBlci1vd25lciBxdW90YSBhbmQgZHVtcAovLyBwZW5kaW5nIG9ibGlnYXRpb25zIOKAlCB3aXRoIGFuIGF0dGFja2VyLWNob3NlbiBndWFyZGlhbiDigJQgb24gYW4KLy8gYWRkcmVzcyB0aGF0IG5ldmVyIGFza2VkKS4gT3duZXIgb25seS4gUGFzcyAiIiB0byBjbGVhciBhIHBlbmRpbmcKLy8gb2ZmZXIuIE5vdGhpbmcgY2hhbmdlcyBoYW5kcyB1bnRpbCB0aGUgbm9taW5lZSBhY2NlcHRzLgpmdW5jIFRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwKGN1ciByZWFsbSwgdGFyZ2V0TmFtZSBzdHJpbmcsIG5ld093bmVyIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiB0cmFuc2ZlciBvd25lcnNoaXAiKQoJfQoJaWYgbmV3T3duZXIgPT0gIiIgewoJCXQuUGVuZGluZ093bmVyID0gIiIKCQljaGFpbi5FbWl0KCJ0aW1lbG9ja19vd25lcnNoaXBfb2ZmZXJfY2xlYXJlZCIsICJ0YXJnZXQiLCB0YXJnZXROYW1lKQoJCXJldHVybgoJfQoJaWYgIW5ld093bmVyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgbmV3IG93bmVyIGFkZHJlc3M6ICIgKyBzdHJpbmcobmV3T3duZXIpKQoJfQoJaWYgbmV3T3duZXIgPT0gdC5Pd25lciB7CgkJcGFuaWMoIm5ldyBvd25lciBpcyBhbHJlYWR5IHRoZSBvd25lciIpCgl9Cgl0LlBlbmRpbmdPd25lciA9IG5ld093bmVyCgljaGFpbi5FbWl0KCJ0aW1lbG9ja19vd25lcnNoaXBfb2ZmZXJlZCIsICJ0YXJnZXQiLCB0YXJnZXROYW1lLAoJCSJwZW5kaW5nX293bmVyIiwgc3RyaW5nKG5ld093bmVyKSkKfQoKLy8gQWNjZXB0VGFyZ2V0T3duZXJzaGlwIGNvbXBsZXRlcyBhIHBlbmRpbmcgb3duZXJzaGlwIG9mZmVyOyBvbmx5IHRoZQovLyBub21pbmVlIGNhbiBhY2NlcHQuIFRoZSBub21pbmVlJ3MgcXVvdGEgaXMgY2hlY2tlZCBIRVJFIOKAlCBjb25zZW50Ci8vIHRpbWUg4oCUIHNvIGFuIG9mZmVyIGNhbiBuZXZlciBvdmVyZmlsbCBhbiBhY2NvdW50IHRoYXQgZGlkIG5vdCBhZ3JlZQovLyB0byBjYXJyeSBpdC4KZnVuYyBBY2NlcHRUYXJnZXRPd25lcnNoaXAoY3VyIHJlYWxtLCB0YXJnZXROYW1lIHN0cmluZykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXQgOj0gbXVzdEdldFRhcmdldCh0YXJnZXROYW1lKQoJYSA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHQuUGVuZGluZ093bmVyID09ICIiIHx8IGEgIT0gdC5QZW5kaW5nT3duZXIgewoJCXBhbmljKCJjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIG93bmVyIikKCX0KCWlmIG93bmVyVGFyZ2V0c1thXSA+PSBNYXhUYXJnZXRzUGVyT3duZXIgewoJCXBhbmljKCJhY2NlcHRpbmcgd291bGQgZXhjZWVkIHRoZSBwZXItb3duZXIgdGFyZ2V0IGxpbWl0IikKCX0KCW93bmVyVGFyZ2V0c1t0Lk93bmVyXS0tCglpZiBvd25lclRhcmdldHNbdC5Pd25lcl0gPD0gMCB7CgkJZGVsZXRlKG93bmVyVGFyZ2V0cywgdC5Pd25lcikKCX0KCW93bmVyVGFyZ2V0c1thXSsrCgl0Lk93bmVyID0gYQoJdC5QZW5kaW5nT3duZXIgPSAiIgoJY2hhaW4uRW1pdCgidGltZWxvY2tfb3duZXJzaGlwX3RyYW5zZmVycmVkIiwgInRhcmdldCIsIHRhcmdldE5hbWUsCgkJIm5ld19vd25lciIsIHN0cmluZyhhKSkKfQoKLy8gLS0tLS0tLS0tLSB3cml0ZSBvcGVyYXRpb25zIC0tLS0tLS0tLS0KCi8vIFNjaGVkdWxlIGNyZWF0ZXMgYSBuZXcgdGltZWxvY2tlZCBhY3Rpb24gYWdhaW5zdCBhIHJlZ2lzdGVyZWQgdGFyZ2V0LgovLyBPbmx5IHRoZSB0YXJnZXQncyBvd25lciBtYXkgc2NoZWR1bGUuIFRoZSBkZWxheSBtdXN0IGJlIGF0IGxlYXN0IHRoZQovLyB0YXJnZXQncyByZWdpc3RlcmVkIG1pbmltdW0gYW5kIGF0IG1vc3QgTWF4RGVsYXkuIFJldHVybnMgdGhlIGFjdGlvbiBJRC4KZnVuYyBTY2hlZHVsZShjdXIgcmVhbG0sIHRhcmdldE5hbWUsIGRhdGEgc3RyaW5nLCBkZWxheSBpbnQ2NCkgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBzY2hlZHVsZSBhY3Rpb25zIGZvciAiICsgdGFyZ2V0TmFtZSkKCX0KCWlmIGRhdGEgPT0gIiIgewoJCXBhbmljKCJkYXRhIG11c3Qgbm90IGJlIGVtcHR5IikKCX0KCWlmIGxlbihkYXRhKSA+IE1heERhdGFMZW4gewoJCXBhbmljKCJkYXRhIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhEYXRhTGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgZGVsYXkgPCB0Lk1pbkRlbGF5IHsKCQlwYW5pYygiZGVsYXkgYmVsb3cgdGhlIHRhcmdldCdzIG1pbmltdW0gb2YgIiArIHN0cmNvbnYuRm9ybWF0SW50KHQuTWluRGVsYXksIDEwKSArICIgc2Vjb25kcyIpCgl9CglpZiBkZWxheSA+IE1heERlbGF5IHsKCQlwYW5pYygiZGVsYXkgZXhjZWVkcyB0aGUgbWF4aW11bSBvZiAiICsgc3RyY29udi5Gb3JtYXRJbnQoTWF4RGVsYXksIDEwKSArICIgc2Vjb25kcyIpCgl9CgoJc3dlZXBFeHBpcmVkKHRhcmdldE5hbWUpCglpZiBwZW5kaW5nQ291bnQodGFyZ2V0TmFtZSkgPj0gTWF4UGVuZGluZ1BlclRhcmdldCB7CgkJcGFuaWMoInRvbyBtYW55IHBlbmRpbmcgYWN0aW9ucyBmb3IgdGFyZ2V0ICIgKyB0YXJnZXROYW1lKQoJfQoKCWlkIDo9ICJhY3Rpb25fIiArIHN0cmNvbnYuSXRvYShuZXh0SUQpCgluZXh0SUQrKwoKCXRzIDo9IG5vdygpCglleGVjQWZ0ZXIgOj0gdHMuQWRkKHRpbWUuRHVyYXRpb24oZGVsYXkpICogdGltZS5TZWNvbmQpCglhY3Rpb25zW2lkXSA9ICZBY3Rpb257CgkJSUQ6ICAgICAgICAgICBpZCwKCQlUYXJnZXQ6ICAgICAgIHRhcmdldE5hbWUsCgkJQ3JlYXRvcjogICAgICBjYWxsZXIsCgkJRGF0YTogICAgICAgICBkYXRhLAoJCVNjaGVkdWxlZEF0OiAgdHMsCgkJRXhlY3V0ZUFmdGVyOiBleGVjQWZ0ZXIsCgkJRXhwaXJlc0F0OiAgICBleGVjQWZ0ZXIuQWRkKHRpbWUuRHVyYXRpb24oR3JhY2VQZXJpb2QpICogdGltZS5TZWNvbmQpLAoJfQoJYWN0aW9uSURzID0gYXBwZW5kKGFjdGlvbklEcywgaWQpCgkvLyBzZWxmLXRyaW0gKGZpeCBZNCk6IHRoZSByZW5kZXIgaW5kZXggc3RheXMgYm91bmRlZCwgc28gcmVhcGluZyBhbgoJLy8gZW50cnkgZnJvbSBpdCBjYW4gbmV2ZXIgYmVjb21lIGFuIHVuYm91bmRlZCBzY2FuLiBUcmltbWVkIGVudHJpZXMKCS8vIHJlbWFpbiBpbiB0aGUgYWN0aW9ucyBtYXA7IG9ubHkgZnJvbnQtcGFnZSBvcmRlcmluZyBmb3JnZXRzIHRoZW0uCglpZiBsZW4oYWN0aW9uSURzKSA+IFJlbmRlckluZGV4Q2FwIHsKCQlhY3Rpb25JRHMgPSBhcHBlbmQoW11zdHJpbmd7fSwgYWN0aW9uSURzW2xlbihhY3Rpb25JRHMpLU1heFJlbmRlckFjdGlvbnM6XS4uLikKCX0KCXBlbmRpbmdbdGFyZ2V0TmFtZV0gPSBhcHBlbmQocGVuZGluZ1t0YXJnZXROYW1lXSwgaWQpCglhZGRQZW5kaW5nVGFyZ2V0KHRhcmdldE5hbWUpCgkvLyBmdWxsLWF0dHJpYnV0ZSBldmVudCAocm91bmQtMyBhdWRpdCk6IHJlYXBlZCByZWNvcmRzIG11c3QgYmUKCS8vIHJlY29uc3RydWN0aWJsZSBmcm9tIGV2ZW50cyBhbG9uZQoJY2hhaW4uRW1pdCgidGltZWxvY2tfc2NoZWR1bGVkIiwgImlkIiwgaWQsICJ0YXJnZXQiLCB0YXJnZXROYW1lLAoJCSJjcmVhdG9yIiwgc3RyaW5nKGNhbGxlciksICJkYXRhIiwgZGF0YSwKCQkiZGVsYXkiLCBzdHJjb252LkZvcm1hdEludChkZWxheSwgMTApLAoJCSJleGVjdXRlX2FmdGVyIiwgZXhlY0FmdGVyLkZvcm1hdCh0aW1lLlJGQzMzMzkpLAoJCSJleHBpcmVzX2F0IiwgZXhlY0FmdGVyLkFkZCh0aW1lLkR1cmF0aW9uKEdyYWNlUGVyaW9kKSp0aW1lLlNlY29uZCkuRm9ybWF0KHRpbWUuUkZDMzMzOSkpCglyZXR1cm4gaWQKfQoKLy8gRXhlY3V0ZSBtYXJrcyBhbiBhY3Rpb24gYXMgZXhlY3V0ZWQuIEFueW9uZSBjYW4gY2FsbCB0aGlzIOKAlCB0aGUKLy8gdGltZWxvY2sgaXMgdGhlIHByb3RlY3Rpb24sIG5vdCB0aGUgZXhlY3V0b3IncyBpZGVudGl0eS4gVGhlIGFjdGlvbgovLyBtdXN0IGV4aXN0LCBiZSBwZW5kaW5nLCBpdHMgZGVsYXkgZWxhcHNlZCwgYW5kIGl0cyBncmFjZSB3aW5kb3cgbm90Ci8vIHlldCBleHBpcmVkLgpmdW5jIEV4ZWN1dGUoY3VyIHJlYWxtLCBhY3Rpb25JRCBzdHJpbmcpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJYSA6PSBtdXN0R2V0KGFjdGlvbklEKQoJaWYgYS5FeGVjdXRlZCB7CgkJcGFuaWMoImFjdGlvbiBhbHJlYWR5IGV4ZWN1dGVkIikKCX0KCWlmIG5vdygpLkJlZm9yZShhLkV4ZWN1dGVBZnRlcikgewoJCXJlbWFpbmluZyA6PSBhLkV4ZWN1dGVBZnRlci5TdWIobm93KCkpCgkJcGFuaWMoInRvbyBlYXJseTogIiArIHN0cmNvbnYuRm9ybWF0SW50KGludDY0KHJlbWFpbmluZy90aW1lLlNlY29uZCksIDEwKSArICJzIHJlbWFpbmluZyIpCgl9CglpZiBub3coKS5BZnRlcihhLkV4cGlyZXNBdCkgewoJCXBhbmljKCJhY3Rpb24gZXhwaXJlZDogdGhlIGdyYWNlIHdpbmRvdyBvZiAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoR3JhY2VQZXJpb2QsIDEwKSArICJzIGFmdGVyIHJlYWRpbmVzcyBoYXMgcGFzc2VkIikKCX0KCglhLkV4ZWN1dGVkID0gdHJ1ZQoJZHJvcFBlbmRpbmcoYS5UYXJnZXQsIGFjdGlvbklEKQoJY2hhaW4uRW1pdCgidGltZWxvY2tfZXhlY3V0ZWQiLCAiaWQiLCBhY3Rpb25JRCwgInRhcmdldCIsIGEuVGFyZ2V0KQoJcmV0dXJuICJleGVjdXRlZDogIiArIGFjdGlvbklECn0KCi8vIENhbmNlbCByZW1vdmVzIGEgcGVuZGluZyBhY3Rpb24uIE9ubHkgdGhlIHRhcmdldCdzIENVUlJFTlQgb3duZXIgY2FuCi8vIGNhbmNlbCAocmUtYXVkaXQ6IHRoZSBzY2hlZHVsaW5nIGNyZWF0b3IncyByaWdodHMgbXVzdCBub3Qgc3Vydml2ZSBhbgovLyBvd25lcnNoaXAgdHJhbnNmZXIpLiBUaGUgcmVjb3JkIGlzIHJlYXBlZDsgaGlzdG9yeSBpcyB0aGUgZXZlbnQuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgYWN0aW9uSUQgc3RyaW5nKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWEgOj0gbXVzdEdldChhY3Rpb25JRCkKCXQgOj0gbXVzdEdldFRhcmdldChhLlRhcmdldCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBjYW5jZWwiKQoJfQoJaWYgYS5FeGVjdXRlZCB7CgkJcGFuaWMoImNhbm5vdCBjYW5jZWwgYW4gYWxyZWFkeS1leGVjdXRlZCBhY3Rpb24iKQoJfQoJaWYgZXhwaXJlZChhKSB7CgkJcGFuaWMoImFjdGlvbiBleHBpcmVkOiBub3RoaW5nIHRvIGNhbmNlbCAodXNlIEV4cGlyZSkiKQoJfQoKCWNoYWluLkVtaXQoInRpbWVsb2NrX2NhbmNlbGxlZCIsICJpZCIsIGFjdGlvbklELCAidGFyZ2V0IiwgYS5UYXJnZXQpCglyZWFwKGFjdGlvbklEKQoJcmV0dXJuICJjYW5jZWxsZWQ6ICIgKyBhY3Rpb25JRAp9CgovLyBWZXRvIGNhbmNlbHMgYSBwZW5kaW5nIGFjdGlvbiBhcyB0aGUgdGFyZ2V0J3MgZ3VhcmRpYW4uIFRoaXMgaXMgdGhlCi8vIGd1YXJkaWFuJ3Mgd2hvbGUgcG93ZXI6IGl0IGNhbiBzdG9wIGEgc2NoZWR1bGVkIGFjdGlvbiBkdXJpbmcgdGhlCi8vIGRlbGF5IHdpbmRvdywgbmV2ZXIgY3JlYXRlIG9yIGV4ZWN1dGUgb25lLiBUaGUgcmVjb3JkIGlzIHJlYXBlZDsKLy8gaGlzdG9yeSBpcyB0aGUgZXZlbnQuCmZ1bmMgVmV0byhjdXIgcmVhbG0sIGFjdGlvbklEIHN0cmluZykgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglhIDo9IG11c3RHZXQoYWN0aW9uSUQpCgl0IDo9IG11c3RHZXRUYXJnZXQoYS5UYXJnZXQpCglpZiB0Lkd1YXJkaWFuID09ICIiIHsKCQlwYW5pYygidGFyZ2V0IGhhcyBubyBndWFyZGlhbjogIiArIGEuVGFyZ2V0KQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHQuR3VhcmRpYW4gewoJCXBhbmljKCJvbmx5IHRoZSB0YXJnZXQgZ3VhcmRpYW4gY2FuIHZldG8iKQoJfQoJaWYgYS5FeGVjdXRlZCB7CgkJcGFuaWMoImNhbm5vdCB2ZXRvIGFuIGFscmVhZHktZXhlY3V0ZWQgYWN0aW9uIikKCX0KCWlmIGV4cGlyZWQoYSkgewoJCXBhbmljKCJhY3Rpb24gZXhwaXJlZDogbm90aGluZyB0byB2ZXRvICh1c2UgRXhwaXJlKSIpCgl9CgoJY2hhaW4uRW1pdCgidGltZWxvY2tfdmV0b2VkIiwgImlkIiwgYWN0aW9uSUQsICJ0YXJnZXQiLCBhLlRhcmdldCkKCXJlYXAoYWN0aW9uSUQpCglyZXR1cm4gInZldG9lZDogIiArIGFjdGlvbklECn0KCi8vIEV4cGlyZSByZWFwcyBhIHByb3ZhYmx5IGV4cGlyZWQgYWN0aW9uLiBQZXJtaXNzaW9ubGVzcyAoZml4IFkyKTogYW4KLy8gZXhwaXJlZCBhY3Rpb24gZGVjaWRlcyBub3RoaW5nIOKAlCByZWFwaW5nIGl0IG9ubHkgd3JpdGVzIGRvd24gd2hhdCB0aGUKLy8gY2xvY2sgYWxyZWFkeSBkZWNpZGVkIOKAlCBzbyBhbnlvbmUgbWF5IGZyZWUgdGhlIHF1b3RhIHNsb3QgaXQgaG9sZHMuCi8vIFRoaXMgaXMgdGhlIHJlY292ZXJ5IHZhbHZlIHRoYXQgbWFrZXMgYSB3ZWRnZWQgdGFyZ2V0IGltcG9zc2libGU6Ci8vIGJlZm9yZSBpdCwgYSBwaGFudG9tIGV4cGlyZWQgZW50cnkgY29uc3VtZWQgcXVvdGEgYW5kIGJsb2NrZWQKLy8gU2V0R3VhcmRpYW4gdW50aWwgYSBnbG9iYWwgc3dlZXAgaGFwcGVuZWQgdG8gcmVhY2ggaXQ7IG5vdyBpdHMgb3duCi8vIHRhcmdldCdzIG93bmVyIOKAlCBvciBhbnlvbmUgZWxzZSDigJQgcmVhcHMgaXQgZGlyZWN0bHkuCmZ1bmMgRXhwaXJlKGN1ciByZWFsbSwgYWN0aW9uSUQgc3RyaW5nKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWEgOj0gbXVzdEdldChhY3Rpb25JRCkKCWlmIGEuRXhlY3V0ZWQgewoJCXBhbmljKCJhY3Rpb24gYWxyZWFkeSBleGVjdXRlZCIpCgl9CglpZiAhZXhwaXJlZChhKSB7CgkJcGFuaWMoImFjdGlvbiBpcyBub3QgZXhwaXJlZCIpCgl9CgljaGFpbi5FbWl0KCJ0aW1lbG9ja19leHBpcmVkIiwgImlkIiwgYWN0aW9uSUQsICJ0YXJnZXQiLCBhLlRhcmdldCkKCXJlYXAoYWN0aW9uSUQpCglyZXR1cm4gImV4cGlyZWQ6ICIgKyBhY3Rpb25JRAp9CgovLyAtLS0tLS0tLS0tIHJlYWQtb25seSBxdWVyaWVzIC0tLS0tLS0tLS0KCi8vIEdldFRhcmdldCByZXR1cm5zIGEgZm9ybWF0dGVkIHN1bW1hcnkgb2YgYSByZWdpc3RlcmVkIHRhcmdldC4KZnVuYyBHZXRUYXJnZXQodGFyZ2V0TmFtZSBzdHJpbmcpIHN0cmluZyB7Cgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiVGFyZ2V0OiAiICsgdC5OYW1lICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIk93bmVyOiAiICsgc3RyaW5nKHQuT3duZXIpICsgIlxuIikKCWd1YXJkaWFuIDo9ICJub25lIgoJaWYgdC5HdWFyZGlhbiAhPSAiIiB7CgkJZ3VhcmRpYW4gPSBzdHJpbmcodC5HdWFyZGlhbikKCX0KCWIuV3JpdGVTdHJpbmcoIkd1YXJkaWFuOiAiICsgZ3VhcmRpYW4gKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiTWluIGRlbGF5OiAiICsgc3RyY29udi5Gb3JtYXRJbnQodC5NaW5EZWxheSwgMTApICsgInNcbiIpCglpZiB0LlBlbmRpbmdPd25lciAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZygiUGVuZGluZyBvd25lcjogIiArIHN0cmluZyh0LlBlbmRpbmdPd25lcikgKyAiXG4iKQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gR2V0QWN0aW9uIHJldHVybnMgYSBmb3JtYXR0ZWQgc3VtbWFyeSBvZiBhIHNpbmdsZSBwZW5kaW5nIG9yIGV4ZWN1dGVkCi8vIGFjdGlvbi4gQ2FuY2VsbGVkL3ZldG9lZC9leHBpcmVkIGFjdGlvbnMgYXJlIHJlYXBlZCDigJQgdGhlaXIgaGlzdG9yeQovLyBpcyBpbiBlbWl0dGVkIGV2ZW50cy4KZnVuYyBHZXRBY3Rpb24oYWN0aW9uSUQgc3RyaW5nKSBzdHJpbmcgewoJYSA6PSBtdXN0R2V0KGFjdGlvbklEKQoJcmV0dXJuIGZvcm1hdEFjdGlvbihhKQp9CgovLyBHZXRQZW5kaW5nIHJldHVybnMgdGhlIElEcyBvZiBhbGwgcGVuZGluZywgbm9uLWV4cGlyZWQgYWN0aW9ucywKLy8gZ3JvdXBlZCBieSB0YXJnZXQsIGluc2VydGlvbi1vcmRlcmVkIHdpdGhpbiBhIHRhcmdldC4gT25seSB0YXJnZXRzCi8vIHRoYXQgYWN0dWFsbHkgaG9sZCBsaXZlIHBlbmRpbmdzIGFyZSB2aXNpdGVkIChyb3VuZC0yIGZpeCBZLTEpLCBzbwovLyB0aGUgc2NhbiBjYW5ub3QgYmUgaW5mbGF0ZWQgYnkgcmVnaXN0cmF0aW9ucyBhbG9uZS4KZnVuYyBHZXRQZW5kaW5nKCkgc3RyaW5nIHsKCXZhciByZXN1bHRzIFtdc3RyaW5nCglmb3IgXywgbmFtZSA6PSByYW5nZSBwZW5kaW5nVGFyZ2V0cyB7CgkJZm9yIF8sIGlkIDo9IHJhbmdlIHBlbmRpbmdbbmFtZV0gewoJCQlhIDo9IGFjdGlvbnNbaWRdCgkJCWlmIGEgPT0gbmlsIHx8IGEuRXhlY3V0ZWQgfHwgZXhwaXJlZChhKSB7CgkJCQljb250aW51ZQoJCQl9CgkJCXJlc3VsdHMgPSBhcHBlbmQocmVzdWx0cywgYS5JRCkKCQl9Cgl9CglpZiBsZW4ocmVzdWx0cykgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihyZXN1bHRzLCAiLCAiKQp9CgovLyBJc1JlYWR5IHJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uIGV4aXN0cywgaXMgcGVuZGluZywgaXRzIGRlbGF5IGhhcwovLyBlbGFwc2VkLCBhbmQgaXQgaGFzIG5vdCBleHBpcmVkLgpmdW5jIElzUmVhZHkoYWN0aW9uSUQgc3RyaW5nKSBib29sIHsKCWEsIG9rIDo9IGFjdGlvbnNbYWN0aW9uSURdCglpZiAhb2sgfHwgYS5FeGVjdXRlZCB8fCBleHBpcmVkKGEpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiAhbm93KCkuQmVmb3JlKGEuRXhlY3V0ZUFmdGVyKQp9CgovLyBJc0V4ZWN1dGVkIHJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uIGV4aXN0cyBhbmQgd2FzIGV4ZWN1dGVkLiBUaGlzIGlzCi8vIHRoZSBjb25zdW1lci1zaWRlIGNoZWNrOiBjb21iaW5lZCB3aXRoIHRhcmdldCByZWdpc3RyYXRpb24gaXQgYXR0ZXN0cwovLyB0aGF0IHRoZSB0YXJnZXQncyByZWdpc3RlcmVkIG93bmVyIHNjaGVkdWxlZCB0aGUgYWN0aW9uLCBpdCB3YWl0ZWQgYXQKLy8gbGVhc3QgdGhlIHJlZ2lzdGVyZWQgbWluaW11bSBkZWxheSwgbm8gZ3VhcmRpYW4gdmV0b2VkIGl0LCBhbmQgaXQgd2FzCi8vIGV4ZWN1dGVkIHdpdGhpbiBpdHMgZ3JhY2Ugd2luZG93LiBFeGVjdXRlZCByZWNvcmRzIGFyZSBwZXJtYW5lbnQuCmZ1bmMgSXNFeGVjdXRlZChhY3Rpb25JRCBzdHJpbmcpIGJvb2wgewoJYSwgb2sgOj0gYWN0aW9uc1thY3Rpb25JRF0KCXJldHVybiBvayAmJiBhLkV4ZWN1dGVkCn0KCi8vIC0tLS0tLS0tLS0gcmVuZGVyIC0tLS0tLS0tLS0KCi8vIFJlbmRlciByZXR1cm5zIGEgbWFya2Rvd24gb3ZlcnZpZXcuIE5ldmVyIHBhbmljcy4gQ2FuY2VsbGVkLCB2ZXRvZWQsCi8vIGFuZCBleHBpcmVkIGFjdGlvbnMgYXJlIHJlYXBlZCBmcm9tIHN0YXRlOyB0aGVpciBoaXN0b3J5IGlzIGluCi8vIGV2ZW50cy4gVGhlIHBhZ2Ugc2hvd3MgdGhlIG1vc3QgcmVjZW50IGFjdGlvbnMgb25seSAodGhlIG9yZGVyaW5nCi8vIGluZGV4IGlzIGJvdW5kZWQg4oCUIGZpeCBZNCk7IG9sZGVyIGV4ZWN1dGVkIHJlY29yZHMgc3RheSBxdWVyeWFibGUKLy8gdmlhIEdldEFjdGlvbi9Jc0V4ZWN1dGVkIGZvcmV2ZXIuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgYWN0aW9ucyA9PSBuaWwgfHwgbGVuKGFjdGlvbnMpID09IDAgewoJCXJldHVybiAiIyBUaW1lbG9jayBHdWFyZGlhblxuXG5ObyBhY3Rpb25zIHNjaGVkdWxlZC5cbiIKCX0KCgkvLyBUaGUgUGVuZGluZyBzZWN0aW9uIHJlYWRzIHRoZSBsaXZlIHBlci10YXJnZXQgbGlzdHMsIHNvIGZsb29kaW5nCgkvLyB0aGUgcmVhbG0gd2l0aCBleGVjdXRlZCBjaHVybiBjYW4gbmV2ZXIgcHVzaCBhIHN0aWxsLWxpdmUgcGVuZGluZwoJLy8gYWN0aW9uIG9mZiB0aGUgcGFnZSBkdXJpbmcgaXRzIGRlbGF5IHdpbmRvdyAocm91bmQtMiBmaXggWS0yKS4KCXZhciBwZW5kaW5nTGlzdCBbXSpBY3Rpb24KCXRydW5jYXRlZCA6PSBmYWxzZQoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgcGVuZGluZ1RhcmdldHMgewoJCWZvciBfLCBpZCA6PSByYW5nZSBwZW5kaW5nW25hbWVdIHsKCQkJYSA6PSBhY3Rpb25zW2lkXQoJCQlpZiBhID09IG5pbCB8fCBhLkV4ZWN1dGVkIHx8IGV4cGlyZWQoYSkgewoJCQkJY29udGludWUKCQkJfQoJCQlpZiBsZW4ocGVuZGluZ0xpc3QpID49IE1heFJlbmRlckFjdGlvbnMgewoJCQkJdHJ1bmNhdGVkID0gdHJ1ZQoJCQkJYnJlYWsKCQkJfQoJCQlwZW5kaW5nTGlzdCA9IGFwcGVuZChwZW5kaW5nTGlzdCwgYSkKCQl9CgkJaWYgdHJ1bmNhdGVkIHsKCQkJYnJlYWsKCQl9Cgl9CgoJLy8gVGhlIEV4ZWN1dGVkIHNlY3Rpb24gcmVhZHMgdGhlIGJvdW5kZWQgcmVuZGVyIGluZGV4OiByZWNlbnQKCS8vIGF0dGVzdGF0aW9ucyBvbmx5OyBvbGRlciBvbmVzIHN0YXkgcXVlcnlhYmxlIHZpYSBHZXRBY3Rpb24uCgl2YXIgZXhlY3V0ZWRMaXN0IFtdKkFjdGlvbgoJc2hvdyA6PSBhY3Rpb25JRHMKCWlmIGxlbihzaG93KSA+IE1heFJlbmRlckFjdGlvbnMgewoJCXNob3cgPSBzaG93W2xlbihzaG93KS1NYXhSZW5kZXJBY3Rpb25zOl0KCQl0cnVuY2F0ZWQgPSB0cnVlCgl9Cglmb3IgXywgaWQgOj0gcmFuZ2Ugc2hvdyB7CgkJYSA6PSBhY3Rpb25zW2lkXQoJCWlmIGEgPT0gbmlsIHx8ICFhLkV4ZWN1dGVkIHsKCQkJY29udGludWUKCQl9CgkJZXhlY3V0ZWRMaXN0ID0gYXBwZW5kKGV4ZWN1dGVkTGlzdCwgYSkKCX0KCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgVGltZWxvY2sgR3VhcmRpYW5cblxuIikKCWlmIHRydW5jYXRlZCB7CgkJYi5Xcml0ZVN0cmluZygiX1Nob3dpbmcgYXQgbW9zdCAiICsgc3RyY29udi5JdG9hKE1heFJlbmRlckFjdGlvbnMpICsgIiBhY3Rpb25zIHBlciBzZWN0aW9uLl9cblxuIikKCX0KCglzZWN0aW9uIDo9IGZ1bmModGl0bGUgc3RyaW5nLCBsaXN0IFtdKkFjdGlvbikgewoJCWlmIGxlbihsaXN0KSA9PSAwIHsKCQkJcmV0dXJuCgkJfQoJCWIuV3JpdGVTdHJpbmcoIiMjICIgKyB0aXRsZSArICIgKCIgKyBzdHJjb252Lkl0b2EobGVuKGxpc3QpKSArICIpXG5cbiIpCgkJZm9yIF8sIGEgOj0gcmFuZ2UgbGlzdCB7CgkJCWIuV3JpdGVTdHJpbmcocmVuZGVyQWN0aW9uUm93KGEpKQoJCX0KCQliLldyaXRlU3RyaW5nKCJcbiIpCgl9CglzZWN0aW9uKCJQZW5kaW5nIiwgcGVuZGluZ0xpc3QpCglzZWN0aW9uKCJFeGVjdXRlZCIsIGV4ZWN1dGVkTGlzdCkKCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyAtLS0tLS0tLS0tIGZvcm1hdHRpbmcgaGVscGVycyAtLS0tLS0tLS0tCgpmdW5jIGZvcm1hdEFjdGlvbihhICpBY3Rpb24pIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIklEOiAiICsgYS5JRCArICJcbiIpCgliLldyaXRlU3RyaW5nKCJUYXJnZXQ6ICIgKyBzYW5pdGl6ZShhLlRhcmdldCkgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiQ3JlYXRvcjogIiArIHN0cmluZyhhLkNyZWF0b3IpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIkRhdGE6ICIgKyBzYW5pdGl6ZShhLkRhdGEpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIlNjaGVkdWxlZDogIiArIGEuU2NoZWR1bGVkQXQuRm9ybWF0KHRpbWUuUkZDMzMzOSkgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiRXhlY3V0ZSBhZnRlcjogIiArIGEuRXhlY3V0ZUFmdGVyLkZvcm1hdCh0aW1lLlJGQzMzMzkpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIkV4cGlyZXM6ICIgKyBhLkV4cGlyZXNBdC5Gb3JtYXQodGltZS5SRkMzMzM5KSArICJcbiIpCgoJc3dpdGNoIHsKCWNhc2UgYS5FeGVjdXRlZDoKCQliLldyaXRlU3RyaW5nKCJTdGF0dXM6IGV4ZWN1dGVkXG4iKQoJY2FzZSBleHBpcmVkKGEpOgoJCWIuV3JpdGVTdHJpbmcoIlN0YXR1czogZXhwaXJlZFxuIikKCWNhc2Ugbm93KCkuQmVmb3JlKGEuRXhlY3V0ZUFmdGVyKToKCQlyZW1haW5pbmcgOj0gYS5FeGVjdXRlQWZ0ZXIuU3ViKG5vdygpKQoJCWIuV3JpdGVTdHJpbmcoIlN0YXR1czogbG9ja2VkICgiICsgc3RyY29udi5Gb3JtYXRJbnQoaW50NjQocmVtYWluaW5nL3RpbWUuU2Vjb25kKSwgMTApICsgInMgcmVtYWluaW5nKVxuIikKCWRlZmF1bHQ6CgkJYi5Xcml0ZVN0cmluZygiU3RhdHVzOiByZWFkeVxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyQWN0aW9uUm93KGEgKkFjdGlvbikgc3RyaW5nIHsKCWRhdGEgOj0gdHJ1bmNhdGUoc2FuaXRpemUoYS5EYXRhKSwgNDApCgoJc3RhdHVzIDo9ICJwZW5kaW5nIgoJc3dpdGNoIHsKCWNhc2UgYS5FeGVjdXRlZDoKCQlzdGF0dXMgPSAiZXhlY3V0ZWQiCgljYXNlIGV4cGlyZWQoYSk6CgkJc3RhdHVzID0gImV4cGlyZWQiCgljYXNlICFub3coKS5CZWZvcmUoYS5FeGVjdXRlQWZ0ZXIpOgoJCXN0YXR1cyA9ICIqKnJlYWR5KioiCgl9CgoJcmV0dXJuICItICoqIiArIGEuSUQgKyAiKiogfCB0YXJnZXQ6IGAiICsgc2FuaXRpemUoYS5UYXJnZXQpICsgImAgfCAiICsgZGF0YSArICIgfCAiICsgc3RhdHVzICsgIlxuIgp9ChrJ/QEKGnRpbWVsb2NrX2d1YXJkaWFuX3Rlc3QuZ25vEqn9AXBhY2thZ2UgdGltZWxvY2tfZ3VhcmRpYW4KCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCglvd25lciAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygib3duZXIiKQoJZ3VhcmRpYW4gPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImd1YXJkaWFuIikKCWF0dGFja2VyID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhdHRhY2tlciIpCgluZXdPd25lciA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibmV3b3duZXIiKQopCgovLyByZXNldFN0YXRlIHJlc2V0cyBhbGwgcGFja2FnZS1sZXZlbCBzdGF0ZSBiZXR3ZWVuIHRlc3RzLgpmdW5jIHJlc2V0U3RhdGUoKSB7Cgl0YXJnZXRzID0gbWFrZShtYXBbc3RyaW5nXSpUYXJnZXRDb25maWcpCgl0YXJnZXROYW1lcyA9IFtdc3RyaW5ne30KCW93bmVyVGFyZ2V0cyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJYWN0aW9ucyA9IG1ha2UobWFwW3N0cmluZ10qQWN0aW9uKQoJYWN0aW9uSURzID0gW11zdHJpbmd7fQoJcGVuZGluZyA9IG1ha2UobWFwW3N0cmluZ11bXXN0cmluZykKCXBlbmRpbmdUYXJnZXRzID0gW11zdHJpbmd7fQoJcHRJbmRleCA9IG1ha2UobWFwW3N0cmluZ11pbnQpCgluZXh0SUQgPSAxCn0KCi8vIGhlaWdodHMgYWR2YW5jaW5nIHRpbWU6IFNraXBIZWlnaHRzIG1vdmVzIHRoZSBjbG9jayA1cyBwZXIgaGVpZ2h0LgpmdW5jIHNraXBTZWNvbmRzKHNlYyBpbnQ2NCkgewoJdGVzdGluZy5Ta2lwSGVpZ2h0cygoc2VjICsgNCkgLyA1KQp9CgpmdW5jIHJlZ2lzdGVyVXBncmFkZXMoY3VyIHJlYWxtKSBzdHJpbmcgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBNaW5EZWxheUZsb29yLCBndWFyZGlhbikKCXJldHVybiAidXBncmFkZXMiCn0KCi8vIC0tLS0tLS0tLS0gUmVnaXN0ZXJUYXJnZXQgLS0tLS0tLS0tLQoKZnVuYyBUZXN0UmVnaXN0ZXJUYXJnZXRfQmFzaWMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgMTIwLCBndWFyZGlhbikKCgl0YyA6PSB0YXJnZXRzWyJ1cGdyYWRlcyJdCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhvd25lciksIHN0cmluZyh0Yy5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhndWFyZGlhbiksIHN0cmluZyh0Yy5HdWFyZGlhbikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEyMCksIHRjLk1pbkRlbGF5KQp9CgpmdW5jIFRlc3RSZWdpc3RlclRhcmdldF9Ob0d1YXJkaWFuQWxsb3dlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCglSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAicGxhaW4iLCBNaW5EZWxheUZsb29yLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIHN0cmluZyh0YXJnZXRzWyJwbGFpbiJdLkd1YXJkaWFuKSkKfQoKZnVuYyBUZXN0UmVnaXN0ZXJUYXJnZXRfRHVwbGljYXRlUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkidGFyZ2V0IGFscmVhZHkgcmVnaXN0ZXJlZDogdXBncmFkZXMiLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyVGFyZ2V0KGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsIE1pbkRlbGF5Rmxvb3IsICIiKSB9LAoJKQp9CgpmdW5jIFRlc3RSZWdpc3RlclRhcmdldF9JbnZhbGlkTmFtZVJlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCWZvciBfLCBiYWQgOj0gcmFuZ2UgW11zdHJpbmd7IiIsICJVcGdyYWRlcyIsICJoYXMgc3BhY2UiLCBzdHJpbmdzLlJlcGVhdCgiYSIsIE1heFRhcmdldE5hbWVMZW4rMSl9IHsKCQl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwKCQkJInRhcmdldCBuYW1lIG11c3QgYmUiLAoJCQlmdW5jKCkgeyBSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCBiYWQsIE1pbkRlbGF5Rmxvb3IsICIiKSB9LAoJCSkKCX0KfQoKZnVuYyBUZXN0UmVnaXN0ZXJUYXJnZXRfRGVsYXlCb3VuZHNFbmZvcmNlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwKCQkibWluaW11bSBkZWxheSBtdXN0IGJlIGF0IGxlYXN0IiwKCQlmdW5jKCkgeyBSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAidG9vX2Zhc3QiLCBNaW5EZWxheUZsb29yLTEsICIiKSB9LAoJKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsCgkJIm1pbmltdW0gZGVsYXkgZXhjZWVkcyB0aGUgbWF4aW11bSIsCgkJZnVuYygpIHsgUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInRvb19zbG93IiwgTWF4RGVsYXkrMSwgIiIpIH0sCgkpCn0KCmZ1bmMgVGVzdFJlZ2lzdGVyVGFyZ2V0X0ludmFsaWRHdWFyZGlhblJlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJpbnZhbGlkIGd1YXJkaWFuIGFkZHJlc3M6IGp1bmsiLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyVGFyZ2V0KGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsIE1pbkRlbGF5Rmxvb3IsIGFkZHJlc3MoImp1bmsiKSkgfSwKCSkKfQoKLy8gLS0tLS0tLS0tLSBTZXRHdWFyZGlhbiAvIHR3by1zdGVwIFRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFNldEd1YXJkaWFuX093bmVyT25seShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm9ubHkgdGhlIHRhcmdldCBvd25lciBjYW4gc2V0IHRoZSBndWFyZGlhbiIsCgkJZnVuYygpIHsgU2V0R3VhcmRpYW4oY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgYXR0YWNrZXIpIH0sCgkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglTZXRHdWFyZGlhbihjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIHN0cmluZyh0YXJnZXRzWyJ1cGdyYWRlcyJdLkd1YXJkaWFuKSkKfQoKZnVuYyBUZXN0VHJhbnNmZXJUYXJnZXRPd25lcnNoaXBfVHdvU3RlcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm9ubHkgdGhlIHRhcmdldCBvd25lciBjYW4gdHJhbnNmZXIgb3duZXJzaGlwIiwKCQlmdW5jKCkgeyBUcmFuc2ZlclRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBhdHRhY2tlcikgfSwKCSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJpbnZhbGlkIG5ldyBvd25lciBhZGRyZXNzOiBqdW5rIiwKCQlmdW5jKCkgeyBUcmFuc2ZlclRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBhZGRyZXNzKCJqdW5rIikpIH0sCgkpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm5ldyBvd25lciBpcyBhbHJlYWR5IHRoZSBvd25lciIsCgkJZnVuYygpIHsgVHJhbnNmZXJUYXJnZXRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgb3duZXIpIH0sCgkpCgoJLy8gdGhlIG9mZmVyIGFsb25lIGNoYW5nZXMgbm90aGluZwoJVHJhbnNmZXJUYXJnZXRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgbmV3T3duZXIpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhvd25lciksIHN0cmluZyh0YXJnZXRzWyJ1cGdyYWRlcyJdLk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG5ld093bmVyKSwgc3RyaW5nKHRhcmdldHNbInVwZ3JhZGVzIl0uUGVuZGluZ093bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgb3duZXJUYXJnZXRzW293bmVyXSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgb3duZXJUYXJnZXRzW25ld093bmVyXSkKCgkvLyBvbmx5IHRoZSBub21pbmVlIGNhbiBhY2NlcHQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIiLAoJCWZ1bmMoKSB7IEFjY2VwdFRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiKSB9LAoJKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3T3duZXIpKQoJQWNjZXB0VGFyZ2V0T3duZXJzaGlwKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhuZXdPd25lciksIHN0cmluZyh0YXJnZXRzWyJ1cGdyYWRlcyJdLk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIHN0cmluZyh0YXJnZXRzWyJ1cGdyYWRlcyJdLlBlbmRpbmdPd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIG93bmVyVGFyZ2V0c1tvd25lcl0pCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIG93bmVyVGFyZ2V0c1tuZXdPd25lcl0pCn0KCmZ1bmMgVGVzdFRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwX0NsZWFyT2ZmZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCglUcmFuc2ZlclRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBuZXdPd25lcikKCVRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICIiKSAvLyBjbGVhcgoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3T3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIiLAoJCWZ1bmMoKSB7IEFjY2VwdFRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiKSB9LAoJKQp9CgpmdW5jIFRlc3RUcmFuc2ZlclRhcmdldE93bmVyc2hpcF9RdW90YUNoZWNrZWRBdEFjY2VwdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG5ld093bmVyKSkKCWZvciBpIDo9IDA7IGkgPCBNYXhUYXJnZXRzUGVyT3duZXI7IGkrKyB7CgkJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInRfIitzdHJpbmdzLlJlcGVhdCgieCIsIGkrMSksIE1pbkRlbGF5Rmxvb3IsICIiKQoJfQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglUcmFuc2ZlclRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBuZXdPd25lcikgLy8gb2ZmZXIgc3VjY2VlZHMKCgkvLyAuLi5idXQgYWNjZXB0aW5nIHBhc3QgdGhlIHF1b3RhIGlzIHJlZnVzZWQsIGFuZCBvd25lcnNoaXAgaXMgdW5jaGFuZ2VkCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG5ld093bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJhY2NlcHRpbmcgd291bGQgZXhjZWVkIHRoZSBwZXItb3duZXIgdGFyZ2V0IGxpbWl0IiwKCQlmdW5jKCkgeyBBY2NlcHRUYXJnZXRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIikgfSwKCSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG93bmVyKSwgc3RyaW5nKHRhcmdldHNbInVwZ3JhZGVzIl0uT3duZXIpKQp9CgpmdW5jIFRlc3RVbnNvbGljaXRlZE9mZmVyQ29uc3VtZXNOb3RoaW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXZpY3RpbSA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInZpY3RpbSIpCgoJLy8gZml4IFk1IHJlZ3Jlc3Npb246IGFuIGF0dGFja2VyIG9mZmVyaW5nIHRhcmdldHMgdG8gYSB2aWN0aW0gbXVzdAoJLy8gbm90IGNvbnN1bWUgdGhlIHZpY3RpbSdzIHF1b3RhIG9yIGNoYW5nZSBhbnkgb2YgdGhlaXIgc3RhdGUKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJZm9yIGkgOj0gMDsgaSA8IE1heFRhcmdldHNQZXJPd25lcjsgaSsrIHsKCQluYW1lIDo9ICJqdW5rXyIgKyBzdHJpbmdzLlJlcGVhdCgieCIsIGkrMSkKCQlSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCBuYW1lLCBNaW5EZWxheUZsb29yLCAiIikKCQlUcmFuc2ZlclRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCBuYW1lLCB2aWN0aW0pCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIDAsIG93bmVyVGFyZ2V0c1t2aWN0aW1dKQoKCS8vIHRoZSB2aWN0aW0gY2FuIHN0aWxsIHJlZ2lzdGVyIGEgZnVsbCBxdW90YSBvZiB0aGVpciBvd24gdGFyZ2V0cwoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh2aWN0aW0pKQoJZm9yIGkgOj0gMDsgaSA8IE1heFRhcmdldHNQZXJPd25lcjsgaSsrIHsKCQlSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAibWluZV8iK3N0cmluZ3MuUmVwZWF0KCJ5IiwgaSsxKSwgTWluRGVsYXlGbG9vciwgIiIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0gU2NoZWR1bGUgLS0tLS0tLS0tLQoKZnVuYyBUZXN0U2NoZWR1bGVfT3duZXJPbmx5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCgoJLy8gYW4gYXR0YWNrZXIgY2Fubm90IHNjaGVkdWxlIGFuIGFjdGlvbiBhZ2FpbnN0IHNvbWVvbmUgZWxzZSdzCgkvLyB0YXJnZXQg4oCUIHRoZSBjb3JlIGJpbmRpbmcgdGhlIGF1ZGl0IGZvdW5kIG1pc3NpbmcKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm9ubHkgdGhlIHRhcmdldCBvd25lciBjYW4gc2NoZWR1bGUgYWN0aW9ucyBmb3IgdXBncmFkZXMiLAoJCWZ1bmMoKSB7IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJtYWxpY2lvdXMgdXBncmFkZSIsIE1pbkRlbGF5Rmxvb3IpIH0sCgkpCn0KCmZ1bmMgVGVzdFNjaGVkdWxlX1VucmVnaXN0ZXJlZFRhcmdldFJlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJ0YXJnZXQgbm90IGZvdW5kOiBnaG9zdCIsCgkJZnVuYygpIHsgU2NoZWR1bGUoY3Jvc3MoY3VyKSwgImdob3N0IiwgImRhdGEiLCBNaW5EZWxheUZsb29yKSB9LAoJKQp9CgpmdW5jIFRlc3RTY2hlZHVsZV9NaW5EZWxheUVuZm9yY2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgMzYwMCwgIiIpCgoJLy8gYSBkZWxheSBiZWxvdyB0aGUgdGFyZ2V0J3MgcmVnaXN0ZXJlZCBtaW5pbXVtIGlzIHJlamVjdGVkIOKAlCBubwoJLy8gbW9yZSAxLXNlY29uZCAidGltZWxvY2tzIgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImRlbGF5IGJlbG93IHRoZSB0YXJnZXQncyBtaW5pbXVtIG9mIDM2MDAgc2Vjb25kcyIsCgkJZnVuYygpIHsgU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgImRhdGEiLCA2MCkgfSwKCSkKfQoKZnVuYyBUZXN0U2NoZWR1bGVfTWF4RGVsYXlFbmZvcmNlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoKCS8vIG92ZXJmbG93IHJlZ3Jlc3Npb246IGEgZGVsYXkgcGFzdCBNYXhEZWxheSBtdXN0IGFib3J0LCBuZXZlciB3cmFwCgkvLyBFeGVjdXRlQWZ0ZXIgaW50byB0aGUgcGFzdAoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsCgkJImRlbGF5IGV4Y2VlZHMgdGhlIG1heGltdW0iLAoJCWZ1bmMoKSB7IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJkYXRhIiwgTWF4RGVsYXkrMSkgfSwKCSkKfQoKZnVuYyBUZXN0U2NoZWR1bGVfRGF0YVZhbGlkYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiZGF0YSBtdXN0IG5vdCBiZSBlbXB0eSIsCgkJZnVuYygpIHsgU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIiIsIE1pbkRlbGF5Rmxvb3IpIH0sCgkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwKCQkiZGF0YSBleGNlZWRzIiwKCQlmdW5jKCkgeyBTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBzdHJpbmdzLlJlcGVhdCgieCIsIE1heERhdGFMZW4rMSksIE1pbkRlbGF5Rmxvb3IpIH0sCgkpCn0KCmZ1bmMgVGVzdFNjaGVkdWxlX1BlbmRpbmdDYXAoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCglmb3IgaSA6PSAwOyBpIDwgTWF4UGVuZGluZ1BlclRhcmdldDsgaSsrIHsKCQlTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AiLCBNaW5EZWxheUZsb29yKQoJfQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInRvbyBtYW55IHBlbmRpbmcgYWN0aW9ucyBmb3IgdGFyZ2V0IHVwZ3JhZGVzIiwKCQlmdW5jKCkgeyBTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AiLCBNaW5EZWxheUZsb29yKSB9LAoJKQp9CgpmdW5jIFRlc3RTY2hlZHVsZV9TZXRzV2luZG93cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoKCWlkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJyb3RhdGUga2V5cyIsIDEyMCkKCWEgOj0gYWN0aW9uc1tpZF0KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTIwKSwgaW50NjQoYS5FeGVjdXRlQWZ0ZXIuU3ViKGEuU2NoZWR1bGVkQXQpLlNlY29uZHMoKSkpCgl1YXNzZXJ0LkVxdWFsKHQsIEdyYWNlUGVyaW9kLCBpbnQ2NChhLkV4cGlyZXNBdC5TdWIoYS5FeGVjdXRlQWZ0ZXIpLlNlY29uZHMoKSkpCn0KCi8vIC0tLS0tLS0tLS0gRXhlY3V0ZSAtLS0tLS0tLS0tCgpmdW5jIFRlc3RFeGVjdXRlX1Rvb0Vhcmx5QmxvY2tlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoJaWQgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wIiwgTWluRGVsYXlGbG9vcikKCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRvbyBlYXJseSIsIGZ1bmMoKSB7IEV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpIH0pCgl1YXNzZXJ0LkZhbHNlKHQsIElzUmVhZHkoaWQpLCAibXVzdCBub3QgYmUgcmVhZHkgYmVmb3JlIHRoZSBkZWxheSIpCn0KCmZ1bmMgVGVzdEV4ZWN1dGVfUmVhZHlBZnRlckRlbGF5X0FueW9uZUNhbkV4ZWN1dGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCWlkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJvcCIsIE1pbkRlbGF5Rmxvb3IpCgoJc2tpcFNlY29uZHMoTWluRGVsYXlGbG9vcikKCXVhc3NlcnQuVHJ1ZSh0LCBJc1JlYWR5KGlkKSwgIm11c3QgYmUgcmVhZHkgYWZ0ZXIgdGhlIGRlbGF5IikKCgkvLyBleGVjdXRvciBpZGVudGl0eSBpcyBkZWxpYmVyYXRlbHkgdW5yZXN0cmljdGVkCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuRXF1YWwodCwgImV4ZWN1dGVkOiAiK2lkLCBFeGVjdXRlKGNyb3NzKGN1ciksIGlkKSkKCXVhc3NlcnQuVHJ1ZSh0LCBJc0V4ZWN1dGVkKGlkKSwgIm11c3QgcmVjb3JkIGV4ZWN1dGlvbiIpCn0KCmZ1bmMgVGVzdEV4ZWN1dGVfVHdpY2VCbG9ja2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglpZCA6PSBTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AiLCBNaW5EZWxheUZsb29yKQoJc2tpcFNlY29uZHMoTWluRGVsYXlGbG9vcikKCUV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhY3Rpb24gYWxyZWFkeSBleGVjdXRlZCIsIGZ1bmMoKSB7IEV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpIH0pCn0KCmZ1bmMgVGVzdEV4ZWN1dGVfRXhwaXJlZEJsb2NrZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCWlkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJvcCIsIE1pbkRlbGF5Rmxvb3IpCgoJLy8gdHJhdmVsIHBhc3QgdGhlIGdyYWNlIHdpbmRvdzogc3RhbGUgYWN0aW9ucyBjYW5ub3QgYmUgc3BydW5nIGxhdGVyCglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yICsgR3JhY2VQZXJpb2QgKyAxMCkKCXVhc3NlcnQuRmFsc2UodCwgSXNSZWFkeShpZCksICJleHBpcmVkIGFjdGlvbiBtdXN0IG5vdCBiZSByZWFkeSIpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImFjdGlvbiBleHBpcmVkIiwgZnVuYygpIHsgRXhlY3V0ZShjcm9zcyhjdXIpLCBpZCkgfSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBHZXRQZW5kaW5nKCkpCn0KCi8vIC0tLS0tLS0tLS0gQ2FuY2VsIC8gVmV0byAtLS0tLS0tLS0tCgpmdW5jIFRlc3RDYW5jZWxfQ3VycmVudE93bmVyT25seShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoJaWQgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wIiwgTWluRGVsYXlGbG9vcikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJvbmx5IHRoZSB0YXJnZXQgb3duZXIgY2FuIGNhbmNlbCIsCgkJZnVuYygpIHsgQ2FuY2VsKGNyb3NzKGN1ciksIGlkKSB9LAoJKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAiY2FuY2VsbGVkOiAiK2lkLCBDYW5jZWwoY3Jvc3MoY3VyKSwgaWQpKQoJXywgcHJlc2VudCA6PSBhY3Rpb25zW2lkXQoJdWFzc2VydC5GYWxzZSh0LCBwcmVzZW50LCAiY2FuY2VsbGVkIGFjdGlvbiBtdXN0IGJlIHJlYXBlZCBmcm9tIHN0YXRlIikKCgkvLyByZS1hdWRpdCBQMzogYWZ0ZXIgYW4gb3duZXJzaGlwIHRyYW5zZmVyIHRoZSBTQ0hFRFVMSU5HIGNyZWF0b3IKCS8vIGxvc2VzIGNhbmNlbCByaWdodHM7IG9ubHkgdGhlIGN1cnJlbnQgb3duZXIgaG9sZHMgdGhlbQoJaWQyIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJvcDIiLCBNaW5EZWxheUZsb29yKQoJVHJhbnNmZXJUYXJnZXRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgbmV3T3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG5ld093bmVyKSkKCUFjY2VwdFRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBjYW5jZWwiLAoJCWZ1bmMoKSB7IENhbmNlbChjcm9zcyhjdXIpLCBpZDIpIH0sCgkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG5ld093bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgImNhbmNlbGxlZDogIitpZDIsIENhbmNlbChjcm9zcyhjdXIpLCBpZDIpKQp9CgpmdW5jIFRlc3RDYW5jZWxfRXhlY3V0ZWRCbG9ja2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglpZCA6PSBTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AiLCBNaW5EZWxheUZsb29yKQoJc2tpcFNlY29uZHMoTWluRGVsYXlGbG9vcikKCUV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNhbm5vdCBjYW5jZWwgYW4gYWxyZWFkeS1leGVjdXRlZCBhY3Rpb24iLAoJCWZ1bmMoKSB7IENhbmNlbChjcm9zcyhjdXIpLCBpZCkgfSwKCSkKfQoKZnVuYyBUZXN0VmV0b19HdWFyZGlhbk9ubHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCWlkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJvcCIsIE1pbkRlbGF5Rmxvb3IpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgdGFyZ2V0IGd1YXJkaWFuIGNhbiB2ZXRvIiwKCQlmdW5jKCkgeyBWZXRvKGNyb3NzKGN1ciksIGlkKSB9LAoJKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZ3VhcmRpYW4pKQoJdWFzc2VydC5FcXVhbCh0LCAidmV0b2VkOiAiK2lkLCBWZXRvKGNyb3NzKGN1ciksIGlkKSkKCV8sIHByZXNlbnQgOj0gYWN0aW9uc1tpZF0KCXVhc3NlcnQuRmFsc2UodCwgcHJlc2VudCwgInZldG9lZCBhY3Rpb24gbXVzdCBiZSByZWFwZWQgZnJvbSBzdGF0ZSIpCgoJLy8gYSB2ZXRvZWQgYWN0aW9uIGNhbiBuZXZlciBleGVjdXRlCglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhY3Rpb24gbm90IGZvdW5kOiAiK2lkLCBmdW5jKCkgeyBFeGVjdXRlKGNyb3NzKGN1ciksIGlkKSB9KQp9CgpmdW5jIFRlc3RWZXRvX05vR3VhcmRpYW5UYXJnZXRCbG9ja2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInBsYWluIiwgTWluRGVsYXlGbG9vciwgIiIpCglpZCA6PSBTY2hlZHVsZShjcm9zcyhjdXIpLCAicGxhaW4iLCAib3AiLCBNaW5EZWxheUZsb29yKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZ3VhcmRpYW4pKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInRhcmdldCBoYXMgbm8gZ3VhcmRpYW46IHBsYWluIiwKCQlmdW5jKCkgeyBWZXRvKGNyb3NzKGN1ciksIGlkKSB9LAoJKQp9CgovLyAtLS0tLS0tLS0tIEV4cGlyZSAoZml4IFkyKSAtLS0tLS0tLS0tCgpmdW5jIFRlc3RFeHBpcmVfUGVybWlzc2lvbmxlc3NSZWNvdmVyeShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoKCS8vIGZpbGwgdGhlIHRhcmdldCdzIHF1b3RhLCB0aGVuIGxldCBldmVyeXRoaW5nIGV4cGlyZQoJdmFyIGlkcyBbXXN0cmluZwoJZm9yIGkgOj0gMDsgaSA8IE1heFBlbmRpbmdQZXJUYXJnZXQ7IGkrKyB7CgkJaWRzID0gYXBwZW5kKGlkcywgU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wIiwgTWluRGVsYXlGbG9vcikpCgl9Cglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yICsgR3JhY2VQZXJpb2QgKyAxMCkKCgkvLyBmaXggWTIgcmVncmVzc2lvbjogQU5ZT05FIOKAlCBub3QganVzdCBhIGx1Y2t5IHN3ZWVwIHdpbmRvdyDigJQgY2FuCgkvLyByZWFwIGEgcHJvdmFibHkgZXhwaXJlZCBhY3Rpb24gYW5kIGZyZWUgdGhlIHNsb3QgaXQgd2VkZ2VzCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuRXF1YWwodCwgImV4cGlyZWQ6ICIraWRzWzBdLCBFeHBpcmUoY3Jvc3MoY3VyKSwgaWRzWzBdKSkKCV8sIHByZXNlbnQgOj0gYWN0aW9uc1tpZHNbMF1dCgl1YXNzZXJ0LkZhbHNlKHQsIHByZXNlbnQsICJleHBpcmVkIGFjdGlvbiBtdXN0IGJlIHJlYXBlZCBmcm9tIHN0YXRlIikKCgkvLyByZWFwIHRoZSByZXN0IGFzIHRoZSBvd25lcjsgcXVvdGEgYW5kIFNldEd1YXJkaWFuIGJvdGggcmVjb3ZlcgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglmb3IgXywgaWQgOj0gcmFuZ2UgaWRzWzE6XSB7CgkJRXhwaXJlKGNyb3NzKGN1ciksIGlkKQoJfQoJdWFzc2VydC5FcXVhbCh0LCAwLCBwZW5kaW5nQ291bnQoInVwZ3JhZGVzIikpCglTZXRHdWFyZGlhbihjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAiIikgLy8gbm8gbG9uZ2VyIGJsb2NrZWQKCVNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJmcmVzaCIsIE1pbkRlbGF5Rmxvb3IpCn0KCmZ1bmMgVGVzdEV4cGlyZV9SZWZ1c2VzTGl2ZUFuZEV4ZWN1dGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglsaXZlIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJsaXZlIiwgTWluRGVsYXlGbG9vcikKCWRvbmUgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgImRvbmUiLCBNaW5EZWxheUZsb29yKQoJc2tpcFNlY29uZHMoTWluRGVsYXlGbG9vcikKCUV4ZWN1dGUoY3Jvc3MoY3VyKSwgZG9uZSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFjdGlvbiBpcyBub3QgZXhwaXJlZCIsCgkJZnVuYygpIHsgRXhwaXJlKGNyb3NzKGN1ciksIGxpdmUpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFjdGlvbiBhbHJlYWR5IGV4ZWN1dGVkIiwKCQlmdW5jKCkgeyBFeHBpcmUoY3Jvc3MoY3VyKSwgZG9uZSkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWN0aW9uIG5vdCBmb3VuZDogZ2hvc3QiLAoJCWZ1bmMoKSB7IEV4cGlyZShjcm9zcyhjdXIpLCAiZ2hvc3QiKSB9KQp9CgovLyAtLS0tLS0tLS0tIHN0cmF5IHNlbmRzIChmaXggWTYpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFN0cmF5U2VuZFJlamVjdGVkRXZlcnl3aGVyZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoJaWQgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wIiwgTWluRGVsYXlGbG9vcikKCgkvLyBmaXggWTYgcmVncmVzc2lvbjogdGhpcyByZWFsbSBob2xkcyBubyBiYW5rZXIsIHNvIGFuIGF0dGFjaGVkCgkvLyBzZW5kIHdvdWxkIHN0cmFuZCBvbiB0aGUgcmVhbG0gYWRkcmVzcyBmb3JldmVyIOKAlCBldmVyeSBjcm9zc2luZwoJLy8gZnVuY3Rpb24gbXVzdCBhYm9ydCBpdCAodGhlIGFib3J0IHJldmVydHMgdGhlIHRyYW5zZmVyKQoJbXNnIDo9ICJ0aGlzIHJlYWxtIGRvZXMgbm90IGFjY2VwdCBjb2lucyIKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7RGVub206ICJ1Z25vdCIsIEFtb3VudDogNX19KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInBhaWQiLCBNaW5EZWxheUZsb29yLCAiIikgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJvcDIiLCBNaW5EZWxheUZsb29yKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgQ2FuY2VsKGNyb3NzKGN1ciksIGlkKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgU2V0R3VhcmRpYW4oY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIiIpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBUcmFuc2ZlclRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiLCBuZXdPd25lcikgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEFjY2VwdFRhcmdldE93bmVyc2hpcChjcm9zcyhjdXIpLCAidXBncmFkZXMiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgVmV0byhjcm9zcyhjdXIpLCBpZCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEV4cGlyZShjcm9zcyhjdXIpLCBpZCkgfSkKCS8vIFNraXBIZWlnaHRzIHJlc2V0cyB0aGUgdGVzdCBjb250ZXh0ICh3aXBpbmcgdGhlIHNlbmQgZW52ZWxvcGUpLAoJLy8gc28gcmUtYXJtIGl0IGJlZm9yZSBwcm9iaW5nIHRoZSByZWFkeS1hY3Rpb24gRXhlY3V0ZSBwYXRoCglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e0Rlbm9tOiAidWdub3QiLCBBbW91bnQ6IDV9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpIH0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCS8vIHdpdGhvdXQgY29pbnMgdGhlIHNhbWUgY2FsbCBzdWNjZWVkcwoJdWFzc2VydC5FcXVhbCh0LCAiZXhlY3V0ZWQ6ICIraWQsIEV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpKQp9CgovLyAtLS0tLS0tLS0tIHF1ZXJpZXMgKyByZW5kZXIgLS0tLS0tLS0tLQoKZnVuYyBUZXN0R2V0UGVuZGluZ19FeGNsdWRlc0ZpbmlzaGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglpZDEgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wMSIsIE1pbkRlbGF5Rmxvb3IpCglpZDIgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wMiIsIE1pbkRlbGF5Rmxvb3IpCglpZDMgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wMyIsIE1pbkRlbGF5Rmxvb3IpCgoJQ2FuY2VsKGNyb3NzKGN1ciksIGlkMikKCXNraXBTZWNvbmRzKE1pbkRlbGF5Rmxvb3IpCglFeGVjdXRlKGNyb3NzKGN1ciksIGlkMSkKCgl1YXNzZXJ0LkVxdWFsKHQsIGlkMywgR2V0UGVuZGluZygpKQp9CgpmdW5jIFRlc3RHZXRQZW5kaW5nX0dyb3VwZWRCeVRhcmdldChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVJlZ2lzdGVyVGFyZ2V0KGNyb3NzKGN1ciksICJhbHBoYSIsIE1pbkRlbGF5Rmxvb3IsICIiKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgImJldGEiLCBNaW5EZWxheUZsb29yLCAiIikKCgkvLyBpbnRlcmxlYXZlIHNjaGVkdWxpbmcgYWNyb3NzIHRhcmdldHM7IG91dHB1dCBncm91cHMgYnkgdGFyZ2V0IGluCgkvLyByZWdpc3RyYXRpb24gb3JkZXIgKGZpeCBZNCBib29ra2VlcGluZyksIGluc2VydGlvbi1vcmRlcmVkIHdpdGhpbgoJYTEgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgImFscGhhIiwgImExIiwgTWluRGVsYXlGbG9vcikKCWIxIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJiZXRhIiwgImIxIiwgTWluRGVsYXlGbG9vcikKCWEyIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJhbHBoYSIsICJhMiIsIE1pbkRlbGF5Rmxvb3IpCgoJdWFzc2VydC5FcXVhbCh0LCBhMSsiLCAiK2EyKyIsICIrYjEsIEdldFBlbmRpbmcoKSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgcGVuZGluZ0NvdW50KCJhbHBoYSIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBwZW5kaW5nQ291bnQoImJldGEiKSkKCglDYW5jZWwoY3Jvc3MoY3VyKSwgYTEpCgl1YXNzZXJ0LkVxdWFsKHQsIGEyKyIsICIrYjEsIEdldFBlbmRpbmcoKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgcGVuZGluZ0NvdW50KCJhbHBoYSIpKQp9CgpmdW5jIFRlc3RHZXRUYXJnZXRfU3VtbWFyeShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoKCW91dCA6PSBHZXRUYXJnZXQoInVwZ3JhZGVzIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgc3RyaW5nKG93bmVyKSksICJtdXN0IHNob3cgb3duZXIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCBzdHJpbmcoZ3VhcmRpYW4pKSwgIm11c3Qgc2hvdyBndWFyZGlhbiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJNaW4gZGVsYXk6IDYwcyIpLCAibXVzdCBzaG93IG1pbiBkZWxheSIpCgoJVHJhbnNmZXJUYXJnZXRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgbmV3T3duZXIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhHZXRUYXJnZXQoInVwZ3JhZGVzIiksICJQZW5kaW5nIG93bmVyOiAiK3N0cmluZyhuZXdPd25lcikpLAoJCSJtdXN0IHNob3cgYSBwZW5kaW5nIG93bmVyc2hpcCBvZmZlciIpCn0KCmZ1bmMgVGVzdFJlbmRlcl9TYW5pdGl6ZXNJbmplY3Rpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCVNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJldmlsYCB8IGluamVjdGVkXG5yb3ciLCBNaW5EZWxheUZsb29yKQoKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiZXZpbGAiKSwgImJhY2t0aWNrcyBtdXN0IGJlIHNhbml0aXplZCIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiaW5qZWN0ZWRcbnJvdyIpLCAibmV3bGluZXMgbXVzdCBiZSBzYW5pdGl6ZWQiKQp9CgpmdW5jIFRlc3RSZW5kZXJfU2FuaXRpemVzSFRNTEJyYWNrZXRzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCgkvLyBmaXggWTMgcmVncmVzc2lvbjogcmF3IEhUTUwgbXVzdCBuZXZlciByZWFjaCB0aGUgcGFnZQoJU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIjxzY3JpcHQ+YWxlcnQoMSk8L3NjcmlwdD4iLCBNaW5EZWxheUZsb29yKQoKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiPHNjcmlwdCIpLCAic2NyaXB0IHRhZ3MgbXVzdCBiZSBzYW5pdGl6ZWQgaW4gUmVuZGVyIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICI8L3NjcmlwdCIpLCAiY2xvc2luZyB0YWdzIG11c3QgYmUgc2FuaXRpemVkIGluIFJlbmRlciIpCglvbmUgOj0gR2V0QWN0aW9uKEdldFBlbmRpbmcoKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhvbmUsICI8c2NyaXB0IiksICJzY3JpcHQgdGFncyBtdXN0IGJlIHNhbml0aXplZCBpbiBHZXRBY3Rpb24iKQp9CgpmdW5jIFRlc3RSZW5kZXJfRW1wdHlTdGF0ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl1YXNzZXJ0LkVxdWFsKHQsICIjIFRpbWVsb2NrIEd1YXJkaWFuXG5cbk5vIGFjdGlvbnMgc2NoZWR1bGVkLlxuIiwgUmVuZGVyKCIiKSkKfQoKZnVuYyBUZXN0UmVuZGVyX1NlY3Rpb25zKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglpZDEgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wMSIsIE1pbkRlbGF5Rmxvb3IpCglpZDIgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wMiIsIE1pbkRlbGF5Rmxvb3IpCglTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AzIiwgTWluRGVsYXlGbG9vcikKCXNraXBTZWNvbmRzKE1pbkRlbGF5Rmxvb3IpCglFeGVjdXRlKGNyb3NzKGN1ciksIGlkMSkKCUNhbmNlbChjcm9zcyhjdXIpLCBpZDIpCgoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIiMjIEV4ZWN1dGVkICgxKSIpLCAiZXhlY3V0ZWQgc2VjdGlvbiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIjIyBQZW5kaW5nICgxKSIpLCAicGVuZGluZyBzZWN0aW9uIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJDYW5jZWxsZWQiKSwgImNhbmNlbGxlZCBhY3Rpb25zIGFyZSByZWFwZWQsIG5vdCByZW5kZXJlZCIpCn0KCi8vIC0tLS0tLS0tLS0gcmUtYXVkaXQgcmVncmVzc2lvbnMgKDIwMjYtMDktMDIpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFNjaGVkdWxlQ2FuY2VsQ3ljbGluZ19DYW5ub3RCcmlja1RoZVJlYWxtKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCgoJLy8gcmUtYXVkaXQgUDE6IHRoZSBvbGQgbGlmZXRpbWUgY2FwIGNvdWxkIGJlIGNvbnN1bWVkIGZvcmV2ZXIgYnkKCS8vIHNjaGVkdWxlK2NhbmNlbCBjeWNsaW5nOyB0aGUgY2FwIG5vdyBib3VuZHMgTElWRSBhY3Rpb25zIGFuZAoJLy8gY2FuY2VsbGVkIHJlY29yZHMgYXJlIHJlYXBlZCwgc28gaGVhdnkgY3ljbGluZyBsZWF2ZXMgbm8gcmVzaWR1ZQoJZm9yIGkgOj0gMDsgaSA8IDMqTWF4UGVuZGluZ1BlclRhcmdldDsgaSsrIHsKCQlpZCA6PSBTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AiLCBNaW5EZWxheUZsb29yKQoJCUNhbmNlbChjcm9zcyhjdXIpLCBpZCkKCX0KCXVhc3NlcnQuRXF1YWwodCwgMCwgbGVuKGFjdGlvbnMpLCAiY3ljbGluZyBtdXN0IGxlYXZlIG5vIHN0YXRlIHJlc2lkdWUiKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBwZW5kaW5nQ291bnQoInVwZ3JhZGVzIiksICJubyBsaXZlIGFjdGlvbnMgYWZ0ZXIgY3ljbGluZyIpCglTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AiLCBNaW5EZWxheUZsb29yKSAvLyBtdXN0IG5vdCBhYm9ydAp9CgpmdW5jIFRlc3RTZXRHdWFyZGlhbl9CbG9ja2VkV2hpbGVQZW5kaW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJcmVnaXN0ZXJVcGdyYWRlcyhjdXIpCglpZCA6PSBTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAicnVnIiwgTWluRGVsYXlGbG9vcikKCgkvLyByZS1hdWRpdCBQMjogdGhlIG93bmVyIG11c3Qgbm90IGJlIGFibGUgdG8gc3RyaXAgdGhlIGd1YXJkaWFuCgkvLyBkdXJpbmcgdGhlIGRlbGF5IHdpbmRvdyB0aGUgZ3VhcmRpYW4gZXhpc3RzIHRvIHBvbGljZQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNhbm5vdCBjaGFuZ2UgdGhlIGd1YXJkaWFuIHdoaWxlIGFjdGlvbnMgYXJlIHBlbmRpbmciLAoJCWZ1bmMoKSB7IFNldEd1YXJkaWFuKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICIiKSB9LAoJKQoKCS8vIG9uY2Ugbm90aGluZyBpcyBwZW5kaW5nLCB0aGUgb3duZXIgbWF5IGNoYW5nZSB0aGUgZ3VhcmRpYW4KCUNhbmNlbChjcm9zcyhjdXIpLCBpZCkKCVNldEd1YXJkaWFuKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICIiKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgc3RyaW5nKHRhcmdldHNbInVwZ3JhZGVzIl0uR3VhcmRpYW4pKQp9CgpmdW5jIFRlc3RWZXRvQW5kQ2FuY2VsX1JlZnVzZUV4cGlyZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCWlkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJvcCIsIE1pbkRlbGF5Rmxvb3IpCglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yICsgR3JhY2VQZXJpb2QgKyAxMCkKCgkvLyByZS1hdWRpdCBQMzogdGVybWluYWwtc3RhdGUgd3JpdGVzIG9uIGV4cGlyZWQgYWN0aW9ucyByZXdyb3RlCgkvLyBoaXN0b3J5OyBib3RoIG11c3QgcmVmdXNlIGFuZCBwb2ludCBhdCB0aGUgRXhwaXJlIHZhbHZlCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFjdGlvbiBleHBpcmVkOiBub3RoaW5nIHRvIGNhbmNlbCAodXNlIEV4cGlyZSkiLAoJCWZ1bmMoKSB7IENhbmNlbChjcm9zcyhjdXIpLCBpZCkgfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZ3VhcmRpYW4pKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhY3Rpb24gZXhwaXJlZDogbm90aGluZyB0byB2ZXRvICh1c2UgRXhwaXJlKSIsCgkJZnVuYygpIHsgVmV0byhjcm9zcyhjdXIpLCBpZCkgfSkKfQoKZnVuYyBUZXN0RXhwaXJlZEFjdGlvbnNfUmVhcGVkT25TY2hlZHVsZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoJU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wIiwgTWluRGVsYXlGbG9vcikKCXNraXBTZWNvbmRzKE1pbkRlbGF5Rmxvb3IgKyBHcmFjZVBlcmlvZCArIDEwKQoKCS8vIHRoZSBuZXh0IFNjaGVkdWxlIHN3ZWVwcyBleHBpcmVkIGFjdGlvbnMgb3V0IG9mIHN0YXRlCglTY2hlZHVsZShjcm9zcyhjdXIpLCAidXBncmFkZXMiLCAib3AyIiwgTWluRGVsYXlGbG9vcikKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGVuKGFjdGlvbnMpLCAiZXhwaXJlZCBhY3Rpb24gbXVzdCBiZSByZWFwZWQgYnkgdGhlIHN3ZWVwIikKfQoKZnVuYyBUZXN0UmVuZGVyX0xpbmtJbmplY3Rpb25TYW5pdGl6ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCVNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJbYXBwcm92ZV0oaHR0cHM6Ly9ldmlsLmV4YW1wbGUpIiwgTWluRGVsYXlGbG9vcikKCglvdXQgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIlthcHByb3ZlXSIpLCAibGluayBzeW50YXggbXVzdCBiZSBzYW5pdGl6ZWQiKQp9CgpmdW5jIFRlc3RQZXJPd25lclRhcmdldENhcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWZvciBpIDo9IDA7IGkgPCBNYXhUYXJnZXRzUGVyT3duZXI7IGkrKyB7CgkJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInRfIitzdHJpbmdzLlJlcGVhdCgieCIsIGkrMSksIE1pbkRlbGF5Rmxvb3IsICIiKQoJfQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInBlci1vd25lciB0YXJnZXQgbGltaXQgcmVhY2hlZCIsCgkJZnVuYygpIHsgUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgIm9uZV9tb3JlIiwgTWluRGVsYXlGbG9vciwgIiIpIH0sCgkpCn0KCi8vIC0tLS0tLS0tLS0gcm91bmQtMyBhdWRpdCByZWdyZXNzaW9ucyAoMjAyNi0wOS0wMikgLS0tLS0tLS0tLQoKZnVuYyBUZXN0U3liaWxzQ2Fubm90RXhoYXVzdFNoYXJlZENhcGFjaXR5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCgkvLyByb3VuZC0zIFAxOiB0d28gYXR0YWNrZXJzIGZpbGxpbmcgdGhlaXIgT1dOIHBlci1vd25lciBxdW90YXMgbXVzdAoJLy8gbmV2ZXIgYmxvY2sgYSB0aGlyZCBvd25lcidzIFNjaGVkdWxlIOKAlCB0aGVyZSBpcyBubyBzaGFyZWQgY2FwIGxlZnQKCS8vIHRvIGV4aGF1c3QKCXN5YmlscyA6PSBbXWFkZHJlc3N7dGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJzeWJpbF9hIiksIHRlc3R1dGlscy5UZXN0QWRkcmVzcygic3liaWxfYiIpfQoJZm9yIF8sIHN5YiA6PSByYW5nZSBzeWJpbHMgewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oc3liKSkKCQlmb3IgaSA6PSAwOyBpIDwgTWF4VGFyZ2V0c1Blck93bmVyOyBpKysgewoJCQluYW1lIDo9ICJ0XyIgKyBzdHJpbmcoc3liW2xlbihzeWIpLTQ6XSkgKyAiXyIgKyBzdHJpbmdzLlJlcGVhdCgieCIsIGkrMSkKCQkJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgbmFtZSwgTWluRGVsYXlGbG9vciwgIiIpCgkJCWZvciBqIDo9IDA7IGogPCBNYXhQZW5kaW5nUGVyVGFyZ2V0OyBqKysgewoJCQkJU2NoZWR1bGUoY3Jvc3MoY3VyKSwgbmFtZSwgInNwYW0iLCBNYXhEZWxheSkgLy8gMTB5IGRlbGF5OiBzd2VlcCByZWNsYWltcyBub3RoaW5nCgkJCX0KCQl9Cgl9CgoJLy8gYSBsZWdpdGltYXRlIG93bmVyIGlzIGVudGlyZWx5IHVuYWZmZWN0ZWQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgImxlZ2l0IiwgTWluRGVsYXlGbG9vciwgIiIpCglTY2hlZHVsZShjcm9zcyhjdXIpLCAibGVnaXQiLCAicmVhbCB3b3JrIiwgTWluRGVsYXlGbG9vcikgLy8gbXVzdCBub3QgYWJvcnQKfQoKZnVuYyBUZXN0VmljdGltUmVjb3ZlcnNCZWhpbmRTeWJpbFdhbGwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoKCS8vIGZpeCBZMi9ZNCByZWdyZXNzaW9uIOKAlCB0aGUgZXhhY3Qgc3RhcnZhdGlvbiBjYXNlIHRoZSBvbGQgZ2xvYmFsCgkvLyBidWRnZXQtd2luZG93ZWQgc3dlZXAgY291bGQgbm90IHJlY292ZXIgZnJvbTogYSB3YWxsIG9mIGxvbmctZGVsYXkKCS8vIHN5YmlsIGFjdGlvbnMgaW4gZnJvbnQsIGEgdmljdGltIHdob3NlIGFjdGlvbnMgZXhwaXJlZCBiZWhpbmQgaXQuCgkvLyBQZXItdGFyZ2V0IHN3ZWVwcyBhbmQgcGVybWlzc2lvbmxlc3MgRXhwaXJlIG1ha2UgcmVjb3ZlcnkgbG9jYWwuCglzeWIgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJ3YWxsIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oc3liKSkKCWZvciBpIDo9IDA7IGkgPCA1OyBpKysgewoJCW5hbWUgOj0gIndhbGxfIiArIHN0cmluZ3MuUmVwZWF0KCJ3IiwgaSsxKQoJCVJlZ2lzdGVyVGFyZ2V0KGNyb3NzKGN1ciksIG5hbWUsIE1pbkRlbGF5Rmxvb3IsICIiKQoJCWZvciBqIDo9IDA7IGogPCBNYXhQZW5kaW5nUGVyVGFyZ2V0OyBqKysgewoJCQlTY2hlZHVsZShjcm9zcyhjdXIpLCBuYW1lLCAid2FsbCIsIE1heERlbGF5KSAvLyAxMDAgbGl2ZSAxMHkgZW50cmllcwoJCX0KCX0KCgl2aWN0aW0gOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJ2aWN0aW0yIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odmljdGltKSkKCVJlZ2lzdGVyVGFyZ2V0KGNyb3NzKGN1ciksICJ2dCIsIE1pbkRlbGF5Rmxvb3IsIGd1YXJkaWFuKQoJdmFyIGlkcyBbXXN0cmluZwoJZm9yIGogOj0gMDsgaiA8IE1heFBlbmRpbmdQZXJUYXJnZXQ7IGorKyB7CgkJaWRzID0gYXBwZW5kKGlkcywgU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInZ0IiwgIm9wIiwgTWluRGVsYXlGbG9vcikpCgl9Cglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yICsgR3JhY2VQZXJpb2QgKyAxMCkgLy8gYWxsIDIwIGV4cGlyZQoKCS8vIHRoZSB2aWN0aW0ncyBvd24gbmV4dCBTY2hlZHVsZSBzd2VlcHMgVEhFSVIgdGFyZ2V0IGRlc3BpdGUgdGhlIHdhbGwKCVNjaGVkdWxlKGNyb3NzKGN1ciksICJ2dCIsICJyZWNvdmVyZWQiLCBNaW5EZWxheUZsb29yKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBwZW5kaW5nQ291bnQoInZ0IiksICJleHBpcmVkIGFjdGlvbnMgc3dlcHQgZGVzcGl0ZSB0aGUgc3liaWwgd2FsbCIpCgoJLy8gYW5kIEV4cGlyZSBmcmVlcyBhIHdlZGdlZCBzbG90IGRpcmVjdGx5LCBmcm9tIGFueSBrZXkKCWlkMiA6PSBTY2hlZHVsZShjcm9zcyhjdXIpLCAidnQiLCAid2lsbCBleHBpcmUiLCBNaW5EZWxheUZsb29yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCglza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yICsgR3JhY2VQZXJpb2QgKyAxMCkKCUV4cGlyZShjcm9zcyhjdXIpLCBpZDIpCglfLCBwcmVzZW50IDo9IGFjdGlvbnNbaWQyXQoJdWFzc2VydC5GYWxzZSh0LCBwcmVzZW50LCAiRXhwaXJlIG11c3QgcmVhcCByZWdhcmRsZXNzIG9mIGdsb2JhbCBxdWV1ZSBwb3NpdGlvbiIpCn0KCmZ1bmMgVGVzdFBlbmRpbmdDb3VudGVyQ29uc2lzdGVuY3koY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglyZWdpc3RlclVwZ3JhZGVzKGN1cikKCglpZDEgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgImEiLCBNaW5EZWxheUZsb29yKQoJaWQyIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJiIiwgTWluRGVsYXlGbG9vcikKCVNjaGVkdWxlKGNyb3NzKGN1ciksICJ1cGdyYWRlcyIsICJjIiwgTWluRGVsYXlGbG9vcikKCXVhc3NlcnQuRXF1YWwodCwgMywgcGVuZGluZ0NvdW50KCJ1cGdyYWRlcyIpKQoKCUNhbmNlbChjcm9zcyhjdXIpLCBpZDEpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIHBlbmRpbmdDb3VudCgidXBncmFkZXMiKSkKCXNraXBTZWNvbmRzKE1pbkRlbGF5Rmxvb3IpCglFeGVjdXRlKGNyb3NzKGN1ciksIGlkMikKCXVhc3NlcnQuRXF1YWwodCwgMSwgcGVuZGluZ0NvdW50KCJ1cGdyYWRlcyIpKQoKCS8vIGV4cGlyeTogdGhlIGNvdW50IGRyb3BzIHdoZW4gdGhlIHN3ZWVwIHJlYXBzCglza2lwU2Vjb25kcyhHcmFjZVBlcmlvZCArIDEwKQoJU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgImQiLCBNaW5EZWxheUZsb29yKSAvLyB0cmlnZ2VycyBzd2VlcCBvZiBleHBpcmVkICJjIgoJdWFzc2VydC5FcXVhbCh0LCAxLCBwZW5kaW5nQ291bnQoInVwZ3JhZGVzIikpCn0KCmZ1bmMgVGVzdFNhbml0aXplX0VtcGhhc2lzTWFya2VycyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoJU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIioqcmVhZHkqKiBfbm93XyIsIE1pbkRlbGF5Rmxvb3IpCgoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIqKnJlYWR5KiogX25vd18iKSwKCQkiZW1waGFzaXMgbWFya2VycyBpbiBEYXRhIG11c3QgYmUgc2FuaXRpemVkIikKfQoKLy8gLS0tLS0tLS0tLSByZW5kZXItaW5kZXggYm91bmRzIChmaXggWTQpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFJlbmRlckluZGV4U2VsZlRyaW1zKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgImNodXJuIiwgTWluRGVsYXlGbG9vciwgIiIpCgoJLy8gZXhlY3V0ZSBtYW55IGFjdGlvbnMgc28gYWN0aW9uSURzIHdvdWxkIGdyb3cgdW5ib3VuZGVkbHkgd2l0aG91dAoJLy8gdGhlIHRyaW07IHRoZSBpbmRleCBtdXN0IHN0YXkgd2l0aGluIFJlbmRlckluZGV4Q2FwIGFuZCBvbGQKCS8vIGV4ZWN1dGVkIHJlY29yZHMgbXVzdCBzdGF5IHF1ZXJ5YWJsZSB2aWEgdGhlIG1hcCByZWFkcwoJdmFyIGZpcnN0IHN0cmluZwoJZm9yIGkgOj0gMDsgaSA8IFJlbmRlckluZGV4Q2FwKzMwOyBpKysgewoJCWlkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJjaHVybiIsICJvcCIsIE1pbkRlbGF5Rmxvb3IpCgkJaWYgaSA9PSAwIHsKCQkJZmlyc3QgPSBpZAoJCX0KCQlza2lwU2Vjb25kcyhNaW5EZWxheUZsb29yKQoJCUV4ZWN1dGUoY3Jvc3MoY3VyKSwgaWQpCgl9Cgl1YXNzZXJ0LlRydWUodCwgbGVuKGFjdGlvbklEcykgPD0gUmVuZGVySW5kZXhDYXAsICJyZW5kZXIgaW5kZXggbXVzdCBzZWxmLXRyaW0iKQoJdWFzc2VydC5UcnVlKHQsIElzRXhlY3V0ZWQoZmlyc3QpLCAidHJpbW1lZCByZWNvcmRzIHN0YXkgcXVlcnlhYmxlIGZvcmV2ZXIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoR2V0QWN0aW9uKGZpcnN0KSwgIlN0YXR1czogZXhlY3V0ZWQiKSwKCQkiR2V0QWN0aW9uIG11c3Qgc3RpbGwgc2VydmUgdHJpbW1lZCByZWNvcmRzIikKfQoKLy8gLS0tLS0tLS0tLSByb3VuZC0yIGF1ZGl0IHJlZ3Jlc3Npb25zIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFNldEd1YXJkaWFuX1N3ZWVwc0V4cGlyZWRGaXJzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXJlZ2lzdGVyVXBncmFkZXMoY3VyKQoJU2NoZWR1bGUoY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIm9wIiwgTWluRGVsYXlGbG9vcikKCXNraXBTZWNvbmRzKE1pbkRlbGF5Rmxvb3IgKyBHcmFjZVBlcmlvZCArIDEwKQoKCS8vIHJvdW5kLTIgaGFyZGVuaW5nOiBleHBpcmVkLWJ1dC11bnN3ZXB0IGFjdGlvbnMgcHJvdGVjdCBub3RoaW5nCgkvLyBhbmQgbXVzdCBub3QgYmxvY2sgYSBndWFyZGlhbiByb3RhdGlvbgoJU2V0R3VhcmRpYW4oY3Jvc3MoY3VyKSwgInVwZ3JhZGVzIiwgIiIpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBzdHJpbmcodGFyZ2V0c1sidXBncmFkZXMiXS5HdWFyZGlhbikpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIHBlbmRpbmdDb3VudCgidXBncmFkZXMiKSwgInRoZSBnYXRlIHN3ZWVwIG11c3QgcmVhcCBleHBpcmVkIGFjdGlvbnMiKQp9CgpmdW5jIFRlc3RSZW5kZXJTaG93c1BlbmRpbmdEZXNwaXRlQ2h1cm4oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAidmlzIiwgTWluRGVsYXlGbG9vciwgIiIpCgl3YXRjaGVkIDo9IFNjaGVkdWxlKGNyb3NzKGN1ciksICJ2aXMiLCAid2F0Y2hlZCBydWciLCAyKihNaW5EZWxheUZsb29yKzUqKFJlbmRlckluZGV4Q2FwKzMwKSkpCgoJLy8gcm91bmQtMiBmaXggWS0yOiBmbG9vZCB0aGUgcmVuZGVyIGluZGV4IHdpdGggZXhlY3V0ZWQgY2h1cm47IHRoZQoJLy8gbGl2ZSBwZW5kaW5nIGFjdGlvbiBtdXN0IHJlbWFpbiB2aXNpYmxlIGZvciBpdHMgd2hvbGUgd2luZG93CglSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAiY2h1cm4yIiwgTWluRGVsYXlGbG9vciwgIiIpCglmb3IgaSA6PSAwOyBpIDwgUmVuZGVySW5kZXhDYXArMzA7IGkrKyB7CgkJaWQgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgImNodXJuMiIsICJub2lzZSIsIE1pbkRlbGF5Rmxvb3IpCgkJc2tpcFNlY29uZHMoTWluRGVsYXlGbG9vcikKCQlFeGVjdXRlKGNyb3NzKGN1ciksIGlkKQoJfQoKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsIHdhdGNoZWQpLCAiYSBsaXZlIHBlbmRpbmcgYWN0aW9uIG11c3Qgc3Vydml2ZSByZW5kZXItaW5kZXggY2h1cm4iKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiIyMgUGVuZGluZyAoMSkiKSwgInBlbmRpbmcgc2VjdGlvbiBmcm9tIGxpdmUgbGlzdHMiKQoKCS8vIGFuZCBzdGF0ZSBzdGF5cyBjb25zaXN0ZW50IGZvciBhbiBhY3Rpb24gdHJpbW1lZCBvdXQgb2YgdGhlCgkvLyByZW5kZXIgaW5kZXg6IENhbmNlbCBzdGlsbCB3b3JrcyAoYWJzZW50LWlkIHJlbW92ZUlEIGlzIGEgbm8tb3ApCgl1YXNzZXJ0LkVxdWFsKHQsICJjYW5jZWxsZWQ6ICIrd2F0Y2hlZCwgQ2FuY2VsKGNyb3NzKGN1ciksIHdhdGNoZWQpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBwZW5kaW5nQ291bnQoInZpcyIpKQp9CgpmdW5jIFRlc3RQZW5kaW5nVGFyZ2V0c0Jvb2trZWVwaW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgIm9uZSIsIE1pbkRlbGF5Rmxvb3IsICIiKQoJUmVnaXN0ZXJUYXJnZXQoY3Jvc3MoY3VyKSwgInR3byIsIE1pbkRlbGF5Rmxvb3IsICIiKQoKCS8vIHJvdW5kLTIgZml4IFktMTogb25seSB0YXJnZXRzIHdpdGggbGl2ZSBwZW5kaW5ncyBhcmUgdHJhY2tlZAoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4ocGVuZGluZ1RhcmdldHMpKQoJYTEgOj0gU2NoZWR1bGUoY3Jvc3MoY3VyKSwgIm9uZSIsICJhIiwgTWluRGVsYXlGbG9vcikKCVNjaGVkdWxlKGNyb3NzKGN1ciksICJ0d28iLCAiYiIsIE1pbkRlbGF5Rmxvb3IpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihwZW5kaW5nVGFyZ2V0cykpCgoJQ2FuY2VsKGNyb3NzKGN1ciksIGExKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBsZW4ocGVuZGluZ1RhcmdldHMpLCAiZW1wdGllZCB0YXJnZXQgbGVhdmVzIHRoZSB3aXRoLXBlbmRpbmdzIGxpc3QiKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBsZW4ocHRJbmRleCkpCgoJLy8gcmVnaXN0cmF0aW9uIGFsb25lIG5ldmVyIGluZmxhdGVzIHRoZSBsaXN0CglSZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAidGhyZWUiLCBNaW5EZWxheUZsb29yLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGVuKHBlbmRpbmdUYXJnZXRzKSkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQFe8AAM6MMYjYwhniOJlZXSCNXEMpVGmqjoqm3p+5zy0bwATA+8p1u8gZ9MhLtZiETfT5oTFnjN2LLsUcDZ2Y30aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data