Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
BD67E9398BABB6A9EF0FA61F4E68152739D08229BD3D385203F663234BB87517
Transaction overview
Execution summary
TX INDEX
1
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
53,913,330
Gas consumed
FEE
250000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cpi9AgoML3ZtLm1fYWRkcGtnEoa9AgooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLJvAIKEHVwZ3JhZGVfcmVnaXN0cnkSRGduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS91cGdyYWRlX3JlZ2lzdHJ5GmsKC2dub21vZC50b21sElxtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3VwZ3JhZGVfcmVnaXN0cnkiCmdubyA9ICIwLjkiChr5mgEKFHVwZ3JhZGVfcmVnaXN0cnkuZ25vEt+aAXBhY2thZ2UgdXBncmFkZV9yZWdpc3RyeQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCikKCi8vIENvbnRyYWN0RW50cnkgcmVwcmVzZW50cyBhIHJlZ2lzdGVyZWQgY29udHJhY3QgYW5kIGl0cyB1cGdyYWRlIHN0YXR1cy4KLy8KLy8gQW4gZW50cnkncyBBZGRyZXNzIGlzIEFMV0FZUyB0aGUgYWRkcmVzcyB0aGF0IGNhbGxlZCBSZWdpc3RlciDigJQgYQovLyBjb250cmFjdCBjYW4gb25seSByZWdpc3RlciBpdHNlbGYuIFRoYXQgY2FsbCBpcyB0aGUgcHJvb2Ygb2YgY29udHJvbDoKLy8gbm9ib2R5IGNhbiBjbGFpbSBhbiBhZGRyZXNzIHRoZXkgZG9uJ3QgY29tbWFuZCwgc28gYSBEZXByZWNhdGUKLy8gcmVkaXJlY3Qgb24gYW4gZW50cnkgYWx3YXlzIG9yaWdpbmF0ZXMgZnJvbSB3aG9ldmVyIGdlbnVpbmVseQovLyBjb250cm9sbGVkIHRoZSBjb250cmFjdC4gRW50cmllcyBhcmUgcGVybWFuZW50IGJ5IGRlc2lnbjogbWlncmF0aW9uCi8vIGhpc3RvcnkgaXMgd2hhdCBjb25zdW1lcnMgcmVseSBvbiwgc28gaXQgbXVzdCBub3QgYmUgZXJhc2FibGUgKGFuZCBhCi8vIGRlbGV0ZSB3b3VsZCByZW9wZW4gcmUtcmVnaXN0cmF0aW9uIHNxdWF0dGluZykuCi8vCi8vIE93bmVyc2hpcCBpcyB0d28tc3RlcCAocmUtYXVkaXQgMjAyNi0wOS0wMik6IFJlZ2lzdGVyL1RyYW5zZmVyIG9ubHkKLy8gTk9NSU5BVEUgYW4gb3duZXI7IHRoZSBub21pbmVlIG11c3QgQWNjZXB0T3duZXJzaGlwLiBVbnRpbCB0aGVuIHRoZQovLyBlbnRyeSBpcyBvd25lZCBieSB0aGUgY29udHJhY3QgaXRzZWxmLCBzbyBub2JvZHkncyBhZGRyZXNzIGNhbiBiZQovLyBhdHRhY2hlZCBhcyAib3duZXIiIHdpdGhvdXQgdGhlaXIgY29uc2VudC4KdHlwZSBDb250cmFjdEVudHJ5IHN0cnVjdCB7CglBZGRyZXNzICAgICAgYWRkcmVzcwoJT3duZXIgICAgICAgIGFkZHJlc3MgLy8gY3VycmVudCBtYW5hZ2VyIChhY2NlcHRlZCkKCVBlbmRpbmdPd25lciBhZGRyZXNzIC8vIG5vbWluYXRlZCwgbm90IHlldCBhY2NlcHRlZDsgZW1wdHkgaWYgbm9uZQoJTmFtZSAgICAgICAgIHN0cmluZwoJRGVwcmVjYXRlZCAgIGJvb2wKCVN1Y2Nlc3NvciAgICBhZGRyZXNzIC8vIGFkZHJlc3Mgb2YgdGhlIHVwZ3JhZGVkIGNvbnRyYWN0LCBlbXB0eSBpZiBjdXJyZW50Cn0KCmNvbnN0ICgKCU1heE5hbWVMZW4gPSA2NAoKCS8vIE1heENoYWluTGVuIGJvdW5kcyB0d28gV0FMS1MsIGFuZCBpcyBOT1QgYSBib3VuZCBvbiBob3cgbG9uZyBhCgkvLyBtaWdyYXRpb24gY2hhaW4gY2FuIGJlY29tZSAocm91bmQtNCBhdWRpdDogdGhlIHByZXZpb3VzIGNvbW1lbnQKCS8vIG5hbWVkIG9ubHkgdGhlIGZpcnN0IG9mIHRoZSB0d28gdXNlcywgd2hpY2ggcmVhZCBhcyB0aG91Z2ggY2hhaW4KCS8vIGxlbmd0aCBpdHNlbGYgd2VyZSBjYXBwZWQgYXQgNTApOgoJLy8KCS8vICAgMS4gR2V0TWlncmF0aW9uQ2hhaW4ncyB0cmF2ZXJzYWwgYW5kIG91dHB1dCDigJQgYSBjaGFpbiBsb25nZXIgdGhhbgoJLy8gICAgICB0aGlzIGlzIGV4cGxpY2l0bHkgbWFya2VkIHRydW5jYXRlZCByYXRoZXIgdGhhbiBwcmVzZW50ZWQgYXMKCS8vICAgICAgZW5kaW5nIGVhcmx5LgoJLy8gICAyLiBEZXByZWNhdGUncyBjeWNsZS12ZXJpZmljYXRpb24gd2Fsaywgd2hpY2ggcmVmdXNlcyByYXRoZXIgdGhhbgoJLy8gICAgICB3YWxraW5nIHVuYm91bmRlZC4KCS8vCgkvLyBOZWl0aGVyIGJvdW5kcyBUT1RBTCBjaGFpbiBsZW5ndGgsIGJlY2F1c2UgRGVwcmVjYXRlJ3Mgd2FsayBydW5zCgkvLyBGT1JXQVJEIGZyb20gdGhlIG5ldyBzdWNjZXNzb3IgYW5kIG5ldmVyIHNlZXMgdGhlIGNoYWluIEJFSElORCB0aGUKCS8vIHByZWRlY2Vzc29yLiBJdHMgY29zdCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGNoYWluIEFIRUFEIG9mIHRoZQoJLy8gc3VjY2Vzc29yLCB3aGljaCBpczoKCS8vCgkvLyAgIC0gemVybyBob3BzIHdoZW4gdGhlIHN1Y2Nlc3NvciBpcyB0ZXJtaW5hbCDigJQgdGhlIG9yZGluYXJ5CgkvLyAgICAgdGFpbC1hcHBlbmQuIFRoZSB3YWxrIGJyZWFrcyBpbW1lZGlhdGVseSwgc28gdGFpbC1hcHBlbmRpbmcgZ3Jvd3MKCS8vICAgICBhIGNoYWluIHdpdGhvdXQgbGltaXQuIFRoZSByZWFsbSdzIG93bgoJLy8gICAgIFRlc3RNaWdyYXRpb25DaGFpbl9NYXJrc1RydW5jYXRpb24gYnVpbGRzIE1heENoYWluTGVuKzUgbGlua3MgdGhpcwoJLy8gICAgIHdheSBhbmQgaXMgZXhwZWN0ZWQgdG8gc3VjY2VlZC4KCS8vICAgLSBPKGNoYWluIGFoZWFkKSB3aGVuIHRoZSBzdWNjZXNzb3IgaXMgSVRTRUxGIGFscmVhZHkgZGVwcmVjYXRlZCDigJQgYQoJLy8gICAgIGhlYWQtYXBwZW5kLiBEZXByZWNhdGUgZG9lcyBOT1QgcmVqZWN0IGFuIGFscmVhZHktZGVwcmVjYXRlZAoJLy8gICAgIHN1Y2Nlc3NvciAoaXQgdmFsaWRhdGVzIG9ubHkgZXhpc3RlbmNlIGFuZCBvd25lcnNoaXApLCBzbyB0aGlzIGlzCgkvLyAgICAgYSBwZXJtaXR0ZWQgY2FsbCwgYW5kIHBhc3QgTWF4Q2hhaW5MZW4gaG9wcyBpdCByZWZ1c2VzLiBTZWUKCS8vICAgICBUZXN0RGVwcmVjYXRlX0JvdW5kZWRXYWxrUmVmdXNhbC4KCS8vCgkvLyBUaGlzIGlzIHdoeSBHZXRMYXRlc3QgZG9jdW1lbnRzIGFuIFVOQk9VTkRFRCBjb3N0IChzZWUgaXRzIENPU1QKCS8vIFdBUk5JTkcpIOKAlCB0aGF0IHdhcm5pbmcgaXMgYWNjdXJhdGUsIG5vdCBjb25zZXJ2YXRpdmUuCgkvLwoJLy8gRXh0ZW5kaW5nIGEgY2hhaW4gcmVxdWlyZXMgb3duaW5nIGJvdGggZW5kcyBvZiBUSEUgT05FIE5FVyBMSU5LIGF0CgkvLyBjYWxsIHRpbWUgKHNlZSBEZXByZWNhdGUsIHdoaWNoIGNoZWNrcyBleGFjdGx5IHRoYXQgYW5kIG5ldmVyCgkvLyByZS12ZXJpZmllcyBlYXJsaWVyIGxpbmtzKS4gVGhhdCBpcyBhIHBlci1jYWxsIGNvbnNlbnQgY2hlY2ssIG5vdCBhbgoJLy8gaW52YXJpYW50IG9mIHRoZSBmaW5pc2hlZCBjaGFpbjogYW4gb3duZXIgd2hvIHRyYW5zZmVycyBhd2F5IG9ubHkgdGhlCgkvLyBUQUlMIGVudHJ5IGhhbmRzIHRoZSByZWNpcGllbnQgdGhlIGFiaWxpdHkgdG8gZXh0ZW5kIGl0LCBhbmQgc28gdG8KCS8vIG1vdmUgR2V0TGF0ZXN0IGZvciBldmVyeSBlbnRyeSBiZWhpbmQgaXQsIHdpdGhvdXQgdGhhdCByZWNpcGllbnQgZXZlcgoJLy8gaGF2aW5nIG93bmVkIHRoZSByb290LiBBY3F1aXJpbmcgdGhlIHRhaWwgc3RpbGwgdGFrZXMgdGhlIHR3by1zdGVwCgkvLyBub21pbmF0ZS9hY2NlcHQgaGFuZG9mZiBmcm9tIGl0cyBvd25lciwgc28gbm8gY2hhaW4gY2FuIGJlIGxlbmd0aGVuZWQKCS8vIHdpdGhvdXQgc29tZSBjb25zZW50aW5nIG93bmVyIGFsb25nIGl0LgoJTWF4Q2hhaW5MZW4gPSA1MAoKCS8vIFJlbmRlciBib3VuZHMgKHJlLWF1ZGl0KTogcmVuZGVyaW5nIGlzIHBhZ2luYXRlZCBhbmQgdGhlIHBlci1yb3cKCS8vICJsYXRlc3QiIGFubm90YXRpb24gd2Fsa3MgYSBib3VuZGVkIG51bWJlciBvZiBob3BzLCBzbyBhbgoJLy8gYXR0YWNrZXItYnVpbHQgbG9uZyBjaGFpbiBjYW5ub3QgYmxvdyB1cCB0aGUgcmVhbG0gcGFnZS4KCU1heFJlbmRlckVudHJpZXMgPSAxMDAKCVJlbmRlckxhdGVzdEhvcHMgPSAxMAopCgovLyBOT1RFIChyZS1hdWRpdCk6IHRoZXJlIGlzIGRlbGliZXJhdGVseSBOTyBnbG9iYWwgZW50cnkgY2FwLCBhbmQgdGhlCi8vIHJlYXNvbiBpcyB0aGUgc2Vjb25kIGNsYXVzZSBiZWxvdywgTk9UIHRoZSBmaXJzdC4KLy8KLy8gRW50cmllcyBhcmUgb25lLXBlci1hZGRyZXNzIGJ5IGNvbnN0cnVjdGlvbiAoc2VsZi1yZWdpc3RyYXRpb24pLCBidXQKLy8gcm91bmQtNCBhdWRpdCBjb3JyZWN0aW9uOiB0aGF0IGRvZXMgTk9UIG1ha2Ugc3BhbSBleHBlbnNpdmUuIEFkZHJlc3NlcwovLyBhcmUgY2hlYXAg4oCUIGFueW9uZSBtYXkgZGVwbG95IHVubGltaXRlZCByZWFsbXMgdW5kZXIgdGhlaXIgb3duCi8vIHBlcnNvbmFsLWFkZHJlc3MgbmFtZXNwYWNlLCBhbmQgZWFjaCBkZXBsb3llZCBwYXRoIGRlcml2ZXMgYSBkaXN0aW5jdAovLyBhZGRyZXNzIOKAlCBzbyBlbnRyeSBjb3VudCBpcyBlZmZlY3RpdmVseSB1bmJvdW5kZWQgcmVnYXJkbGVzcy4gVGhlCi8vIGVhcmxpZXIgd29yZGluZyBwcmVzZW50ZWQgcGVyLWFkZHJlc3MgdW5pcXVlbmVzcyBhcyBhIHNwYW0gY29udHJvbDsgaXQKLy8gaXMgbm90IG9uZS4KLy8KLy8gVGhlIGNhcCBpcyBvbWl0dGVkIGJlY2F1c2UgYSBoYXJkIGNhcCwgY29tYmluZWQgd2l0aCB0aGUKLy8gcmVnaXN0ZXJlZC1zdWNjZXNzb3IgcnVsZSwgd291bGQgbGV0IGFuIGF0dGFja2VyIHNhdHVyYXRlIHRoZSByZWdpc3RyeQovLyBhbmQgcGVybWFuZW50bHkgZGlzYWJsZSBkZXByZWNhdGlvbiBmb3IgZXZlcnkgbGVnaXRpbWF0ZSBlbnRyeS4gVGhhdAovLyBmYWlsdXJlIGlzIHBlcm1hbmVudCBhbmQgZ2xvYmFsOyB1bmJvdW5kZWQgZ3Jvd3RoIGlzIG5laXRoZXIuIEdyb3d0aAovLyBpcyBhbHNvIHBhaWQgZm9yIGJ5IHRoZSByZWdpc3RyYW50LCBub3QgYnkgdGhpcyByZWFsbSdzIG9wZXJhdG9yLgovLwovLyBDb25zZXF1ZW5jZSBhY2NlcHRlZCBoZXJlIGFuZCBOT1QgbWl0aWdhdGVkOiBSZW5kZXIgc2hvd3MgdGhlIG1vc3QKLy8gcmVjZW50IE1heFJlbmRlckVudHJpZXMgZW50cmllcywgc28gYSByZWdpc3RyYW50IHdobyBmbG9vZHMgdGhhdCBtYW55Ci8vIGVudHJpZXMgcHVzaGVzIG9sZGVyIG9uZXMgb2ZmIHRoaXMgcmVhbG0ncyByZW5kZXJlZCBwYWdlIHBlcm1hbmVudGx5LgovLyBUaGUgZGF0YSByZW1haW5zIHF1ZXJ5YWJsZSBieSBhZGRyZXNzIHZpYSBHZXRJbmZvL0dldE1pZ3JhdGlvbkNoYWluLgoKdmFyICgKCWVudHJpZXMgICAgICAgIG1hcFthZGRyZXNzXSpDb250cmFjdEVudHJ5CgllbnRyeUFkZHJzICAgICBbXWFkZHJlc3MgLy8gaW5zZXJ0aW9uLW9yZGVyZWQgZm9yIGRldGVybWluaXN0aWMgUmVuZGVyCglvd25lckNvbnRyYWN0cyBtYXBbYWRkcmVzc11bXWFkZHJlc3MKKQoKZnVuYyBpbml0KCkgewoJZW50cmllcyA9IG1ha2UobWFwW2FkZHJlc3NdKkNvbnRyYWN0RW50cnkpCgllbnRyeUFkZHJzID0gW11hZGRyZXNze30KCW93bmVyQ29udHJhY3RzID0gbWFrZShtYXBbYWRkcmVzc11bXWFkZHJlc3MpCn0KCi8vIHJlamVjdFN0cmF5U2VuZCBhYm9ydHMgd2hlbiBjb2lucyBhcmUgYXR0YWNoZWQgdG8gYSBjYWxsIChhdWRpdCBZMik6Ci8vIHRoaXMgcmVhbG0gaGFuZGxlcyBubyBmdW5kcyBhbmQgaG9sZHMgbm8gYmFua2VyLCBzbyBhbiBhdHRhY2hlZCBzZW5kCi8vIHdvdWxkIHN0cmFuZCBvbiB0aGUgcmVhbG0gYWRkcmVzcyBmb3JldmVyLiBBYm9ydGluZyByZXZlcnRzIHRoZQovLyB0cmFuc2ZlciBiYWNrIHRvIHRoZSBzZW5kZXIuIEZhaWxzIG9wZW4gZm9yIHJlYWxtLXJvdXRlZCBjYWxscywgd2hvc2UKLy8gYXR0YWNoZWQgc2VuZCBsYW5kcyBvbiB0aGUgaW50ZXJtZWRpYXJ5IHJlYWxtLCBuZXZlciBoZXJlLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygidGhpcyByZWFsbSBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgovLyBpc1ZhbGlkTmFtZSByZXN0cmljdHMgbmFtZXMgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoCi8vIHVuZGVyc2NvcmVzLiBOYW1lcyBhcHBlYXIgaW4gcmVuZGVyZWQgbWFya2Rvd24gYW5kIHF1ZXJ5IG91dHB1dCwgc28KLy8gbm8gZGVsaW1pdGVyIG9yIG1hcmtkb3duIGNoYXJhY3RlciBtYXkgZW50ZXIgb25lLgpmdW5jIGlzVmFsaWROYW1lKG5hbWUgc3RyaW5nKSBib29sIHsKCWlmIG5hbWUgPT0gIiIgfHwgbGVuKG5hbWUpID4gTWF4TmFtZUxlbiB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgXywgYyA6PSByYW5nZSBuYW1lIHsKCQlpZiAhKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBjID09ICdfJykgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIG93bmVySW5kZXhSZW1vdmUob3duZXIsIGNvbnRyYWN0QWRkciBhZGRyZXNzKSB7CglvbGQgOj0gb3duZXJDb250cmFjdHNbb3duZXJdCglmb3IgaSwgYWRkciA6PSByYW5nZSBvbGQgewoJCWlmIGFkZHIgPT0gY29udHJhY3RBZGRyIHsKCQkJb3duZXJDb250cmFjdHNbb3duZXJdID0gYXBwZW5kKG9sZFs6aV0sIG9sZFtpKzE6XS4uLikKCQkJYnJlYWsKCQl9Cgl9CglpZiBsZW4ob3duZXJDb250cmFjdHNbb3duZXJdKSA9PSAwIHsKCQlkZWxldGUob3duZXJDb250cmFjdHMsIG93bmVyKQoJfQp9CgovLyAtLS0tLS0tLS0tIHdyaXRlIG9wZXJhdGlvbnMgLS0tLS0tLS0tLQoKLy8gUmVnaXN0ZXIgYWRkcyB0aGUgQ0FMTElORyBjb250cmFjdCB0byB0aGUgcmVnaXN0cnkg4oCUIHRoZSBlbnRyeSdzCi8vIGFkZHJlc3MgaXMgdGhlIGNhbGxlcidzIG93biBhZGRyZXNzLCB3aGljaCBpcyB0aGUgcHJvb2Ygb2YgY29udHJvbC4KLy8gb3duZXIgTk9NSU5BVEVTIGEgbWFuYWdlciAodGVhbSBFT0Egb3IgZ292ZXJuYW5jZSByZWFsbSk7IGl0IGhvbGRzIG5vCi8vIHBvd2VyIHVudGlsIGl0IGNhbGxzIEFjY2VwdE93bmVyc2hpcCAobm9ib2R5IGNhbiBiZSBtYWRlIGFuIG93bmVyCi8vIHdpdGhvdXQgY29uc2VudCDigJQgcmUtYXVkaXQpLiBQYXNzICIiIHRvIG1hbmFnZSBmcm9tIHRoZSBjb250cmFjdAovLyBpdHNlbGYg4oCUIGJ1dCBub3RlIChhdWRpdCBZNCk6IGVudHJpZXMgYXJlIHBlcm1hbmVudCwgc28gYW4gZW50cnkKLy8gbWFuYWdlZCBieSBhIGNvbnRyYWN0IHRoYXQgaGFzIG5vIGNvZGUgcGF0aCBmb3IgY2FsbGluZyB0aGlzCi8vIHJlZ2lzdHJ5IGFnYWluIGlzIEZST1pFTiBhcyBhY3RpdmUgZm9yZXZlcjogbmV2ZXIgZGVwcmVjYXRhYmxlLAovLyBuZXZlciB0cmFuc2ZlcmFibGUuIFJlYWxtcyByZWdpc3RlcmluZyBmcm9tIGluaXQoKSBzaG91bGQgbm9taW5hdGUKLy8gYW4gRU9BIG9yIGdvdmVybmFuY2UgbWFuYWdlciBpbnN0ZWFkLgpmdW5jIFJlZ2lzdGVyKGN1ciByZWFsbSwgbmFtZSBzdHJpbmcsIG93bmVyIGFkZHJlc3MpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJaWYgIWlzVmFsaWROYW1lKG5hbWUpIHsKCQlwYW5pYygibmFtZSBtdXN0IGJlIDEtIiArIHN0cmNvbnYuSXRvYShNYXhOYW1lTGVuKSArCgkJCSIgY2hhcnMsIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcyBvbmx5IikKCX0KCWNvbnRyYWN0QWRkciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIF8sIGV4aXN0cyA6PSBlbnRyaWVzW2NvbnRyYWN0QWRkcl07IGV4aXN0cyB7CgkJcGFuaWMoImNvbnRyYWN0IGFscmVhZHkgcmVnaXN0ZXJlZDogIiArIHN0cmluZyhjb250cmFjdEFkZHIpKQoJfQoJcGVuZGluZyA6PSBhZGRyZXNzKCIiKQoJaWYgb3duZXIgIT0gIiIgJiYgb3duZXIgIT0gY29udHJhY3RBZGRyIHsKCQlpZiAhb3duZXIuSXNWYWxpZCgpIHsKCQkJcGFuaWMoImludmFsaWQgb3duZXIgYWRkcmVzczogIiArIHN0cmluZyhvd25lcikpCgkJfQoJCXBlbmRpbmcgPSBvd25lcgoJfQoKCWVudHJpZXNbY29udHJhY3RBZGRyXSA9ICZDb250cmFjdEVudHJ5ewoJCUFkZHJlc3M6ICAgICAgY29udHJhY3RBZGRyLAoJCU93bmVyOiAgICAgICAgY29udHJhY3RBZGRyLAoJCVBlbmRpbmdPd25lcjogcGVuZGluZywKCQlOYW1lOiAgICAgICAgIG5hbWUsCgl9CgllbnRyeUFkZHJzID0gYXBwZW5kKGVudHJ5QWRkcnMsIGNvbnRyYWN0QWRkcikKCW93bmVyQ29udHJhY3RzW2NvbnRyYWN0QWRkcl0gPSBhcHBlbmQob3duZXJDb250cmFjdHNbY29udHJhY3RBZGRyXSwgY29udHJhY3RBZGRyKQoJLy8gYG93bmVyYCBpcyB0aGUgRUZGRUNUSVZFIG93bmVyIGFmdGVyIHRoaXMgZXZlbnQsIHdoaWNoIGF0IHJlZ2lzdHJhdGlvbgoJLy8gaXMgdGhlIGNvbnRyYWN0IGl0c2VsZjsgYHBlbmRpbmdPd25lcmAgaXMgdGhlIG5vbWluYXRpb24sIGVtcHR5IHdoZW4KCS8vIHRoZSBlbnRyeSBpcyBzZWxmLW1hbmFnZWQuIEVtaXR0aW5nIGJvdGggaXMgd2hhdCBtYWtlcyB0aGUga2V5IGBvd25lcmAKCS8vIG1lYW4gdGhlIHNhbWUgdGhpbmcgaW4gZXZlcnkgZXZlbnQgdGhpcyByZWFsbSBlbWl0cyAocm91bmQtNCBhdWRpdCBZMjoKCS8vIG9taXR0aW5nIGl0IGhlcmUgbGVmdCBgb3duZXJgIHJlYWRhYmxlIGFzICJ0aGUgYXV0aG9yaXppbmcgYWN0b3IiIGluCgkvLyBzb21lIGV2ZW50cyBhbmQgInRoZSBuZXcgb3duZXIiIGluIG90aGVycykuCgljaGFpbi5FbWl0KCJSZWdpc3RlciIsCgkJImNvbnRyYWN0Iiwgc3RyaW5nKGNvbnRyYWN0QWRkciksCgkJIm5hbWUiLCBuYW1lLAoJCSJvd25lciIsIHN0cmluZyhjb250cmFjdEFkZHIpLAoJCSJwZW5kaW5nT3duZXIiLCBzdHJpbmcocGVuZGluZyksCgkpCglyZXR1cm4gInJlZ2lzdGVyZWQgIiArIG5hbWUgKyAiIGF0ICIgKyBzdHJpbmcoY29udHJhY3RBZGRyKQp9CgovLyBBY2NlcHRPd25lcnNoaXAgY29tcGxldGVzIGEgbm9taW5hdGVkIG93bmVyc2hpcDogb25seSB0aGUgcGVuZGluZwovLyBvd25lciBjYW4gYWNjZXB0LCBhbmQgb25seSBhY2NlcHRhbmNlIG1vdmVzIHRoZSBlbnRyeSAoYW5kIHRoZQovLyBvd25lckNvbnRyYWN0cyBpbmRleCkgdG8gdGhlbS4KZnVuYyBBY2NlcHRPd25lcnNoaXAoY3VyIHJlYWxtLCBjb250cmFjdEFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgllbnRyeSA6PSBtdXN0R2V0KGNvbnRyYWN0QWRkcikKCWMgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlbnRyeS5QZW5kaW5nT3duZXIgPT0gIiIgfHwgYyAhPSBlbnRyeS5QZW5kaW5nT3duZXIgewoJCXBhbmljKCJjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIG93bmVyIG9mICIgKyBzdHJpbmcoY29udHJhY3RBZGRyKSkKCX0KCXByZXZpb3VzT3duZXIgOj0gZW50cnkuT3duZXIKCW93bmVySW5kZXhSZW1vdmUoZW50cnkuT3duZXIsIGNvbnRyYWN0QWRkcikKCW93bmVyQ29udHJhY3RzW2NdID0gYXBwZW5kKG93bmVyQ29udHJhY3RzW2NdLCBjb250cmFjdEFkZHIpCgllbnRyeS5Pd25lciA9IGMKCWVudHJ5LlBlbmRpbmdPd25lciA9ICIiCgljaGFpbi5FbWl0KCJPd25lcnNoaXBBY2NlcHRlZCIsCgkJImNvbnRyYWN0Iiwgc3RyaW5nKGNvbnRyYWN0QWRkciksCgkJIm93bmVyIiwgc3RyaW5nKGMpLAoJCSJwcmV2aW91c093bmVyIiwgc3RyaW5nKHByZXZpb3VzT3duZXIpLAoJKQoJcmV0dXJuICJvd25lcnNoaXAgYWNjZXB0ZWQgYnkgIiArIHN0cmluZyhjKQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcCBOT01JTkFURVMgYSBuZXcgb3duZXIgZm9yIGEgcmVnaXN0cnkgZW50cnk7IHRoZQovLyBub21pbmVlIG11c3QgQWNjZXB0T3duZXJzaGlwIHRvIHRha2UgY29udHJvbCAodHdvLXN0ZXAg4oCUIHJlLWF1ZGl0KS4KLy8gUGFzc2luZyAiIiBjbGVhcnMgYSBwZW5kaW5nIG5vbWluYXRpb24uCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBjb250cmFjdEFkZHIsIG5ld093bmVyIGFkZHJlc3MpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJZW50cnkgOj0gbXVzdEdldChjb250cmFjdEFkZHIpCglpZiBlbnRyeS5Pd25lciAhPSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gdHJhbnNmZXIgb3duZXJzaGlwIikKCX0KCWlmIG5ld093bmVyID09ICIiIHsKCQkvLyBFbWl0IG9ubHkgd2hlbiBhIG5vbWluYXRpb24gYWN0dWFsbHkgZXhpc3RlZCAocm91bmQtNCBhdWRpdCBMMjoKCQkvLyBjbGVhcmluZyBhbiBlbnRyeSB0aGF0IGhhcyBubyBwZW5kaW5nIG93bmVyIGlzIGEgbm8tb3AsIGFuZCBhbgoJCS8vIGV2ZW50IGZvciBpdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmVhbCBjbGVhcmluZyB0byBhbgoJCS8vIGluZGV4ZXIpLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuY29uZGl0aW9uYWwgZWl0aGVyIHdheSDigJQgdGhpcwoJCS8vIGNoYW5nZXMgd2hhdCBpcyBPQlNFUlZFRCwgbm90IHdoYXQgaGFwcGVucy4KCQljbGVhcmVkIDo9IGVudHJ5LlBlbmRpbmdPd25lcgoJCWVudHJ5LlBlbmRpbmdPd25lciA9ICIiCgkJaWYgY2xlYXJlZCAhPSAiIiB7CgkJCWNoYWluLkVtaXQoIk93bmVyc2hpcE5vbWluYXRpb25DbGVhcmVkIiwKCQkJCSJjb250cmFjdCIsIHN0cmluZyhjb250cmFjdEFkZHIpLAoJCQkJIm93bmVyIiwgc3RyaW5nKGVudHJ5Lk93bmVyKSwKCQkJCSJjbGVhcmVkTm9taW5lZSIsIHN0cmluZyhjbGVhcmVkKSwKCQkJKQoJCX0KCQlyZXR1cm4gInBlbmRpbmcgb3duZXJzaGlwIG5vbWluYXRpb24gY2xlYXJlZCIKCX0KCWlmICFuZXdPd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIG5ldyBvd25lciBhZGRyZXNzOiAiICsgc3RyaW5nKG5ld093bmVyKSkKCX0KCWVudHJ5LlBlbmRpbmdPd25lciA9IG5ld093bmVyCgljaGFpbi5FbWl0KCJPd25lcnNoaXBOb21pbmF0ZWQiLAoJCSJjb250cmFjdCIsIHN0cmluZyhjb250cmFjdEFkZHIpLAoJCSJvd25lciIsIHN0cmluZyhlbnRyeS5Pd25lciksCgkJInBlbmRpbmdPd25lciIsIHN0cmluZyhuZXdPd25lciksCgkpCglyZXR1cm4gIm93bmVyc2hpcCBub21pbmF0ZWQgdG8gIiArIHN0cmluZyhuZXdPd25lcikgKyAiIChwZW5kaW5nIGFjY2VwdGFuY2UpIgp9CgovLyBEZXByZWNhdGUgbWFya3MgYSBjb250cmFjdCBhcyBkZXByZWNhdGVkIGFuZCBwb2ludHMgdG8gaXRzIHN1Y2Nlc3Nvci4KLy8gT25seSB0aGUgZW50cnkncyBvd25lciBjYW4gZGVwcmVjYXRlLiBUaGUgc3VjY2Vzc29yIG11c3QgaXRzZWxmIGJlIGEKLy8gUkVHSVNURVJFRCBlbnRyeSDigJQgcmVnaXN0cmF0aW9uIGlzIHNlbGYtcHJvdmluZywgc28gYSBzdWNjZXNzb3IgY2FuCi8vIG5ldmVyIGJlIGEgZGFuZ2xpbmcgcG9pbnRlciBvciBhbiBhZGRyZXNzIHNxdWF0dGVkIGJ5IGEgdGhpcmQgcGFydHkg4oCUCi8vIGFuZCB0aGUgc3VjY2Vzc29yIGVudHJ5IG11c3QgYmUgT1dORUQgQlkgVEhFIENBTExFUiAocmUtYXVkaXQ6IHdpdGhvdXQKLy8gY29uc2VudCwgYW4gYXR0YWNrZXIgY291bGQgY2hhaW4gdGhlaXIgZW50cnkgSU5UTyBhIGxlZ2l0aW1hdGUKLy8gY29udHJhY3QsIGZvcmdpbmcgIm9mZmljaWFsIHByZWRlY2Vzc29yIiBwcm92ZW5hbmNlKS4gQ29uc2VudCBpcwovLyBjaGVja2VkIEFUIENBTEwgVElNRTogdHJhbnNmZXJyaW5nIHRoZSBzdWNjZXNzb3IgZW50cnkgYXdheSBsYXRlcgovLyBkb2VzIG5vdCB1bmxpbmsgYW4gZXhpc3RpbmcgY2hhaW4g4oCUIHRoZSBhdHRlc3RhdGlvbiBpcyB0aGF0IGJvdGgKLy8gZW5kcyBzaGFyZWQgYW4gb3duZXIgd2hlbiB0aGUgZGVwcmVjYXRpb24gd2FzIHJlY29yZGVkLgpmdW5jIERlcHJlY2F0ZShjdXIgcmVhbG0sIGNvbnRyYWN0QWRkciwgc3VjY2Vzc29yQWRkciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWVudHJ5IDo9IG11c3RHZXQoY29udHJhY3RBZGRyKQoJaWYgZW50cnkuT3duZXIgIT0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIHsKCQlwYW5pYygib25seSB0aGUgb3duZXIgY2FuIGRlcHJlY2F0ZSB0aGlzIGNvbnRyYWN0IikKCX0KCWlmIGVudHJ5LkRlcHJlY2F0ZWQgewoJCXBhbmljKCJjb250cmFjdCBpcyBhbHJlYWR5IGRlcHJlY2F0ZWQiKQoJfQoJaWYgc3VjY2Vzc29yQWRkciA9PSBjb250cmFjdEFkZHIgewoJCXBhbmljKCJzdWNjZXNzb3IgY2Fubm90IGJlIHRoZSBjb250cmFjdCBpdHNlbGYiKQoJfQoJc3VjYywgZXhpc3RzIDo9IGVudHJpZXNbc3VjY2Vzc29yQWRkcl0KCWlmICFleGlzdHMgewoJCXBhbmljKCJzdWNjZXNzb3IgaXMgbm90IGEgcmVnaXN0ZXJlZCBjb250cmFjdDogIiArIHN0cmluZyhzdWNjZXNzb3JBZGRyKSkKCX0KCWlmIHN1Y2MuT3duZXIgIT0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIHsKCQlwYW5pYygic3VjY2Vzc29yIGVudHJ5IGlzIG5vdCBvd25lZCBieSB0aGUgY2FsbGVyOiAiICsgc3RyaW5nKHN1Y2Nlc3NvckFkZHIpKQoJfQoKCS8vIFByZXZlbnQgY2lyY3VsYXIgY2hhaW5zOiB3YWxrIGZyb20gc3VjY2Vzc29yIGFuZCBlbnN1cmUgd2UgZG9uJ3QKCS8vIGxvb3AgYmFjayB0byBjb250cmFjdEFkZHIuIFN1Y2Nlc3NvcnMgYXJlIGltbXV0YWJsZSBvbmNlIHNldCwgc28KCS8vIGEgY2hlY2sgb3ZlciB0aGUgZXhpc3RpbmcgY2hhaW4gaXMgY29tcGxldGUuCgl2aXNpdGVkIDo9IG1ha2UobWFwW2FkZHJlc3NdYm9vbCkKCXZpc2l0ZWRbY29udHJhY3RBZGRyXSA9IHRydWUKCXdhbGsgOj0gc3VjY2Vzc29yQWRkcgoJZm9yIGhvcHMgOj0gMDsgOyBob3BzKysgewoJCWlmIGhvcHMgPiBNYXhDaGFpbkxlbiB7CgkJCS8vIGJvdW5kZWQtd2FsayBkaXNjaXBsaW5lIChyb3VuZC0zIGF1ZGl0KTogYSBzdWNjZXNzb3IgY2hhaW4KCQkJLy8gdGhpcyBsb25nIGlzIHBhdGhvbG9naWNhbDsgcmVmdXNlIHJhdGhlciB0aGFuIHdhbGsgdW5ib3VuZGVkCgkJCXBhbmljKCJzdWNjZXNzb3IgY2hhaW4gdG9vIGxvbmcgdG8gdmVyaWZ5OyBjYW5ub3QgZGVwcmVjYXRlIikKCQl9CgkJaWYgdmlzaXRlZFt3YWxrXSB7CgkJCXBhbmljKCJkZXByZWNhdGluZyAiICsgc3RyaW5nKGNvbnRyYWN0QWRkcikgKyAiIHRvICIgKwoJCQkJc3RyaW5nKHN1Y2Nlc3NvckFkZHIpICsgIiB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhciBtaWdyYXRpb24gY2hhaW4iKQoJCX0KCQllLCBleGlzdHMgOj0gZW50cmllc1t3YWxrXQoJCWlmICFleGlzdHMgfHwgIWUuRGVwcmVjYXRlZCB8fCBlLlN1Y2Nlc3NvciA9PSAiIiB7CgkJCWJyZWFrCgkJfQoJCXZpc2l0ZWRbd2Fsa10gPSB0cnVlCgkJd2FsayA9IGUuU3VjY2Vzc29yCgl9CgoJZW50cnkuRGVwcmVjYXRlZCA9IHRydWUKCWVudHJ5LlN1Y2Nlc3NvciA9IHN1Y2Nlc3NvckFkZHIKCWNoYWluLkVtaXQoIkRlcHJlY2F0ZSIsCgkJImNvbnRyYWN0Iiwgc3RyaW5nKGNvbnRyYWN0QWRkciksCgkJIm5hbWUiLCBlbnRyeS5OYW1lLAoJCSJzdWNjZXNzb3IiLCBzdHJpbmcoc3VjY2Vzc29yQWRkciksCgkpCglyZXR1cm4gImRlcHJlY2F0ZWQgIiArIGVudHJ5Lk5hbWUgKyAiLCBzdWNjZXNzb3I6ICIgKyBzdHJpbmcoc3VjY2Vzc29yQWRkcikKfQoKLy8gLS0tLS0tLS0tLSByZWFkLW9ubHkgcXVlcmllcyAtLS0tLS0tLS0tCgovLyBHZXRMYXRlc3QgZm9sbG93cyB0aGUgbWlncmF0aW9uIGNoYWluIGZyb20gYSBjb250cmFjdCBhZGRyZXNzIGFuZAovLyByZXR1cm5zIHRoZSBsYXRlc3Qgbm9uLWRlcHJlY2F0ZWQgYWRkcmVzcy4gU2FmZSBhZ2FpbnN0IGNpcmN1bGFyIHJlZnMuCi8vCi8vIENPU1QgV0FSTklORyAoYXVkaXQgWTMpOiB1bmxpa2UgdGhlIHdyaXRlLXBhdGggd2Fsa3MsIHRoaXMgcmVhZCBpcwovLyBkZWxpYmVyYXRlbHkgVU5CT1VOREVEIGluIGhvcHMgc28gaXQgYWx3YXlzIHJlc29sdmVzIHRoZSB0cnVlCi8vIGVuZHBvaW50LiBDaGFpbiBsZW5ndGggaXMgYXR0YWNrZXItYnVpbGRhYmxlLCBzbyBhbiBvbi1jaGFpbgovLyBpbnRlZ3JhdG9yIHJlc29sdmluZyBhbiBVTlRSVVNURUQgYWRkcmVzcyBpbnNpZGUgaXRzIG93biB0cmFuc2FjdGlvbgovLyBtdXN0IHRyZWF0IHRoZSBnYXMgY29zdCBhcyBPKGNoYWluIGxlbmd0aCkg4oCUIHdyYXAgaXQsIGJvdW5kIHRoZQovLyBpbnB1dCBzZXQsIG9yIHJlc29sdmUgb2ZmLWNoYWluIHZpYSBxdWVyeS4KZnVuYyBHZXRMYXRlc3QoY29udHJhY3RBZGRyIGFkZHJlc3MpIGFkZHJlc3MgewoJdmlzaXRlZCA6PSBtYWtlKG1hcFthZGRyZXNzXWJvb2wpCgljdXJyZW50IDo9IGNvbnRyYWN0QWRkcgoKCWZvciB7CgkJZW50cnksIGV4aXN0cyA6PSBlbnRyaWVzW2N1cnJlbnRdCgkJaWYgIWV4aXN0cyB7CgkJCXJldHVybiBjdXJyZW50CgkJfQoJCWlmICFlbnRyeS5EZXByZWNhdGVkIHx8IGVudHJ5LlN1Y2Nlc3NvciA9PSAiIiB7CgkJCXJldHVybiBjdXJyZW50CgkJfQoJCWlmIHZpc2l0ZWRbY3VycmVudF0gewoJCQlyZXR1cm4gY3VycmVudCAvLyBicmVhayBvbiBjaXJjdWxhcgoJCX0KCQl2aXNpdGVkW2N1cnJlbnRdID0gdHJ1ZQoJCWN1cnJlbnQgPSBlbnRyeS5TdWNjZXNzb3IKCX0KfQoKLy8gR2V0TWlncmF0aW9uQ2hhaW4gcmV0dXJucyB0aGUgZnVsbCB1cGdyYWRlIHBhdGggc3RhcnRpbmcgZnJvbSB0aGUKLy8gZ2l2ZW4gYWRkcmVzcywgYXQgbW9zdCBNYXhDaGFpbkxlbiBob3BzLiBBIGNoYWluIGxvbmdlciB0aGFuIHRoZQovLyBib3VuZCBpcyBleHBsaWNpdGx5IG1hcmtlZCBhcyB0cnVuY2F0ZWQgKHJlLWF1ZGl0OiBzaWxlbnQgdHJ1bmNhdGlvbgovLyBwcmVzZW50ZWQgYSBtaWQtY2hhaW4gbm9kZSBhcyB0aGUgZW5kcG9pbnQpLgpmdW5jIEdldE1pZ3JhdGlvbkNoYWluKGNvbnRyYWN0QWRkciBhZGRyZXNzKSBzdHJpbmcgewoJdmlzaXRlZCA6PSBtYWtlKG1hcFthZGRyZXNzXWJvb2wpCgljdXJyZW50IDo9IGNvbnRyYWN0QWRkcgoJdmFyIHBhcnRzIFtdc3RyaW5nCgoJZm9yIHsKCQlpZiBsZW4ocGFydHMpID49IE1heENoYWluTGVuIHsKCQkJcGFydHMgPSBhcHBlbmQocGFydHMsICIuLi4gKHRydW5jYXRlZCBhdCAiK3N0cmNvbnYuSXRvYShNYXhDaGFpbkxlbikrCgkJCQkiIGhvcHM7IHVzZSBHZXRMYXRlc3QgZm9yIHRoZSBlbmRwb2ludCkiKQoJCQlicmVhawoJCX0KCQllbnRyeSwgZXhpc3RzIDo9IGVudHJpZXNbY3VycmVudF0KCQlpZiAhZXhpc3RzIHsKCQkJaWYgbGVuKHBhcnRzKSA9PSAwIHsKCQkJCXJldHVybiAibm90IGZvdW5kOiAiICsgc3RyaW5nKGNvbnRyYWN0QWRkcikKCQkJfQoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgc3RyaW5nKGN1cnJlbnQpKyIgKHVucmVnaXN0ZXJlZCkiKQoJCQlicmVhawoJCX0KCQlpZiB2aXNpdGVkW2N1cnJlbnRdIHsKCQkJcGFydHMgPSBhcHBlbmQocGFydHMsIHN0cmluZyhjdXJyZW50KSsiIChjaXJjdWxhcikiKQoJCQlicmVhawoJCX0KCQl2aXNpdGVkW2N1cnJlbnRdID0gdHJ1ZQoKCQl0YWcgOj0gIiIKCQlpZiBlbnRyeS5EZXByZWNhdGVkIHsKCQkJdGFnID0gIiBbZGVwcmVjYXRlZF0iCgkJfQoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCBzdHJpbmcoZW50cnkuQWRkcmVzcykrIiAoIitlbnRyeS5OYW1lKyIpIit0YWcpCgoJCWlmICFlbnRyeS5EZXByZWNhdGVkIHx8IGVudHJ5LlN1Y2Nlc3NvciA9PSAiIiB7CgkJCWJyZWFrCgkJfQoJCWN1cnJlbnQgPSBlbnRyeS5TdWNjZXNzb3IKCX0KCglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhcnRzLCAiIC0+ICIpCn0KCi8vIEdldEluZm8gcmV0dXJucyBhIG9uZS1saW5lIHN1bW1hcnkgZm9yIGEgY29udHJhY3QuCmZ1bmMgR2V0SW5mbyhjb250cmFjdEFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCWVudHJ5IDo9IG11c3RHZXQoY29udHJhY3RBZGRyKQoJc3RhdHVzIDo9ICJhY3RpdmUiCglpZiBlbnRyeS5EZXByZWNhdGVkIHsKCQlzdGF0dXMgPSAiZGVwcmVjYXRlZCAtPiAiICsgc3RyaW5nKGVudHJ5LlN1Y2Nlc3NvcikKCX0KCXJldHVybiBlbnRyeS5OYW1lICsgIiB8IG93bmVyOiAiICsgc3RyaW5nKGVudHJ5Lk93bmVyKSArICIgfCAiICsgc3RhdHVzCn0KCi8vIEdldE93bmVyQ29udHJhY3RzIHJldHVybnMgYWxsIGNvbnRyYWN0IGFkZHJlc3NlcyB3aG9zZSBBQ0NFUFRFRCBvd25lcgovLyBpcyB0aGUgZ2l2ZW4gYWRkcmVzcyAobm9taW5hdGlvbnMgZG9uJ3QgY291bnQgdW50aWwgYWNjZXB0ZWQpLgpmdW5jIEdldE93bmVyQ29udHJhY3RzKG93bmVyIGFkZHJlc3MpIHN0cmluZyB7CglhZGRycywgZXhpc3RzIDo9IG93bmVyQ29udHJhY3RzW293bmVyXQoJaWYgIWV4aXN0cyB8fCBsZW4oYWRkcnMpID09IDAgewoJCXJldHVybiAibm9uZSIKCX0KCXBhcnRzIDo9IG1ha2UoW11zdHJpbmcsIGxlbihhZGRycykpCglmb3IgaSwgYSA6PSByYW5nZSBhZGRycyB7CgkJcGFydHNbaV0gPSBzdHJpbmcoYSkKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4ocGFydHMsICIsICIpCn0KCi8vIC0tLS0tLS0tLS0gcmVuZGVyIC0tLS0tLS0tLS0KCi8vIHJlbmRlckxhdGVzdCB3YWxrcyBhdCBtb3N0IFJlbmRlckxhdGVzdEhvcHMgaG9wcyBmb3IgdGhlIHBlci1yb3cKLy8gYW5ub3RhdGlvbjsgbG9uZ2VyIGNoYWlucyBhcmUgbWFya2VkIHJhdGhlciB0aGFuIHdhbGtlZCAocmVuZGVyIGdhcwovLyBib3VuZCDigJQgcmUtYXVkaXQpLgpmdW5jIHJlbmRlckxhdGVzdChjb250cmFjdEFkZHIgYWRkcmVzcykgKGFkZHJlc3MsIGJvb2wpIHsKCWN1cnJlbnQgOj0gY29udHJhY3RBZGRyCglmb3IgaSA6PSAwOyBpIDwgUmVuZGVyTGF0ZXN0SG9wczsgaSsrIHsKCQllbnRyeSwgZXhpc3RzIDo9IGVudHJpZXNbY3VycmVudF0KCQlpZiAhZXhpc3RzIHx8ICFlbnRyeS5EZXByZWNhdGVkIHx8IGVudHJ5LlN1Y2Nlc3NvciA9PSAiIiB7CgkJCXJldHVybiBjdXJyZW50LCB0cnVlCgkJfQoJCWN1cnJlbnQgPSBlbnRyeS5TdWNjZXNzb3IKCX0KCS8vIHJvdW5kLTMgYXVkaXQgb2ZmLWJ5LW9uZTogdGhlIG5vZGUgcmVhY2hlZCBPTiB0aGUgYnVkZ2V0IGJvdW5kYXJ5CgkvLyBtYXkgaXRzZWxmIGJlIHRlcm1pbmFsIOKAlCBjaGVjayBiZWZvcmUgZGVjbGFyaW5nIHRoZSB3YWxrIGluY29tcGxldGUKCWVudHJ5LCBleGlzdHMgOj0gZW50cmllc1tjdXJyZW50XQoJaWYgIWV4aXN0cyB8fCAhZW50cnkuRGVwcmVjYXRlZCB8fCBlbnRyeS5TdWNjZXNzb3IgPT0gIiIgewoJCXJldHVybiBjdXJyZW50LCB0cnVlCgl9CglyZXR1cm4gY3VycmVudCwgZmFsc2UKfQoKLy8gUmVuZGVyIHJldHVybnMgYSBtYXJrZG93biBvdmVydmlldyBvZiB0aGUgbW9zdCByZWNlbnQgZW50cmllcy4KLy8gTmV2ZXIgcGFuaWNzLgovLwovLyBUaGUgcmVuZGVyZWQgcGFnZSBjYXJyaWVzIGFuIGV4cGxpY2l0IHNjb3BlIGRpc2Nsb3N1cmUgKHJvdW5kLTQgYXVkaXQpLgovLyBXaGF0IHRoaXMgcmVnaXN0cnkgcHJvdmVzIGlzIG5hcnJvdyBhbmQgZWFzeSB0byBvdmVyLXJlYWQ6IGFuIGVudHJ5J3MKLy8gQUREUkVTUyBpcyBzZWxmLXJlZ2lzdGVyZWQgYW5kIHRoZXJlZm9yZSB2ZXJpZmllZCwgYnV0IGl0cyBOQU1FIGlzIGFuCi8vIGFyYml0cmFyeSBzZWxmLWFzc2VydGVkIGxhYmVsIHRoYXQgaXMgbmVpdGhlciB1bmlxdWUgbm9yIGNoZWNrZWQKLy8gYWdhaW5zdCBhbnl0aGluZy4gVHdvIGVudHJpZXMgbWF5IGNhcnJ5IHRoZSBzYW1lIG5hbWUsIGFuZCBhIG5hbWUgbWF5Ci8vIGltcGVyc29uYXRlIGEgd2VsbC1rbm93biBwcm9qZWN0LiBBIHJlYWRlciB3aG8ga2V5cyBvbiB0aGUgYm9sZCBuYW1lCi8vIHJhdGhlciB0aGFuIHRoZSBhZGRyZXNzIGlzIHRydXN0aW5nIHNvbWV0aGluZyB0aGlzIHJlYWxtIGRvZXMgbm90Ci8vIGF0dGVzdC4gU3RhdGluZyB0aGF0IGluIHRoZSBvdXRwdXQgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIG1pdGlnYXRpb246Ci8vIHRoZSBlbnRyaWVzIGFyZSBpbW11dGFibGUsIGFuZCBuYW1lIHVuaXF1ZW5lc3MgaXMgZGVsaWJlcmF0ZWx5IE5PVAovLyBlbmZvcmNlZCBiZWNhdXNlIGZpcnN0LWNvbWUgdW5pcXVlbmVzcyBvbiBhIHBlcm1pc3Npb25sZXNzIGltbXV0YWJsZQovLyByZWdpc3RyeSB3b3VsZCBsZXQgYW4gYXR0YWNrZXIgYnVybiBldmVyeSB2YWx1YWJsZSBuYW1lIHBlcm1hbmVudGx5LgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWRpc2Nsb3N1cmUgOj0gIj4gWyFOT1RFXVxuIiArCgkJIj4gQWRkcmVzc2VzIGFyZSBzZWxmLXJlZ2lzdGVyZWQgYW5kIHRoZXJlZm9yZSB2ZXJpZmllZDogYW4gZW50cnkgZXhpc3RzXG4iICsKCQkiPiBvbmx5IGJlY2F1c2UgdGhhdCBhZGRyZXNzIGl0c2VsZiBjYWxsZWQgYFJlZ2lzdGVyYC4gKipOYW1lcyBhcmUgbm90LioqXG4iICsKCQkiPiBBIG5hbWUgaXMgYW4gYXJiaXRyYXJ5IHNlbGYtYXNzZXJ0ZWQgbGFiZWwg4oCUIGl0IGlzIE5PVCB1bmlxdWUsIE5PVFxuIiArCgkJIj4gdmVyaWZpZWQsIGFuZCBtYXkgaW1wZXJzb25hdGUgYW5vdGhlciBwcm9qZWN0LiBJZGVudGlmeSBjb250cmFjdHMgYnlcbiIgKwoJCSI+IGFkZHJlc3MsIG5ldmVyIGJ5IG5hbWUuXG5cbiIKCglpZiBlbnRyaWVzID09IG5pbCB8fCBsZW4oZW50cmllcykgPT0gMCB7CgkJcmV0dXJuICIjIFVwZ3JhZGUgUmVnaXN0cnlcblxuIiArIGRpc2Nsb3N1cmUgKyAiTm8gY29udHJhY3RzIHJlZ2lzdGVyZWQuXG4iCgl9CgoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIFVwZ3JhZGUgUmVnaXN0cnlcblxuIikKCWIuV3JpdGVTdHJpbmcoZGlzY2xvc3VyZSkKCWIuV3JpdGVTdHJpbmcoIioqUmVnaXN0ZXJlZCBjb250cmFjdHM6KiogIiArIHN0cmNvbnYuSXRvYShsZW4oZW50cmllcykpICsgIlxuXG4iKQoKCXNob3cgOj0gZW50cnlBZGRycwoJaWYgbGVuKHNob3cpID4gTWF4UmVuZGVyRW50cmllcyB7CgkJYi5Xcml0ZVN0cmluZygiX1Nob3dpbmcgdGhlIG1vc3QgcmVjZW50ICIgKyBzdHJjb252Lkl0b2EoTWF4UmVuZGVyRW50cmllcykgKwoJCQkiIGVudHJpZXMgb2YgIiArIHN0cmNvbnYuSXRvYShsZW4oc2hvdykpICsgIi4gT2xkZXIgZW50cmllcyBhcmUgbm90ICIgKwoJCQkibGlzdGVkIGhlcmUgYW5kIHJlbWFpbiBxdWVyeWFibGUgYnkgYWRkcmVzcyB2aWEgR2V0SW5mbyBhbmQgIiArCgkJCSJHZXRNaWdyYXRpb25DaGFpbi5fXG5cbiIpCgkJc2hvdyA9IHNob3dbbGVuKHNob3cpLU1heFJlbmRlckVudHJpZXM6XQoJfQoKCXZhciBhY3RpdmUgW11zdHJpbmcKCXZhciBkZXByZWNhdGVkIFtdc3RyaW5nCgoJZm9yIF8sIGFkZHIgOj0gcmFuZ2Ugc2hvdyB7CgkJZW50cnkgOj0gZW50cmllc1thZGRyXQoJCWlmIGVudHJ5ID09IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWxpbmUgOj0gIi0gKioiICsgZW50cnkuTmFtZSArICIqKiAoYCIgKyBzdHJpbmcoYWRkcikgKyAiYCkg4oCUIG93bmVyOiBgIiArIHN0cmluZyhlbnRyeS5Pd25lcikgKyAiYCIKCQlpZiBlbnRyeS5EZXByZWNhdGVkIHsKCQkJbGluZSArPSAiIOKAlCAqKkRFUFJFQ0FURUQqKiAtPiBgIiArIHN0cmluZyhlbnRyeS5TdWNjZXNzb3IpICsgImAiCgkJCWxhdGVzdCwgY29tcGxldGUgOj0gcmVuZGVyTGF0ZXN0KGFkZHIpCgkJCWlmICFjb21wbGV0ZSB7CgkJCQlsaW5lICs9ICIgKGxvbmcgY2hhaW47IHVzZSBHZXRMYXRlc3QpIgoJCQl9IGVsc2UgaWYgbGF0ZXN0ICE9IGVudHJ5LlN1Y2Nlc3NvciB7CgkJCQlsaW5lICs9ICIgKGxhdGVzdDogYCIgKyBzdHJpbmcobGF0ZXN0KSArICJgKSIKCQkJfQoJCQlkZXByZWNhdGVkID0gYXBwZW5kKGRlcHJlY2F0ZWQsIGxpbmUpCgkJfSBlbHNlIHsKCQkJYWN0aXZlID0gYXBwZW5kKGFjdGl2ZSwgbGluZSkKCQl9Cgl9CgoJaWYgbGVuKGFjdGl2ZSkgPiAwIHsKCQliLldyaXRlU3RyaW5nKCIjIyBBY3RpdmVcblxuIikKCQlmb3IgXywgbCA6PSByYW5nZSBhY3RpdmUgewoJCQliLldyaXRlU3RyaW5nKGwgKyAiXG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCJcbiIpCgl9CgoJaWYgbGVuKGRlcHJlY2F0ZWQpID4gMCB7CgkJYi5Xcml0ZVN0cmluZygiIyMgRGVwcmVjYXRlZFxuXG4iKQoJCWZvciBfLCBsIDo9IHJhbmdlIGRlcHJlY2F0ZWQgewoJCQliLldyaXRlU3RyaW5nKGwgKyAiXG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCJcbiIpCgl9CgoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0KCmZ1bmMgbXVzdEdldChhZGRyIGFkZHJlc3MpICpDb250cmFjdEVudHJ5IHsKCWVudHJ5LCBvayA6PSBlbnRyaWVzW2FkZHJdCglpZiAhb2sgewoJCXBhbmljKCJjb250cmFjdCBub3QgZm91bmQ6ICIgKyBzdHJpbmcoYWRkcikpCgl9CglyZXR1cm4gZW50cnkKfQoa358BChl1cGdyYWRlX3JlZ2lzdHJ5X3Rlc3QuZ25vEsCfAXBhY2thZ2UgdXBncmFkZV9yZWdpc3RyeQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgovLyBJbiBwcm9kdWN0aW9uIHRoZSByZWdpc3RyYW50IGlzIHVzdWFsbHkgYSByZWFsbTsgdXNlciBhZGRyZXNzZXMgZ2l2ZQovLyB0aGUgc2FtZSBzZWxmLXJlZ2lzdHJhdGlvbiBzZW1hbnRpY3MgaW4gdGVzdHMgKFJlZ2lzdGVyIGJpbmRzIHRoZQovLyBlbnRyeSB0byB0aGUgQ0FMTEVSJ3MgYWRkcmVzcyBlaXRoZXIgd2F5KS4KdmFyICgKCXYxICAgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJjb250cmFjdF92MSIpCgl2MiAgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiY29udHJhY3RfdjIiKQoJdjMgICAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImNvbnRyYWN0X3YzIikKCXRlYW1FT0EgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJ0ZWFtIikKCWF0dGFja2VyID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhdHRhY2tlciIpCikKCi8vIHJlc2V0U3RhdGUgcmVzZXRzIGFsbCBwYWNrYWdlLWxldmVsIHN0YXRlIGJldHdlZW4gdGVzdHMuCmZ1bmMgcmVzZXRTdGF0ZSgpIHsKCWVudHJpZXMgPSBtYWtlKG1hcFthZGRyZXNzXSpDb250cmFjdEVudHJ5KQoJZW50cnlBZGRycyA9IFtdYWRkcmVzc3t9Cglvd25lckNvbnRyYWN0cyA9IG1ha2UobWFwW2FkZHJlc3NdW11hZGRyZXNzKQp9CgovLyByZWdpc3RlciBzZWxmLXJlZ2lzdGVycyBhZGRyIHVuZGVyIG5hbWU7IHdoZW4gb3duZXIgaXMgbm9uLWVtcHR5IHRoZQovLyBub21pbmVlIGFjY2VwdHMsIGNvbXBsZXRpbmcgdGhlIHR3by1zdGVwIGhhbmRvdmVyLgpmdW5jIHJlZ2lzdGVyKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzLCBuYW1lIHN0cmluZywgb3duZXIgYWRkcmVzcykgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZGRyKSkKCVJlZ2lzdGVyKGNyb3NzKGN1ciksIG5hbWUsIG93bmVyKQoJaWYgb3duZXIgIT0gIiIgJiYgb3duZXIgIT0gYWRkciB7CgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgkJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGFkZHIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0gUmVnaXN0ZXIgKHByb29mIG9mIGNvbnRyb2wpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFJlZ2lzdGVyX0JpbmRzVG9DYWxsZXJBZGRyZXNzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgdjEsICJ2YXVsdCIsIHRlYW1FT0EpCgoJZSA6PSBlbnRyaWVzW3YxXQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcodjEpLCBzdHJpbmcoZS5BZGRyZXNzKSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHRlYW1FT0EpLCBzdHJpbmcoZS5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsICJ2YXVsdCIsIGUuTmFtZSkKCgkvLyB0aGUgYXVkaXQncyBQMTogdGhlcmUgaXMgbm8gd2F5IHRvIHJlZ2lzdGVyIGFuIGFkZHJlc3MgeW91IGRvIG5vdAoJLy8gY29udHJvbCDigJQgdGhlIGVudHJ5IGFkZHJlc3MgaXMgQUxXQVlTIHRoZSBjYWxsZXIncyBvd24uIEFuCgkvLyBhdHRhY2tlciByZWdpc3RlcmluZyBnZXRzIGFuIGVudHJ5IGZvciB0aGVtc2VsdmVzLCBub3QgdGhlIHZpY3RpbS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgImZha2VfdmF1bHQiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGF0dGFja2VyKSwgc3RyaW5nKGVudHJpZXNbYXR0YWNrZXJdLkFkZHJlc3MpKQoJXywgaGlqYWNrZWQgOj0gZW50cmllc1t2Ml0KCXVhc3NlcnQuRmFsc2UodCwgaGlqYWNrZWQsICJubyBlbnRyeSBtYXkgZXhpc3QgZm9yIGFuIGFkZHJlc3MgdGhhdCBuZXZlciByZWdpc3RlcmVkIGl0c2VsZiIpCn0KCmZ1bmMgVGVzdFJlZ2lzdGVyX093bmVyRGVmYXVsdHNUb0NvbnRyYWN0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgdjEsICJ2YXVsdCIsICIiKQoKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHYxKSwgc3RyaW5nKGVudHJpZXNbdjFdLk93bmVyKSkKfQoKZnVuYyBUZXN0UmVnaXN0ZXJfRHVwbGljYXRlUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCB2MSwgInZhdWx0IiwgIiIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh2MSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiY29udHJhY3QgYWxyZWFkeSByZWdpc3RlcmVkOiAiK3N0cmluZyh2MSksCgkJZnVuYygpIHsgUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgInZhdWx0X2FnYWluIiwgIiIpIH0sCgkpCn0KCmZ1bmMgVGVzdFJlZ2lzdGVyX05hbWVWYWxpZGF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odjEpKQoKCWZvciBfLCBiYWQgOj0gcmFuZ2UgW11zdHJpbmd7IiIsICJWYXVsdCIsICJoYXMgc3BhY2UiLCAidGlja2BuYW1lIiwgc3RyaW5ncy5SZXBlYXQoImEiLCBNYXhOYW1lTGVuKzEpfSB7CgkJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsCgkJCSJuYW1lIG11c3QgYmUiLAoJCQlmdW5jKCkgeyBSZWdpc3Rlcihjcm9zcyhjdXIpLCBiYWQsICIiKSB9LAoJCSkKCX0KfQoKZnVuYyBUZXN0UmVnaXN0ZXJfSW52YWxpZE93bmVyUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh2MSkpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImludmFsaWQgb3duZXIgYWRkcmVzczoganVuayIsCgkJZnVuYygpIHsgUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgInZhdWx0IiwgYWRkcmVzcygianVuayIpKSB9LAoJKQp9CgovLyAtLS0tLS0tLS0tIERlcHJlY2F0ZSAtLS0tLS0tLS0tCgpmdW5jIFRlc3REZXByZWNhdGVfT3duZXJPbmx5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgdjEsICJ2YXVsdF92MSIsIHRlYW1FT0EpCglyZWdpc3RlcihjdXIsIHYyLCAidmF1bHRfdjIiLCB0ZWFtRU9BKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm9ubHkgdGhlIG93bmVyIGNhbiBkZXByZWNhdGUgdGhpcyBjb250cmFjdCIsCgkJZnVuYygpIHsgRGVwcmVjYXRlKGNyb3NzKGN1ciksIHYxLCB2MikgfSwKCSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlYW1FT0EpKQoJRGVwcmVjYXRlKGNyb3NzKGN1ciksIHYxLCB2MikKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHYyKSwgc3RyaW5nKEdldExhdGVzdCh2MSkpKQp9CgpmdW5jIFRlc3REZXByZWNhdGVfU3VjY2Vzc29yTXVzdEJlUmVnaXN0ZXJlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsIHYxLCAidmF1bHRfdjEiLCB0ZWFtRU9BKQoKCS8vIHRoZSBhdWRpdCdzIGRhbmdsaW5nLXN1Y2Nlc3NvciArIGZyb250LXJ1bm5pbmcgcm91dGU6IHBvaW50aW5nIGF0CgkvLyBhbiB1bnJlZ2lzdGVyZWQgYWRkcmVzcyBpcyByZWZ1c2VkIG91dHJpZ2h0LCBhbmQgYSBzdWNjZXNzb3IgZW50cnkKCS8vIGNhbiBvbmx5IGV2ZXIgYmUgY3JlYXRlZCBieSB0aGUgc3VjY2Vzc29yIGNvbnRyYWN0IGl0c2VsZgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJzdWNjZXNzb3IgaXMgbm90IGEgcmVnaXN0ZXJlZCBjb250cmFjdDogIitzdHJpbmcodjIpLAoJCWZ1bmMoKSB7IERlcHJlY2F0ZShjcm9zcyhjdXIpLCB2MSwgdjIpIH0sCgkpCn0KCmZ1bmMgVGVzdERlcHJlY2F0ZV9TZWxmQW5kRG91YmxlUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCB2MSwgInZhdWx0X3YxIiwgdGVhbUVPQSkKCXJlZ2lzdGVyKGN1ciwgdjIsICJ2YXVsdF92MiIsIHRlYW1FT0EpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJzdWNjZXNzb3IgY2Fubm90IGJlIHRoZSBjb250cmFjdCBpdHNlbGYiLAoJCWZ1bmMoKSB7IERlcHJlY2F0ZShjcm9zcyhjdXIpLCB2MSwgdjEpIH0sCgkpCglEZXByZWNhdGUoY3Jvc3MoY3VyKSwgdjEsIHYyKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNvbnRyYWN0IGlzIGFscmVhZHkgZGVwcmVjYXRlZCIsCgkJZnVuYygpIHsgRGVwcmVjYXRlKGNyb3NzKGN1ciksIHYxLCB2MikgfSwKCSkKfQoKZnVuYyBUZXN0RGVwcmVjYXRlX0NpcmN1bGFyQ2hhaW5SZWplY3RlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsIHYxLCAidmF1bHRfdjEiLCB0ZWFtRU9BKQoJcmVnaXN0ZXIoY3VyLCB2MiwgInZhdWx0X3YyIiwgdGVhbUVPQSkKCXJlZ2lzdGVyKGN1ciwgdjMsICJ2YXVsdF92MyIsIHRlYW1FT0EpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCURlcHJlY2F0ZShjcm9zcyhjdXIpLCB2MSwgdjIpCglEZXByZWNhdGUoY3Jvc3MoY3VyKSwgdjIsIHYzKQoKCS8vIGNsb3NpbmcgdGhlIGxvb3AgZnJvbSB0aGUgdGFpbCBtdXN0IGFib3J0Cgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiZGVwcmVjYXRpbmcgIitzdHJpbmcodjMpKyIgdG8gIitzdHJpbmcodjEpKyIgd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgbWlncmF0aW9uIGNoYWluIiwKCQlmdW5jKCkgeyBEZXByZWNhdGUoY3Jvc3MoY3VyKSwgdjMsIHYxKSB9LAoJKQp9CgovLyAtLS0tLS0tLS0tIGNoYWluIHF1ZXJpZXMgLS0tLS0tLS0tLQoKZnVuYyBUZXN0R2V0TGF0ZXN0X1dhbGtzQ2hhaW4oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCB2MSwgInZhdWx0X3YxIiwgdGVhbUVPQSkKCXJlZ2lzdGVyKGN1ciwgdjIsICJ2YXVsdF92MiIsIHRlYW1FT0EpCglyZWdpc3RlcihjdXIsIHYzLCAidmF1bHRfdjMiLCB0ZWFtRU9BKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVhbUVPQSkpCglEZXByZWNhdGUoY3Jvc3MoY3VyKSwgdjEsIHYyKQoJRGVwcmVjYXRlKGNyb3NzKGN1ciksIHYyLCB2MykKCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyh2MyksIHN0cmluZyhHZXRMYXRlc3QodjEpKSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHYzKSwgc3RyaW5nKEdldExhdGVzdCh2MikpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcodjMpLCBzdHJpbmcoR2V0TGF0ZXN0KHYzKSkpCgkvLyB1bmtub3duIGFkZHJlc3NlcyBjb21lIGJhY2sgdW5jaGFuZ2VkCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhhdHRhY2tlciksIHN0cmluZyhHZXRMYXRlc3QoYXR0YWNrZXIpKSkKfQoKZnVuYyBUZXN0R2V0TWlncmF0aW9uQ2hhaW4oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCB2MSwgInZhdWx0X3YxIiwgdGVhbUVPQSkKCXJlZ2lzdGVyKGN1ciwgdjIsICJ2YXVsdF92MiIsIHRlYW1FT0EpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCURlcHJlY2F0ZShjcm9zcyhjdXIpLCB2MSwgdjIpCgoJb3V0IDo9IEdldE1pZ3JhdGlvbkNoYWluKHYxKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAidmF1bHRfdjEiKSwgImNoYWluIG11c3QgbmFtZSB2MSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJbZGVwcmVjYXRlZF0iKSwgImNoYWluIG11c3QgdGFnIGRlcHJlY2F0aW9uIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInZhdWx0X3YyIiksICJjaGFpbiBtdXN0IG5hbWUgdjIiKQoJdWFzc2VydC5FcXVhbCh0LCAibm90IGZvdW5kOiAiK3N0cmluZyhhdHRhY2tlciksIEdldE1pZ3JhdGlvbkNoYWluKGF0dGFja2VyKSkKfQoKLy8gLS0tLS0tLS0tLSBUcmFuc2Zlck93bmVyc2hpcCAtLS0tLS0tLS0tCgpmdW5jIFRlc3RUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsIHYxLCAidmF1bHQiLCB0ZWFtRU9BKQoJbmV3T3duZXIgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJuZXdvd25lciIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgb3duZXIgY2FuIHRyYW5zZmVyIG93bmVyc2hpcCIsCgkJZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgdjEsIGF0dGFja2VyKSB9LAoJKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVhbUVPQSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiaW52YWxpZCBuZXcgb3duZXIgYWRkcmVzczoganVuayIsCgkJZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgdjEsIGFkZHJlc3MoImp1bmsiKSkgfSwKCSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHYxLCBuZXdPd25lcikKCS8vIG5vbWluYXRpb24gYWxvbmUgY2hhbmdlcyBub3RoaW5nICh0d28tc3RlcCkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHRlYW1FT0EpLCBzdHJpbmcoZW50cmllc1t2MV0uT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcodjEpLCBHZXRPd25lckNvbnRyYWN0cyh0ZWFtRU9BKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG5ld093bmVyKSkKCUFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG5ld093bmVyKSwgc3RyaW5nKGVudHJpZXNbdjFdLk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBHZXRPd25lckNvbnRyYWN0cyh0ZWFtRU9BKSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHYxKSwgR2V0T3duZXJDb250cmFjdHMobmV3T3duZXIpKQp9CgovLyAtLS0tLS0tLS0tIHJlbmRlciAtLS0tLS0tLS0tCgpmdW5jIFRlc3RSZW5kZXJfRW1wdHlTdGF0ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglvdXQgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuSGFzUHJlZml4KG91dCwgIiMgVXBncmFkZSBSZWdpc3RyeVxuXG4iKSwgImhlYWRpbmcgZmlyc3QiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuSGFzU3VmZml4KG91dCwgIk5vIGNvbnRyYWN0cyByZWdpc3RlcmVkLlxuIiksCgkJImVtcHR5IHN0YXRlIG11c3Qgc3RpbGwgc2F5IHRoZSByZWdpc3RyeSBpcyBlbXB0eSIpCgkvLyByb3VuZC00IGF1ZGl0OiB0aGUgc2NvcGUgZGlzY2xvc3VyZSBpcyBub3QgY29uZGl0aW9uYWwgb24gdGhlcmUgYmVpbmcKCS8vIGVudHJpZXMg4oCUIGFuIGVtcHR5IHBhZ2UgbXVzdCBub3QgcmVhZCBhcyBhbiBlbmRvcnNlbWVudC1mcmVlIHpvbmUuCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIqKk5hbWVzIGFyZSBub3QuKioiKSwKCQkidGhlIG5hbWUtc2NvcGUgZGlzY2xvc3VyZSBtdXN0IGFwcGVhciBldmVuIGluIHRoZSBlbXB0eSBzdGF0ZSIpCn0KCi8vIFRlc3RSZW5kZXJfQ2Fycmllc05hbWVTY29wZURpc2Nsb3N1cmUgaXMgdGhlIHJlZ3Jlc3Npb24gZ3VhcmQgZm9yIHRoZQovLyByb3VuZC00IGF1ZGl0IGZpbmRpbmcgdGhhdCBhbGwgdGhyZWUgcmV2aWV3IHBhc3NlcyByYWlzZWQ6IHRoZSByZW5kZXJlZAovLyBwYWdlIGdpdmVzIGEgc2VsZi1hc3NlcnRlZCBOQU1FIHRoZSBtb3N0IHZpc3VhbCB3ZWlnaHQgd2hpbGUgb25seSB0aGUKLy8gQUREUkVTUyBpcyBhY3R1YWxseSBwcm92ZW4uIE5hbWVzIGFyZSBkZWxpYmVyYXRlbHkgbmV2ZXIgbWFkZSB1bmlxdWUKLy8gKGZpcnN0LWNvbWUgdW5pcXVlbmVzcyBvbiBhbiBpbW11dGFibGUgcGVybWlzc2lvbmxlc3MgcmVnaXN0cnkgd291bGQgbGV0Ci8vIGFuIGF0dGFja2VyIGJ1cm4gZXZlcnkgdmFsdWFibGUgbmFtZSBmb3JldmVyKSwgc28gZGlzY2xvc2luZyB0aGUgc2NvcGUgaW4KLy8gdGhlIG91dHB1dCBpcyB0aGUgZW50aXJlIG1pdGlnYXRpb24uIEl0IGNhbm5vdCBiZSBhZGRlZCBhZnRlciBkZXBsb3kuCi8vCi8vIEVhY2ggYXNzZXJ0aW9uIGJlbG93IG5hbWVzIGEgZGlzdGluY3QgY2xhaW0sIHNvIGRlbGV0aW5nIG9yIHNvZnRlbmluZyBhbnkKLy8gb25lIG9mIHRoZW0gZmFpbHMgdGhpcyB0ZXN0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRlZ3JhZGluZyB0aGUgd2FybmluZy4KZnVuYyBUZXN0UmVuZGVyX0NhcnJpZXNOYW1lU2NvcGVEaXNjbG9zdXJlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgdjEsICJ2YXVsdF92MSIsIHRlYW1FT0EpCgoJLy8gVGhlIGltcGVyc29uYXRpb24gdGhpcyBkaXNjbG9zdXJlIGV4aXN0cyBmb3I6IGEgc2Vjb25kLCB1bnJlbGF0ZWQKCS8vIGFkZHJlc3MgcmVnaXN0ZXJpbmcgdGhlIFNBTUUgbmFtZSBpcyBwZXJtaXR0ZWQgYW5kIHJlbmRlcnMgZXF1YWxseS4KCXJlZ2lzdGVyKGN1ciwgYXR0YWNrZXIsICJ2YXVsdF92MSIsICIiKQoKCW91dCA6PSBSZW5kZXIoIiIpCglmb3IgXywgY2xhaW0gOj0gcmFuZ2UgW11zdHJpbmd7CgkJIj4gWyFOT1RFXSIsCgkJIkFkZHJlc3NlcyBhcmUgc2VsZi1yZWdpc3RlcmVkIGFuZCB0aGVyZWZvcmUgdmVyaWZpZWQiLAoJCSIqKk5hbWVzIGFyZSBub3QuKioiLAoJCSJOT1QgdW5pcXVlIiwKCQkibWF5IGltcGVyc29uYXRlIGFub3RoZXIgcHJvamVjdCIsCgkJImFkZHJlc3MsIG5ldmVyIGJ5IG5hbWUuIiwKCX0gewoJCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgY2xhaW0pLAoJCQkicmVuZGVyZWQgZGlzY2xvc3VyZSBtdXN0IGNhcnJ5IHRoZSBjbGFpbTogIitjbGFpbSkKCX0KCgkvLyBCb3RoIGR1cGxpY2F0ZS1uYW1lZCBlbnRyaWVzIHJlYWxseSBhcmUgcHJlc2VudCDigJQgdGhlIGRpc2Nsb3N1cmUgaXMKCS8vIGRlc2NyaWJpbmcgYSBsaXZlIGNvbmRpdGlvbiwgbm90IGEgaHlwb3RoZXRpY2FsIG9uZS4KCXVhc3NlcnQuRXF1YWwodCwgMiwgc3RyaW5ncy5Db3VudChvdXQsICIqKnZhdWx0X3YxKioiKSwKCQkiZHVwbGljYXRlIG5hbWVzIGFyZSBwZXJtaXR0ZWQgYW5kIGJvdGggbXVzdCByZW5kZXIiKQp9CgpmdW5jIFRlc3RSZW5kZXJfU2VjdGlvbnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCB2MSwgInZhdWx0X3YxIiwgdGVhbUVPQSkKCXJlZ2lzdGVyKGN1ciwgdjIsICJ2YXVsdF92MiIsIHRlYW1FT0EpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCURlcHJlY2F0ZShjcm9zcyhjdXIpLCB2MSwgdjIpCgoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIiMjIEFjdGl2ZSIpLCAiYWN0aXZlIHNlY3Rpb24iKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiIyMgRGVwcmVjYXRlZCIpLCAiZGVwcmVjYXRlZCBzZWN0aW9uIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIkRFUFJFQ0FURUQiKSwgImRlcHJlY2F0aW9uIGZsYWciKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCBzdHJpbmcodjIpKSwgInN1Y2Nlc3NvciBzaG93biIpCn0KCi8vIC0tLS0tLS0tLS0gcmUtYXVkaXQgcmVncmVzc2lvbnMgKDIwMjYtMDktMDIpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdE93bmVyTm9taW5hdGlvbl9SZXF1aXJlc0NvbnNlbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoKCS8vIHJlLWF1ZGl0IFAyOiByZWdpc3RlcmluZyB3aXRoIHNvbWVvbmUgZWxzZSdzIGFkZHJlc3MgYXMgb3duZXIgbXVzdAoJLy8gTk9UIGF0dGFjaCB0aGVtIOKAlCBubyBwb2xsdXRpb24gb2YgR2V0T3duZXJDb250cmFjdHMsIG5vIEdldEluZm8KCS8vIHNob3dpbmcgdGhlbSBhcyBvd25lciwgdW50aWwgdGhleSBhY2NlcHQKCXZpY3RpbSA6PSB0ZWFtRU9BCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCVJlZ2lzdGVyKGNyb3NzKGN1ciksICJnbm9zd2FwX3JvdXRlciIsIHZpY3RpbSkKCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhhdHRhY2tlciksIHN0cmluZyhlbnRyaWVzW2F0dGFja2VyXS5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsICJub25lIiwgR2V0T3duZXJDb250cmFjdHModmljdGltKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKEdldEluZm8oYXR0YWNrZXIpLCBzdHJpbmcoYXR0YWNrZXIpKSwKCQkiaW5mbyBtdXN0IHNob3cgdGhlIGNvbnRyYWN0IGl0c2VsZiBhcyBvd25lciBwcmUtYWNjZXB0YW5jZSIpCgoJLy8gb25seSB0aGUgbm9taW5lZSBjYW4gYWNjZXB0OyBhIGJ5c3RhbmRlciBjYW5ub3QKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3T3duZXJBZGRyKCkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIgb2YgIitzdHJpbmcoYXR0YWNrZXIpLAoJCWZ1bmMoKSB7IEFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBhdHRhY2tlcikgfSwKCSkKfQoKZnVuYyBuZXdPd25lckFkZHIoKSBhZGRyZXNzIHsKCXJldHVybiB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJ5c3RhbmRlciIpCn0KCmZ1bmMgVGVzdERlcHJlY2F0ZV9TdWNjZXNzb3JDb25zZW50UmVxdWlyZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCB2MSwgInZhdWx0IiwgdGVhbUVPQSkKCgkvLyByZS1hdWRpdCBQMjogYW4gYXR0YWNrZXIgY2hhaW5zIHRoZWlyIGVudHJ5IElOVE8gYSBsZWdpdCBjb250cmFjdCwKCS8vIGZvcmdpbmcgcHJlZGVjZXNzb3IgcHJvdmVuYW5jZSDigJQgcmVmdXNlZCB1bmxlc3MgdGhlIGNhbGxlciBvd25zCgkvLyB0aGUgc3VjY2Vzc29yIGVudHJ5IHRvbwoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCglSZWdpc3Rlcihjcm9zcyhjdXIpLCAidmF1bHRfdjFfb2xkIiwgIiIpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic3VjY2Vzc29yIGVudHJ5IGlzIG5vdCBvd25lZCBieSB0aGUgY2FsbGVyOiAiK3N0cmluZyh2MSksCgkJZnVuYygpIHsgRGVwcmVjYXRlKGNyb3NzKGN1ciksIGF0dGFja2VyLCB2MSkgfSwKCSkKfQoKZnVuYyBUZXN0TWlncmF0aW9uQ2hhaW5fTWFya3NUcnVuY2F0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCS8vIGJ1aWxkIGEgY2hhaW4gbG9uZ2VyIHRoYW4gTWF4Q2hhaW5MZW4gZW50aXJlbHkgdW5kZXIgb25lIG93bmVyCglwcmV2IDo9IGFkZHJlc3MoIiIpCglhZGRycyA6PSBtYWtlKFtdYWRkcmVzcywgTWF4Q2hhaW5MZW4rNSkKCWZvciBpIDo9IHJhbmdlIGFkZHJzIHsKCQlhZGRyc1tpXSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibGlua18iICsgc3RyY29udi5JdG9hKGkpKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRkcnNbaV0pKQoJCVJlZ2lzdGVyKGNyb3NzKGN1ciksICJsaW5rIiwgdGVhbUVPQSkKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlYW1FT0EpKQoJCUFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBhZGRyc1tpXSkKCQlpZiBwcmV2ICE9ICIiIHsKCQkJRGVwcmVjYXRlKGNyb3NzKGN1ciksIHByZXYsIGFkZHJzW2ldKQoJCX0KCQlwcmV2ID0gYWRkcnNbaV0KCX0KCglvdXQgOj0gR2V0TWlncmF0aW9uQ2hhaW4oYWRkcnNbMF0pCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJ0cnVuY2F0ZWQiKSwKCQkib3Zlci1sZW5ndGggY2hhaW5zIG11c3QgY2FycnkgYW4gZXhwbGljaXQgdHJ1bmNhdGlvbiBtYXJrZXIiKQoJLy8gR2V0TGF0ZXN0IHN0aWxsIHJlc29sdmVzIHRoZSB0cnVlIGVuZHBvaW50Cgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhhZGRyc1tsZW4oYWRkcnMpLTFdKSwgc3RyaW5nKEdldExhdGVzdChhZGRyc1swXSkpKQp9CgpmdW5jIFRlc3RUcmFuc2Zlck5vbWluYXRpb25fQ2FuQmVDbGVhcmVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgdjEsICJ2YXVsdCIsIHRlYW1FT0EpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHYxLCBhdHRhY2tlcikKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIHYxLCAiIikKCgkvLyByb3VuZC00IGF1ZGl0IEwyOiBjbGVhcmluZyBhZ2FpbiBpcyBhIHB1cmUgbm8tb3AsIGFuZCB0aGUgZW1pdHRlZAoJLy8gZXZlbnQgaXMgbm93IHN1cHByZXNzZWQgZm9yIGl0LiBUaGUgcmV0dXJuIHZhbHVlIGFuZCB0aGUgc3RhdGUgYXJlCgkvLyB1bmNoYW5nZWQgZWl0aGVyIHdheSwgd2hpY2ggaXMgYWxsIGEgdW5pdCB0ZXN0IGNhbiBvYnNlcnZlIGhlcmUgLS0KCS8vIHRoaXMgdG9vbGNoYWluJ3MgdGVzdGluZyBzdGRsaWIgY2FycmllcyBubyBldmVudHMgYWNjZXNzb3IuIFRoYXQgdGhlCgkvLyBzZWNvbmQgY2xlYXIgZW1pdHMgTk9USElORyBpcyBhc3NlcnRlZCBleHRlcm5hbGx5IGJ5CgkvLyB0b29scy90ZXN0X3VwZ3JhZGVfcmVnaXN0cnlfZXZlbnRzLnNoLCB3aGljaCBjb3VudHMgdGhlIGV2ZW50cwoJLy8gYGdubyB0ZXN0IC1wcmludC1ldmVudHNgIHByaW50cyBmb3IgdGhpcyB2ZXJ5IHN1aXRlLgoJdWFzc2VydC5FcXVhbCh0LCAicGVuZGluZyBvd25lcnNoaXAgbm9taW5hdGlvbiBjbGVhcmVkIiwKCQlUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSwgIiIpKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgc3RyaW5nKG11c3RHZXQodjEpLlBlbmRpbmdPd25lcikpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiY2FsbGVyIGlzIG5vdCB0aGUgcGVuZGluZyBvd25lciBvZiAiK3N0cmluZyh2MSksCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIHYxKSB9LAoJKQp9CgovLyAtLS0tLS0tLS0tIHJvdW5kLTMgYXVkaXQgcmVncmVzc2lvbnMgKDIwMjYtMDktMDIpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFJlbmRlckxhdGVzdF9FeGFjdEJ1ZGdldENoYWluSXNDb21wbGV0ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgkvLyBleGFjdGx5IFJlbmRlckxhdGVzdEhvcHMgZGVwcmVjYXRlZCBob3BzICsgdGVybWluYWwgZW5kcG9pbnQ6CgkvLyB0aGUgd2FsayBtdXN0IGJlIHJlcG9ydGVkIENPTVBMRVRFIChyb3VuZC0zIG9mZi1ieS1vbmUpCgluIDo9IFJlbmRlckxhdGVzdEhvcHMgKyAxCglhZGRycyA6PSBtYWtlKFtdYWRkcmVzcywgbikKCWZvciBpIDo9IHJhbmdlIGFkZHJzIHsKCQlhZGRyc1tpXSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiaG9wXyIgKyBzdHJjb252Lkl0b2EoaSkpCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZGRyc1tpXSkpCgkJUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgImhvcCIsIHRlYW1FT0EpCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCQlBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgYWRkcnNbaV0pCgkJaWYgaSA+IDAgewoJCQlEZXByZWNhdGUoY3Jvc3MoY3VyKSwgYWRkcnNbaS0xXSwgYWRkcnNbaV0pCgkJfQoJfQoJbGF0ZXN0LCBjb21wbGV0ZSA6PSByZW5kZXJMYXRlc3QoYWRkcnNbMF0pCgl1YXNzZXJ0LlRydWUodCwgY29tcGxldGUsICJhbiBleGFjdGx5LWJ1ZGdldCBjaGFpbiBtdXN0IGJlIGNvbXBsZXRlIikKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGFkZHJzW24tMV0pLCBzdHJpbmcobGF0ZXN0KSkKfQoKLy8gLS0tLS0tLS0tLSBhdWRpdCBnYXAgY2xvc3VyZXMgKDIwMjYtMDktMjEsIGFwcHMtcGlwZWxpbmUgcm91bmQpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdFN0cmF5U2VuZFJlamVjdGVkRXZlcnl3aGVyZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsIHYxLCAidmF1bHQiLCB0ZWFtRU9BKQoKCS8vIGF1ZGl0IFkyOiB0aGUgcmVhbG0gaG9sZHMgbm8gYmFua2VyLCBzbyBhdHRhY2hlZCBjb2lucyB3b3VsZAoJLy8gc3RyYW5kIGZvcmV2ZXIg4oCUIGV2ZXJ5IGNyb3NzaW5nIGZ1bmN0aW9uIG11c3QgYWJvcnQgdGhlbQoJbXNnIDo9ICJ0aGlzIHJlYWxtIGRvZXMgbm90IGFjY2VwdCBjb2lucyIKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVhbUVPQSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e0Rlbm9tOiAidWdub3QiLCBBbW91bnQ6IDV9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFJlZ2lzdGVyKGNyb3NzKGN1ciksICJwYWlkIiwgIiIpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgdjEpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSwgYXR0YWNrZXIpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBEZXByZWNhdGUoY3Jvc3MoY3VyKSwgdjEsIHYyKSB9KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKfQoKZnVuYyBUZXN0RGVwcmVjYXRlX0JvdW5kZWRXYWxrUmVmdXNhbChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgkvLyBhdWRpdCBZNS4xOiB0aGUgcm91bmQtMyBib3VuZGVkLXdhbGsgcGFuaWMgaGFkIHplcm8gY292ZXJhZ2UuCgkvLyBCdWlsZCBhIGNoYWluIGxvbmdlciB0aGFuIE1heENoYWluTGVuLCB0aGVuIHBvaW50IGEgZnJlc2ggZW50cnkKCS8vIGF0IGl0cyBoZWFkIOKAlCB0aGUgdmVyaWZpY2F0aW9uIHdhbGsgbXVzdCByZWZ1c2UsIG5vdCB3YWxrIGl0LgoJcHJldiA6PSBhZGRyZXNzKCIiKQoJYWRkcnMgOj0gbWFrZShbXWFkZHJlc3MsIE1heENoYWluTGVuKzUpCglmb3IgaSA6PSByYW5nZSBhZGRycyB7CgkJYWRkcnNbaV0gPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJ3XyIgKyBzdHJjb252Lkl0b2EoaSkpCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZGRyc1tpXSkpCgkJUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgImxpbmsiLCB0ZWFtRU9BKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVhbUVPQSkpCgkJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGFkZHJzW2ldKQoJCWlmIHByZXYgIT0gIiIgewoJCQlEZXByZWNhdGUoY3Jvc3MoY3VyKSwgcHJldiwgYWRkcnNbaV0pCgkJfQoJCXByZXYgPSBhZGRyc1tpXQoJfQoJZnJlc2ggOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJid19mcmVzaCIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZyZXNoKSkKCVJlZ2lzdGVyKGNyb3NzKGN1ciksICJmcmVzaCIsIHRlYW1FT0EpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlYW1FT0EpKQoJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGZyZXNoKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInN1Y2Nlc3NvciBjaGFpbiB0b28gbG9uZyB0byB2ZXJpZnk7IGNhbm5vdCBkZXByZWNhdGUiLAoJCWZ1bmMoKSB7IERlcHJlY2F0ZShjcm9zcyhjdXIpLCBmcmVzaCwgYWRkcnNbMF0pIH0sCgkpCn0KCmZ1bmMgVGVzdFJlbmRlckxhdGVzdF9Mb25nQ2hhaW5NYXJrZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJLy8gYXVkaXQgWTUuMjogdGhlIGluY29tcGxldGUgYnJhbmNoIGFuZCBSZW5kZXIncyBsb25nLWNoYWluIG1hcmtlcgoJLy8gd2VyZSB1bnRlc3RlZC4gQnVkZ2V0LWJvdW5kYXJ5IG5vZGUgbXVzdCBiZSBOT04tdGVybWluYWwgaGVyZS4KCW4gOj0gUmVuZGVyTGF0ZXN0SG9wcyArIDMKCWFkZHJzIDo9IG1ha2UoW11hZGRyZXNzLCBuKQoJZm9yIGkgOj0gcmFuZ2UgYWRkcnMgewoJCWFkZHJzW2ldID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJsY18iICsgc3RyY29udi5JdG9hKGkpKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRkcnNbaV0pKQoJCVJlZ2lzdGVyKGNyb3NzKGN1ciksICJob3AiLCB0ZWFtRU9BKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVhbUVPQSkpCgkJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGFkZHJzW2ldKQoJCWlmIGkgPiAwIHsKCQkJRGVwcmVjYXRlKGNyb3NzKGN1ciksIGFkZHJzW2ktMV0sIGFkZHJzW2ldKQoJCX0KCX0KCV8sIGNvbXBsZXRlIDo9IHJlbmRlckxhdGVzdChhZGRyc1swXSkKCXVhc3NlcnQuRmFsc2UodCwgY29tcGxldGUsICJhbiBvdmVyLWJ1ZGdldCBjaGFpbiBtdXN0IGJlIHJlcG9ydGVkIGluY29tcGxldGUiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCIiKSwgIihsb25nIGNoYWluOyB1c2UgR2V0TGF0ZXN0KSIpLAoJCSJyZW5kZXIgbXVzdCBtYXJrIG92ZXItYnVkZ2V0IGNoYWlucyBpbnN0ZWFkIG9mIG1pc2xhYmVsaW5nIGFuIGVuZHBvaW50IikKfQoKZnVuYyBUZXN0UmVuZGVyX1BhZ2luYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJLy8gYXVkaXQgWTUuMzogdGhlIE1heFJlbmRlckVudHJpZXMgd2luZG93IHdhcyB1bnRlc3RlZAoJZm9yIGkgOj0gMDsgaSA8IE1heFJlbmRlckVudHJpZXMrNTsgaSsrIHsKCQlhIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygicGdfIiArIHN0cmNvbnYuSXRvYShpKSkKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGEpKQoJCVJlZ2lzdGVyKGNyb3NzKGN1ciksICJlbnRyeSIsICIiKQoJfQoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwKCQkiX1Nob3dpbmcgdGhlIG1vc3QgcmVjZW50ICIrc3RyY29udi5JdG9hKE1heFJlbmRlckVudHJpZXMpKyIgZW50cmllcyBvZiAiKwoJCQlzdHJjb252Lkl0b2EoTWF4UmVuZGVyRW50cmllcys1KSsiLiIpLAoJCSJvdmVyLXdpbmRvdyByZWdpc3RyaWVzIG11c3QgYW5ub3VuY2UgdGhlIHdpbmRvdyBBTkQgdGhlIHRydWUgdG90YWwiKQoJLy8gcm91bmQtNCBhdWRpdDogYW5ub3VuY2luZyB0aGUgd2luZG93IGlzIG5vdCBlbm91Z2ggb24gYW4gaW1tdXRhYmxlCgkvLyByZWFsbSDigJQgdGhlIHBhZ2UgbXVzdCBhbHNvIHNheSB3aGVyZSB0aGUgdW5saXN0ZWQgZW50cmllcyB3ZW50LCBzaW5jZQoJLy8gYSBmbG9vZCBvZiBuZXcgZW50cmllcyBldmljdHMgb2xkZXIgb25lcyBmcm9tIHRoaXMgdmlldyBwZXJtYW5lbnRseS4KCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInJlbWFpbiBxdWVyeWFibGUgYnkgYWRkcmVzcyB2aWEgR2V0SW5mbyIpLAoJCSJ0aGUgZXZpY3Rpb24gbm90aWNlIG11c3QgcG9pbnQgYXQgdGhlIGFjY2Vzc29ycyB0aGF0IHN0aWxsIHNlcnZlIHRoZW0iKQp9CgpmdW5jIFRlc3RSZW5vbWluYXRpb25fT3ZlcndyaXRlc1ByaW9yKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgdjEsICJ2YXVsdCIsIHRlYW1FT0EpCglhIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibm9taW5lZV9hIikKCWIgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJub21pbmVlX2IiKQoKCS8vIGF1ZGl0IFk1LjQ6IGEgbmV3ZXIgbm9taW5hdGlvbiBtdXN0IHJldm9rZSB0aGUgb2xkZXIgb25lCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlYW1FT0EpKQoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgdjEsIGEpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSwgYikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiY2FsbGVyIGlzIG5vdCB0aGUgcGVuZGluZyBvd25lciBvZiAiK3N0cmluZyh2MSksCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIHYxKSB9LAoJKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiKSkKCUFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGIpLCBzdHJpbmcoZW50cmllc1t2MV0uT3duZXIpKQp9CgpmdW5jIFRlc3RTZWxmTm9taW5hdGlvbkFjY2VwdEtlZXBzSW5kZXhDbGVhbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsIHYxLCAidmF1bHQiLCB0ZWFtRU9BKQoKCS8vIGF1ZGl0IFk1LjU6IG93bmVyIG5vbWluYXRpbmcgdGhlbXNlbHZlcyBhbmQgYWNjZXB0aW5nIG11c3Qgbm90CgkvLyBkdXBsaWNhdGUgb3IgbG9zZSB0aGUgb3duZXJDb250cmFjdHMgaW5kZXggZW50cnkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVhbUVPQSkpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSwgdGVhbUVPQSkKCUFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCB2MSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKHRlYW1FT0EpLCBzdHJpbmcoZW50cmllc1t2MV0uT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcodjEpLCBHZXRPd25lckNvbnRyYWN0cyh0ZWFtRU9BKSkKfQoKZnVuYyBUZXN0T3BzT25VbnJlZ2lzdGVyZWRBYm9ydChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgkvLyBhdWRpdCBZNS42OiB0aGUgbm90LWZvdW5kIGFib3J0cyB3ZXJlIG5ldmVyIGFzc2VydGVkCglnaG9zdCA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImdob3N0IikKCW1zZyA6PSAiY29udHJhY3Qgbm90IGZvdW5kOiAiICsgc3RyaW5nKGdob3N0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZWFtRU9BKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBnaG9zdCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGdob3N0LCB0ZWFtRU9BKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgRGVwcmVjYXRlKGNyb3NzKGN1ciksIGdob3N0LCB2MSkgfSkKCS8vIEdldEluZm8gc2hhcmVzIG11c3RHZXQgd2l0aCB0aGUgdGhyZWUgY3Jvc3NpbmcgcGF0aHMgYWJvdmU7IGl0cwoJLy8gc2FtZS1yZWFsbSBwYW5pYyBpcyBub3QgY2F0Y2hhYmxlIGJ5IHRoZSByZXZpdmUtYmFzZWQgQWJvcnRzIGhlbHBlcnMKfQoKZnVuYyBUZXN0UmVnaXN0ZXJfT3duZXJFcXVhbHNTZWxmTm9QZW5kaW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCS8vIGF1ZGl0IFk1Ljc6IHJlZ2lzdGVyaW5nIHdpdGggeW91ciBvd24gYWRkcmVzcyBhcyBvd25lciBtdXN0IGxlYXZlCgkvLyBubyBwZW5kaW5nIG5vbWluYXRpb24gKHRoZSBleHBsaWNpdCBvd25lcj09Y29udHJhY3RBZGRyIGJyYW5jaCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odjEpKQoJUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgInZhdWx0IiwgdjEpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyh2MSksIHN0cmluZyhlbnRyaWVzW3YxXS5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBzdHJpbmcoZW50cmllc1t2MV0uUGVuZGluZ093bmVyKSkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQKzoF7+FwS7KCcK3NGTmM5LrbYgvWy98iPVAVQU/YNHSGFcOUYWU0Pcv/DwPx84ynQ8eJfrMsnsCQBnuoBnJ6dMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=