Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
745C8A19A97BE8839B1D4A45B54B62478F7481931AD30714A6195F0C01198941
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
g19t6f4f4ptt3m949jznalfsx2h8aj696llul0nj20000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvK1AQoML3ZtLm1fYWRkcGtnEuC1AQooZzE5dDZmNGY0cHR0M205NDlqem5hbGZzeDJoOGFqNjk2bGx1bDBuahKjtQEKB21pbGxpb24SPmduby5sYW5kL3IvZzE5dDZmNGY0cHR0M205NDlqem5hbGZzeDJoOGFqNjk2bGx1bDBuai9taWxsaW9uL3YwGpAJCglSRUFETUUubWQSggkjIG1pbGxpb24KClJlYWxtIGBnbm8ubGFuZC9yL2cxOXQ2ZjRmNHB0dDNtOTQ5anpuYWxmc3gyaDhhajY5NmxsdWwwbmovbWlsbGlvbi92MGA6IGEgMTI1MCB4IDgwMCAob25lIG1pbGxpb24gcGl4ZWxzLCAxNjoxMCkgcGF5LXBlci1waXhlbCBjYW52YXMKYnVpbHQgb24gYGduby5sYW5kL3AvZzE5dDZmNGY0cHR0M205NDlqem5hbGZzeDJoOGFqNjk2bGx1bDBuai9jYW52YXMvdjBgLgoKUGFpbnQgZnJvbSB0aGUgQ0xJOgoKYGBgc2gKZ25va2V5IG1ha2V0eCBjYWxsIC1wa2dwYXRoIGduby5sYW5kL3IvZzE5dDZmNGY0cHR0M205NDlqem5hbGZzeDJoOGFqNjk2bGx1bDBuai9taWxsaW9uL3YwIC1mdW5jIFBhaW50QmF0Y2ggXAogIC1hcmdzICIxMCwxMCw2OzExLDEwLDYiIC1zZW5kIDEwMDAwMHVnbm90IFwKICAtZ2FzLWZlZSAxMDAwMDAwdWdub3QgLWdhcy13YW50ZWQgNTAwMDAwMCAtYnJvYWRjYXN0IC1jaGFpbmlkIGRldiAtcmVtb3RlIDEyNy4wLjAuMToyNjY1NyA8a2V5PgpgYGAKClRoZSBhbW91bnQgc2VudCBtdXN0IGVxdWFsIGBQcmljZSgpYCB0aW1lcyB0aGUgbnVtYmVyIG9mIHBpeGVscywgYW5kIHRoZQpjYWxsIG11c3QgY29tZSBkaXJlY3RseSBmcm9tIGEgdXNlciB0cmFuc2FjdGlvbi4gUGF5bWVudHMgYXJlIGZvcndhcmRlZCB0bwp0aGUgYWRtaW4gd2FsbGV0IChgT3duZXIoKWApIGFzIHRoZXkgYXJyaXZlOyB0aGUgYWRtaW4gcGFpbnRzIGZvciBmcmVlIGFuZApjYW4gYFNldFByaWNlYCwgYFNldE1heEJhdGNoYCwgYFdpdGhkcmF3YCBhbmQgYFRyYW5zZmVyT3duZXJzaGlwYCAoYWxsIHBhcmFtcyBhcmUgb3duZXItc2V0dGFibGUgYXQgcnVudGltZSkuIFJlYWQgZnVuY3Rpb25zIHVzZWQgYnkgY2xpZW50czoKYEdldFdpZHRoYCwgYEdldEhlaWdodGAsIGBQcmljZWAsIGBQYWxldHRlYCwgYE1heEJhdGNoU2l6ZWAsIGBQYWludGVkYCwKYFBpeGVsKHgsIHkpYCwgYFJvd3MoZnJvbSwgdG8pYCwgYFZlcnNpb24oKWAsIGBEaXJ0eVJvd3Moc2luY2UpYC4KCmBWZXJzaW9uKClgIGNvdW50cyBzdWNjZXNzZnVsIHBhaW50IGNhbGxzIGFuZCBgRGlydHlSb3dzKHNpbmNlKWAgbGlzdHMgdGhlCnJvd3MgdG91Y2hlZCBhZnRlciB0aGF0IHZlcnNpb24sIHNvIGNsaWVudHMgZmV0Y2ggb25seSB3aGF0IGNoYW5nZWQuChplCgtnbm9tb2QudG9tbBJWbW9kdWxlID0gImduby5sYW5kL3IvZzE5dDZmNGY0cHR0M205NDlqem5hbGZzeDJoOGFqNjk2bGx1bDBuai9taWxsaW9uL3YwIgpnbm8gPSAiMC45IgoazUsKC21pbGxpb24uZ25vEr1LLy8gUGFja2FnZSBtaWxsaW9uIGlzIGEgcGF5LXBlci1waXhlbCBjb2xsYWJvcmF0aXZlIGNhbnZhczogYW55b25lIGNhbiBwYWludAovLyBhbnkgcGl4ZWwgb2YgYSBXaWR0aCB4IEhlaWdodCBncmlkIGluIG9uZSBvZiAxNSBjb2xvcnMgYnkgc2VuZGluZyBleGFjdGx5Ci8vIFByaWNlKCkgdWdub3QgcGVyIHBpeGVsIGFsb25nIHdpdGggdGhlIGNhbGwuIFBpeGVscyBjYW4gYmUgcmVwYWludGVkIGJ5Ci8vIGFueW9uZSwgZm9yIHRoZSBzYW1lIHByaWNlLiBQYXltZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBhZG1pbiB3YWxsZXQKLy8gYXMgdGhleSBhcnJpdmUsIGFuZCB0aGUgYWRtaW4gcGFpbnRzIGZvciBmcmVlLgovLwovLyBUaGUgZ3JpZCBsb2dpYyBsaXZlcyBpbiBnbm8ubGFuZC9wL2cxOXQ2ZjRmNHB0dDNtOTQ5anpuYWxmc3gyaDhhajY5NmxsdWwwbmovY2FudmFzL3YwOyB0aGlzIHJlYWxtIGFkZHMgdGhlCi8vIHBheW1lbnQgZ3VhcmQsIHRoZSBvd25lciBjb250cm9scyBhbmQgdGhlIHJlYWQgQVBJIHVzZWQgYnkgdGhlIHdlYiBjbGllbnQuCnBhY2thZ2UgbWlsbGlvbgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxOXQ2ZjRmNHB0dDNtOTQ5anpuYWxmc3gyaDhhajY5NmxsdWwwbmovY2FudmFzL3YwIgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJLy8gV2lkdGggYW5kIEhlaWdodCBhcmUgZml4ZWQgZm9yIHRoZSBsaWZlIG9mIHRoaXMgdmVyc2lvbjogY2hhbmdpbmcKCS8vIHRoZW0gd291bGQgY2hhbmdlIHRoZSBzdG9yYWdlIGxheW91dCwgc28gaXQgbWVhbnMgYSBuZXcgL3ZOLgoJLy8gMTI1MCB4IDgwMCBpcyBvbmUgbWlsbGlvbiBwaXhlbHMgaW4gYSAxNjoxMCBsYXB0b3AgYXNwZWN0IHJhdGlvLgoJV2lkdGggID0gMTI1MAoJSGVpZ2h0ID0gODAwCgoJLy8gRGVmYXVsdE1heEJhdGNoIGJvdW5kcyBhIHNpbmdsZSBQYWludEJhdGNoIGNhbGwgc28gb25lIHR4IGNhbm5vdCBibG93CgkvLyB0aGUgYmxvY2sgZ2FzIGxpbWl0IG9yIG92ZXJmbG93IHRoZSBwcmljZSBhcml0aG1ldGljLiBUaGUgb3duZXIgY2FuCgkvLyBjaGFuZ2UgaXQgYXQgcnVudGltZSB3aXRoIFNldE1heEJhdGNoLCB1cCB0byBIYXJkTWF4QmF0Y2guCglEZWZhdWx0TWF4QmF0Y2ggPSA1MDAwCglIYXJkTWF4QmF0Y2ggICAgPSAyMDAwMAoKCS8vIERlZmF1bHRQcmljZSBpcyB0aGUgaW5pdGlhbCBwcmljZSBwZXIgcGl4ZWwsIGluIHVnbm90ICgwLjA1IEdOT1QpLgoJRGVmYXVsdFByaWNlIGludDY0ID0gNTBfMDAwCgoJLy8gRGVmYXVsdEFkbWluIHJlY2VpdmVzIGV2ZXJ5IHBheW1lbnQsIHBhaW50cyBmb3IgZnJlZSBhbmQgaG9sZHMgdGhlCgkvLyBvd25lciBjb250cm9scy4gQ2hhbmdlIGl0IGJlZm9yZSBkZXBsb3lpbmc7IFRyYW5zZmVyT3duZXJzaGlwIG1vdmVzCgkvLyBpdCBhZnRlcndhcmRzLgoJRGVmYXVsdEFkbWluID0gImcxOXQ2ZjRmNHB0dDNtOTQ5anpuYWxmc3gyaDhhajY5NmxsdWwwbmoiCgoJRGVub20gPSAidWdub3QiCikKCnZhciAoCglib2FyZCAgICA9IGNhbnZhcy5OZXcoV2lkdGgsIEhlaWdodCkKCXByaWNlICAgID0gRGVmYXVsdFByaWNlCgltYXhCYXRjaCA9IERlZmF1bHRNYXhCYXRjaAoJb3duZXIgICAgPSBhZGRyZXNzKERlZmF1bHRBZG1pbikKCgkvLyBTdGF0cy4KCXJldmVudWUgaW50NjQgLy8gdG90YWwgdWdub3QgZXZlciBwYWlkIGZvciBwaXhlbHMKCXBhaW50cyAgaW50NjQgLy8gbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgUGFpbnQvUGFpbnRCYXRjaCBjYWxscwoKCS8vIENoYW5nZSB0cmFja2luZywgc28gY2xpZW50cyBmZXRjaCBvbmx5IHRoZSByb3dzIHRoYXQgbW92ZWQuCgkvLyB2ZXJzaW9uIGJ1bXBzIG9uY2UgcGVyIHN1Y2Nlc3NmdWwgcGFpbnQgY2FsbDsgcm93VmVyc2lvbiBob2xkcyB0aGUKCS8vIHZlcnNpb24gb2YgdGhlIGxhc3QgcGFpbnQgdGhhdCB0b3VjaGVkIGVhY2ggcm93ICgwID0gbmV2ZXIgcGFpbnRlZCkuCgl2ZXJzaW9uICAgIGludDY0Cglyb3dWZXJzaW9uID0gbWFrZShbXWludDY0LCBIZWlnaHQpCikKCi8vIFBhaW50IGNvbG9ycyBvbmUgcGl4ZWwuIFNlbmQgZXhhY3RseSBQcmljZSgpIHVnbm90IChub3RoaW5nIGZvciB0aGUgYWRtaW4pLgpmdW5jIFBhaW50KGN1ciByZWFsbSwgeCwgeSwgY29sb3IgaW50KSB7CglpZiBjb2xvciA8PSAwIHx8IGNvbG9yID4gaW50KGNhbnZhcy5NYXhDb2xvcikgewoJCXBhbmljKGNhbnZhcy5FcnJJbnZhbGlkQ29sb3IpCgl9CglwYWludChbXWNhbnZhcy5QaXhlbHt7WDogeCwgWTogeSwgQ29sb3I6IGJ5dGUoY29sb3IpfX0sIGN1cikKfQoKLy8gUGFpbnRCYXRjaCBjb2xvcnMgdXAgdG8gTWF4QmF0Y2hTaXplKCkgcGl4ZWxzIGluIG9uZSBjYWxsLiBUaGUgYXJndW1lbnQgaXMKLy8gIngseSxjb2xvcjt4LHksY29sb3I7Li4uIi4gU2VuZCBleGFjdGx5IFByaWNlKCkgKiBjb3VudCB1Z25vdCAobm90aGluZwovLyBmb3IgdGhlIGFkbWluKS4KZnVuYyBQYWludEJhdGNoKGN1ciByZWFsbSwgcGl4ZWxzIHN0cmluZykgewoJcHgsIGVyciA6PSBjYW52YXMuUGFyc2VQaXhlbHMocGl4ZWxzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcGFpbnQocHgsIGN1cikKfQoKLy8gcGFpbnQgdGFrZXMgdGhlIHJlYWxtIGFzIGl0cyBMQVNUIHBhcmFtZXRlciBvbiBwdXJwb3NlOiBhIHJlYWxtIGZpcnN0Ci8vIHBhcmFtZXRlciB3b3VsZCBtYWtlIGl0IGEgY3Jvc3NpbmcgZnVuY3Rpb24gYW5kIFByZXZpb3VzKCkgd291bGQgdGhlbgovLyBiZSB0aGlzIHJlYWxtIGluc3RlYWQgb2YgdGhlIHVzZXIuCmZ1bmMgcGFpbnQocHggW11jYW52YXMuUGl4ZWwsIHJsbSByZWFsbSkgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInNwb29mZWQgcmVhbG0iKQoJfQoJLy8gUGF5bWVudCBndWFyZDogdW5zYWZlLk9yaWdpblNlbmQoKSBkZXNjcmliZXMgdGhlIGNvaW5zIGF0dGFjaGVkIHRvCgkvLyB0aGUgdHJhbnNhY3Rpb24sIHdoaWNoIG9ubHkgcHJvdmFibHkgbGFuZGVkIGhlcmUgd2hlbiB0aGUgY2FsbGVyIGlzCgkvLyBhIHBsYWluIHVzZXIgY2FsbCAobm8gaW50ZXJtZWRpYXRlIG9yIGVwaGVtZXJhbCByZWFsbSkuIEtlZXAgdGhlIHR3bwoJLy8gY2hlY2tzIHRvZ2V0aGVyLiB1bnNhZmUgaXMgaW1wb3J0ZWQgZm9yIE9yaWdpblNlbmQgb25seTsgY2FsbGVyCgkvLyBpZGVudGl0eSBhbHdheXMgY29tZXMgZnJvbSB0aGUgcmVhbG0gaGFuZGxlLgoJaWYgIXJsbS5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoIm11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGEgdXNlciAobWFrZXR4IGNhbGwpIikKCX0KCXBhaW50ZXIgOj0gcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpCgluIDo9IGxlbihweCkKCWlmIG4gPT0gMCB7CgkJcGFuaWMoIm5vdGhpbmcgdG8gcGFpbnQiKQoJfQoJaWYgbiA+IG1heEJhdGNoIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoInRvbyBtYW55IHBpeGVsczogJWQgPiAlZCIsIG4sIG1heEJhdGNoKSkKCX0KCWZvciBfLCBwIDo9IHJhbmdlIHB4IHsKCQlpZiBlcnIgOj0gYm9hcmQuQ2hlY2socCk7IGVyciAhPSBuaWwgewoJCQlwYW5pYyhlcnIpCgkJfQoJfQoKCWNvc3QgOj0gcHJpY2UgKiBpbnQ2NChuKQoJaWYgcGFpbnRlciA9PSBvd25lciB7CgkJY29zdCA9IDAgLy8gdGhlIGFkbWluIHBhaW50cyBmb3IgZnJlZQoJfQoJaWYgc2VudCA6PSBzZW50VWdub3QodW5zYWZlLk9yaWdpblNlbmQoKSk7IHNlbnQgIT0gY29zdCB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJtdXN0IHNlbmQgZXhhY3RseSAlZCVzIGZvciAlZCBwaXhlbChzKSwgZ290ICVkJXMiLCBjb3N0LCBEZW5vbSwgbiwgc2VudCwgRGVub20pKQoJfQoJaWYgY29zdCA+IDAgewoJCS8vIEZvcndhcmQgdGhlIHBheW1lbnQgdG8gdGhlIGFkbWluIHJpZ2h0IGF3YXksIHNvIG5vdGhpbmcKCQkvLyBhY2N1bXVsYXRlcyBpbiB0aGUgcmVhbG0uIEJhbmtlclR5cGVPcmlnaW5TZW5kIGNhbiBvbmx5IG1vdmUKCQkvLyB3aGF0IHRoaXMgdmVyeSBtZXNzYWdlIHNlbnQsIHdoaWNoIGlzIGV4YWN0bHkgY29zdC4KCQlibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZU9yaWdpblNlbmQsIHJsbSkKCQlibmsuU2VuZENvaW5zKHJsbS5BZGRyZXNzKCksIG93bmVyLCBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKERlbm9tLCBjb3N0KSkpCgl9CgoJdmVyc2lvbisrCglmb3IgXywgcCA6PSByYW5nZSBweCB7CgkJYm9hcmQuU2V0KHApCgkJcm93VmVyc2lvbltwLlldID0gdmVyc2lvbgoJfQoJcmV2ZW51ZSArPSBjb3N0CglwYWludHMrKwoKCS8vIFRoZSBwaXhlbCBsaXN0IGl0c2VsZiBpcyBub3QgZW1pdHRlZDogZXZlbnQgYXR0cmlidXRlIHZhbHVlcyBhcmUKCS8vIHNpemUtY2FwcGVkIGJ5IHRoZSBub2RlIGFuZCBhIGZ1bGwgYmF0Y2ggZXhjZWVkcyBpdC4gQ2xpZW50cyByZS1yZWFkCgkvLyBSb3dzKCkgYWZ0ZXIgYSBwYWludC4KCWNoYWluLkVtaXQoIlBhaW50IiwKCQkicGFpbnRlciIsIHBhaW50ZXIuU3RyaW5nKCksCgkJImNvdW50Iiwgc3RyY29udi5JdG9hKG4pLAoJCSJwYWlkIiwgc3RyY29udi5JdG9hKGludChjb3N0KSkrRGVub20sCgkpCn0KCi8vIHNlbnRVZ25vdCByZXR1cm5zIHRoZSB1Z25vdCBhbW91bnQgaW4gY29pbnMgYW5kIHJlamVjdHMgYW55IG90aGVyIGRlbm9tLAovLyBzbyBhIGNhbGxlciBjYW5ub3QgcGF5IHdpdGggc29tZXRoaW5nIHRoZSByZWFsbSBkb2VzIG5vdCBwcmljZS4KZnVuYyBzZW50VWdub3QoY29pbnMgY2hhaW4uQ29pbnMpIGludDY0IHsKCXZhciBhbW91bnQgaW50NjQKCWZvciBfLCBjIDo9IHJhbmdlIGNvaW5zIHsKCQlpZiBjLkRlbm9tICE9IERlbm9tIHsKCQkJcGFuaWMoIm9ubHkgIiArIERlbm9tICsgIiBpcyBhY2NlcHRlZCIpCgkJfQoJCWFtb3VudCArPSBjLkFtb3VudAoJfQoJcmV0dXJuIGFtb3VudAp9CgovLyAtLS0gb3duZXIgY29udHJvbHMgLS0tCgovLyBhc3NlcnRPd25lciBwYW5pY3MgdW5sZXNzIHRoZSB2ZXJpZmllZCBjYWxsZXIgYmVoaW5kIHJsbSBpcyB0aGUgb3duZXIuCi8vIFRoZSByZWFsbSBpcyBkZWxpYmVyYXRlbHkgbm90IHRoZSBmaXJzdCBwYXJhbWV0ZXIgKHNlZSBwYWludCk7IHRoZQovLyBsZWFkaW5nIGJsYW5rIGludCBpcyB0aGUgc2FtZSBpZGlvbSBnbm8ubGFuZC9wL250L293bmFibGUgdXNlcy4KZnVuYyBhc3NlcnRPd25lcihfIGludCwgcmxtIHJlYWxtKSB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlwYW5pYygic3Bvb2ZlZCByZWFsbSIpCgl9CglpZiBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gb3duZXIgewoJCXBhbmljKCJvd25lciBvbmx5IikKCX0KfQoKLy8gU2V0UHJpY2UgY2hhbmdlcyB0aGUgcHJpY2UgcGVyIHBpeGVsLCBpbiB1Z25vdC4gWmVybyBtYWtlcyBwYWludGluZyBmcmVlCi8vIGZvciBldmVyeW9uZS4KZnVuYyBTZXRQcmljZShjdXIgcmVhbG0sIHVnbm90IGludDY0KSB7Cglhc3NlcnRPd25lcigwLCBjdXIpCglpZiB1Z25vdCA8IDAgewoJCXBhbmljKCJwcmljZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpCgl9CglwcmljZSA9IHVnbm90Cn0KCi8vIFNldE1heEJhdGNoIGNoYW5nZXMgdGhlIG1heGltdW0gcGl4ZWxzIHBlciBQYWludEJhdGNoIGNhbGwsIDEuLkhhcmRNYXhCYXRjaC4KZnVuYyBTZXRNYXhCYXRjaChjdXIgcmVhbG0sIG4gaW50KSB7Cglhc3NlcnRPd25lcigwLCBjdXIpCglpZiBuIDwgMSB8fCBuID4gSGFyZE1heEJhdGNoIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoIm1heCBiYXRjaCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgJWQiLCBIYXJkTWF4QmF0Y2gpKQoJfQoJbWF4QmF0Y2ggPSBuCn0KCi8vIFdpdGhkcmF3IHNlbmRzIGFtb3VudCB1Z25vdCBoZWxkIGJ5IHRoZSByZWFsbSB0byB0aGUgZ2l2ZW4gYWRkcmVzcy4KLy8gUGF5bWVudHMgYXJlIGZvcndhcmRlZCBvbiBhcnJpdmFsLCBzbyB0aGlzIG9ubHkgbWF0dGVycyBmb3IgY29pbnMgc2VudAovLyB0byB0aGUgcmVhbG0gb3V0c2lkZSBvZiBhIHBhaW50IGNhbGwuCmZ1bmMgV2l0aGRyYXcoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE93bmVyKDAsIGN1cikKCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGFkZHJlc3MiKQoJfQoJaWYgYW1vdW50IDw9IDAgewoJCXBhbmljKCJhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CglibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJYm5rLlNlbmRDb2lucyhjdXIuQWRkcmVzcygpLCB0bywgY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihEZW5vbSwgYW1vdW50KSkpCn0KCi8vIFRyYW5zZmVyT3duZXJzaGlwIGhhbmRzIHRoZSBhZG1pbiByb2xlIChwYXltZW50cywgZnJlZSBwYWludGluZyBhbmQgdGhlCi8vIG93bmVyIGNvbnRyb2xzKSB0byBuZXdPd25lci4KZnVuYyBUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIG5ld093bmVyIGFkZHJlc3MpIHsKCWFzc2VydE93bmVyKDAsIGN1cikKCWlmICFuZXdPd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGFkZHJlc3MiKQoJfQoJb3duZXIgPSBuZXdPd25lcgp9CgovLyAtLS0gcmVhZCBBUEkgKHVzZWQgYnkgdGhlIHdlYiBjbGllbnQgdGhyb3VnaCB2bS9xZXZhbCkgLS0tCgpmdW5jIEdldFdpZHRoKCkgaW50ICAgIHsgcmV0dXJuIFdpZHRoIH0KZnVuYyBHZXRIZWlnaHQoKSBpbnQgICB7IHJldHVybiBIZWlnaHQgfQpmdW5jIFByaWNlKCkgaW50NjQgICAgIHsgcmV0dXJuIHByaWNlIH0KZnVuYyBPd25lcigpIGFkZHJlc3MgICB7IHJldHVybiBvd25lciB9CmZ1bmMgUGFpbnRlZCgpIGludCAgICAgeyByZXR1cm4gYm9hcmQuUGFpbnRlZCgpIH0KZnVuYyBSZXZlbnVlKCkgaW50NjQgICB7IHJldHVybiByZXZlbnVlIH0KZnVuYyBQYWludHMoKSBpbnQ2NCAgICB7IHJldHVybiBwYWludHMgfQpmdW5jIE1heEJhdGNoU2l6ZSgpIGludCB7IHJldHVybiBtYXhCYXRjaCB9CgovLyBQaXhlbCByZXR1cm5zIHRoZSBjb2xvciBpbmRleCBhdCAoeCwgeSk7IDAgbWVhbnMgbmV2ZXIgcGFpbnRlZC4KZnVuYyBQaXhlbCh4LCB5IGludCkgaW50IHsgcmV0dXJuIGludChib2FyZC5HZXQoeCwgeSkpIH0KCi8vIFJvd3MgcmV0dXJucyByb3dzIFtmcm9tLCB0bykgYXMgb25lIGhleCBkaWdpdCBwZXIgcGl4ZWwsIFdpZHRoIGRpZ2l0cyBwZXIKLy8gcm93LCB3aXRoIG5vIHNlcGFyYXRvcnMuIENsaWVudHMgcGFnZSB0aHJvdWdoIHRoZSBncmlkIHdpdGggaXQuCmZ1bmMgUm93cyhmcm9tLCB0byBpbnQpIHN0cmluZyB7IHJldHVybiBib2FyZC5Sb3dzKGZyb20sIHRvKSB9CgovLyBWZXJzaW9uIGlzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBwYWludCBjYWxscyBzbyBmYXIuIENsaWVudHMgcmVtZW1iZXIKLy8gaXQgYW5kIGFzayBEaXJ0eVJvd3MgZm9yIHdoYXQgY2hhbmdlZCBzaW5jZS4KZnVuYyBWZXJzaW9uKCkgaW50NjQgeyByZXR1cm4gdmVyc2lvbiB9CgovLyBEaXJ0eVJvd3MgbGlzdHMgdGhlIHJvd3MgcGFpbnRlZCBhZnRlciB2ZXJzaW9uIGBzaW5jZWAsIGFzICJ5LHkseSIgaW4KLy8gYXNjZW5kaW5nIG9yZGVyLiBEaXJ0eVJvd3MoMCkgaXMgZXZlcnkgcm93IHRoYXQgd2FzIGV2ZXIgcGFpbnRlZCwgd2hpY2gKLy8gaXMgYWxsIGEgZnJlc2ggY2xpZW50IG5lZWRzIHRvIGxvYWQ6IHRoZSBvdGhlcnMgYXJlIGJsYW5rLgpmdW5jIERpcnR5Um93cyhzaW5jZSBpbnQ2NCkgc3RyaW5nIHsKCWlmIHNpbmNlIDwgMCB7CgkJc2luY2UgPSAwCgl9Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglmb3IgeSwgdiA6PSByYW5nZSByb3dWZXJzaW9uIHsKCQlpZiB2IDw9IHNpbmNlIHsKCQkJY29udGludWUKCQl9CgkJaWYgc2IuTGVuKCkgPiAwIHsKCQkJc2IuV3JpdGVCeXRlKCcsJykKCQl9CgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKHkpKQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIFBhbGV0dGUgcmV0dXJucyB0aGUgMTYgcGFsZXR0ZSBjb2xvcnMgYXMgY29tbWEtc2VwYXJhdGVkIENTUyBoZXggdmFsdWVzLAovLyBpbmRleCAwIGJlaW5nIHRoZSBibGFuayBjb2xvci4KZnVuYyBQYWxldHRlKCkgc3RyaW5nIHsKCXJldHVybiBzdHJpbmdzLkpvaW4oY2FudmFzLlBhbGV0dGVbOl0sICIsIikKfQoKLy8gUmVuZGVyIHNob3dzIHRoZSBnYW1lIHN0YXRzIG9uIGdub3dlYi4gVGhlIHBhdGggaXMgaWdub3JlZC4KZnVuYyBSZW5kZXIoXyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBNaWxsaW9uIEdub1xuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkEgcGF5LXBlci1waXhlbCBjYW52YXMuIFBpY2sgYSBjb2xvciwgcGF5IHRoZSBwcmljZSwgb3duIHRoZSBwaXhlbCB1bnRpbCBzb21lb25lIHJlcGFpbnRzIGl0LiBQYXltZW50cyBnbyB0byB0aGUgYWRtaW4gd2FsbGV0LCB3aGljaCBwYWludHMgZm9yIGZyZWUuXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCB8IHxcbnwtLS18LS0tfFxuIikKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBTaXplIHwgJWQgeCAlZCB8XG4iLCBXaWR0aCwgSGVpZ2h0KSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBQcmljZSBwZXIgcGl4ZWwgfCAlZCVzIHxcbiIsIHByaWNlLCBEZW5vbSkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgUGl4ZWxzIHBhaW50ZWQgfCAlZCAvICVkIHxcbiIsIGJvYXJkLlBhaW50ZWQoKSwgV2lkdGgqSGVpZ2h0KSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBQYWludCBjYWxscyB8ICVkIHxcbiIsIHBhaW50cykpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgVmVyc2lvbiB8ICVkIHxcbiIsIHZlcnNpb24pKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IFJldmVudWUgfCAlZCVzIHxcbiIsIHJldmVudWUsIERlbm9tKSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBBZG1pbiB8ICVzIHxcbiIsIG93bmVyLlN0cmluZygpKSkKCXNiLldyaXRlU3RyaW5nKCJcbiMjIFBhbGV0dGVcblxuIikKCWZvciBpIDo9IDE7IGkgPD0gaW50KGNhbnZhcy5NYXhDb2xvcik7IGkrKyB7CgkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCItICVkOiBgJXNgXG4iLCBpLCBjYW52YXMuUGFsZXR0ZVtpXSkpCgl9CglzYi5Xcml0ZVN0cmluZygiXG4jIyBQYWludFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0gW1BhaW50IG9uZSBwaXhlbF0oIiArIFJlYWxtICsgIiRoZWxwJmZ1bmM9UGFpbnQpOiBgUGFpbnQoeCwgeSwgY29sb3IpYCB3aXRoIGAtc2VuZCA8cHJpY2U+dWdub3RgXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0gW1BhaW50IGEgYmF0Y2hdKCIgKyBSZWFsbSArICIkaGVscCZmdW5jPVBhaW50QmF0Y2gpOiBgUGFpbnRCYXRjaChcIngseSxjb2xvcjt4LHksY29sb3JcIilgIHdpdGggYC1zZW5kIDxwcmljZSpjb3VudD51Z25vdGBcbiIpCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gUmVhbG0gaXMgdGhpcyByZWFsbSdzIGdub3dlYiBwYXRoLgpjb25zdCBSZWFsbSA9ICIvci9nMTl0NmY0ZjRwdHQzbTk0OWp6bmFsZnN4Mmg4YWo2OTZsbHVsMG5qL21pbGxpb24vdjAiChrpXgoQbWlsbGlvbl90ZXN0LmdubxLUXnBhY2thZ2UgbWlsbGlvbgoKaW1wb3J0ICgKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgp2YXIgKAoJZGVwbG95ZXIgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImRlcGxveWVyIikKCWFsaWNlICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhbGljZSIpCglib2IgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYm9iIikKKQoKdmFyIHJlYWxtQWRkciA9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2cxOXQ2ZjRmNHB0dDNtOTQ5anpuYWxmc3gyaDhhajY5NmxsdWwwbmovbWlsbGlvbi92MCIpCgovLyBUZXN0cyBvd24gdGhlIGFkbWluIHJvbGUgdGhyb3VnaCBhIHRlc3QgYWRkcmVzcyByYXRoZXIgdGhhbiBEZWZhdWx0QWRtaW4uCmZ1bmMgaW5pdCgpIHsKCW93bmVyID0gZGVwbG95ZXIKfQoKLy8gZnVuZCBjcmVkaXRzIHRoZSByZWFsbSB3aXRoIHdoYXQgdGhlIG5leHQgcGFpbnQgY2FsbCBjbGFpbXMgdG8gc2VuZCwgYXMKLy8gdGhlIGNoYWluIHdvdWxkIGJlZm9yZSBydW5uaW5nIHRoZSBtZXNzYWdlLCBhbmQgcmVzZXRzIHRoZSBwZXItbWVzc2FnZQovLyBvcmlnaW4tc2VuZCBzcGVuZGluZyBsaW1pdCB0aGF0IHRoZSBwcmV2aW91cyBjYWxsIHVzZWQgdXAuCmZ1bmMgZnVuZChuIGludDY0KSB7Cgl0ZXN0aW5nLlNldE9yaWdpblNwZW5kKG5pbCkKCWlmIG4gPiAwIHsKCQl0ZXN0aW5nLklzc3VlQ29pbnMocmVhbG1BZGRyLCB1Z25vdChuKSkKCX0KfQoKZnVuYyBiYWxhbmNlT2YoYSBhZGRyZXNzKSBpbnQ2NCB7CglyZXR1cm4gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbihhLCBEZW5vbSkKfQoKZnVuYyB1Z25vdChuIGludDY0KSBjaGFpbi5Db2lucyB7CglyZXR1cm4gY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihEZW5vbSwgbikpCn0KCi8vIHRlc3RpbmcuU2V0UmVhbG0gb25seSBhZmZlY3RzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIGl0LCBzbyBpdCBjYW5ub3QgYmUKLy8gd3JhcHBlZCBpbiBhIGhlbHBlcjogZXZlcnkgdGVzdCBzZXRzIHRoZSBjYWxsZXIgaW5saW5lLgoKZnVuYyBUZXN0SW5pdGlhbFN0YXRlKHQgKnRlc3RpbmcuVCkgewoJdWFzc2VydC5FcXVhbCh0LCBXaWR0aCwgR2V0V2lkdGgoKSkKCXVhc3NlcnQuRXF1YWwodCwgSGVpZ2h0LCBHZXRIZWlnaHQoKSkKCXVhc3NlcnQuRXF1YWwodCwgRGVmYXVsdFByaWNlLCBQcmljZSgpKQoJdWFzc2VydC5FcXVhbCh0LCBEZWZhdWx0TWF4QmF0Y2gsIE1heEJhdGNoU2l6ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgwLCAwKSkKCXVhc3NlcnQuRXF1YWwodCwgZGVwbG95ZXIsIE93bmVyKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDE2LCBsZW4oc3RyaW5ncy5TcGxpdChQYWxldHRlKCksICIsIikpKQp9CgpmdW5jIFRlc3RQYWludE9uZVBpeGVsKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglhZG1pbkJlZm9yZSA6PSBiYWxhbmNlT2Yob3duZXIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJZnVuZChwcmljZSkKCVBhaW50KGNyb3NzKGN1ciksIDEwLCAyMCwgNikKCgl1YXNzZXJ0LkVxdWFsKHQsIDYsIFBpeGVsKDEwLCAyMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIFBhaW50ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgcHJpY2UsIFJldmVudWUoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIFBhaW50cygpKQoJLy8gVGhlIHBheW1lbnQgd2VudCBzdHJhaWdodCB0byB0aGUgYWRtaW4sIG5vdGhpbmcgc3RheWVkIGluIHRoZSByZWFsbS4KCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5CZWZvcmUrcHJpY2UsIGJhbGFuY2VPZihvd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBiYWxhbmNlT2YocmVhbG1BZGRyKSkKCgkvLyBBbnlvbmUgY2FuIHJlcGFpbnQgZm9yIHRoZSBzYW1lIHByaWNlOyB0aGUgY291bnQgZG9lcyBub3QgZ3Jvdy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCglmdW5kKHByaWNlKQoJUGFpbnQoY3Jvc3MoY3VyKSwgMTAsIDIwLCAxNSkKCXVhc3NlcnQuRXF1YWwodCwgMTUsIFBpeGVsKDEwLCAyMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIFBhaW50ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMipwcmljZSwgUmV2ZW51ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbkJlZm9yZSsyKnByaWNlLCBiYWxhbmNlT2Yob3duZXIpKQp9CgpmdW5jIFRlc3RBZG1pblBhaW50c0ZvckZyZWUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWFkbWluQmVmb3JlIDo9IGJhbGFuY2VPZihvd25lcikKCXJldmVudWVCZWZvcmUgOj0gUmV2ZW51ZSgpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUGFpbnQoY3Jvc3MoY3VyKSwgNDAwLCA0MDAsIDgpCgl1YXNzZXJ0LkVxdWFsKHQsIDgsIFBpeGVsKDQwMCwgNDAwKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglQYWludEJhdGNoKGNyb3NzKGN1ciksICI0MDEsNDAwLDk7NDAyLDQwMCwxMCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEwLCBQaXhlbCg0MDIsIDQwMCkpCgoJLy8gRnJlZSBtZWFucyBleGFjdGx5IGZyZWU6IHRoZSBhZG1pbiBtdXN0IG5vdCBhdHRhY2ggY29pbnMgZWl0aGVyLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSAwdWdub3QiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCA0MDMsIDQwMCwgMSkgfSkKCgl1YXNzZXJ0LkVxdWFsKHQsIHJldmVudWVCZWZvcmUsIFJldmVudWUoKSkKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5CZWZvcmUsIGJhbGFuY2VPZihvd25lcikpCn0KCmZ1bmMgVGVzdFBhaW50UmVqZWN0c1dyb25nUGF5bWVudChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVmb3JlIDo9IFBhaW50ZWQoKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHByaWNlLTEpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDAsIDAsIDEpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UrMSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKCJ1YXRvbSIsIHByaWNlKSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm9ubHkgdWdub3QgaXMgYWNjZXB0ZWQiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCAwLCAxKSB9KQoKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlLCBQYWludGVkKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIFBpeGVsKDAsIDApKQp9CgpmdW5jIFRlc3RQYWludFJlamVjdHNJbnZhbGlkUGl4ZWxzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm91dCBvZiByYW5nZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIFdpZHRoLCAwLCAxKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvdXQgb2YgcmFuZ2UiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCBIZWlnaHQsIDEpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm91dCBvZiByYW5nZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIC0xLCAwLCAxKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJjb2xvciBtdXN0IGJlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMCkgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiY29sb3IgbXVzdCBiZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDAsIDAsIDE2KSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJjb2xvciBtdXN0IGJlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgLTEpIH0pCn0KCmZ1bmMgVGVzdFBhaW50UmVqZWN0c0NvZGVSZWFsbShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJLy8gUmVncmVzc2lvbiBmb3IgdGhlIE9yaWdpblNlbmQgYnlwYXNzOiBhbiBpbnRlcm1lZGlhdGUgcmVhbG0gZm9yd2FyZHMKCS8vIHRoZSBjYWxsIHdoaWxlIHRoZSBlbnZlbG9wZSBjbGFpbXMgdGhlIGNvaW5zIHdlcmUgc2VudC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYXR0YWNrZXIvd3JhcHBlciIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHByaWNlKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZGlyZWN0bHkgYnkgYSB1c2VyIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMSwgMSwgMSkgfSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgUGl4ZWwoMSwgMSkpCn0KCmZ1bmMgVGVzdFBhaW50QmF0Y2goY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZm9yZSA6PSBQYWludGVkKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDMgKiBwcmljZSkpCglmdW5kKDMgKiBwcmljZSkKCVBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgIjEwMCwxMDAsMTsxMDEsMTAwLDI7MTAyLDEwMCwzOyIpCgoJdWFzc2VydC5FcXVhbCh0LCAxLCBQaXhlbCgxMDAsIDEwMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIFBpeGVsKDEwMSwgMTAwKSkKCXVhc3NlcnQuRXF1YWwodCwgMywgUGl4ZWwoMTAyLCAxMDApKQoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUrMywgUGFpbnRlZCgpKQoKCXJvdyA6PSBSb3dzKDEwMCwgMTAxKQoJdWFzc2VydC5FcXVhbCh0LCBXaWR0aCwgbGVuKHJvdykpCgl1YXNzZXJ0LkVxdWFsKHQsICIxMjMiLCByb3dbMTAwOjEwM10pCn0KCmZ1bmMgVGVzdFBhaW50QmF0Y2hJc0F0b21pYyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJLy8gT25lIGJhZCBwaXhlbCByZWplY3RzIHRoZSB3aG9sZSBiYXRjaCBiZWZvcmUgYW55dGhpbmcgaXMgd3JpdHRlbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDIqcHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvdXQgb2YgcmFuZ2UiLCBmdW5jKCkgeyBQYWludEJhdGNoKGNyb3NzKGN1ciksICIyMDAsMjAwLDE7OTk5OSwwLDEiKSB9KQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgyMDAsIDIwMCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSIsIGZ1bmMoKSB7IFBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgIjIwMCwyMDAsMTsyMDEsMjAwLDEiKSB9KQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgyMDAsIDIwMCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJ4LHksY29sb3IiLCBmdW5jKCkgeyBQYWludEJhdGNoKGNyb3NzKGN1ciksICJnYXJiYWdlIikgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAieCx5LGNvbG9yIiwgZnVuYygpIHsgUGFpbnRCYXRjaChjcm9zcyhjdXIpLCAiIikgfSkKfQoKZnVuYyBUZXN0UGFpbnRCYXRjaFRvb0xhcmdlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglmb3IgaSA6PSAwOyBpIDw9IG1heEJhdGNoOyBpKysgewoJCWlmIGkgPiAwIHsKCQkJc2IuV3JpdGVCeXRlKCc7JykKCQl9CgkJc2IuV3JpdGVTdHJpbmcoIjAsIikKCQlzYi5Xcml0ZVN0cmluZyhpdG9hKGkpKQoJCXNiLldyaXRlU3RyaW5nKCIsMSIpCgl9Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChpbnQ2NChtYXhCYXRjaCsxKSpwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRvbyBtYW55IHBpeGVscyIsIGZ1bmMoKSB7IFBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgc2IuU3RyaW5nKCkpIH0pCn0KCmZ1bmMgVGVzdFNldFByaWNlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyIG9ubHkiLCBmdW5jKCkgeyBTZXRQcmljZShjcm9zcyhjdXIpLCAxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicHJpY2UgbXVzdCBub3QgYmUgbmVnYXRpdmUiLCBmdW5jKCkgeyBTZXRQcmljZShjcm9zcyhjdXIpLCAtMSkgfSkKCVNldFByaWNlKGNyb3NzKGN1ciksIDApCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQcmljZSgpKQoKCS8vIEZyZWUgcGFpbnRpbmcgcmVxdWlyZXMgc2VuZGluZyBub3RoaW5nLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUGFpbnQoY3Jvc3MoY3VyKSwgMzAwLCAzMDAsIDQpCgl1YXNzZXJ0LkVxdWFsKHQsIDQsIFBpeGVsKDMwMCwgMzAwKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDMwMCwgMzAxLCA0KSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVNldFByaWNlKGNyb3NzKGN1ciksIERlZmF1bHRQcmljZSkKfQoKZnVuYyBUZXN0U2V0TWF4QmF0Y2goY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCW9yaWcgOj0gTWF4QmF0Y2hTaXplKCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsIGZ1bmMoKSB7IFNldE1heEJhdGNoKGNyb3NzKGN1ciksIDEwMCkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibWF4IGJhdGNoIG11c3QgYmUgYmV0d2VlbiIsIGZ1bmMoKSB7IFNldE1heEJhdGNoKGNyb3NzKGN1ciksIDApIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm1heCBiYXRjaCBtdXN0IGJlIGJldHdlZW4iLCBmdW5jKCkgeyBTZXRNYXhCYXRjaChjcm9zcyhjdXIpLCBIYXJkTWF4QmF0Y2grMSkgfSkKCglTZXRNYXhCYXRjaChjcm9zcyhjdXIpLCAzKQoJdWFzc2VydC5FcXVhbCh0LCAzLCBNYXhCYXRjaFNpemUoKSkKCgkvLyBUaGUgbmV3IGxpbWl0IGlzIGVuZm9yY2VkIGJ5IFBhaW50QmF0Y2guCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCg0ICogcHJpY2UpKQoJZnVuZCg0ICogcHJpY2UpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRvbyBtYW55IHBpeGVscyIsIGZ1bmMoKSB7CgkJUGFpbnRCYXRjaChjcm9zcyhjdXIpLCAiMCw1MDAsMTsxLDUwMCwxOzIsNTAwLDE7Myw1MDAsMSIpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJU2V0TWF4QmF0Y2goY3Jvc3MoY3VyKSwgb3JpZykKCXVhc3NlcnQuRXF1YWwodCwgb3JpZywgTWF4QmF0Y2hTaXplKCkpCn0KCmZ1bmMgVGVzdFdpdGhkcmF3KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLklzc3VlQ29pbnMocmVhbG1BZGRyLCB1Z25vdCgxXzAwMCkpCglybyA6PSBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKQoJYm9iQmVmb3JlIDo9IHJvLkdldENvaW4oYm9iLCBEZW5vbSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyIG9ubHkiLCBmdW5jKCkgeyBXaXRoZHJhdyhjcm9zcyhjdXIpLCBhbGljZSwgMSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIiwgZnVuYygpIHsgV2l0aGRyYXcoY3Jvc3MoY3VyKSwgYm9iLCAwKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGFkZHJlc3MiLCBmdW5jKCkgeyBXaXRoZHJhdyhjcm9zcyhjdXIpLCBhZGRyZXNzKCJub3BlIiksIDEpIH0pCglXaXRoZHJhdyhjcm9zcyhjdXIpLCBib2IsIDYwMCkKCgl1YXNzZXJ0LkVxdWFsKHQsIGJvYkJlZm9yZSs2MDAsIHJvLkdldENvaW4oYm9iLCBEZW5vbSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDQwMCksIHJvLkdldENvaW4ocmVhbG1BZGRyLCBEZW5vbSkpCgkvLyBMZWF2ZSB0aGUgcmVhbG0gZW1wdHkgZm9yIHRoZSB0ZXN0cyB0aGF0IGFzc2VydCBvbiBpdC4KCVdpdGhkcmF3KGNyb3NzKGN1ciksIGJvYiwgNDAwKQp9CgpmdW5jIFRlc3RUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJb3JpZ2luYWwgOj0gb3duZXIKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyIG9ubHkiLCBmdW5jKCkgeyBUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBhbGljZSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG9yaWdpbmFsKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgYWRkcmVzcyIsIGZ1bmMoKSB7IFRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGFkZHJlc3MoIm5vcGUiKSkgfSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGFsaWNlKQoJdWFzc2VydC5FcXVhbCh0LCBhbGljZSwgT3duZXIoKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBvcmlnaW5hbCkKCXVhc3NlcnQuRXF1YWwodCwgb3JpZ2luYWwsIE93bmVyKCkpCn0KCmZ1bmMgVGVzdFZlcnNpb25BbmREaXJ0eVJvd3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXYgOj0gVmVyc2lvbigpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBEaXJ0eVJvd3ModikpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMyAqIHByaWNlKSkKCWZ1bmQoMyAqIHByaWNlKQoJUGFpbnRCYXRjaChjcm9zcyhjdXIpLCAiMCw3MDAsMTsxLDcwMCwyOzAsNzAxLDMiKQoKCXVhc3NlcnQuRXF1YWwodCwgdisxLCBWZXJzaW9uKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICI3MDAsNzAxIiwgRGlydHlSb3dzKHYpKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgRGlydHlSb3dzKFZlcnNpb24oKSkpCgoJLy8gQSBzZWNvbmQgY2FsbCBvbiBvbmUgb2YgdGhvc2Ugcm93cyBtb3ZlcyBvbmx5IHRoYXQgcm93IGZvcndhcmQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJZnVuZChwcmljZSkKCVBhaW50KGNyb3NzKGN1ciksIDUsIDcwMSwgNCkKCXVhc3NlcnQuRXF1YWwodCwgdisyLCBWZXJzaW9uKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICI3MDEiLCBEaXJ0eVJvd3ModisxKSkKCXVhc3NlcnQuRXF1YWwodCwgIjcwMCw3MDEiLCBEaXJ0eVJvd3ModikpCgoJLy8gQSByZWplY3RlZCBwYWludCBjaGFuZ2VzIG5vdGhpbmcuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgNSwgNzAyLCA0KSB9KQoJdWFzc2VydC5FcXVhbCh0LCB2KzIsIFZlcnNpb24oKSkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIERpcnR5Um93cyh2KzIpKQoKCS8vIE5lZ2F0aXZlICJzaW5jZSIgYmVoYXZlcyBsaWtlIHplcm86IHBhaW50ZWQgcm93cyBvbmx5LCBuZXZlciBibGFuayBvbmVzLgoJdWFzc2VydC5FcXVhbCh0LCBEaXJ0eVJvd3MoMCksIERpcnR5Um93cygtMSkpCgl1YXNzZXJ0LlRydWUodCwgIXN0cmluZ3MuQ29udGFpbnMoIiwiK0RpcnR5Um93cygwKSsiLCIsICIsNzk5LCIpLCAicm93IDc5OSB3YXMgbmV2ZXIgcGFpbnRlZCIpCn0KCmZ1bmMgVGVzdFJlbmRlcih0ICp0ZXN0aW5nLlQpIHsKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIjIE1pbGxpb24gR25vIiksICJ0aXRsZSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJ8IFNpemUgfCAxMjUwIHggODAwIHwiKSwgInNpemUgcm93IikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInwgUHJpY2UgcGVyIHBpeGVsIHwgNTAwMDB1Z25vdCB8IiksICJwcmljZSByb3ciKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAifCBBZG1pbiB8ICIrb3duZXIuU3RyaW5nKCkrIiB8IiksICJhZG1pbiByb3ciKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiJGhlbHAmZnVuYz1QYWludEJhdGNoIiksICJoZWxwIGxpbmsiKQp9CgpmdW5jIGl0b2EobiBpbnQpIHN0cmluZyB7CglpZiBuID09IDAgewoJCXJldHVybiAiMCIKCX0KCXZhciBiIFtdYnl0ZQoJZm9yIG4gPiAwIHsKCQliID0gYXBwZW5kKFtdYnl0ZXtieXRlKCcwJyArIG4lMTApfSwgYi4uLikKCQluIC89IDEwCgl9CglyZXR1cm4gc3RyaW5nKGIpCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0yMDAwMDAwMHVnbm90EhMIgISvXxIMMTAwMDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAvwH3/GnLWpLzIMEvHOYv6hfL87sCu35eY0XnbIXr1bXEkBfiC9BauITaw1XV6hBr3UPZ5dy2WtEqgcLGeAnic+c/hUEthh57K+bPWbaGFlp2cCmKEoTxKrD25J8lLIATV9CGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl