Transaction executed successfully

Transaction Details

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

Transaction hash
04C0210124D6399502621C4267DD737325F417877C9C823FF04C4E0D70AC8D16

Transaction overview

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

Execution summary

TX INDEX
1
Position in block
GAS WANTED
59,929,257
Requested gas limit
GAS USED
49,941,077
Gas consumed
FEE
59930ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CsKlAgoML3ZtLm1fYWRkcGtnErClAgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBKCpQIKDHByb3RvY29sX2ZlZRIiZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZS92MRq9FAoJUkVBRE1FLm1kEq8UIyBQcm90b2NvbCBGZWUKCkZlZSBjb2xsZWN0aW9uIGFuZCBkaXN0cmlidXRpb24gZm9yIHByb3RvY29sIG9wZXJhdGlvbnMuCgojIyBPdmVydmlldwoKVGhlIHByb3RvY29sLWZlZSBjb250cmFjdCBjb2xsZWN0cyBhdXRob3JpemVkIGZlZXMgZnJvbSBwcm90b2NvbCBvcGVyYXRpb25zIGFuZApkaXN0cmlidXRlcyB0aGVtIHRvIEdvdlN0YWtlciBhbmQgRGV2T3BzIGFjY29yZGluZyB0byBjb25maWd1cmVkIHBlcmNlbnRhZ2VzLgoKIyMgQ29uZmlndXJhdGlvbgoKLSAqKlJvdXRlciBGZWUgKGluaXRpYWwvZGVmYXVsdCkqKjogMC4xNSUgb2YgdGhlIHN3YXAgYW1vdW50OyBjb25maWd1cmVkIGJ5IHRoZSByb3V0ZXIsIHdpdGggYW4gYWRtaW4tb3ItZ292ZXJuYW5jZSByYW5nZSBvZiAw4oCTMTAlCi0gKipQb29sIENyZWF0aW9uIEZlZSAoaW5pdGlhbC9kZWZhdWx0KSoqOiAxMDAgR05TOyBjb25maWd1cmVkIGJ5IHRoZSBwb29sIGFuZCBtb2RpZmlhYmxlIHRocm91Z2ggZ292ZXJuYW5jZQotICoqV2l0aGRyYXdhbCBGZWUgKGluaXRpYWwvZGVmYXVsdCkqKjogMSUgb2YgTFAgZmVlcyBjbGFpbWVkOyBjb25maWd1cmVkIGJ5IHRoZSBwb29sIGFuZCBtb2RpZmlhYmxlIHRocm91Z2ggZ292ZXJuYW5jZQotICoqVW5zdGFraW5nIEZlZSAoaW5pdGlhbC9kZWZhdWx0KSoqOiAxJSBvZiBzdGFraW5nIHJld2FyZHM7IGNvbmZpZ3VyZWQgYnkgdGhlIHN0YWtlciBhbmQgbW9kaWZpYWJsZSBieSBhZG1pbiBvciBnb3Zlcm5hbmNlCi0gKipEaXN0cmlidXRpb24gKGRlZmF1bHQpKio6IDEwMCUgdG8gR292U3Rha2VyIGFuZCAwJSB0byBEZXZPcHMKClRoZSBvcGVyYXRpb24tc3BlY2lmaWMgZmVlcyBhYm92ZSBhcmUgY29uZmlndXJlZCBpbiB0aGVpciBvd25pbmcgbW9kdWxlczsgdGhleQphcmUgbm90IHByb3RvY29sLWZlZSBkaXN0cmlidXRpb24gcGVyY2VudGFnZXMuCgojIyBGZWUgU291cmNlcwoKMS4gKipTd2FwcyoqOiBUaGUgcm91dGVyIGFwcGxpZXMgaXRzIGNvbmZpZ3VyZWQgc3dhcCBmZWUgKDAuMTUlIGluaXRpYWxseSkuCjIuICoqUG9vbCBDcmVhdGlvbioqOiBUaGUgcG9vbCBjaGFyZ2VzIGl0cyBjb25maWd1cmVkIGNyZWF0aW9uIGZlZSAoMTAwIEdOUyBpbml0aWFsbHkpLgozLiAqKkxQIFdpdGhkcmF3YWxzKio6IFRoZSBwb29sIGNoYXJnZXMgaXRzIGNvbmZpZ3VyZWQgd2l0aGRyYXdhbCBmZWUgKDElIGluaXRpYWxseSkuCjQuICoqU3Rha2luZyBDbGFpbXMqKjogVGhlIHN0YWtlciBjaGFyZ2VzIGl0cyBjb25maWd1cmVkIHVuc3Rha2luZyBmZWUgKDElIGluaXRpYWxseSkuCgojIyBLZXkgRnVuY3Rpb25zCgojIyMgYERpc3RyaWJ1dGVQcm90b2NvbEZlZWAKRGlzdHJpYnV0ZXMgYWNjdW11bGF0ZWQgZmVlcyB0byByZWNpcGllbnRzLgoKIyMjIGBTZXREZXZPcHNQY3RgClNldHMgdGhlIERldk9wcyBmdW5kaW5nIHBlcmNlbnRhZ2UuCgojIyMgYFNldEdvdlN0YWtlclBjdGAKU2V0cyB0aGUgR292U3Rha2VyIGZ1bmRpbmcgcGVyY2VudGFnZS4KCiMjIyBgQWRkVG9Qcm90b2NvbEZlZWAKQWRkcyBhbiBhcHByb3ZlZCBmZWUgYW1vdW50IHRvIHRoZSBkaXN0cmlidXRpb24gcXVldWUuCgojIyMgYEFkdmFuY2VBY2NydWFsRXBvY2hgCkNsb3NlcyB0aGUgYWNjcnVhbCBlcG9jaCBpbiBmb3JjZSBhbmQgcmV0dXJucyB0aGUgbmV3IG9uZS4gQ2FsbGVkIGJ5IGdvdi9zdGFrZXIgb24gZXZlcnkgc3Rha2UgY2hhbmdlLCBzbyBmZWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHRoZSBzdGFrZSBkaXN0cmlidXRpb24gbGl2ZSB3aGVuIHRoZXkgYXJyaXZlZC4KCiMjIyBgQ29uc3VtZUFjY3J1YWxCdWNrZXRzYApSZXR1cm5zIGFuZCBjbGVhcnMgdXAgdG8gYGxpbWl0YCBvZiB0aGUgb2xkZXN0IHBlbmRpbmcgYnVja2V0cyBvZiBvbmUgdG9rZW4sIGFzIHBhcmFsbGVsIGVwb2NoIGFuZCBhbW91bnQgc2xpY2VzLiBDYWxsZWQgYnkgZ292L3N0YWtlciB3aGVuIHRoYXQgdG9rZW4gaXMgY29sbGVjdGVkLgoKIyMgVXNhZ2UKCmBgYGdvCi8vIERpc3RyaWJ1dGUgYWNjdW11bGF0ZWQgZmVlcwpEaXN0cmlidXRlUHJvdG9jb2xGZWUoY3Jvc3MoY3VyKSkKCi8vIENvbmZpZ3VyZSBkaXN0cmlidXRpb24KU2V0RGV2T3BzUGN0KGNyb3NzKGN1ciksIDIwMDApICAgICAvLyAyMCUgdG8gRGV2T3BzClNldEdvdlN0YWtlclBjdChjcm9zcyhjdXIpLCA4MDAwKSAgLy8gODAlIHRvIEdvdlN0YWtlcgoKLy8gVmlldyB0b2tlbnMgcmVzZXJ2ZWQgZm9yIHRoZSBuZXh0IGRpc3RyaWJ1dGlvbgpHZXRSZXNlcnZlZFRva2VucygpCgovLyBWaWV3IHdoYXQgZ292L3N0YWtlciBoYXMgbm90IGZvbGRlZCB5ZXQKR2V0QWNjcnVhbEVwb2NoKCkKR2V0QWNjcnVhbFBlbmRpbmdUb2tlbnMoKQpHZXRBY2NydWFsQnVja2V0cyh0b2tlblBhdGgsIDApCmBgYAoKIyMgU2VjdXJpdHkKCi0gQ29uZmlndXJhdGlvbiBjaGFuZ2VzIGFyZSByZXN0cmljdGVkIHRvIGFkbWluIG9yIGdvdmVybmFuY2U7IGRpc3RyaWJ1dGlvbiBpcyByZXN0cmljdGVkIHRvIGFkbWluIG9yIGdvdi9zdGFrZXIKLSBBdXRvbWF0aWMgZmVlIGFjY3VtdWxhdGlvbgotIE11bHRpLXRva2VuIHN1cHBvcnQKLSBUcmFuc3BhcmVudCBkaXN0cmlidXRpb24gdHJhY2tpbmcKGtcLCgphc3NlcnQuZ25vEsgLcGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCAoCglwcmJhYyAiZ25vLmxhbmQvcC9nbm9zd2FwL3JiYWMvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIGFzc2VydElzUG9vbE9yUG9zaXRpb25PclJvdXRlck9yU3Rha2VyIHBhbmljcyBpZiB0aGUgY2FsbGVyIGlzIG5vdCB0aGUgcG9vbCwgcm91dGVyLCBvciBzdGFrZXIgY29udHJhY3QuCmZ1bmMgYXNzZXJ0SXNQb29sT3JQb3NpdGlvbk9yUm91dGVyT3JTdGFrZXIoY2FsbGVyIGFkZHJlc3MpIHsKCWlmIGFjY2Vzcy5Jc0F1dGhvcml6ZWQocHJiYWMuUk9MRV9QT09MLlN0cmluZygpLCBjYWxsZXIpIHx8CgkJYWNjZXNzLklzQXV0aG9yaXplZChwcmJhYy5ST0xFX1BPU0lUSU9OLlN0cmluZygpLCBjYWxsZXIpIHx8CgkJYWNjZXNzLklzQXV0aG9yaXplZChwcmJhYy5ST0xFX1JPVVRFUi5TdHJpbmcoKSwgY2FsbGVyKSB8fAoJCWFjY2Vzcy5Jc0F1dGhvcml6ZWQocHJiYWMuUk9MRV9TVEFLRVIuU3RyaW5nKCksIGNhbGxlcikgewoJCXJldHVybgoJfQoKCXBhbmljKHVmbXQuRXJyb3JmKCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciAlcyBpcyBub3QgcG9vbCBvciBwb3NpdGlvbiBvciByb3V0ZXIgb3Igc3Rha2VyIiwgY2FsbGVyKSkKfQoKLy8gYXNzZXJ0SXNBZG1pbk9yR292U3Rha2VyIHBhbmljcyBpZiB0aGUgY2FsbGVyIGlzIG5vdCBhZG1pbiBvciBnb3Yvc3Rha2VyLgpmdW5jIGFzc2VydElzQWRtaW5PckdvdlN0YWtlcihjYWxsZXIgYWRkcmVzcykgewoJaWYgYWNjZXNzLklzQXV0aG9yaXplZChwcmJhYy5ST0xFX0FETUlOLlN0cmluZygpLCBjYWxsZXIpIHsKCQlyZXR1cm4KCX0KCglpZiBhY2Nlc3MuSXNBdXRob3JpemVkKHByYmFjLlJPTEVfR09WX1NUQUtFUi5TdHJpbmcoKSwgY2FsbGVyKSB7CgkJcmV0dXJuCgl9CgoJcGFuaWModWZtdC5FcnJvcmYoInVuYXV0aG9yaXplZDogY2FsbGVyICVzIGlzIG5vdCBhZG1pbiBvciBnb3Yvc3Rha2VyIiwgY2FsbGVyKSkKfQoKLy8gYXNzZXJ0SXNWYWxpZFBlcmNlbnQgcGFuaWNzIGlmIHRoZSBwZXJjZW50YWdlIGlzIGludmFsaWQgKG5vdCBiZXR3ZWVuIDAtMTAwMDApLgpmdW5jIGFzc2VydElzVmFsaWRQZXJjZW50KHBjdCBpbnQ2NCkgewoJaWYgcGN0ID4gMTAwMDAgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWwoCgkJCWVyckludmFsaWRQY3QsCgkJCXVmbXQuU3ByaW50ZigicGN0KCVkKSBzaG91bGQgbm90IGJlIGJpZ2dlciB0aGFuIDEwMDAwIiwgcGN0KSwKCQkpKQoJfQoKCWlmIHBjdCA8IDAgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWwoCgkJCWVyckludmFsaWRQY3QsCgkJCXVmbXQuU3ByaW50ZigicGN0KCVkKSBzaG91bGQgbm90IGJlIHNtYWxsZXIgdGhhbiAwIiwgcGN0KSwKCQkpKQoJfQp9CgpmdW5jIGFzc2VydE5vdEltcGxlbWVudFlldCgpIHsKCXBhbmljKCJOb3RJbXBsZW1lbnRZZXQiKQp9ChqhAgoHZG9jLmdubxKVAi8vIHBhY2thZ2UgdjEgY29sbGVjdHMgYW5kIGRpc3RyaWJ1dGVzIHByb3RvY29sIGZlZXMgZnJvbSBzd2Fwcy4KLy8KLy8gVGhpcyBjb250cmFjdCBhY2N1bXVsYXRlcyBmZWVzIGdlbmVyYXRlZCBmcm9tIHRyYWRpbmcgYWN0aXZpdHkgYW5kCi8vIGRpc3RyaWJ1dGVzIHRoZW0gdG8gZGV2T3BzIGFuZCBnb3Zlcm5hbmNlIHN0YWtlcnMgYWNjb3JkaW5nIHRvCi8vIGNvbmZpZ3VyYWJsZSBwZXJjZW50YWdlcyBzZXQgdGhyb3VnaCBnb3Zlcm5hbmNlLgpwYWNrYWdlIHByb3RvY29sX2ZlZQoaxgQKCmVycm9ycy5nbm8StwRwYWNrYWdlIHByb3RvY29sX2ZlZQoKaW1wb3J0ICgKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJZXJySW52YWxpZFBjdCAgICAgICAgPSAiW0dOT1NXQVAtUFJPVE9DT0xfRkVFLTAwMV0gaW52YWxpZCBwZXJjZW50YWdlIgoJZXJySW52YWxpZEFtb3VudCAgICAgPSAiW0dOT1NXQVAtUFJPVE9DT0xfRkVFLTAwMl0gaW52YWxpZCBhbW91bnQiCgllcnJQcm90b2NvbEZlZUhhbHRlZCA9ICJbR05PU1dBUC1QUk9UT0NPTF9GRUUtMDAzXSBwcm90b2NvbCBmZWUgaGFsdGVkIgoJZXJyU3Bvb2ZlZFJlYWxtICAgICAgPSAiW0dOT1NXQVAtUFJPVE9DT0xfRkVFLTAwNF0gcmxtIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lIgopCgovLyBtYWtlRXJyb3JXaXRoRGV0YWlsIGNyZWF0ZXMgYW4gZXJyb3Igd2l0aCBhZGRpdGlvbmFsIGNvbnRleHQuCmZ1bmMgbWFrZUVycm9yV2l0aERldGFpbChtZXNzYWdlIHN0cmluZywgZGV0YWlsIHN0cmluZykgZXJyb3IgewoJcmV0dXJuIHVmbXQuRXJyb3JmKCIlcyB8fCAlcyIsIG1lc3NhZ2UsIGRldGFpbCkKfQoa1TIKCmdldHRlci5nbm8SxjJwYWNrYWdlIHByb3RvY29sX2ZlZQoKLy8gR2V0RGV2T3BzUGN0IHJldHVybnMgdGhlIHBlcmNlbnRhZ2UgYWxsb2NhdGVkIHRvIGRldk9wcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBjdDogRGV2T3BzJyBwcm90b2NvbC1mZWUgYWxsb2NhdGlvbiBwZXJjZW50YWdlIGluIGJhc2lzIHBvaW50cyAoMCB0aHJvdWdoIDEwMDAwKS4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldERldk9wc1BjdCgpIGludDY0IHsKCXJldHVybiBwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuRGV2T3BzUGN0KCkKfQoKLy8gR2V0R292U3Rha2VyUGN0IHJldHVybnMgdGhlIHBlcmNlbnRhZ2UgYWxsb2NhdGVkIHRvIGdvdi9zdGFrZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwY3Q6IEdvdi9TdGFrZXIncyBwcm90b2NvbC1mZWUgYWxsb2NhdGlvbiBwZXJjZW50YWdlIGluIGJhc2lzIHBvaW50cywgY29tcHV0ZWQgYXMgMTAwMDAgbWludXMgdGhlIHN0b3JlZCBEZXZPcHMgcGVyY2VudGFnZS4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEdvdlN0YWtlclBjdCgpIGludDY0IHsKCXJldHVybiBwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuR292U3Rha2VyUGN0KCkKfQoKLy8gR2V0UmVzZXJ2ZWRUb2tlbnMgcmV0dXJucyB0b2tlbiBwYXRocyByZXNlcnZlZCBmb3IgZGlzdHJpYnV0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5QYXRoczogVG9rZW4gcGF0aHMgY3VycmVudGx5IHJlc2VydmVkIGZvciBwcm90b2NvbC1mZWUgZGlzdHJpYnV0aW9uLgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgR2V0UmVzZXJ2ZWRUb2tlbnMoKSBbXXN0cmluZyB7CglyZXR1cm4gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLlJlc2VydmVkVG9rZW5zKCkKfQoKLy8gR2V0QWNjcnVhbEVwb2NoIHJldHVybnMgdGhlIGFjY3J1YWwgZXBvY2ggZmVlcyBhcmUgY3VycmVudGx5IGJ1Y2tldGVkIHVuZGVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXBvY2g6IEN1cnJlbnQgYWNjcnVhbCBlcG9jaCB1bmRlciB3aGljaCBuZXdseSBjb2xsZWN0ZWQgR292L1N0YWtlciBhbW91bnRzIGFyZSBidWNrZXRlZC4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEFjY3J1YWxFcG9jaCgpIGludDY0IHsKCXJldHVybiBwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuc3RvcmUuR2V0QWNjcnVhbEVwb2NoKCkKfQoKLy8gR2V0QWNjcnVhbFBlbmRpbmdUb2tlbnMgcmV0dXJucyB0aGUgdG9rZW4gcGF0aHMgdGhhdCBzdGlsbCBvd24gcGVuZGluZyBhY2NydWFsIGJ1Y2tldHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlblBhdGhzOiBUb2tlbiBwYXRocyB0aGF0IHN0aWxsIGhhdmUgb25lIG9yIG1vcmUgcGVuZGluZyBHb3YvU3Rha2VyIGFjY3J1YWwgYnVja2V0cy4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEFjY3J1YWxQZW5kaW5nVG9rZW5zKCkgW11zdHJpbmcgewoJcmV0dXJuIHBmLmdldFByb3RvY29sRmVlU3RhdGUoKS5zdG9yZS5HZXRBY2NydWFsUGVuZGluZ1Rva2VucygpCn0KCi8vIEdldEFjY3J1YWxCdWNrZXRzIHJldHVybnMgdXAgdG8gbGltaXQgb2YgdGhlIG9sZGVzdCBwZW5kaW5nIGJ1Y2tldHMgb2YgdG9rZW5QYXRoCi8vIHdpdGhvdXQgY2xlYXJpbmcgdGhlbS4gQSBsaW1pdCBvZiB6ZXJvIG9yIGxlc3MgcmV0dXJucyBldmVyeSBwZW5kaW5nIGJ1Y2tldC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBwZW5kaW5nIEdvdi9TdGFrZXIgYWNjcnVhbCBidWNrZXRzIHNob3VsZCBiZSByZWFkLgovLyAgIC0gbGltaXQ6IE1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgdG8gcmV0dXJuOyB6ZXJvIG9yIGEgbmVnYXRpdmUgdmFsdWUgcmV0dXJucyBhbGwgcGVuZGluZyBidWNrZXRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXBvY2hzOiBFcG9jaCBudW1iZXJzIGZvciB0aGUgcmV0dXJuZWQgYnVja2V0cyBpbiBhc2NlbmRpbmcgZXBvY2ggb3JkZXIuCi8vICAgLSBhbW91bnRzOiBHb3YvU3Rha2VyIGFtb3VudHMgZm9yIHRoZSByZXR1cm5lZCBlcG9jaHM7IGFtb3VudHNbaV0gY29ycmVzcG9uZHMgdG8gZXBvY2hzW2ldLgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgR2V0QWNjcnVhbEJ1Y2tldHModG9rZW5QYXRoIHN0cmluZywgbGltaXQgaW50KSAoW11pbnQ2NCwgW11pbnQ2NCkgewoJcmV0dXJuIHBmLmdldFByb3RvY29sRmVlU3RhdGUoKS5zdG9yZS5HZXRBY2NydWFsQnVja2V0cyh0b2tlblBhdGgsIGxpbWl0KQp9CgovLyBHZXRBY2N1VHJhbnNmZXJzVG9Hb3ZTdGFrZXIgcmV0dXJucyBhbGwgYWNjdW11bGF0ZWQgdHJhbnNmZXJzIHRvIGdvdi9zdGFrZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmFuc2ZlcnM6IFNuYXBzaG90IG1hcCBmcm9tIHRva2VuIHBhdGggdG8gY3VtdWxhdGl2ZSBhbW91bnQgYWxsb2NhdGVkIHRvIEdvdi9TdGFrZXIsIGluY2x1ZGluZyBhbW91bnRzIHN0aWxsIHBlbmRpbmcgZGlzdHJpYnV0aW9uLgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgR2V0QWNjdVRyYW5zZmVyc1RvR292U3Rha2VyKCkgbWFwW3N0cmluZ11pbnQ2NCB7CglhY2N1VHJhbnNmZXJzIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCkKCglwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuQWNjdVRvR292U3Rha2VyKCkuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlhbW91bnQsIG9rIDo9IHZhbHVlLihpbnQ2NCkKCQlpZiAhb2sgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgoJCWFjY3VUcmFuc2ZlcnNba2V5XSA9IGFtb3VudAoJCXJldHVybiBmYWxzZQoJfSkKCglyZXR1cm4gYWNjdVRyYW5zZmVycwp9CgovLyBHZXRBY2N1VHJhbnNmZXJzVG9EZXZPcHMgcmV0dXJucyBhbGwgYWNjdW11bGF0ZWQgdHJhbnNmZXJzIHRvIGRldk9wcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyYW5zZmVyczogU25hcHNob3QgbWFwIGZyb20gdG9rZW4gcGF0aCB0byBjdW11bGF0aXZlIGFtb3VudCBhbGxvY2F0ZWQgdG8gRGV2T3BzLCBpbmNsdWRpbmcgYW1vdW50cyBzdGlsbCBwZW5kaW5nIGRpc3RyaWJ1dGlvbi4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEFjY3VUcmFuc2ZlcnNUb0Rldk9wcygpIG1hcFtzdHJpbmddaW50NjQgewoJYWNjdVRyYW5zZmVycyA6PSBtYWtlKG1hcFtzdHJpbmddaW50NjQpCgoJcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkFjY3VUb0Rldk9wcygpLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJYW1vdW50LCBvayA6PSB2YWx1ZS4oaW50NjQpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoKCQlhY2N1VHJhbnNmZXJzW2tleV0gPSBhbW91bnQKCQlyZXR1cm4gZmFsc2UKCX0pCgoJcmV0dXJuIGFjY3VUcmFuc2ZlcnMKfQoKLy8gR2V0QWNjdVRyYW5zZmVyVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB0cmFuc2ZlciB0byBnb3Yvc3Rha2VyIGJ5IHRva2VuIHBhdGguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwYXRoOiBUb2tlbiBwYXRoIHdob3NlIGN1bXVsYXRpdmUgR292L1N0YWtlciBhbGxvY2F0aW9uIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBDdW11bGF0aXZlIEdvdi9TdGFrZXIgYW1vdW50IGFsbG9jYXRlZCBmb3IgcGF0aCwgb3IgemVybyB3aGVuIG5vIGFsbG9jYXRpb24gaXMgcmVjb3JkZWQuCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBHZXRBY2N1VHJhbnNmZXJUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkdldEFjY3VUcmFuc2ZlclRvR292U3Rha2VyQnlUb2tlblBhdGgocGF0aCkKfQoKLy8gR2V0QWNjdVRyYW5zZmVyVG9EZXZPcHNCeVRva2VuUGF0aCByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB0cmFuc2ZlciB0byBkZXZPcHMgYnkgdG9rZW4gcGF0aC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBhdGg6IFRva2VuIHBhdGggd2hvc2UgY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiBzaG91bGQgYmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogQ3VtdWxhdGl2ZSBEZXZPcHMgYW1vdW50IGFsbG9jYXRlZCBmb3IgcGF0aCwgb3IgemVybyB3aGVuIG5vIGFsbG9jYXRpb24gaXMgcmVjb3JkZWQuCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBHZXRBY2N1VHJhbnNmZXJUb0Rldk9wc0J5VG9rZW5QYXRoKHBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkdldEFjY3VUcmFuc2ZlclRvRGV2T3BzQnlUb2tlblBhdGgocGF0aCkKfQoKLy8gR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlciByZXR1cm5zIGFsbCBhY3R1YWwgdHJhbnNmZXJzIHRvIGdvdi9zdGFrZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmFuc2ZlcnM6IFNuYXBzaG90IG1hcCBmcm9tIHRva2VuIHBhdGggdG8gY3VtdWxhdGl2ZSBhbW91bnQgYWN0dWFsbHkgZGlzdHJpYnV0ZWQgdG8gR292L1N0YWtlci4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIoKSBtYXBbc3RyaW5nXWludDY0IHsKCWFjdHVhbERpc3RyaWJ1dGVkIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCkKCglwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuQWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlcigpLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJYW1vdW50LCBvayA6PSB2YWx1ZS4oaW50NjQpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoKCQlhY3R1YWxEaXN0cmlidXRlZFtrZXldID0gYW1vdW50CgkJcmV0dXJuIGZhbHNlCgl9KQoKCXJldHVybiBhY3R1YWxEaXN0cmlidXRlZAp9CgovLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzIHJldHVybnMgYWxsIGFjdHVhbCB0cmFuc2ZlcnMgdG8gZGV2T3BzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJhbnNmZXJzOiBTbmFwc2hvdCBtYXAgZnJvbSB0b2tlbiBwYXRoIHRvIGN1bXVsYXRpdmUgYW1vdW50IGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIERldk9wcy4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIEdldEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHMoKSBtYXBbc3RyaW5nXWludDY0IHsKCWFjdHVhbERpc3RyaWJ1dGVkIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCkKCglwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuQWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wcygpLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJYW1vdW50LCBvayA6PSB2YWx1ZS4oaW50NjQpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoKCQlhY3R1YWxEaXN0cmlidXRlZFtrZXldID0gYW1vdW50CgkJcmV0dXJuIGZhbHNlCgl9KQoKCXJldHVybiBhY3R1YWxEaXN0cmlidXRlZAp9CgovLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyQnlUb2tlblBhdGggcmV0dXJucyB0aGUgYWN0dWFsIHRyYW5zZmVyIHRvIGdvdi9zdGFrZXIgYnkgdG9rZW4gcGF0aC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBhdGg6IFRva2VuIHBhdGggd2hvc2UgY3VtdWxhdGl2ZSBhY3R1YWwgR292L1N0YWtlciBkaXN0cmlidXRpb24gc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgYW1vdW50IGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIEdvdi9TdGFrZXIgZm9yIHBhdGgsIG9yIHplcm8gd2hlbiBubyBoaXN0b3J5IGlzIHJlY29yZGVkLgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkdldEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aChwYXRoKQp9CgovLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzQnlUb2tlblBhdGggcmV0dXJucyB0aGUgYWN0dWFsIHRyYW5zZmVyIHRvIGRldk9wcyBieSB0b2tlbiBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcGF0aDogVG9rZW4gcGF0aCB3aG9zZSBjdW11bGF0aXZlIGFjdHVhbCBEZXZPcHMgZGlzdHJpYnV0aW9uIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBDdW11bGF0aXZlIGFtb3VudCBhY3R1YWxseSBkaXN0cmlidXRlZCB0byBEZXZPcHMgZm9yIHBhdGgsIG9yIHplcm8gd2hlbiBubyBoaXN0b3J5IGlzIHJlY29yZGVkLgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wc0J5VG9rZW5QYXRoKHBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkdldEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHNCeVRva2VuUGF0aChwYXRoKQp9ChpJCgtnbm9tb2QudG9tbBI6bW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUvdjEiCmdubyA9ICIwLjkiChrvEAoIaW5pdC5nbm8S4hBwYWNrYWdlIHByb3RvY29sX2ZlZQoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIgopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CglyZWdpc3RlclByb3RvY29sRmVlVjEoY3VyKQp9CgpmdW5jIHJlZ2lzdGVyUHJvdG9jb2xGZWVWMShjdXIgcmVhbG0pIHsKCXByb3RvY29sX2ZlZS5SZWdpc3RlckluaXRpYWxpemVyKGNyb3NzKGN1ciksIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgcHJvdG9jb2xGZWVTdG9yZSBwcm90b2NvbF9mZWUuSVByb3RvY29sRmVlU3RvcmUpIHByb3RvY29sX2ZlZS5JUHJvdG9jb2xGZWUgewoJCS8vIGBybG1gIGhlcmUgaXMgdGhlIHByb3RvY29sX2ZlZSBwcm94eSByZWFsbSB0aHJlYWRlZCBpbiBieQoJCS8vIHByb3RvY29sX2ZlZS5SZWdpc3RlckluaXRpYWxpemVyLiBQZXItdmVyc2lvbiBzdG9yZSBib290c3RyYXAKCQkvLyB3cml0ZXMgdGhlcmVmb3JlIHBhc3MgdGhlIHByb3h5J3MgS1Ytc3RvcmUgQUNMLgoJCWVyciA6PSBpbml0U3RvcmVEYXRhKDAsIHJsbSwgcHJvdG9jb2xGZWVTdG9yZSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCgkJcmV0dXJuIE5ld1Byb3RvY29sRmVlVjEocHJvdG9jb2xGZWVTdG9yZSkKCX0pCn0KCmZ1bmMgaW5pdFN0b3JlRGF0YShfIGludCwgcmxtIHJlYWxtLCBwcm90b2NvbEZlZVN0b3JlIHByb3RvY29sX2ZlZS5JUHJvdG9jb2xGZWVTdG9yZSkgZXJyb3IgewoJaWYgIXByb3RvY29sRmVlU3RvcmUuSGFzRGV2T3BzUGN0U3RvcmVLZXkoKSB7CgkJZXJyIDo9IHByb3RvY29sRmVlU3RvcmUuSW5pdGlhbGl6ZURldk9wc1BjdCgwLCBybG0pCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIXByb3RvY29sRmVlU3RvcmUuSGFzQWNjdVRvR292U3Rha2VyU3RvcmVLZXkoKSB7CgkJZXJyIDo9IHByb3RvY29sRmVlU3RvcmUuSW5pdGlhbGl6ZUFjY3VUb0dvdlN0YWtlcigwLCBybG0pCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIXByb3RvY29sRmVlU3RvcmUuSGFzQWNjdVRvRGV2T3BzU3RvcmVLZXkoKSB7CgkJZXJyIDo9IHByb3RvY29sRmVlU3RvcmUuSW5pdGlhbGl6ZUFjY3VUb0Rldk9wcygwLCBybG0pCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIXByb3RvY29sRmVlU3RvcmUuSGFzRGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnlTdG9yZUtleSgpIHsKCQllcnIgOj0gcHJvdG9jb2xGZWVTdG9yZS5Jbml0aWFsaXplRGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkoMCwgcmxtKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJfQoKCWlmICFwcm90b2NvbEZlZVN0b3JlLkhhc0Rpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5U3RvcmVLZXkoKSB7CgkJZXJyIDo9IHByb3RvY29sRmVlU3RvcmUuSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5KDAsIHJsbSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglpZiAhcHJvdG9jb2xGZWVTdG9yZS5IYXNSZXNlcnZlZFRva2Vuc1N0b3JlS2V5KCkgewoJCWVyciA6PSBwcm90b2NvbEZlZVN0b3JlLkluaXRpYWxpemVSZXNlcnZlZFRva2VucygwLCBybG0pCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIXByb3RvY29sRmVlU3RvcmUuSGFzQWNjcnVhbEVwb2NoU3RvcmVLZXkoKSB7CgkJZXJyIDo9IHByb3RvY29sRmVlU3RvcmUuSW5pdGlhbGl6ZUFjY3J1YWxFcG9jaCgwLCBybG0pCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIXByb3RvY29sRmVlU3RvcmUuSGFzQWNjcnVhbEJ1Y2tldHNTdG9yZUtleSgpIHsKCQllcnIgOj0gcHJvdG9jb2xGZWVTdG9yZS5Jbml0aWFsaXplQWNjcnVhbEJ1Y2tldHMoMCwgcmxtKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJfQoKCWlmICFwcm90b2NvbEZlZVN0b3JlLkhhc0FjY3J1YWxQZW5kaW5nVG9rZW5zU3RvcmVLZXkoKSB7CgkJZXJyIDo9IHByb3RvY29sRmVlU3RvcmUuSW5pdGlhbGl6ZUFjY3J1YWxQZW5kaW5nVG9rZW5zKDAsIHJsbSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglyZXR1cm4gbmlsCn0KGusFCgxpbnN0YW5jZS5nbm8S2gVwYWNrYWdlIHByb3RvY29sX2ZlZQoKaW1wb3J0ICgKCSJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIgopCgp0eXBlIHByb3RvY29sRmVlVjEgc3RydWN0IHsKCXN0b3JlIHByb3RvY29sX2ZlZS5JUHJvdG9jb2xGZWVTdG9yZQp9CgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpICpwcm90b2NvbEZlZVN0YXRlIHsKCXJldHVybiBOZXdQcm90b2NvbEZlZVN0YXRlQnkocGYuc3RvcmUpCn0KCi8vIE5ld1Byb3RvY29sRmVlVjEgY3JlYXRlcyB0aGUgcHJvdG9jb2wtZmVlIHYxIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBwcm90b2NvbEZlZVN0b3JlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvdG9jb2xGZWVTdG9yZTogU3RvcmUgaW1wbGVtZW50YXRpb24gY29udGFpbmluZyB0aGUgcHJvdG9jb2wtZmVlIHN0YXRlIGZvciB0aGlzIHZlcnNpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbXBsZW1lbnRhdGlvbjogQW4gSVByb3RvY29sRmVlIGltcGxlbWVudGF0aW9uIHRoYXQgZXhwb3NlcyB2MSBiZWhhdmlvciB0aHJvdWdoIHByb3RvY29sRmVlU3RvcmUuCmZ1bmMgTmV3UHJvdG9jb2xGZWVWMShwcm90b2NvbEZlZVN0b3JlIHByb3RvY29sX2ZlZS5JUHJvdG9jb2xGZWVTdG9yZSkgcHJvdG9jb2xfZmVlLklQcm90b2NvbEZlZSB7CglyZXR1cm4gJnByb3RvY29sRmVlVjF7CgkJc3RvcmU6IHByb3RvY29sRmVlU3RvcmUsCgl9Cn0KGqZcChBwcm90b2NvbF9mZWUuZ25vEpFccGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCAoCgkiY2hhaW4iCgkiZXJyb3JzIgoJInN0cmNvbnYiCgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJcHJhYmMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2NvbW1vbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKKQoKLy8gRGlzdHJpYnV0ZVByb3RvY29sRmVlIGRpc3RyaWJ1dGVzIGNvbGxlY3RlZCBwcm90b2NvbCBmZWVzLgovLwovLyBTcGxpdHMgZmVlcyBiZXR3ZWVuIGRldk9wcyBhbmQgZ292L3N0YWtlciBiYXNlZCBvbiBjb25maWd1cmVkIHBlcmNlbnRhZ2VzLgovLyBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgYWNjdW11bGF0ZWQgZmVlcyBzaW5jZSBsYXN0IGRpc3RyaWJ1dGlvbi4KLy8KLy8gT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBnb3Yvc3Rha2VyIGNvbnRyYWN0LgovLyBOb3RlOiBEZWZhdWx0IHNwbGl0IGlzIDAlIGRldk9wcywgMTAwJSBnb3Yvc3Rha2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0OyBpdCBtdXN0IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBEaXN0cmlidXRlUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSkgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJcHJldiA6PSBybG0uUHJldmlvdXMoKQoJYXNzZXJ0SXNBZG1pbk9yR292U3Rha2VyKHByZXYuQWRkcmVzcygpKQoKCWlmIGhhbHQuSXNIYWx0ZWRXaXRoZHJhdygpIHsKCQlyZXR1cm4KCX0KCglwcm90b2NvbEZlZUFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYWJjLlJPTEVfUFJPVE9DT0xfRkVFLlN0cmluZygpKQoJcGZzIDo9IHBmLmdldFByb3RvY29sRmVlU3RhdGUoKQoKCXJlc2VydmVkVG9rZW5zIDo9IHBmcy5SZXNlcnZlZFRva2VucygpCgoJZm9yIF8sIHRva2VuIDo9IHJhbmdlIHJlc2VydmVkVG9rZW5zIHsKCQlwZi5kaXN0cmlidXRlUHJvdG9jb2xGZWVGb3JUb2tlbigKCQkJMCwKCQkJcmxtLAoJCQlwZnMsCgkJCXByb3RvY29sRmVlQWRkciwKCQkJdG9rZW4sCgkJKQoJfQp9CgovLyBEaXN0cmlidXRlUHJvdG9jb2xGZWVCeVRva2VuUGF0aCBkaXN0cmlidXRlcyBjb2xsZWN0ZWQgcHJvdG9jb2wgZmVlcyBmb3Igb25lIHRva2VuIHBhdGguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcHJvdG9jb2xfZmVlIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgbWF0Y2ggdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSByZXNlcnZlZCBmZWUgaXMgZWxpZ2libGUgZm9yIGRpc3RyaWJ1dGlvbgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgRGlzdHJpYnV0ZVByb3RvY29sRmVlQnlUb2tlblBhdGgoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJcHJldiA6PSBybG0uUHJldmlvdXMoKQoJYXNzZXJ0SXNBZG1pbk9yR292U3Rha2VyKHByZXYuQWRkcmVzcygpKQoKCWlmIGhhbHQuSXNIYWx0ZWRXaXRoZHJhdygpIHsKCQlyZXR1cm4KCX0KCglwcm90b2NvbEZlZUFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYWJjLlJPTEVfUFJPVE9DT0xfRkVFLlN0cmluZygpKQoJcGZzIDo9IHBmLmdldFByb3RvY29sRmVlU3RhdGUoKQoKCWlmICFwZnMuc3RvcmUuSGFzUmVzZXJ2ZWRUb2tlbih0b2tlblBhdGgpIHsKCQlyZXR1cm4KCX0KCglwZi5kaXN0cmlidXRlUHJvdG9jb2xGZWVGb3JUb2tlbigKCQkwLAoJCXJsbSwKCQlwZnMsCgkJcHJvdG9jb2xGZWVBZGRyLAoJCXRva2VuUGF0aCwKCSkKfQoKLy8gZGlzdHJpYnV0ZVByb3RvY29sRmVlRm9yVG9rZW4gdmFsaWRhdGVzIGFuZCBkaXN0cmlidXRlcyBvbmUgcmVzZXJ2ZWQgdG9rZW4ncyBwZW5kaW5nIGZlZXMuCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBkaXN0cmlidXRlUHJvdG9jb2xGZWVGb3JUb2tlbihfIGludCwgcmxtIHJlYWxtLCBwZnMgKnByb3RvY29sRmVlU3RhdGUsIHByb3RvY29sRmVlQWRkciBhZGRyZXNzLCB0b2tlblBhdGggc3RyaW5nKSB7Cgl0b0Rldk9wc0Ftb3VudCA6PSBnbnNtYXRoLlNhZmVTdWJJbnQ2NCgKCQlwZnMuR2V0QWNjdVRyYW5zZmVyVG9EZXZPcHNCeVRva2VuUGF0aCh0b2tlblBhdGgpLAoJCXBmcy5HZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzQnlUb2tlblBhdGgodG9rZW5QYXRoKSwKCSkKCXRvR292U3Rha2VyQW1vdW50IDo9IGduc21hdGguU2FmZVN1YkludDY0KAoJCXBmcy5HZXRBY2N1VHJhbnNmZXJUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHRva2VuUGF0aCksCgkJcGZzLkdldEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCh0b2tlblBhdGgpLAoJKQoKCWFtb3VudCA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NCh0b0Rldk9wc0Ftb3VudCwgdG9Hb3ZTdGFrZXJBbW91bnQpCgliYWxhbmNlIDo9IGNvbW1vbi5CYWxhbmNlT2YodG9rZW5QYXRoLCBwcm90b2NvbEZlZUFkZHIpCgoJLy8gYW1vdW50IHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYmFsYW5jZQoJaWYgYW1vdW50ID4gYmFsYW5jZSB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbCgKCQkJZXJySW52YWxpZEFtb3VudCwKCQkJdWZtdC5TcHJpbnRmKCJhbW91bnQ6ICVkIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYmFsYW5jZTogJWQiLCBhbW91bnQsIGJhbGFuY2UpLAoJCSkpCgl9CgoJaWYgZXJyIDo9IHBmcy5yZW1vdmVSZXNlcnZlZFRva2VuKDAsIHJsbSwgdG9rZW5QYXRoKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWlmIGFtb3VudCA8PSAwIHsKCQlyZXR1cm4KCX0KCgkvLyBkaXN0cmlidXRlVG9EZXZPcHMgYW5kIGRpc3RyaWJ1dGVUb0dvdlN0YWtlciByZWNvcmQgaGlzdG9yeSBiZWZvcmUgdHJhbnNmZXJyaW5nLgoJaWYgZXJyIDo9IHBmcy5kaXN0cmlidXRlVG9EZXZPcHMoMCwgcmxtLCB0b2tlblBhdGgsIHRvRGV2T3BzQW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgZXJyIDo9IHBmcy5kaXN0cmlidXRlVG9Hb3ZTdGFrZXIoMCwgcmxtLCB0b2tlblBhdGgsIHRvR292U3Rha2VyQW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXByZXYgOj0gcmxtLlByZXZpb3VzKCkKCgljaGFpbi5FbWl0KAoJCSJUcmFuc2ZlclByb3RvY29sRmVlIiwKCQkicHJldkFkZHIiLCBwcmV2LkFkZHJlc3MoKS5TdHJpbmcoKSwKCQkicHJldlJlYWxtIiwgcHJldi5Qa2dQYXRoKCksCgkJInRva2VuUGF0aCIsIHRva2VuUGF0aCwKCQkidG9EZXZPcHNBbW91bnQiLCBzdHJjb252LkZvcm1hdEludCh0b0Rldk9wc0Ftb3VudCwgMTApLAoJCSJ0b0dvdlN0YWtlckFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KHRvR292U3Rha2VyQW1vdW50LCAxMCksCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApLAoJKQp9CgovLyBTZXREZXZPcHNQY3Qgc2V0cyB0aGUgZGV2T3BzUGN0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0OyBpdCBtdXN0IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lCi8vICAgLSBwY3Q6IHBlcmNlbnRhZ2UgZm9yIGRldk9wcyAoMC0xMDAwMCwgd2hlcmUgMTAwMDAgPSAxMDAlKQovLwovLyBPbmx5IGNhbGxhYmxlIGJ5IGFkbWluIG9yIGdvdmVybmFuY2UuCi8vIE5vdGU6IEdvdlN0YWtlciBwZXJjZW50YWdlIGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgdG8gKDEwMDAwIC0gZGV2T3BzUGN0KS4KZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIFNldERldk9wc1BjdChfIGludCwgcmxtIHJlYWxtLCBwY3QgaW50NjQpIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRQcm90b2NvbEZlZSgpCgoJcHJldiA6PSBybG0uUHJldmlvdXMoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UocHJldi5BZGRyZXNzKCkpCgoJYXNzZXJ0SXNWYWxpZFBlcmNlbnQocGN0KQoKCXByZXZEZXZPcHNQY3QgOj0gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkRldk9wc1BjdCgpCglwcmV2R292U3Rha2VyUGN0IDo9IHBmLmdldFByb3RvY29sRmVlU3RhdGUoKS5Hb3ZTdGFrZXJQY3QoKQoKCW5ld0Rldk9wc1BjdCwgZXJyIDo9IHBmLmdldFByb3RvY29sRmVlU3RhdGUoKS5zZXREZXZPcHNQY3QoMCwgcmxtLCBwY3QpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgluZXdHb3ZTdGFrZXJQY3QgOj0gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkdvdlN0YWtlclBjdCgpCgoJY2hhaW4uRW1pdCgKCQkiU2V0RGV2T3BzUGN0IiwKCQkicHJldkFkZHIiLCBwcmV2LkFkZHJlc3MoKS5TdHJpbmcoKSwKCQkicHJldlJlYWxtIiwgcHJldi5Qa2dQYXRoKCksCgkJIm5ld0Rldk9wc1BjdCIsIHN0cmNvbnYuRm9ybWF0SW50KG5ld0Rldk9wc1BjdCwgMTApLAoJCSJwcmV2RGV2T3BzUGN0Iiwgc3RyY29udi5Gb3JtYXRJbnQocHJldkRldk9wc1BjdCwgMTApLAoJCSJuZXdHb3ZTdGFrZXJQY3QiLCBzdHJjb252LkZvcm1hdEludChuZXdHb3ZTdGFrZXJQY3QsIDEwKSwKCQkicHJldkdvdlN0YWtlclBjdCIsIHN0cmNvbnYuRm9ybWF0SW50KHByZXZHb3ZTdGFrZXJQY3QsIDEwKSwKCSkKfQoKLy8gU2V0R292U3Rha2VyUGN0IHNldHMgdGhlIHN0YWtlclBjdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZQovLyAgIC0gcGN0OiBwZXJjZW50YWdlIGZvciBnb3Yvc3Rha2VyICgwLTEwMDAwLCB3aGVyZSAxMDAwMCA9IDEwMCUpCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgYWRtaW4gb3IgZ292ZXJuYW5jZS4KLy8gTm90ZTogRGV2T3BzIHBlcmNlbnRhZ2UgaXMgYXV0b21hdGljYWxseSBhZGp1c3RlZCB0byAoMTAwMDAgLSBnb3ZTdGFrZXJQY3QpLgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgU2V0R292U3Rha2VyUGN0KF8gaW50LCBybG0gcmVhbG0sIHBjdCBpbnQ2NCkgewoJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZFByb3RvY29sRmVlKCkKCglwcmV2IDo9IHJsbS5QcmV2aW91cygpCglhY2Nlc3MuQXNzZXJ0SXNBZG1pbk9yR292ZXJuYW5jZShwcmV2LkFkZHJlc3MoKSkKCglhc3NlcnRJc1ZhbGlkUGVyY2VudChwY3QpCgoJcHJldkRldk9wc1BjdCA6PSBwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuRGV2T3BzUGN0KCkKCXByZXZHb3ZTdGFrZXJQY3QgOj0gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLkdvdlN0YWtlclBjdCgpCgoJbmV3R292U3Rha2VyUGN0LCBlcnIgOj0gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpLnNldEdvdlN0YWtlclBjdCgwLCBybG0sIHBjdCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCW5ld0Rldk9wc1BjdCA6PSBwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkuRGV2T3BzUGN0KCkKCgljaGFpbi5FbWl0KAoJCSJTZXRHb3ZTdGFrZXJQY3QiLAoJCSJwcmV2QWRkciIsIHByZXYuQWRkcmVzcygpLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2LlBrZ1BhdGgoKSwKCQkibmV3RGV2T3BzUGN0Iiwgc3RyY29udi5Gb3JtYXRJbnQobmV3RGV2T3BzUGN0LCAxMCksCgkJInByZXZEZXZPcHNQY3QiLCBzdHJjb252LkZvcm1hdEludChwcmV2RGV2T3BzUGN0LCAxMCksCgkJIm5ld0dvdlN0YWtlclBjdCIsIHN0cmNvbnYuRm9ybWF0SW50KG5ld0dvdlN0YWtlclBjdCwgMTApLAoJCSJwcmV2R292U3Rha2VyUGN0Iiwgc3RyY29udi5Gb3JtYXRJbnQocHJldkdvdlN0YWtlclBjdCwgMTApLAoJKQp9CgovLyBBZGRUb1Byb3RvY29sRmVlIHB1bGxzIHRoZSBhcHByb3ZlZCBhbW91bnQgaW50byBwcm90b2NvbCBmZWUgYWNjb3VudGluZy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgYSBub24tY3VycmVudCB2YWx1ZSByZXR1cm5zIGVyclNwb29mZWRSZWFsbQovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIGZyb20gd2hpY2ggdGhlIGFwcHJvdmVkIGZlZSBpcyBwdWxsZWQKLy8gICAtIGFtb3VudDogbm9uLW5lZ2F0aXZlIGZlZSBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0czsgemVybyByZXR1cm5zIG5pbCB3aXRob3V0IHRyYW5zZmVycmluZwovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgb24gc3VjY2VzczsgZXJyU3Bvb2ZlZFJlYWxtIGZvciBhIHNwb29mZWQtcmVhbG0gY2FsbDsgZXJyUHJvdG9jb2xGZWVIYWx0ZWQgd2hlbiBwcm90b2NvbC1mZWUgY29sbGVjdGlvbiBpcyBoYWx0ZWQKLy8KLy8gT25seSBjYWxsYWJsZSBieSBwb29sLCBwb3NpdGlvbiwgcm91dGVyIG9yIHN0YWtlciBjb250cmFjdHMuCi8vIENhbGxlciBtdXN0IGFwcHJvdmUgdGhlIHByb3RvY29sIGZlZSByZWFsbSBmb3IgYXQgbGVhc3QgYW1vdW50IGJlZm9yZSBjYWxsaW5nLgovLyBOb3RlOiBBY2N1bXVsYXRlZCBmZWVzIGFyZSBkaXN0cmlidXRlZCB3aGVuIERpc3RyaWJ1dGVQcm90b2NvbEZlZSBpcyBjYWxsZWQuCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBBZGRUb1Byb3RvY29sRmVlKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWlmIGhhbHQuSXNIYWx0ZWRQcm90b2NvbEZlZSgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJQcm90b2NvbEZlZUhhbHRlZCkKCX0KCglwcmV2IDo9IHJsbS5QcmV2aW91cygpCgljYWxsZXIgOj0gcHJldi5BZGRyZXNzKCkKCWFzc2VydElzUG9vbE9yUG9zaXRpb25PclJvdXRlck9yU3Rha2VyKGNhbGxlcikKCglpZiBhbW91bnQgPCAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlsKAoJCQllcnJJbnZhbGlkQW1vdW50LAoJCQl1Zm10LlNwcmludGYoImFtb3VudCglZCkgc2hvdWxkIG5vdCBiZSBuZWdhdGl2ZSIsIGFtb3VudCksCgkJKSkKCX0KCglpZiBhbW91bnQgPT0gMCB7CgkJcmV0dXJuIG5pbAoJfQoKCXBmLnJlc2VydmVDb2xsZWN0ZWRQcm90b2NvbEZlZSgwLCBybG0sIHRva2VuUGF0aCwgYW1vdW50KQoJcHJvdG9jb2xGZWVBZGRyIDo9IGFjY2Vzcy5NdXN0R2V0QWRkcmVzcyhwcmFiYy5ST0xFX1BST1RPQ09MX0ZFRS5TdHJpbmcoKSkKCWNvbW1vbi5TYWZlR1JDMjBUcmFuc2ZlckZyb20oMCwgcmxtLCB0b2tlblBhdGgsIGNhbGxlciwgcHJvdG9jb2xGZWVBZGRyLCBhbW91bnQpCgoJY2hhaW4uRW1pdCgKCQkiQWRkVG9Qcm90b2NvbEZlZSIsCgkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2LlBrZ1BhdGgoKSwKCQkidG9rZW5QYXRoIiwgdG9rZW5QYXRoLAoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChhbW91bnQsIDEwKSwKCSkKCglyZXR1cm4gbmlsCn0KCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSByZXNlcnZlQ29sbGVjdGVkUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSB7CglwZnMgOj0gcGYuZ2V0UHJvdG9jb2xGZWVTdGF0ZSgpCgoJdG9EZXZPcHNBbW91bnQgOj0gZ25zbWF0aC5TYWZlTXVsRGl2SW50NjQoYW1vdW50LCBwZnMuRGV2T3BzUGN0KCksIDEwMDAwKQoJdG9Hb3ZTdGFrZXJBbW91bnQgOj0gZ25zbWF0aC5TYWZlU3ViSW50NjQoYW1vdW50LCB0b0Rldk9wc0Ftb3VudCkKCglpZiBlcnIgOj0gcGZzLmFkZEFjY3VUb0Rldk9wcygwLCBybG0sIHRva2VuUGF0aCwgdG9EZXZPcHNBbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglpZiBlcnIgOj0gcGZzLmFkZEFjY3VUb0dvdlN0YWtlcigwLCBybG0sIHRva2VuUGF0aCwgdG9Hb3ZTdGFrZXJBbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaWYgZXJyIDo9IHBmcy5zdG9yZS5BZGRSZXNlcnZlZFRva2VuKDAsIHJsbSwgdG9rZW5QYXRoKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCS8vIEJ1Y2tldCB0aGUgZ292L3N0YWtlciBzaGFyZSB1bmRlciB0aGUgYWNjcnVhbCBlcG9jaCBpbiBmb3JjZSBzbyB0aGF0IGdvdi9zdGFrZXIKCS8vIGNhbiBsYXRlciBmb2xkIGl0IGFnYWluc3QgdGhlIHN0YWtlIGRpc3RyaWJ1dGlvbiB0aGF0IHdhcyBsaXZlIHdoZW4gaXQgYXJyaXZlZC4KCS8vIEEgc3BsaXQgdGhhdCBsZWF2ZXMgZ292L3N0YWtlciBub3RoaW5nIG1vdmVzIG5vIGFjY3VtdWxhdG9yLCBzbyBpdCBpcyBub3QgYnVja2V0ZWQuCglpZiB0b0dvdlN0YWtlckFtb3VudCA+IDAgewoJCWVwb2NoIDo9IHBmcy5zdG9yZS5HZXRBY2NydWFsRXBvY2goKQoJCWlmIGVyciA6PSBwZnMuc3RvcmUuQWRkQWNjcnVhbEJ1Y2tldCgwLCBybG0sIHRva2VuUGF0aCwgZXBvY2gsIHRvR292U3Rha2VyQW1vdW50KTsgZXJyICE9IG5pbCB7CgkJCXBhbmljKGVycikKCQl9CgkJaWYgZXJyIDo9IHBmcy5zdG9yZS5BZGRBY2NydWFsUGVuZGluZ1Rva2VuKDAsIHJsbSwgdG9rZW5QYXRoKTsgZXJyICE9IG5pbCB7CgkJCXBhbmljKGVycikKCQl9Cgl9Cn0KCi8vIEFkdmFuY2VBY2NydWFsRXBvY2ggY2xvc2VzIHRoZSBhY2NydWFsIGVwb2NoIGluIGZvcmNlIGFuZCByZXR1cm5zIHRoZSBuZXcgb25lLgovLwovLyBnb3Yvc3Rha2VyIGNhbGxzIGl0IG9uIGV2ZXJ5IHN0YWtlIGNoYW5nZSwgYmVmb3JlIGl0IHJlY29yZHMgdGhlIG5ldyBzdGFrZQovLyBkaXN0cmlidXRpb24sIHNvIGV2ZXJ5IGZlZSBidWNrZXRlZCBmcm9tIG5vdyBvbiBpcyBhdHRyaWJ1dGVkIHRvIHRoYXQgZGlzdHJpYnV0aW9uLgovLyBSZXN0cmljdGVkIHRvIGdvdi9zdGFrZXI6IGFuIGVwb2NoIGFkdmFuY2VkIGJ5IGFueW9uZSBlbHNlIHdvdWxkIGZyYWdtZW50IHRoZSBidWNrZXRzCi8vIHdpdGhvdXQgYSBtYXRjaGluZyBzdGFrZSByZWNvcmQgb24gdGhlIGdvdi9zdGFrZXIgc2lkZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IGFuZCBiZSBjYWxsZWQgYnkgR292U3Rha2VyCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcG9jaDogbmV3bHkgc3RvcmVkIG5vbi1uZWdhdGl2ZSBhY2NydWFsIGVwb2NoIGZvciBmZWVzIGNvbGxlY3RlZCBhZnRlciB0aGUgc3Rha2UgY2hhbmdlCmZ1bmMgKHBmICpwcm90b2NvbEZlZVYxKSBBZHZhbmNlQWNjcnVhbEVwb2NoKF8gaW50LCBybG0gcmVhbG0pIGludDY0IHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKSkKCX0KCglwcmV2IDo9IHJsbS5QcmV2aW91cygpCglhY2Nlc3MuQXNzZXJ0SXNHb3ZTdGFrZXIocHJldi5BZGRyZXNzKCkpCgoJcGZzIDo9IHBmLmdldFByb3RvY29sRmVlU3RhdGUoKQoJZXBvY2ggOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQocGZzLnN0b3JlLkdldEFjY3J1YWxFcG9jaCgpLCAxKQoJaWYgZXJyIDo9IHBmcy5zdG9yZS5TZXRBY2NydWFsRXBvY2goMCwgcmxtLCBlcG9jaCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXR1cm4gZXBvY2gKfQoKLy8gQ29uc3VtZUFjY3J1YWxCdWNrZXRzIHJldHVybnMgYW5kIGNsZWFycyB1cCB0byBsaW1pdCBvZiB0aGUgb2xkZXN0IHBlbmRpbmcgYnVja2V0cyBvZgovLyB0b2tlblBhdGgsIGFzIHBhcmFsbGVsIGVwb2NoIGFuZCBhbW91bnQgc2xpY2VzIGluIGVwb2NoIG9yZGVyLiBBIGxpbWl0IG9mIHplcm8gb3IKLy8gbGVzcyBjb25zdW1lcyBldmVyeSBwZW5kaW5nIGJ1Y2tldC4gT25jZSBubyBidWNrZXQgcmVtYWlucyB0aGUgdG9rZW4gbGVhdmVzIHRoZQovLyBwZW5kaW5nIHNldC4KLy8KLy8gUmVzdHJpY3RlZCB0byBnb3Yvc3Rha2VyOiBjbGVhcmluZyBhIGJ1Y2tldCB3aXRob3V0IGZvbGRpbmcgaXQgaW50byBhbiBhY2N1bXVsYXRvcgovLyB3b3VsZCBzdHJhbmQgdGhhdCBmZWUgc2hhcmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcHJvdG9jb2xfZmVlIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCBhbmQgYmUgY2FsbGVkIGJ5IEdvdlN0YWtlcgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgYWNjcnVhbCBidWNrZXRzIGFyZSBjb25zdW1lZAovLyAgIC0gbGltaXQ6IG1heGltdW0gbnVtYmVyIG9mIG9sZGVzdCBidWNrZXRzIHRvIGNvbnN1bWU7IHplcm8gb3IgbmVnYXRpdmUgY29uc3VtZXMgYWxsIHBlbmRpbmcgYnVja2V0cwovLwovLyBSZXR1cm5zOgovLyAgIC0gZXBvY2hzOiBjb25zdW1lZCBhY2NydWFsIGVwb2NoIG51bWJlcnMgaW4gYXNjZW5kaW5nIGVwb2NoIG9yZGVyCi8vICAgLSBhbW91bnRzOiBmZWUgYW1vdW50cyBjb3JyZXNwb25kaW5nIHBvc2l0aW9uYWxseSB0byBlcG9jaHMsIGluIHRva2VuIGJhc2UgdW5pdHMKZnVuYyAocGYgKnByb3RvY29sRmVlVjEpIENvbnN1bWVBY2NydWFsQnVja2V0cyhfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBsaW1pdCBpbnQpIChbXWludDY0LCBbXWludDY0KSB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlwYW5pYyhlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkpCgl9CgoJcHJldiA6PSBybG0uUHJldmlvdXMoKQoJYWNjZXNzLkFzc2VydElzR292U3Rha2VyKHByZXYuQWRkcmVzcygpKQoKCXBmcyA6PSBwZi5nZXRQcm90b2NvbEZlZVN0YXRlKCkKCWVwb2NocywgYW1vdW50cyA6PSBwZnMuc3RvcmUuR2V0QWNjcnVhbEJ1Y2tldHModG9rZW5QYXRoLCBsaW1pdCkKCWlmIGxlbihlcG9jaHMpID09IDAgewoJCXJldHVybiBlcG9jaHMsIGFtb3VudHMKCX0KCglpZiBlcnIgOj0gcGZzLnN0b3JlLlJlbW92ZUFjY3J1YWxCdWNrZXRzKDAsIHJsbSwgdG9rZW5QYXRoLCBlcG9jaHMpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcmVtYWluaW5nRXBvY2hzLCBfIDo9IHBmcy5zdG9yZS5HZXRBY2NydWFsQnVja2V0cyh0b2tlblBhdGgsIDEpCglpZiBsZW4ocmVtYWluaW5nRXBvY2hzKSA9PSAwIHsKCQlpZiBlcnIgOj0gcGZzLnN0b3JlLlJlbW92ZUFjY3J1YWxQZW5kaW5nVG9rZW4oMCwgcmxtLCB0b2tlblBhdGgpOyBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCX0KCglyZXR1cm4gZXBvY2hzLCBhbW91bnRzCn0KGptKChZwcm90b2NvbF9mZWVfc3RhdGUuZ25vEoBKcGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCAoCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJcHJhYmMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2NvbW1vbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIgopCgovLyBwcm90b2NvbEZlZVN0YXRlIGhvbGRzIGFsbCB0aGUgc3RhdGUgdmFyaWFibGVzIGZvciBwcm90b2NvbCBmZWUgbWFuYWdlbWVudAp0eXBlIHByb3RvY29sRmVlU3RhdGUgc3RydWN0IHsKCXN0b3JlIHByb3RvY29sX2ZlZS5JUHJvdG9jb2xGZWVTdG9yZQp9CgovLyBEZXZPcHNQY3QgcmV0dXJucyB0aGUgcGVyY2VudGFnZSBvZiBwcm90b2NvbCBmZWVzIGFsbG9jYXRlZCB0byBEZXZPcHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwY3Q6IFN0b3JlZCBEZXZPcHMgcHJvdG9jb2wtZmVlIGFsbG9jYXRpb24gcGVyY2VudGFnZSBpbiBiYXNpcyBwb2ludHMuCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgRGV2T3BzUGN0KCkgaW50NjQgewoJcmV0dXJuIHBmcy5zdG9yZS5HZXREZXZPcHNQY3QoKQp9CgovLyBHb3ZTdGFrZXJQY3QgcmV0dXJucyB0aGUgcGVyY2VudGFnZSBvZiBwcm90b2NvbCBmZWVzIGFsbG9jYXRlZCB0byBHb3YvU3Rha2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGN0OiBHb3YvU3Rha2VyIHByb3RvY29sLWZlZSBhbGxvY2F0aW9uIHBlcmNlbnRhZ2UgaW4gYmFzaXMgcG9pbnRzLCBjb21wdXRlZCBhcyAxMDAwMCBtaW51cyB0aGUgc3RvcmVkIERldk9wcyBwZXJjZW50YWdlLgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIEdvdlN0YWtlclBjdCgpIGludDY0IHsKCXJldHVybiAxMDAwMCAtIHBmcy5zdG9yZS5HZXREZXZPcHNQY3QoKQp9CgovLyBBY2N1VG9Hb3ZTdGFrZXIgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBhbW91bnQgYWxsb2NhdGVkIHRvIEdvdlN0YWtlci4KLy8gSXQgaW5jbHVkZXMgYWxsb2NhdGlvbnMgdGhhdCBtYXkgc3RpbGwgYmUgcGVuZGluZyBkaXN0cmlidXRpb247IGNvbXBsZXRlZAovLyB0cmFuc2ZlcnMgYXJlIHRyYWNrZWQgc2VwYXJhdGVseSBpbiB0aGUgZGlzdHJpYnV0aW9uIGhpc3RvcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBCUC10cmVlIG1hcHBpbmcgdG9rZW4gcGF0aHMgdG8gY3VtdWxhdGl2ZSBhbW91bnRzIGFsbG9jYXRlZCB0byBHb3YvU3Rha2VyLCBpbmNsdWRpbmcgYWxsb2NhdGlvbnMgcGVuZGluZyBkaXN0cmlidXRpb24uCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgQWNjdVRvR292U3Rha2VyKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIHBmcy5zdG9yZS5HZXRBY2N1VG9Hb3ZTdGFrZXIoKQp9CgovLyBBY2N1VG9EZXZPcHMgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBhbW91bnQgYWxsb2NhdGVkIHRvIERldk9wcy4KLy8gSXQgaW5jbHVkZXMgYWxsb2NhdGlvbnMgdGhhdCBtYXkgc3RpbGwgYmUgcGVuZGluZyBkaXN0cmlidXRpb247IGNvbXBsZXRlZAovLyB0cmFuc2ZlcnMgYXJlIHRyYWNrZWQgc2VwYXJhdGVseSBpbiB0aGUgZGlzdHJpYnV0aW9uIGhpc3RvcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBCUC10cmVlIG1hcHBpbmcgdG9rZW4gcGF0aHMgdG8gY3VtdWxhdGl2ZSBhbW91bnRzIGFsbG9jYXRlZCB0byBEZXZPcHMsIGluY2x1ZGluZyBhbGxvY2F0aW9ucyBwZW5kaW5nIGRpc3RyaWJ1dGlvbi4KZnVuYyAocGZzICpwcm90b2NvbEZlZVN0YXRlKSBBY2N1VG9EZXZPcHMoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gcGZzLnN0b3JlLkdldEFjY3VUb0Rldk9wcygpCn0KCi8vIEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBhbW91bnRzIGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIEdvdi9TdGFrZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBCUC10cmVlIG1hcHBpbmcgdG9rZW4gcGF0aHMgdG8gY3VtdWxhdGl2ZSBhbW91bnRzIGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIEdvdi9TdGFrZXIuCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgQWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlcigpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiBwZnMuc3RvcmUuR2V0RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkoKQp9CgovLyBBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzIHJldHVybnMgdGhlIGN1bXVsYXRpdmUgYW1vdW50cyBhY3R1YWxseSBkaXN0cmlidXRlZCB0byBEZXZPcHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBCUC10cmVlIG1hcHBpbmcgdG9rZW4gcGF0aHMgdG8gY3VtdWxhdGl2ZSBhbW91bnRzIGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIERldk9wcy4KZnVuYyAocGZzICpwcm90b2NvbEZlZVN0YXRlKSBBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIHBmcy5zdG9yZS5HZXREaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeSgpCn0KCi8vIFJlc2VydmVkVG9rZW5zIHJldHVybnMgdG9rZW4gcGF0aHMgcmVzZXJ2ZWQgZm9yIGRpc3RyaWJ1dGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuUGF0aHM6IFRva2VuIHBhdGhzIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wtZmVlIGRpc3RyaWJ1dGlvbi4KZnVuYyAocGZzICpwcm90b2NvbEZlZVN0YXRlKSBSZXNlcnZlZFRva2VucygpIFtdc3RyaW5nIHsKCXJldHVybiBwZnMuc3RvcmUuR2V0UmVzZXJ2ZWRUb2tlbnMoKQp9CgovLyBkaXN0cmlidXRlVG9EZXZPcHMgZGlzdHJpYnV0ZXMgdG9rZW5zIHRvIERldk9wcyBhbmQgdXBkYXRlcyByZWxhdGVkIHN0YXRlLgovLyBBbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwIChhbHJlYWR5IGNoZWNrZWQgaW4gRGlzdHJpYnV0ZVByb3RvY29sRmVlKS4KZnVuYyAocGZzICpwcm90b2NvbEZlZVN0YXRlKSBkaXN0cmlidXRlVG9EZXZPcHMoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW4gc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWRldk9wc0FkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYWJjLlJPTEVfREVWT1BTLlN0cmluZygpKQoKCWlmIGVyciA6PSBwZnMuYWRkQWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wcygwLCBybG0sIHRva2VuLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9Cgljb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgcmxtLCB0b2tlbiwgZGV2T3BzQWRkciwgYW1vdW50KQoKCXJldHVybiBuaWwKfQoKLy8gZGlzdHJpYnV0ZVRvR292U3Rha2VyIGRpc3RyaWJ1dGVzIHRva2VucyB0byBHb3YvU3Rha2VyIGFuZCB1cGRhdGVzIHJlbGF0ZWQgc3RhdGUuCi8vIEFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAgKGFscmVhZHkgY2hlY2tlZCBpbiBEaXN0cmlidXRlUHJvdG9jb2xGZWUpLgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIGRpc3RyaWJ1dGVUb0dvdlN0YWtlcihfIGludCwgcmxtIHJlYWxtLCB0b2tlbiBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJZ292U3Rha2VyQWRkciA6PSBhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJhYmMuUk9MRV9HT1ZfU1RBS0VSLlN0cmluZygpKQoKCWlmIGVyciA6PSBwZnMuYWRkQWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlcigwLCBybG0sIHRva2VuLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9Cgljb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgcmxtLCB0b2tlbiwgZ292U3Rha2VyQWRkciwgYW1vdW50KQoKCXJldHVybiBuaWwKfQoKLy8gc2V0RGV2T3BzUGN0IHNldHMgdGhlIGRldk9wc1BjdC4KZnVuYyAocGZzICpwcm90b2NvbEZlZVN0YXRlKSBzZXREZXZPcHNQY3QoXyBpbnQsIHJsbSByZWFsbSwgcGN0IGludDY0KSAoaW50NjQsIGVycm9yKSB7CglpZiBwY3QgPCAwIHsKCQlyZXR1cm4gMCwgbWFrZUVycm9yV2l0aERldGFpbCgKCQkJZXJySW52YWxpZFBjdCwKCQkJdWZtdC5TcHJpbnRmKCJwY3QoJWQpIHNob3VsZCBub3QgYmUgbmVnYXRpdmUiLCBwY3QpLAoJCSkKCX0KCWlmIHBjdCA+IDEwMDAwIHsKCQlyZXR1cm4gMCwgbWFrZUVycm9yV2l0aERldGFpbCgKCQkJZXJySW52YWxpZFBjdCwKCQkJdWZtdC5TcHJpbnRmKCJwY3QoJWQpIHNob3VsZCBub3QgYmUgYmlnZ2VyIHRoYW4gMTAwMDAiLCBwY3QpLAoJCSkKCX0KCglpZiBlcnIgOj0gcGZzLnN0b3JlLlNldERldk9wc1BjdCgwLCBybG0sIHBjdCk7IGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCglyZXR1cm4gcGN0LCBuaWwKfQoKLy8gc2V0R292U3Rha2VyUGN0IHNldHMgdGhlIGdvdlN0YWtlclBjdCBieSBjYWxjdWxhdGluZyBkZXZPcHNQY3QuCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgc2V0R292U3Rha2VyUGN0KF8gaW50LCBybG0gcmVhbG0sIHBjdCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJaWYgcGN0IDwgMCB7CgkJcmV0dXJuIDAsIG1ha2VFcnJvcldpdGhEZXRhaWwoCgkJCWVyckludmFsaWRQY3QsCgkJCXVmbXQuU3ByaW50ZigicGN0KCVkKSBzaG91bGQgbm90IGJlIG5lZ2F0aXZlIiwgcGN0KSwKCQkpCgl9CgoJZGV2T3BzUGN0IDo9IDEwMDAwIC0gcGN0CgoJaWYgXywgZXJyIDo9IHBmcy5zZXREZXZPcHNQY3QoMCwgcmxtLCBkZXZPcHNQY3QpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIHBjdCwgbmlsCn0KCi8vIGFkZEFjY3VUb0dvdlN0YWtlciBhZGRzIHRoZSBhbW91bnQgdG8gdGhlIGFjY3VUb0dvdlN0YWtlciBieSB0b2tlbiBwYXRoLgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIGFkZEFjY3VUb0dvdlN0YWtlcihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWJlZm9yZSA6PSBwZnMuR2V0QWNjdVRyYW5zZmVyVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCh0b2tlblBhdGgpCgoJLy8gQ2hlY2sgZm9yIG92ZXJmbG93CglhZnRlciA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChiZWZvcmUsIGFtb3VudCkKCWlmIGVyciA6PSBwZnMuc3RvcmUuU2V0QWNjdVRvR292U3Rha2VySXRlbSgwLCBybG0sIHRva2VuUGF0aCwgYWZ0ZXIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglyZXR1cm4gbmlsCn0KCi8vIGFkZEFjY3VUb0Rldk9wcyBhZGRzIHRoZSBhbW91bnQgdG8gdGhlIGFjY3VUb0Rldk9wcyBieSB0b2tlbiBwYXRoLgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIGFkZEFjY3VUb0Rldk9wcyhfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWJlZm9yZSA6PSBwZnMuR2V0QWNjdVRyYW5zZmVyVG9EZXZPcHNCeVRva2VuUGF0aCh0b2tlblBhdGgpCgoJLy8gQ2hlY2sgZm9yIG92ZXJmbG93CglhZnRlciA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChiZWZvcmUsIGFtb3VudCkKCWlmIGVyciA6PSBwZnMuc3RvcmUuU2V0QWNjdVRvRGV2T3BzSXRlbSgwLCBybG0sIHRva2VuUGF0aCwgYWZ0ZXIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglyZXR1cm4gbmlsCn0KCi8vIGFkZEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIgYWRkcyB0aGUgYW1vdW50IHRvIHRoZSBhY3R1YWwgZGlzdHJpYnV0ZWQgYW1vdW50IHRvIGdvdi9zdGFrZXIgYnkgdG9rZW4gcGF0aC4KZnVuYyAocGZzICpwcm90b2NvbEZlZVN0YXRlKSBhZGRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJYmVmb3JlIDo9IHBmcy5HZXRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyQnlUb2tlblBhdGgodG9rZW5QYXRoKQoJYWZ0ZXIgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQoYmVmb3JlLCBhbW91bnQpCglpZiBlcnIgOj0gcGZzLnN0b3JlLlNldERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5SXRlbSgwLCBybG0sIHRva2VuUGF0aCwgYWZ0ZXIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglyZXR1cm4gbmlsCn0KCi8vIGFkZEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHMgYWRkcyB0aGUgYW1vdW50IHRvIHRoZSBhY3R1YWwgZGlzdHJpYnV0ZWQgYW1vdW50IHRvIGRldk9wcyBieSB0b2tlbiBwYXRoLgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIGFkZEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHMoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvciB7CgliZWZvcmUgOj0gcGZzLkdldEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHNCeVRva2VuUGF0aCh0b2tlblBhdGgpCglhZnRlciA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChiZWZvcmUsIGFtb3VudCkKCWlmIGVyciA6PSBwZnMuc3RvcmUuU2V0RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnlJdGVtKDAsIHJsbSwgdG9rZW5QYXRoLCBhZnRlcik7IGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCXJldHVybiBuaWwKfQoKLy8gR2V0QWNjdVRyYW5zZmVyVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCBnZXRzIHRoZSBhY2N1bXVsYXRlZCBhbW91bnQgdG8gZ292L3N0YWtlciBieSB0b2tlbiBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGN1bXVsYXRpdmUgR292L1N0YWtlciBhbGxvY2F0aW9uIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBDdW11bGF0aXZlIEdvdi9TdGFrZXIgYWxsb2NhdGlvbiBmb3IgdG9rZW5QYXRoLCBvciB6ZXJvIHdoZW4gbm8gZW50cnkgaXMgcmVjb3JkZWQuCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgR2V0QWNjdVRyYW5zZmVyVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCh0b2tlblBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gcmV0cmlldmVBbW91bnQocGZzLnN0b3JlLkdldEFjY3VUb0dvdlN0YWtlcigpLCB0b2tlblBhdGgpCn0KCi8vIEdldEFjY3VUcmFuc2ZlclRvRGV2T3BzQnlUb2tlblBhdGggZ2V0cyB0aGUgYWNjdW11bGF0ZWQgYW1vdW50IHRvIGRldk9wcyBieSB0b2tlbiBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGN1bXVsYXRpdmUgRGV2T3BzIGFsbG9jYXRpb24gc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgRGV2T3BzIGFsbG9jYXRpb24gZm9yIHRva2VuUGF0aCwgb3IgemVybyB3aGVuIG5vIGVudHJ5IGlzIHJlY29yZGVkLgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIEdldEFjY3VUcmFuc2ZlclRvRGV2T3BzQnlUb2tlblBhdGgodG9rZW5QYXRoIHN0cmluZykgaW50NjQgewoJcmV0dXJuIHJldHJpZXZlQW1vdW50KHBmcy5zdG9yZS5HZXRBY2N1VG9EZXZPcHMoKSwgdG9rZW5QYXRoKQp9CgovLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyQnlUb2tlblBhdGggZ2V0cyB0aGUgYWN0dWFsIGRpc3RyaWJ1dGVkIGFtb3VudCB0byBnb3Yvc3Rha2VyIGJ5IHRva2VuIHBhdGguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IFRva2VuIHBhdGggd2hvc2UgY3VtdWxhdGl2ZSBhY3R1YWwgR292L1N0YWtlciBkaXN0cmlidXRpb24gc2hvdWxkIGJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgYW1vdW50IGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIEdvdi9TdGFrZXIgZm9yIHRva2VuUGF0aCwgb3IgemVybyB3aGVuIG5vIGhpc3RvcnkgaXMgcmVjb3JkZWQuCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHRva2VuUGF0aCBzdHJpbmcpIGludDY0IHsKCXJldHVybiByZXRyaWV2ZUFtb3VudChwZnMuc3RvcmUuR2V0RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkoKSwgdG9rZW5QYXRoKQp9CgovLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzQnlUb2tlblBhdGggZ2V0cyB0aGUgYWN0dWFsIGRpc3RyaWJ1dGVkIGFtb3VudCB0byBkZXZPcHMgYnkgdG9rZW4gcGF0aC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBjdW11bGF0aXZlIGFjdHVhbCBEZXZPcHMgZGlzdHJpYnV0aW9uIHNob3VsZCBiZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBDdW11bGF0aXZlIGFtb3VudCBhY3R1YWxseSBkaXN0cmlidXRlZCB0byBEZXZPcHMgZm9yIHRva2VuUGF0aCwgb3IgemVybyB3aGVuIG5vIGhpc3RvcnkgaXMgcmVjb3JkZWQuCmZ1bmMgKHBmcyAqcHJvdG9jb2xGZWVTdGF0ZSkgR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wc0J5VG9rZW5QYXRoKHRva2VuUGF0aCBzdHJpbmcpIGludDY0IHsKCXJldHVybiByZXRyaWV2ZUFtb3VudChwZnMuc3RvcmUuR2V0RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkoKSwgdG9rZW5QYXRoKQp9CgovLyByZW1vdmVSZXNlcnZlZFRva2VuIHJlbW92ZXMgb25lIGRpc3RyaWJ1dGVkIHRva2VuIGZyb20gdGhlIHJlc2VydmVkIHRva2VuIGluZGV4LgpmdW5jIChwZnMgKnByb3RvY29sRmVlU3RhdGUpIHJlbW92ZVJlc2VydmVkVG9rZW4oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IgewoJcmV0dXJuIHBmcy5zdG9yZS5SZW1vdmVSZXNlcnZlZFRva2VuKDAsIHJsbSwgdG9rZW5QYXRoKQp9CgovLyBOZXdQcm90b2NvbEZlZVN0YXRlIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgcHJvdG9jb2xGZWVTdGF0ZSB3aXRoIGluaXRpYWxpemVkIHZhbHVlcwovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvdG9jb2xGZWVTdG9yZTogU3RvcmUgaW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgbmV3IHByb3RvY29sLWZlZSBzdGF0ZSB2aWV3LgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RhdGU6IE5ldyBwcm90b2NvbEZlZVN0YXRlIHdyYXBwZXIgYmFja2VkIGJ5IHByb3RvY29sRmVlU3RvcmUuCmZ1bmMgTmV3UHJvdG9jb2xGZWVTdGF0ZUJ5KHByb3RvY29sRmVlU3RvcmUgcHJvdG9jb2xfZmVlLklQcm90b2NvbEZlZVN0b3JlKSAqcHJvdG9jb2xGZWVTdGF0ZSB7CglyZXR1cm4gJnByb3RvY29sRmVlU3RhdGV7CgkJc3RvcmU6IHByb3RvY29sRmVlU3RvcmUsCgl9Cn0KCmZ1bmMgcmV0cmlldmVBbW91bnQodHJlZSAqYnB0cmVlLkJQVHJlZSwga2V5IHN0cmluZykgaW50NjQgewoJYW1vdW50SSA6PSB0cmVlLkdldChrZXkpCglpZiBhbW91bnRJID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJlcywgb2sgOj0gYW1vdW50SS4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgYW1vdW50IHRvIGludDY0OiAlVCIsIGFtb3VudEkpKQoJfQoJcmV0dXJuIHJlcwp9Chq0DAoKcmVuZGVyLmdubxKlDHBhY2thZ2UgcHJvdG9jb2xfZmVlCgppbXBvcnQgKAoJImNoYWluIgoJInN0cmluZ3MiCgoJcHJiYWMgImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgoJImduby5sYW5kL3AvbW91bC9tZC92MCIKCSJnbm8ubGFuZC9wL21vdWwvbWR0YWJsZS92MCIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIgopCgpmdW5jIChwZiAqcHJvdG9jb2xGZWVWMSkgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCAhPSAiIiB7CgkJcmV0dXJuICI0MDRcbiIKCX0KCglkZXZPcHNQY3QgOj0gcGYuR2V0RGV2T3BzUGN0KCkKCWdvdlN0YWtlclBjdCA6PSBwZi5HZXRHb3ZTdGFrZXJQY3QoKQoJaW1wbGVtZW50YXRpb24gOj0gcHJvdG9jb2xfZmVlLkdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGgoKQoJdGFibGUgOj0gbWR0YWJsZS5UYWJsZXsKCQlIZWFkZXJzOiBbXXN0cmluZ3siRmllbGQiLCAiVmFsdWUifSwKCQlSb3dzOiBbXVtdc3RyaW5newoJCQl7IlJlYWxtIGFkZHJlc3MiLCBtZC5JbmxpbmVDb2RlKGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2dub3N3YXAvcHJvdG9jb2xfZmVlIikuU3RyaW5nKCkpfSwKCQkJeyJBY3RpdmUgaW1wbGVtZW50YXRpb24iLCBtZC5MaW5rKGltcGxlbWVudGF0aW9uLCBzdHJpbmdzLlRyaW1QcmVmaXgoaW1wbGVtZW50YXRpb24sICJnbm8ubGFuZCIpKX0sCgkJCXsiRGV2T3BzIGFsbG9jYXRpb24iLCB1Zm10LlNwcmludGYoIiVkIGJwcyIsIGRldk9wc1BjdCl9LAoJCQl7IkdvdmVybmFuY2Utc3Rha2VyIGFsbG9jYXRpb24iLCB1Zm10LlNwcmludGYoIiVkIGJwcyIsIGdvdlN0YWtlclBjdCl9LAoJCQl7IkRpc3RyaWJ1dGlvbi1yYXRlIHVuaXQiLCAiMSBicHMgPSAwLjAxJTsgMTAsMDAwIGJwcyA9IDEwMCUifSwKCQkJeyJEZXZPcHMgcmVjaXBpZW50IiwgbWQuSW5saW5lQ29kZShhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9ERVZPUFMuU3RyaW5nKCkpLlN0cmluZygpKX0sCgkJCXsiR292ZXJuYW5jZS1zdGFrZXIgcmVjaXBpZW50IiwgbWQuSW5saW5lQ29kZShhY2Nlc3MuTXVzdEdldEFkZHJlc3MocHJiYWMuUk9MRV9HT1ZfU1RBS0VSLlN0cmluZygpKS5TdHJpbmcoKSl9LAoJCQl7IkN1cnJlbnQgYWNjcnVhbCBlcG9jaCIsIHVmbXQuU3ByaW50ZigiJWQiLCBwZi5HZXRBY2NydWFsRXBvY2goKSl9LAoJCQl7IlByb3RvY29sLWZlZSBoYWx0ZWQiLCB1Zm10LlNwcmludGYoIiV0IiwgaGFsdC5Jc0hhbHRlZFByb3RvY29sRmVlKCkpfSwKCQkJeyJXaXRoZHJhd2FscyBoYWx0ZWQiLCB1Zm10LlNwcmludGYoIiV0IiwgaGFsdC5Jc0hhbHRlZFdpdGhkcmF3KCkpfSwKCQl9LAoJfQoKCW91dCA6PSBtZC5IMSgiR25vc3dhcCBQcm90b2NvbCBGZWUiKSArICJcbiIKCW91dCArPSBtZC5IMigiQ29uZmlndXJhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIikgKyAiXG4iCglvdXQgKz0gdGFibGUuU3RyaW5nKCkKCXJldHVybiBvdXQKfQoaIgoJdXRpbHMuZ25vEhVwYWNrYWdlIHByb3RvY29sX2ZlZQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEQjSypM5Ego1OTkzMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAwSc1QTD4tI6os8LnebKOB+i6fWXOKGBf9lRpSI1wrrhEkBjRNl7el/JoaCA9A4nDk3aZLpeYyA+wsFR9HW4YTVk7kknsHE4cjWImXl9B3dnElwJsmOa/yqRblIWE67CqRMPGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data