Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
2C40C73405C2C65AD1313282B2694B34332420AD5E2E17D6506C5203315C115E
Transaction overview
Execution summary
TX INDEX
1
Position in block
GAS WANTED
100,000,000
Requested gas limit
GAS USED
30,380,713
Gas consumed
FEE
1000000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1v7s3j506wqul2zwt90awgjphpx4ztwga0926f720000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvK1AQoML3ZtLm1fYWRkcGtnEuC1AQooZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNxKjtQEKB2dub2RyYXcSPmduby5sYW5kL3IvZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNy9nbm9kcmF3L3YwGpAJCglSRUFETUUubWQSggkjIGdub2RyYXcKClJlYWxtIGBnbm8ubGFuZC9yL2cxdjdzM2o1MDZ3cXVsMnp3dDkwYXdnanBocHg0enR3Z2EwOTI2ZjcvZ25vZHJhdy92MGA6IGEgMTI1MCB4IDgwMCAob25lIG1pbGxpb24gcGl4ZWxzLCAxNjoxMCkgcGF5LXBlci1waXhlbCBjYW52YXMKYnVpbHQgb24gYGduby5sYW5kL3AvZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNy9jYW52YXMvdjBgLgoKUGFpbnQgZnJvbSB0aGUgQ0xJOgoKYGBgc2gKZ25va2V5IG1ha2V0eCBjYWxsIC1wa2dwYXRoIGduby5sYW5kL3IvZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNy9nbm9kcmF3L3YwIC1mdW5jIFBhaW50QmF0Y2ggXAogIC1hcmdzICIxMCwxMCw2OzExLDEwLDYiIC1zZW5kIDEwMDAwMHVnbm90IFwKICAtZ2FzLWZlZSAxMDAwMDAwdWdub3QgLWdhcy13YW50ZWQgNTAwMDAwMCAtYnJvYWRjYXN0IC1jaGFpbmlkIGRldiAtcmVtb3RlIDEyNy4wLjAuMToyNjY1NyA8a2V5PgpgYGAKClRoZSBhbW91bnQgc2VudCBtdXN0IGVxdWFsIGBQcmljZSgpYCB0aW1lcyB0aGUgbnVtYmVyIG9mIHBpeGVscywgYW5kIHRoZQpjYWxsIG11c3QgY29tZSBkaXJlY3RseSBmcm9tIGEgdXNlciB0cmFuc2FjdGlvbi4gUGF5bWVudHMgYXJlIGZvcndhcmRlZCB0bwp0aGUgYWRtaW4gd2FsbGV0IChgT3duZXIoKWApIGFzIHRoZXkgYXJyaXZlOyB0aGUgYWRtaW4gcGFpbnRzIGZvciBmcmVlIGFuZApjYW4gYFNldFByaWNlYCwgYFNldE1heEJhdGNoYCwgYFdpdGhkcmF3YCBhbmQgYFRyYW5zZmVyT3duZXJzaGlwYCAoYWxsIHBhcmFtcyBhcmUgb3duZXItc2V0dGFibGUgYXQgcnVudGltZSkuIFJlYWQgZnVuY3Rpb25zIHVzZWQgYnkgY2xpZW50czoKYEdldFdpZHRoYCwgYEdldEhlaWdodGAsIGBQcmljZWAsIGBQYWxldHRlYCwgYE1heEJhdGNoU2l6ZWAsIGBQYWludGVkYCwKYFBpeGVsKHgsIHkpYCwgYFJvd3MoZnJvbSwgdG8pYCwgYFZlcnNpb24oKWAsIGBEaXJ0eVJvd3Moc2luY2UpYC4KCmBWZXJzaW9uKClgIGNvdW50cyBzdWNjZXNzZnVsIHBhaW50IGNhbGxzIGFuZCBgRGlydHlSb3dzKHNpbmNlKWAgbGlzdHMgdGhlCnJvd3MgdG91Y2hlZCBhZnRlciB0aGF0IHZlcnNpb24sIHNvIGNsaWVudHMgZmV0Y2ggb25seSB3aGF0IGNoYW5nZWQuChrNSwoLZ25vZHJhdy5nbm8SvUsvLyBQYWNrYWdlIGdub2RyYXcgaXMgYSBwYXktcGVyLXBpeGVsIGNvbGxhYm9yYXRpdmUgY2FudmFzOiBhbnlvbmUgY2FuIHBhaW50Ci8vIGFueSBwaXhlbCBvZiBhIFdpZHRoIHggSGVpZ2h0IGdyaWQgaW4gb25lIG9mIDE1IGNvbG9ycyBieSBzZW5kaW5nIGV4YWN0bHkKLy8gUHJpY2UoKSB1Z25vdCBwZXIgcGl4ZWwgYWxvbmcgd2l0aCB0aGUgY2FsbC4gUGl4ZWxzIGNhbiBiZSByZXBhaW50ZWQgYnkKLy8gYW55b25lLCBmb3IgdGhlIHNhbWUgcHJpY2UuIFBheW1lbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGFkbWluIHdhbGxldAovLyBhcyB0aGV5IGFycml2ZSwgYW5kIHRoZSBhZG1pbiBwYWludHMgZm9yIGZyZWUuCi8vCi8vIFRoZSBncmlkIGxvZ2ljIGxpdmVzIGluIGduby5sYW5kL3AvZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNy9jYW52YXMvdjA7IHRoaXMgcmVhbG0gYWRkcyB0aGUKLy8gcGF5bWVudCBndWFyZCwgdGhlIG93bmVyIGNvbnRyb2xzIGFuZCB0aGUgcmVhZCBBUEkgdXNlZCBieSB0aGUgd2ViIGNsaWVudC4KcGFja2FnZSBnbm9kcmF3CgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNy9jYW52YXMvdjAiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCgkvLyBXaWR0aCBhbmQgSGVpZ2h0IGFyZSBmaXhlZCBmb3IgdGhlIGxpZmUgb2YgdGhpcyB2ZXJzaW9uOiBjaGFuZ2luZwoJLy8gdGhlbSB3b3VsZCBjaGFuZ2UgdGhlIHN0b3JhZ2UgbGF5b3V0LCBzbyBpdCBtZWFucyBhIG5ldyAvdk4uCgkvLyAxMjUwIHggODAwIGlzIG9uZSBtaWxsaW9uIHBpeGVscyBpbiBhIDE2OjEwIGxhcHRvcCBhc3BlY3QgcmF0aW8uCglXaWR0aCAgPSAxMjUwCglIZWlnaHQgPSA4MDAKCgkvLyBEZWZhdWx0TWF4QmF0Y2ggYm91bmRzIGEgc2luZ2xlIFBhaW50QmF0Y2ggY2FsbCBzbyBvbmUgdHggY2Fubm90IGJsb3cKCS8vIHRoZSBibG9jayBnYXMgbGltaXQgb3Igb3ZlcmZsb3cgdGhlIHByaWNlIGFyaXRobWV0aWMuIFRoZSBvd25lciBjYW4KCS8vIGNoYW5nZSBpdCBhdCBydW50aW1lIHdpdGggU2V0TWF4QmF0Y2gsIHVwIHRvIEhhcmRNYXhCYXRjaC4KCURlZmF1bHRNYXhCYXRjaCA9IDUwMDAKCUhhcmRNYXhCYXRjaCAgICA9IDIwMDAwCgoJLy8gRGVmYXVsdFByaWNlIGlzIHRoZSBpbml0aWFsIHByaWNlIHBlciBwaXhlbCwgaW4gdWdub3QgKDAuMDUgR05PVCkuCglEZWZhdWx0UHJpY2UgaW50NjQgPSA1MF8wMDAKCgkvLyBEZWZhdWx0QWRtaW4gcmVjZWl2ZXMgZXZlcnkgcGF5bWVudCwgcGFpbnRzIGZvciBmcmVlIGFuZCBob2xkcyB0aGUKCS8vIG93bmVyIGNvbnRyb2xzLiBDaGFuZ2UgaXQgYmVmb3JlIGRlcGxveWluZzsgVHJhbnNmZXJPd25lcnNoaXAgbW92ZXMKCS8vIGl0IGFmdGVyd2FyZHMuCglEZWZhdWx0QWRtaW4gPSAiZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNyIKCglEZW5vbSA9ICJ1Z25vdCIKKQoKdmFyICgKCWJvYXJkICAgID0gY2FudmFzLk5ldyhXaWR0aCwgSGVpZ2h0KQoJcHJpY2UgICAgPSBEZWZhdWx0UHJpY2UKCW1heEJhdGNoID0gRGVmYXVsdE1heEJhdGNoCglvd25lciAgICA9IGFkZHJlc3MoRGVmYXVsdEFkbWluKQoKCS8vIFN0YXRzLgoJcmV2ZW51ZSBpbnQ2NCAvLyB0b3RhbCB1Z25vdCBldmVyIHBhaWQgZm9yIHBpeGVscwoJcGFpbnRzICBpbnQ2NCAvLyBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBQYWludC9QYWludEJhdGNoIGNhbGxzCgoJLy8gQ2hhbmdlIHRyYWNraW5nLCBzbyBjbGllbnRzIGZldGNoIG9ubHkgdGhlIHJvd3MgdGhhdCBtb3ZlZC4KCS8vIHZlcnNpb24gYnVtcHMgb25jZSBwZXIgc3VjY2Vzc2Z1bCBwYWludCBjYWxsOyByb3dWZXJzaW9uIGhvbGRzIHRoZQoJLy8gdmVyc2lvbiBvZiB0aGUgbGFzdCBwYWludCB0aGF0IHRvdWNoZWQgZWFjaCByb3cgKDAgPSBuZXZlciBwYWludGVkKS4KCXZlcnNpb24gICAgaW50NjQKCXJvd1ZlcnNpb24gPSBtYWtlKFtdaW50NjQsIEhlaWdodCkKKQoKLy8gUGFpbnQgY29sb3JzIG9uZSBwaXhlbC4gU2VuZCBleGFjdGx5IFByaWNlKCkgdWdub3QgKG5vdGhpbmcgZm9yIHRoZSBhZG1pbikuCmZ1bmMgUGFpbnQoY3VyIHJlYWxtLCB4LCB5LCBjb2xvciBpbnQpIHsKCWlmIGNvbG9yIDw9IDAgfHwgY29sb3IgPiBpbnQoY2FudmFzLk1heENvbG9yKSB7CgkJcGFuaWMoY2FudmFzLkVyckludmFsaWRDb2xvcikKCX0KCXBhaW50KFtdY2FudmFzLlBpeGVse3tYOiB4LCBZOiB5LCBDb2xvcjogYnl0ZShjb2xvcil9fSwgY3VyKQp9CgovLyBQYWludEJhdGNoIGNvbG9ycyB1cCB0byBNYXhCYXRjaFNpemUoKSBwaXhlbHMgaW4gb25lIGNhbGwuIFRoZSBhcmd1bWVudCBpcwovLyAieCx5LGNvbG9yO3gseSxjb2xvcjsuLi4iLiBTZW5kIGV4YWN0bHkgUHJpY2UoKSAqIGNvdW50IHVnbm90IChub3RoaW5nCi8vIGZvciB0aGUgYWRtaW4pLgpmdW5jIFBhaW50QmF0Y2goY3VyIHJlYWxtLCBwaXhlbHMgc3RyaW5nKSB7CglweCwgZXJyIDo9IGNhbnZhcy5QYXJzZVBpeGVscyhwaXhlbHMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglwYWludChweCwgY3VyKQp9CgovLyBwYWludCB0YWtlcyB0aGUgcmVhbG0gYXMgaXRzIExBU1QgcGFyYW1ldGVyIG9uIHB1cnBvc2U6IGEgcmVhbG0gZmlyc3QKLy8gcGFyYW1ldGVyIHdvdWxkIG1ha2UgaXQgYSBjcm9zc2luZyBmdW5jdGlvbiBhbmQgUHJldmlvdXMoKSB3b3VsZCB0aGVuCi8vIGJlIHRoaXMgcmVhbG0gaW5zdGVhZCBvZiB0aGUgdXNlci4KZnVuYyBwYWludChweCBbXWNhbnZhcy5QaXhlbCwgcmxtIHJlYWxtKSB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlwYW5pYygic3Bvb2ZlZCByZWFsbSIpCgl9CgkvLyBQYXltZW50IGd1YXJkOiB1bnNhZmUuT3JpZ2luU2VuZCgpIGRlc2NyaWJlcyB0aGUgY29pbnMgYXR0YWNoZWQgdG8KCS8vIHRoZSB0cmFuc2FjdGlvbiwgd2hpY2ggb25seSBwcm92YWJseSBsYW5kZWQgaGVyZSB3aGVuIHRoZSBjYWxsZXIgaXMKCS8vIGEgcGxhaW4gdXNlciBjYWxsIChubyBpbnRlcm1lZGlhdGUgb3IgZXBoZW1lcmFsIHJlYWxtKS4gS2VlcCB0aGUgdHdvCgkvLyBjaGVja3MgdG9nZXRoZXIuIHVuc2FmZSBpcyBpbXBvcnRlZCBmb3IgT3JpZ2luU2VuZCBvbmx5OyBjYWxsZXIKCS8vIGlkZW50aXR5IGFsd2F5cyBjb21lcyBmcm9tIHRoZSByZWFsbSBoYW5kbGUuCglpZiAhcmxtLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygibXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYSB1c2VyIChtYWtldHggY2FsbCkiKQoJfQoJcGFpbnRlciA6PSBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkKCW4gOj0gbGVuKHB4KQoJaWYgbiA9PSAwIHsKCQlwYW5pYygibm90aGluZyB0byBwYWludCIpCgl9CglpZiBuID4gbWF4QmF0Y2ggewoJCXBhbmljKHVmbXQuU3ByaW50ZigidG9vIG1hbnkgcGl4ZWxzOiAlZCA+ICVkIiwgbiwgbWF4QmF0Y2gpKQoJfQoJZm9yIF8sIHAgOj0gcmFuZ2UgcHggewoJCWlmIGVyciA6PSBib2FyZC5DaGVjayhwKTsgZXJyICE9IG5pbCB7CgkJCXBhbmljKGVycikKCQl9Cgl9CgoJY29zdCA6PSBwcmljZSAqIGludDY0KG4pCglpZiBwYWludGVyID09IG93bmVyIHsKCQljb3N0ID0gMCAvLyB0aGUgYWRtaW4gcGFpbnRzIGZvciBmcmVlCgl9CglpZiBzZW50IDo9IHNlbnRVZ25vdCh1bnNhZmUuT3JpZ2luU2VuZCgpKTsgc2VudCAhPSBjb3N0IHsKCQlwYW5pYyh1Zm10LlNwcmludGYoIm11c3Qgc2VuZCBleGFjdGx5ICVkJXMgZm9yICVkIHBpeGVsKHMpLCBnb3QgJWQlcyIsIGNvc3QsIERlbm9tLCBuLCBzZW50LCBEZW5vbSkpCgl9CglpZiBjb3N0ID4gMCB7CgkJLy8gRm9yd2FyZCB0aGUgcGF5bWVudCB0byB0aGUgYWRtaW4gcmlnaHQgYXdheSwgc28gbm90aGluZwoJCS8vIGFjY3VtdWxhdGVzIGluIHRoZSByZWFsbS4gQmFua2VyVHlwZU9yaWdpblNlbmQgY2FuIG9ubHkgbW92ZQoJCS8vIHdoYXQgdGhpcyB2ZXJ5IG1lc3NhZ2Ugc2VudCwgd2hpY2ggaXMgZXhhY3RseSBjb3N0LgoJCWJuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlT3JpZ2luU2VuZCwgcmxtKQoJCWJuay5TZW5kQ29pbnMocmxtLkFkZHJlc3MoKSwgb3duZXIsIGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oRGVub20sIGNvc3QpKSkKCX0KCgl2ZXJzaW9uKysKCWZvciBfLCBwIDo9IHJhbmdlIHB4IHsKCQlib2FyZC5TZXQocCkKCQlyb3dWZXJzaW9uW3AuWV0gPSB2ZXJzaW9uCgl9CglyZXZlbnVlICs9IGNvc3QKCXBhaW50cysrCgoJLy8gVGhlIHBpeGVsIGxpc3QgaXRzZWxmIGlzIG5vdCBlbWl0dGVkOiBldmVudCBhdHRyaWJ1dGUgdmFsdWVzIGFyZQoJLy8gc2l6ZS1jYXBwZWQgYnkgdGhlIG5vZGUgYW5kIGEgZnVsbCBiYXRjaCBleGNlZWRzIGl0LiBDbGllbnRzIHJlLXJlYWQKCS8vIFJvd3MoKSBhZnRlciBhIHBhaW50LgoJY2hhaW4uRW1pdCgiUGFpbnQiLAoJCSJwYWludGVyIiwgcGFpbnRlci5TdHJpbmcoKSwKCQkiY291bnQiLCBzdHJjb252Lkl0b2EobiksCgkJInBhaWQiLCBzdHJjb252Lkl0b2EoaW50KGNvc3QpKStEZW5vbSwKCSkKfQoKLy8gc2VudFVnbm90IHJldHVybnMgdGhlIHVnbm90IGFtb3VudCBpbiBjb2lucyBhbmQgcmVqZWN0cyBhbnkgb3RoZXIgZGVub20sCi8vIHNvIGEgY2FsbGVyIGNhbm5vdCBwYXkgd2l0aCBzb21ldGhpbmcgdGhlIHJlYWxtIGRvZXMgbm90IHByaWNlLgpmdW5jIHNlbnRVZ25vdChjb2lucyBjaGFpbi5Db2lucykgaW50NjQgewoJdmFyIGFtb3VudCBpbnQ2NAoJZm9yIF8sIGMgOj0gcmFuZ2UgY29pbnMgewoJCWlmIGMuRGVub20gIT0gRGVub20gewoJCQlwYW5pYygib25seSAiICsgRGVub20gKyAiIGlzIGFjY2VwdGVkIikKCQl9CgkJYW1vdW50ICs9IGMuQW1vdW50Cgl9CglyZXR1cm4gYW1vdW50Cn0KCi8vIC0tLSBvd25lciBjb250cm9scyAtLS0KCi8vIGFzc2VydE93bmVyIHBhbmljcyB1bmxlc3MgdGhlIHZlcmlmaWVkIGNhbGxlciBiZWhpbmQgcmxtIGlzIHRoZSBvd25lci4KLy8gVGhlIHJlYWxtIGlzIGRlbGliZXJhdGVseSBub3QgdGhlIGZpcnN0IHBhcmFtZXRlciAoc2VlIHBhaW50KTsgdGhlCi8vIGxlYWRpbmcgYmxhbmsgaW50IGlzIHRoZSBzYW1lIGlkaW9tIGduby5sYW5kL3AvbnQvb3duYWJsZSB1c2VzLgpmdW5jIGFzc2VydE93bmVyKF8gaW50LCBybG0gcmVhbG0pIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKCJzcG9vZmVkIHJlYWxtIikKCX0KCWlmIHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBvd25lciB7CgkJcGFuaWMoIm93bmVyIG9ubHkiKQoJfQp9CgovLyBTZXRQcmljZSBjaGFuZ2VzIHRoZSBwcmljZSBwZXIgcGl4ZWwsIGluIHVnbm90LiBaZXJvIG1ha2VzIHBhaW50aW5nIGZyZWUKLy8gZm9yIGV2ZXJ5b25lLgpmdW5jIFNldFByaWNlKGN1ciByZWFsbSwgdWdub3QgaW50NjQpIHsKCWFzc2VydE93bmVyKDAsIGN1cikKCWlmIHVnbm90IDwgMCB7CgkJcGFuaWMoInByaWNlIG11c3Qgbm90IGJlIG5lZ2F0aXZlIikKCX0KCXByaWNlID0gdWdub3QKfQoKLy8gU2V0TWF4QmF0Y2ggY2hhbmdlcyB0aGUgbWF4aW11bSBwaXhlbHMgcGVyIFBhaW50QmF0Y2ggY2FsbCwgMS4uSGFyZE1heEJhdGNoLgpmdW5jIFNldE1heEJhdGNoKGN1ciByZWFsbSwgbiBpbnQpIHsKCWFzc2VydE93bmVyKDAsIGN1cikKCWlmIG4gPCAxIHx8IG4gPiBIYXJkTWF4QmF0Y2ggewoJCXBhbmljKHVmbXQuU3ByaW50ZigibWF4IGJhdGNoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAlZCIsIEhhcmRNYXhCYXRjaCkpCgl9CgltYXhCYXRjaCA9IG4KfQoKLy8gV2l0aGRyYXcgc2VuZHMgYW1vdW50IHVnbm90IGhlbGQgYnkgdGhlIHJlYWxtIHRvIHRoZSBnaXZlbiBhZGRyZXNzLgovLyBQYXltZW50cyBhcmUgZm9yd2FyZGVkIG9uIGFycml2YWwsIHNvIHRoaXMgb25seSBtYXR0ZXJzIGZvciBjb2lucyBzZW50Ci8vIHRvIHRoZSByZWFsbSBvdXRzaWRlIG9mIGEgcGFpbnQgY2FsbC4KZnVuYyBXaXRoZHJhdyhjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoMCwgY3VyKQoJaWYgIXRvLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYWRkcmVzcyIpCgl9CglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCWJuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCglibmsuU2VuZENvaW5zKGN1ci5BZGRyZXNzKCksIHRvLCBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKERlbm9tLCBhbW91bnQpKSkKfQoKLy8gVHJhbnNmZXJPd25lcnNoaXAgaGFuZHMgdGhlIGFkbWluIHJvbGUgKHBheW1lbnRzLCBmcmVlIHBhaW50aW5nIGFuZCB0aGUKLy8gb3duZXIgY29udHJvbHMpIHRvIG5ld093bmVyLgpmdW5jIFRyYW5zZmVyT3duZXJzaGlwKGN1ciByZWFsbSwgbmV3T3duZXIgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoMCwgY3VyKQoJaWYgIW5ld093bmVyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYWRkcmVzcyIpCgl9Cglvd25lciA9IG5ld093bmVyCn0KCi8vIC0tLSByZWFkIEFQSSAodXNlZCBieSB0aGUgd2ViIGNsaWVudCB0aHJvdWdoIHZtL3FldmFsKSAtLS0KCmZ1bmMgR2V0V2lkdGgoKSBpbnQgICAgeyByZXR1cm4gV2lkdGggfQpmdW5jIEdldEhlaWdodCgpIGludCAgIHsgcmV0dXJuIEhlaWdodCB9CmZ1bmMgUHJpY2UoKSBpbnQ2NCAgICAgeyByZXR1cm4gcHJpY2UgfQpmdW5jIE93bmVyKCkgYWRkcmVzcyAgIHsgcmV0dXJuIG93bmVyIH0KZnVuYyBQYWludGVkKCkgaW50ICAgICB7IHJldHVybiBib2FyZC5QYWludGVkKCkgfQpmdW5jIFJldmVudWUoKSBpbnQ2NCAgIHsgcmV0dXJuIHJldmVudWUgfQpmdW5jIFBhaW50cygpIGludDY0ICAgIHsgcmV0dXJuIHBhaW50cyB9CmZ1bmMgTWF4QmF0Y2hTaXplKCkgaW50IHsgcmV0dXJuIG1heEJhdGNoIH0KCi8vIFBpeGVsIHJldHVybnMgdGhlIGNvbG9yIGluZGV4IGF0ICh4LCB5KTsgMCBtZWFucyBuZXZlciBwYWludGVkLgpmdW5jIFBpeGVsKHgsIHkgaW50KSBpbnQgeyByZXR1cm4gaW50KGJvYXJkLkdldCh4LCB5KSkgfQoKLy8gUm93cyByZXR1cm5zIHJvd3MgW2Zyb20sIHRvKSBhcyBvbmUgaGV4IGRpZ2l0IHBlciBwaXhlbCwgV2lkdGggZGlnaXRzIHBlcgovLyByb3csIHdpdGggbm8gc2VwYXJhdG9ycy4gQ2xpZW50cyBwYWdlIHRocm91Z2ggdGhlIGdyaWQgd2l0aCBpdC4KZnVuYyBSb3dzKGZyb20sIHRvIGludCkgc3RyaW5nIHsgcmV0dXJuIGJvYXJkLlJvd3MoZnJvbSwgdG8pIH0KCi8vIFZlcnNpb24gaXMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHBhaW50IGNhbGxzIHNvIGZhci4gQ2xpZW50cyByZW1lbWJlcgovLyBpdCBhbmQgYXNrIERpcnR5Um93cyBmb3Igd2hhdCBjaGFuZ2VkIHNpbmNlLgpmdW5jIFZlcnNpb24oKSBpbnQ2NCB7IHJldHVybiB2ZXJzaW9uIH0KCi8vIERpcnR5Um93cyBsaXN0cyB0aGUgcm93cyBwYWludGVkIGFmdGVyIHZlcnNpb24gYHNpbmNlYCwgYXMgInkseSx5IiBpbgovLyBhc2NlbmRpbmcgb3JkZXIuIERpcnR5Um93cygwKSBpcyBldmVyeSByb3cgdGhhdCB3YXMgZXZlciBwYWludGVkLCB3aGljaAovLyBpcyBhbGwgYSBmcmVzaCBjbGllbnQgbmVlZHMgdG8gbG9hZDogdGhlIG90aGVycyBhcmUgYmxhbmsuCmZ1bmMgRGlydHlSb3dzKHNpbmNlIGludDY0KSBzdHJpbmcgewoJaWYgc2luY2UgPCAwIHsKCQlzaW5jZSA9IDAKCX0KCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciB5LCB2IDo9IHJhbmdlIHJvd1ZlcnNpb24gewoJCWlmIHYgPD0gc2luY2UgewoJCQljb250aW51ZQoJCX0KCQlpZiBzYi5MZW4oKSA+IDAgewoJCQlzYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoeSkpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gUGFsZXR0ZSByZXR1cm5zIHRoZSAxNiBwYWxldHRlIGNvbG9ycyBhcyBjb21tYS1zZXBhcmF0ZWQgQ1NTIGhleCB2YWx1ZXMsCi8vIGluZGV4IDAgYmVpbmcgdGhlIGJsYW5rIGNvbG9yLgpmdW5jIFBhbGV0dGUoKSBzdHJpbmcgewoJcmV0dXJuIHN0cmluZ3MuSm9pbihjYW52YXMuUGFsZXR0ZVs6XSwgIiwiKQp9CgovLyBSZW5kZXIgc2hvd3MgdGhlIGdhbWUgc3RhdHMgb24gZ25vd2ViLiBUaGUgcGF0aCBpcyBpZ25vcmVkLgpmdW5jIFJlbmRlcihfIHN0cmluZykgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIE1pbGxpb24gR25vXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQSBwYXktcGVyLXBpeGVsIGNhbnZhcy4gUGljayBhIGNvbG9yLCBwYXkgdGhlIHByaWNlLCBvd24gdGhlIHBpeGVsIHVudGlsIHNvbWVvbmUgcmVwYWludHMgaXQuIFBheW1lbnRzIGdvIHRvIHRoZSBhZG1pbiB3YWxsZXQsIHdoaWNoIHBhaW50cyBmb3IgZnJlZS5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHwgfFxufC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IFNpemUgfCAlZCB4ICVkIHxcbiIsIFdpZHRoLCBIZWlnaHQpKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IFByaWNlIHBlciBwaXhlbCB8ICVkJXMgfFxuIiwgcHJpY2UsIERlbm9tKSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBQaXhlbHMgcGFpbnRlZCB8ICVkIC8gJWQgfFxuIiwgYm9hcmQuUGFpbnRlZCgpLCBXaWR0aCpIZWlnaHQpKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IFBhaW50IGNhbGxzIHwgJWQgfFxuIiwgcGFpbnRzKSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBWZXJzaW9uIHwgJWQgfFxuIiwgdmVyc2lvbikpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgUmV2ZW51ZSB8ICVkJXMgfFxuIiwgcmV2ZW51ZSwgRGVub20pKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IEFkbWluIHwgJXMgfFxuIiwgb3duZXIuU3RyaW5nKCkpKQoJc2IuV3JpdGVTdHJpbmcoIlxuIyMgUGFsZXR0ZVxuXG4iKQoJZm9yIGkgOj0gMTsgaSA8PSBpbnQoY2FudmFzLk1heENvbG9yKTsgaSsrIHsKCQlzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIi0gJWQ6IGAlc2BcbiIsIGksIGNhbnZhcy5QYWxldHRlW2ldKSkKCX0KCXNiLldyaXRlU3RyaW5nKCJcbiMjIFBhaW50XG5cbiIpCglzYi5Xcml0ZVN0cmluZygiLSBbUGFpbnQgb25lIHBpeGVsXSgiICsgUmVhbG0gKyAiJGhlbHAmZnVuYz1QYWludCk6IGBQYWludCh4LCB5LCBjb2xvcilgIHdpdGggYC1zZW5kIDxwcmljZT51Z25vdGBcbiIpCglzYi5Xcml0ZVN0cmluZygiLSBbUGFpbnQgYSBiYXRjaF0oIiArIFJlYWxtICsgIiRoZWxwJmZ1bmM9UGFpbnRCYXRjaCk6IGBQYWludEJhdGNoKFwieCx5LGNvbG9yO3gseSxjb2xvclwiKWAgd2l0aCBgLXNlbmQgPHByaWNlKmNvdW50PnVnbm90YFxuIikKCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBSZWFsbSBpcyB0aGlzIHJlYWxtJ3MgZ25vd2ViIHBhdGguCmNvbnN0IFJlYWxtID0gIi9yL2cxdjdzM2o1MDZ3cXVsMnp3dDkwYXdnanBocHg0enR3Z2EwOTI2ZjcvZ25vZHJhdy92MCIKGuleChBnbm9kcmF3X3Rlc3QuZ25vEtRecGFja2FnZSBnbm9kcmF3CgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCglkZXBsb3llciA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZGVwbG95ZXIiKQoJYWxpY2UgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImFsaWNlIikKCWJvYiAgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJib2IiKQopCgp2YXIgcmVhbG1BZGRyID0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3IvZzF2N3MzajUwNndxdWwyend0OTBhd2dqcGhweDR6dHdnYTA5MjZmNy9nbm9kcmF3L3YwIikKCi8vIFRlc3RzIG93biB0aGUgYWRtaW4gcm9sZSB0aHJvdWdoIGEgdGVzdCBhZGRyZXNzIHJhdGhlciB0aGFuIERlZmF1bHRBZG1pbi4KZnVuYyBpbml0KCkgewoJb3duZXIgPSBkZXBsb3llcgp9CgovLyBmdW5kIGNyZWRpdHMgdGhlIHJlYWxtIHdpdGggd2hhdCB0aGUgbmV4dCBwYWludCBjYWxsIGNsYWltcyB0byBzZW5kLCBhcwovLyB0aGUgY2hhaW4gd291bGQgYmVmb3JlIHJ1bm5pbmcgdGhlIG1lc3NhZ2UsIGFuZCByZXNldHMgdGhlIHBlci1tZXNzYWdlCi8vIG9yaWdpbi1zZW5kIHNwZW5kaW5nIGxpbWl0IHRoYXQgdGhlIHByZXZpb3VzIGNhbGwgdXNlZCB1cC4KZnVuYyBmdW5kKG4gaW50NjQpIHsKCXRlc3RpbmcuU2V0T3JpZ2luU3BlbmQobmlsKQoJaWYgbiA+IDAgewoJCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIHVnbm90KG4pKQoJfQp9CgpmdW5jIGJhbGFuY2VPZihhIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKGEsIERlbm9tKQp9CgpmdW5jIHVnbm90KG4gaW50NjQpIGNoYWluLkNvaW5zIHsKCXJldHVybiBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKERlbm9tLCBuKSkKfQoKLy8gdGVzdGluZy5TZXRSZWFsbSBvbmx5IGFmZmVjdHMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgaXQsIHNvIGl0IGNhbm5vdCBiZQovLyB3cmFwcGVkIGluIGEgaGVscGVyOiBldmVyeSB0ZXN0IHNldHMgdGhlIGNhbGxlciBpbmxpbmUuCgpmdW5jIFRlc3RJbml0aWFsU3RhdGUodCAqdGVzdGluZy5UKSB7Cgl1YXNzZXJ0LkVxdWFsKHQsIFdpZHRoLCBHZXRXaWR0aCgpKQoJdWFzc2VydC5FcXVhbCh0LCBIZWlnaHQsIEdldEhlaWdodCgpKQoJdWFzc2VydC5FcXVhbCh0LCBEZWZhdWx0UHJpY2UsIFByaWNlKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIERlZmF1bHRNYXhCYXRjaCwgTWF4QmF0Y2hTaXplKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIFBpeGVsKDAsIDApKQoJdWFzc2VydC5FcXVhbCh0LCBkZXBsb3llciwgT3duZXIoKSkKCXVhc3NlcnQuRXF1YWwodCwgMTYsIGxlbihzdHJpbmdzLlNwbGl0KFBhbGV0dGUoKSwgIiwiKSkpCn0KCmZ1bmMgVGVzdFBhaW50T25lUGl4ZWwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWFkbWluQmVmb3JlIDo9IGJhbGFuY2VPZihvd25lcikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCglmdW5kKHByaWNlKQoJUGFpbnQoY3Jvc3MoY3VyKSwgMTAsIDIwLCA2KQoKCXVhc3NlcnQuRXF1YWwodCwgNiwgUGl4ZWwoMTAsIDIwKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgUGFpbnRlZCgpKQoJdWFzc2VydC5FcXVhbCh0LCBwcmljZSwgUmV2ZW51ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgUGFpbnRzKCkpCgkvLyBUaGUgcGF5bWVudCB3ZW50IHN0cmFpZ2h0IHRvIHRoZSBhZG1pbiwgbm90aGluZyBzdGF5ZWQgaW4gdGhlIHJlYWxtLgoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbkJlZm9yZStwcmljZSwgYmFsYW5jZU9mKG93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIGJhbGFuY2VPZihyZWFsbUFkZHIpKQoKCS8vIEFueW9uZSBjYW4gcmVwYWludCBmb3IgdGhlIHNhbWUgcHJpY2U7IHRoZSBjb3VudCBkb2VzIG5vdCBncm93LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHByaWNlKSkKCWZ1bmQocHJpY2UpCglQYWludChjcm9zcyhjdXIpLCAxMCwgMjAsIDE1KQoJdWFzc2VydC5FcXVhbCh0LCAxNSwgUGl4ZWwoMTAsIDIwKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgUGFpbnRlZCgpKQoJdWFzc2VydC5FcXVhbCh0LCAyKnByaWNlLCBSZXZlbnVlKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGFkbWluQmVmb3JlKzIqcHJpY2UsIGJhbGFuY2VPZihvd25lcikpCn0KCmZ1bmMgVGVzdEFkbWluUGFpbnRzRm9yRnJlZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYWRtaW5CZWZvcmUgOj0gYmFsYW5jZU9mKG93bmVyKQoJcmV2ZW51ZUJlZm9yZSA6PSBSZXZlbnVlKCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglQYWludChjcm9zcyhjdXIpLCA0MDAsIDQwMCwgOCkKCXVhc3NlcnQuRXF1YWwodCwgOCwgUGl4ZWwoNDAwLCA0MDApKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgIjQwMSw0MDAsOTs0MDIsNDAwLDEwIikKCXVhc3NlcnQuRXF1YWwodCwgMTAsIFBpeGVsKDQwMiwgNDAwKSkKCgkvLyBGcmVlIG1lYW5zIGV4YWN0bHkgZnJlZTogdGhlIGFkbWluIG11c3Qgbm90IGF0dGFjaCBjb2lucyBlaXRoZXIuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IDB1Z25vdCIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDQwMywgNDAwLCAxKSB9KQoKCXVhc3NlcnQuRXF1YWwodCwgcmV2ZW51ZUJlZm9yZSwgUmV2ZW51ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbkJlZm9yZSwgYmFsYW5jZU9mKG93bmVyKSkKfQoKZnVuYyBUZXN0UGFpbnRSZWplY3RzV3JvbmdQYXltZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWZvcmUgOj0gUGFpbnRlZCgpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UtMSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSsxKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibXVzdCBzZW5kIGV4YWN0bHkiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCAwLCAxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibXVzdCBzZW5kIGV4YWN0bHkiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCAwLCAxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oInVhdG9tIiwgcHJpY2UpKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib25seSB1Z25vdCBpcyBhY2NlcHRlZCIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDAsIDAsIDEpIH0pCgoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUsIFBhaW50ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgUGl4ZWwoMCwgMCkpCn0KCmZ1bmMgVGVzdFBhaW50UmVqZWN0c0ludmFsaWRQaXhlbHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHByaWNlKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib3V0IG9mIHJhbmdlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgV2lkdGgsIDAsIDEpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm91dCBvZiByYW5nZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDAsIEhlaWdodCwgMSkgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAib3V0IG9mIHJhbmdlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgLTEsIDAsIDEpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImNvbG9yIG11c3QgYmUiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCAwLCAwKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJjb2xvciBtdXN0IGJlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMTYpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImNvbG9yIG11c3QgYmUiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCAwLCAtMSkgfSkKfQoKZnVuYyBUZXN0UGFpbnRSZWplY3RzQ29kZVJlYWxtKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgkvLyBSZWdyZXNzaW9uIGZvciB0aGUgT3JpZ2luU2VuZCBieXBhc3M6IGFuIGludGVybWVkaWF0ZSByZWFsbSBmb3J3YXJkcwoJLy8gdGhlIGNhbGwgd2hpbGUgdGhlIGVudmVsb3BlIGNsYWltcyB0aGUgY29pbnMgd2VyZSBzZW50LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9hdHRhY2tlci93cmFwcGVyIikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJkaXJlY3RseSBieSBhIHVzZXIiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAxLCAxLCAxKSB9KQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgxLCAxKSkKfQoKZnVuYyBUZXN0UGFpbnRCYXRjaChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVmb3JlIDo9IFBhaW50ZWQoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMyAqIHByaWNlKSkKCWZ1bmQoMyAqIHByaWNlKQoJUGFpbnRCYXRjaChjcm9zcyhjdXIpLCAiMTAwLDEwMCwxOzEwMSwxMDAsMjsxMDIsMTAwLDM7IikKCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIFBpeGVsKDEwMCwgMTAwKSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgUGl4ZWwoMTAxLCAxMDApKQoJdWFzc2VydC5FcXVhbCh0LCAzLCBQaXhlbCgxMDIsIDEwMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGJlZm9yZSszLCBQYWludGVkKCkpCgoJcm93IDo9IFJvd3MoMTAwLCAxMDEpCgl1YXNzZXJ0LkVxdWFsKHQsIFdpZHRoLCBsZW4ocm93KSkKCXVhc3NlcnQuRXF1YWwodCwgIjEyMyIsIHJvd1sxMDA6MTAzXSkKfQoKZnVuYyBUZXN0UGFpbnRCYXRjaElzQXRvbWljKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgkvLyBPbmUgYmFkIHBpeGVsIHJlamVjdHMgdGhlIHdob2xlIGJhdGNoIGJlZm9yZSBhbnl0aGluZyBpcyB3cml0dGVuLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMipwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm91dCBvZiByYW5nZSIsIGZ1bmMoKSB7IFBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgIjIwMCwyMDAsMTs5OTk5LDAsMSIpIH0pCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIFBpeGVsKDIwMCwgMjAwKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnRCYXRjaChjcm9zcyhjdXIpLCAiMjAwLDIwMCwxOzIwMSwyMDAsMSIpIH0pCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIFBpeGVsKDIwMCwgMjAwKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIngseSxjb2xvciIsIGZ1bmMoKSB7IFBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgImdhcmJhZ2UiKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJ4LHksY29sb3IiLCBmdW5jKCkgeyBQYWludEJhdGNoKGNyb3NzKGN1ciksICIiKSB9KQp9CgpmdW5jIFRlc3RQYWludEJhdGNoVG9vTGFyZ2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpIDo9IDA7IGkgPD0gbWF4QmF0Y2g7IGkrKyB7CgkJaWYgaSA+IDAgewoJCQlzYi5Xcml0ZUJ5dGUoJzsnKQoJCX0KCQlzYi5Xcml0ZVN0cmluZygiMCwiKQoJCXNiLldyaXRlU3RyaW5nKGl0b2EoaSkpCgkJc2IuV3JpdGVTdHJpbmcoIiwxIikKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KGludDY0KG1heEJhdGNoKzEpKnByaWNlKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidG9vIG1hbnkgcGl4ZWxzIiwgZnVuYygpIHsgUGFpbnRCYXRjaChjcm9zcyhjdXIpLCBzYi5TdHJpbmcoKSkgfSkKfQoKZnVuYyBUZXN0U2V0UHJpY2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsIGZ1bmMoKSB7IFNldFByaWNlKGNyb3NzKGN1ciksIDEpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwcmljZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIsIGZ1bmMoKSB7IFNldFByaWNlKGNyb3NzKGN1ciksIC0xKSB9KQoJU2V0UHJpY2UoY3Jvc3MoY3VyKSwgMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFByaWNlKCkpCgoJLy8gRnJlZSBwYWludGluZyByZXF1aXJlcyBzZW5kaW5nIG5vdGhpbmcuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglQYWludChjcm9zcyhjdXIpLCAzMDAsIDMwMCwgNCkKCXVhc3NlcnQuRXF1YWwodCwgNCwgUGl4ZWwoMzAwLCAzMDApKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMzAwLCAzMDEsIDQpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJU2V0UHJpY2UoY3Jvc3MoY3VyKSwgRGVmYXVsdFByaWNlKQp9CgpmdW5jIFRlc3RTZXRNYXhCYXRjaChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJb3JpZyA6PSBNYXhCYXRjaFNpemUoKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvd25lciBvbmx5IiwgZnVuYygpIHsgU2V0TWF4QmF0Y2goY3Jvc3MoY3VyKSwgMTAwKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtYXggYmF0Y2ggbXVzdCBiZSBiZXR3ZWVuIiwgZnVuYygpIHsgU2V0TWF4QmF0Y2goY3Jvc3MoY3VyKSwgMCkgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibWF4IGJhdGNoIG11c3QgYmUgYmV0d2VlbiIsIGZ1bmMoKSB7IFNldE1heEJhdGNoKGNyb3NzKGN1ciksIEhhcmRNYXhCYXRjaCsxKSB9KQoKCVNldE1heEJhdGNoKGNyb3NzKGN1ciksIDMpCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIE1heEJhdGNoU2l6ZSgpKQoKCS8vIFRoZSBuZXcgbGltaXQgaXMgZW5mb3JjZWQgYnkgUGFpbnRCYXRjaC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDQgKiBwcmljZSkpCglmdW5kKDQgKiBwcmljZSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidG9vIG1hbnkgcGl4ZWxzIiwgZnVuYygpIHsKCQlQYWludEJhdGNoKGNyb3NzKGN1ciksICIwLDUwMCwxOzEsNTAwLDE7Miw1MDAsMTszLDUwMCwxIikKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglTZXRNYXhCYXRjaChjcm9zcyhjdXIpLCBvcmlnKQoJdWFzc2VydC5FcXVhbCh0LCBvcmlnLCBNYXhCYXRjaFNpemUoKSkKfQoKZnVuYyBUZXN0V2l0aGRyYXcoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIHVnbm90KDFfMDAwKSkKCXJvIDo9IGJhbmtlci5OZXdSZWFkb25seUJhbmtlcigpCglib2JCZWZvcmUgOj0gcm8uR2V0Q29pbihib2IsIERlbm9tKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1ciksIGFsaWNlLCAxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiLCBmdW5jKCkgeyBXaXRoZHJhdyhjcm9zcyhjdXIpLCBib2IsIDApIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgYWRkcmVzcyIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1ciksIGFkZHJlc3MoIm5vcGUiKSwgMSkgfSkKCVdpdGhkcmF3KGNyb3NzKGN1ciksIGJvYiwgNjAwKQoKCXVhc3NlcnQuRXF1YWwodCwgYm9iQmVmb3JlKzYwMCwgcm8uR2V0Q29pbihib2IsIERlbm9tKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNDAwKSwgcm8uR2V0Q29pbihyZWFsbUFkZHIsIERlbm9tKSkKCS8vIExlYXZlIHRoZSByZWFsbSBlbXB0eSBmb3IgdGhlIHRlc3RzIHRoYXQgYXNzZXJ0IG9uIGl0LgoJV2l0aGRyYXcoY3Jvc3MoY3VyKSwgYm9iLCA0MDApCn0KCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglvcmlnaW5hbCA6PSBvd25lcgoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsIGZ1bmMoKSB7IFRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGFsaWNlKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3JpZ2luYWwpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiaW52YWxpZCBhZGRyZXNzIiwgZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgYWRkcmVzcygibm9wZSIpKSB9KQoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgYWxpY2UpCgl1YXNzZXJ0LkVxdWFsKHQsIGFsaWNlLCBPd25lcigpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIG9yaWdpbmFsKQoJdWFzc2VydC5FcXVhbCh0LCBvcmlnaW5hbCwgT3duZXIoKSkKfQoKZnVuYyBUZXN0VmVyc2lvbkFuZERpcnR5Um93cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdiA6PSBWZXJzaW9uKCkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIERpcnR5Um93cyh2KSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgzICogcHJpY2UpKQoJZnVuZCgzICogcHJpY2UpCglQYWludEJhdGNoKGNyb3NzKGN1ciksICIwLDcwMCwxOzEsNzAwLDI7MCw3MDEsMyIpCgoJdWFzc2VydC5FcXVhbCh0LCB2KzEsIFZlcnNpb24oKSkKCXVhc3NlcnQuRXF1YWwodCwgIjcwMCw3MDEiLCBEaXJ0eVJvd3ModikpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBEaXJ0eVJvd3MoVmVyc2lvbigpKSkKCgkvLyBBIHNlY29uZCBjYWxsIG9uIG9uZSBvZiB0aG9zZSByb3dzIG1vdmVzIG9ubHkgdGhhdCByb3cgZm9yd2FyZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCglmdW5kKHByaWNlKQoJUGFpbnQoY3Jvc3MoY3VyKSwgNSwgNzAxLCA0KQoJdWFzc2VydC5FcXVhbCh0LCB2KzIsIFZlcnNpb24oKSkKCXVhc3NlcnQuRXF1YWwodCwgIjcwMSIsIERpcnR5Um93cyh2KzEpKQoJdWFzc2VydC5FcXVhbCh0LCAiNzAwLDcwMSIsIERpcnR5Um93cyh2KSkKCgkvLyBBIHJlamVjdGVkIHBhaW50IGNoYW5nZXMgbm90aGluZy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibXVzdCBzZW5kIGV4YWN0bHkiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCA1LCA3MDIsIDQpIH0pCgl1YXNzZXJ0LkVxdWFsKHQsIHYrMiwgVmVyc2lvbigpKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgRGlydHlSb3dzKHYrMikpCgoJLy8gTmVnYXRpdmUgInNpbmNlIiBiZWhhdmVzIGxpa2UgemVybzogcGFpbnRlZCByb3dzIG9ubHksIG5ldmVyIGJsYW5rIG9uZXMuCgl1YXNzZXJ0LkVxdWFsKHQsIERpcnR5Um93cygwKSwgRGlydHlSb3dzKC0xKSkKCXVhc3NlcnQuVHJ1ZSh0LCAhc3RyaW5ncy5Db250YWlucygiLCIrRGlydHlSb3dzKDApKyIsIiwgIiw3OTksIiksICJyb3cgNzk5IHdhcyBuZXZlciBwYWludGVkIikKfQoKZnVuYyBUZXN0UmVuZGVyKHQgKnRlc3RpbmcuVCkgewoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIiMgTWlsbGlvbiBHbm8iKSwgInRpdGxlIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInwgU2l6ZSB8IDEyNTAgeCA4MDAgfCIpLCAic2l6ZSByb3ciKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAifCBQcmljZSBwZXIgcGl4ZWwgfCA1MDAwMHVnbm90IHwiKSwgInByaWNlIHJvdyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJ8IEFkbWluIHwgIitvd25lci5TdHJpbmcoKSsiIHwiKSwgImFkbWluIHJvdyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIkaGVscCZmdW5jPVBhaW50QmF0Y2giKSwgImhlbHAgbGluayIpCn0KCmZ1bmMgaXRvYShuIGludCkgc3RyaW5nIHsKCWlmIG4gPT0gMCB7CgkJcmV0dXJuICIwIgoJfQoJdmFyIGIgW11ieXRlCglmb3IgbiA+IDAgewoJCWIgPSBhcHBlbmQoW11ieXRle2J5dGUoJzAnICsgbiUxMCl9LCBiLi4uKQoJCW4gLz0gMTAKCX0KCXJldHVybiBzdHJpbmcoYikKfQoaZQoLZ25vbW9kLnRvbWwSVm1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdjdzM2o1MDZ3cXVsMnp3dDkwYXdnanBocHg0enR3Z2EwOTI2ZjcvZ25vZHJhdy92MCIKZ25vID0gIjAuOSIKIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0yMDAwMDAwMHVnbm90EhMIgISvXxIMMTAwMDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAjPB/9x+1KydcwertWxk/c2fjHTMRpDQMcA4nK2209nbEkCI/CCzJ+ZifJwqu0ZuXHueK0h14zxPG3w2Igh+FgTu/ASSU2Mc1rVOccfGDx6aQOivupxOThvzGgGrgS6iHJZ+GihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl