Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
EACF7CBF8FF9AD28B068E81178F3396BDE495580F0F9151FF3965507DA3E68B5
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
50,000,000
Requested gas limit
GAS USED
27,929,990
Gas consumed
FEE
100000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf2000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CryHAQoML3ZtLm1fYWRkcGtnEqqHAQooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLuhgEKA2F2bBIWZ25vLmxhbmQvcC9zYW1jcmV3L2F2bBrLAgoHZG9jLmdubxK/Ai8vIHYwIC0gVW5hdWRpdGVkOiBUaGlzIGlzIGFuIGluaXRpYWwgdmVyc2lvbiB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZm9ybWFsbHkgYXVkaXRlZC4KLy8gQSBmdWxseSBhdWRpdGVkIHZlcnNpb24gd2lsbCBiZSBwdWJsaXNoZWQgYXMgYSBzdWJzZXF1ZW50IHJlbGVhc2UuCi8vIFVzZSBpbiBwcm9kdWN0aW9uIGF0IHlvdXIgb3duIHJpc2suCi8vCi8vIFBhY2thZ2UgYXZsIHByb3ZpZGVzIGEgZ2FzLWVmZmljaWVudCBBVkwgdHJlZSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RvcmluZwovLyBrZXktdmFsdWUgZGF0YSBpbiBHbm8gcmVhbG1zLgpwYWNrYWdlIGF2bAoaPQoLZ25vbW9kLnRvbWwSLm1vZHVsZSA9ICJnbm8ubGFuZC9wL3NhbWNyZXcvYXZsIgpnbm8gPSAiMC45Igoa4GIKCG5vZGUuZ25vEtNicGFja2FnZSBhdmwKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBOb2RlCgovLyBOb2RlIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIEFWTCB0cmVlLgp0eXBlIE5vZGUgc3RydWN0IHsKCWtleSAgICAgICBzdHJpbmcgLy8ga2V5IGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG5vZGUuCgl2YWx1ZSAgICAgYW55ICAgIC8vIHZhbHVlIGlzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgbm9kZS4KCWhlaWdodCAgICBpbnQ4ICAgLy8gaGVpZ2h0IGlzIHRoZSBoZWlnaHQgb2YgdGhlIG5vZGUgaW4gdGhlIHRyZWUuCglzaXplICAgICAgaW50ICAgIC8vIHNpemUgaXMgdGhlIG51bWJlciBvZiBsZWFmIG5vZGVzIChrZXktdmFsdWUgcGFpcnMpIGluIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGlzIG5vZGUuCglsZWZ0Tm9kZSAgKk5vZGUgIC8vIGxlZnROb2RlIGlzIHRoZSBsZWZ0IGNoaWxkIG9mIHRoZSBub2RlLgoJcmlnaHROb2RlICpOb2RlICAvLyByaWdodE5vZGUgaXMgdGhlIHJpZ2h0IGNoaWxkIG9mIHRoZSBub2RlLgp9CgovLyBOZXdOb2RlIGNyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgpmdW5jIE5ld05vZGUoa2V5IHN0cmluZywgdmFsdWUgYW55KSAqTm9kZSB7CglyZXR1cm4gJk5vZGV7CgkJa2V5OiAgICBrZXksCgkJdmFsdWU6ICB2YWx1ZSwKCQloZWlnaHQ6IDAsCgkJc2l6ZTogICAxLAoJfQp9CgovLyBTaXplIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZSBub2RlLgpmdW5jIChub2RlICpOb2RlKSBTaXplKCkgaW50IHsKCWlmIG5vZGUgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIG5vZGUuc2l6ZQp9CgovLyBJc0xlYWYgY2hlY2tzIGlmIHRoZSBub2RlIGlzIGEgbGVhZiBub2RlIChoYXMgbm8gY2hpbGRyZW4pLgpmdW5jIChub2RlICpOb2RlKSBJc0xlYWYoKSBib29sIHsKCXJldHVybiBub2RlLmhlaWdodCA9PSAwCn0KCi8vIEtleSByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG5vZGUuCmZ1bmMgKG5vZGUgKk5vZGUpIEtleSgpIHN0cmluZyB7CglyZXR1cm4gbm9kZS5rZXkKfQoKLy8gVmFsdWUgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5vZGUuCmZ1bmMgKG5vZGUgKk5vZGUpIFZhbHVlKCkgYW55IHsKCXJldHVybiBub2RlLnZhbHVlCn0KCmZ1bmMgKG5vZGUgKk5vZGUpIF9jb3B5KCkgKk5vZGUgewoJaWYgbm9kZS5oZWlnaHQgPT0gMCB7CgkJcGFuaWMoIldoeSBhcmUgeW91IGNvcHlpbmcgYSB2YWx1ZSBub2RlPyIpCgl9CglyZXR1cm4gJk5vZGV7CgkJa2V5OiAgICAgICBub2RlLmtleSwKCQloZWlnaHQ6ICAgIG5vZGUuaGVpZ2h0LAoJCXNpemU6ICAgICAgbm9kZS5zaXplLAoJCWxlZnROb2RlOiAgbm9kZS5sZWZ0Tm9kZSwKCQlyaWdodE5vZGU6IG5vZGUucmlnaHROb2RlLAoJfQp9CgovLyBIYXMgY2hlY2tzIGlmIGEgbm9kZSB3aXRoIHRoZSBnaXZlbiBrZXkgZXhpc3RzIGluIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgbm9kZS4KZnVuYyAobm9kZSAqTm9kZSkgSGFzKGtleSBzdHJpbmcpIChoYXMgYm9vbCkgewoJaWYgbm9kZSA9PSBuaWwgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgbm9kZS5rZXkgPT0ga2V5IHsKCQlyZXR1cm4gdHJ1ZQoJfQoJaWYgbm9kZS5oZWlnaHQgPT0gMCB7CgkJcmV0dXJuIGZhbHNlCgl9IGVsc2UgewoJCWlmIGtleSA8IG5vZGUua2V5IHsKCQkJcmV0dXJuIG5vZGUuZ2V0TGVmdE5vZGUoKS5IYXMoa2V5KQoJCX0gZWxzZSB7CgkJCXJldHVybiBub2RlLmdldFJpZ2h0Tm9kZSgpLkhhcyhrZXkpCgkJfQoJfQp9CgovLyBHZXQgc2VhcmNoZXMgZm9yIGEgbm9kZSB3aXRoIHRoZSBnaXZlbiBrZXkgaW4gdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoZSBub2RlCi8vIGFuZCByZXR1cm5zIGl0cyBpbmRleCwgdmFsdWUsIGFuZCB3aGV0aGVyIGl0IGV4aXN0cy4KZnVuYyAobm9kZSAqTm9kZSkgR2V0KGtleSBzdHJpbmcpIChpbmRleCBpbnQsIHZhbHVlIGFueSwgZXhpc3RzIGJvb2wpIHsKCWlmIG5vZGUgPT0gbmlsIHsKCQlyZXR1cm4gMCwgbmlsLCBmYWxzZQoJfQoKCWlmIG5vZGUuaGVpZ2h0ID09IDAgewoJCWlmIG5vZGUua2V5ID09IGtleSB7CgkJCXJldHVybiAwLCBub2RlLnZhbHVlLCB0cnVlCgkJfSBlbHNlIGlmIG5vZGUua2V5IDwga2V5IHsKCQkJcmV0dXJuIDEsIG5pbCwgZmFsc2UKCQl9IGVsc2UgewoJCQlyZXR1cm4gMCwgbmlsLCBmYWxzZQoJCX0KCX0gZWxzZSB7CgkJaWYga2V5IDwgbm9kZS5rZXkgewoJCQlyZXR1cm4gbm9kZS5nZXRMZWZ0Tm9kZSgpLkdldChrZXkpCgkJfSBlbHNlIHsKCQkJcmlnaHROb2RlIDo9IG5vZGUuZ2V0UmlnaHROb2RlKCkKCQkJaW5kZXgsIHZhbHVlLCBleGlzdHMgPSByaWdodE5vZGUuR2V0KGtleSkKCQkJaW5kZXggKz0gbm9kZS5zaXplIC0gcmlnaHROb2RlLnNpemUKCQkJcmV0dXJuIGluZGV4LCB2YWx1ZSwgZXhpc3RzCgkJfQoJfQp9CgovLyBHZXRCeUluZGV4IHJldHJpZXZlcyB0aGUga2V5LXZhbHVlIHBhaXIgb2YgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4Ci8vIGluIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgbm9kZS4KZnVuYyAobm9kZSAqTm9kZSkgR2V0QnlJbmRleChpbmRleCBpbnQpIChrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIHsKCWlmIG5vZGUuaGVpZ2h0ID09IDAgewoJCWlmIGluZGV4ID09IDAgewoJCQlyZXR1cm4gbm9kZS5rZXksIG5vZGUudmFsdWUKCQl9IGVsc2UgewoJCQlwYW5pYygiR2V0QnlJbmRleCBhc2tlZCBmb3IgaW52YWxpZCBpbmRleCIpCgkJfQoJfSBlbHNlIHsKCQkvLyBUT0RPOiBjb3VsZCBpbXByb3ZlIHRoaXMgYnkgc3RvcmluZyB0aGUgc2l6ZXMKCQlsZWZ0Tm9kZSA6PSBub2RlLmdldExlZnROb2RlKCkKCQlpZiBpbmRleCA8IGxlZnROb2RlLnNpemUgewoJCQlyZXR1cm4gbGVmdE5vZGUuR2V0QnlJbmRleChpbmRleCkKCQl9IGVsc2UgewoJCQlyZXR1cm4gbm9kZS5nZXRSaWdodE5vZGUoKS5HZXRCeUluZGV4KGluZGV4IC0gbGVmdE5vZGUuc2l6ZSkKCQl9Cgl9Cn0KCi8vIFNldCBpbnNlcnRzIGEgbmV3IG5vZGUgd2l0aCB0aGUgZ2l2ZW4ga2V5LXZhbHVlIHBhaXIgaW50byB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhlIG5vZGUsCi8vIGFuZCByZXR1cm5zIHRoZSBuZXcgcm9vdCBvZiB0aGUgc3VidHJlZSBhbmQgd2hldGhlciBhbiBleGlzdGluZyBub2RlIHdhcyB1cGRhdGVkLgovLwovLyBYWFggY29uc2lkZXIgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuLi4gcGVyaGFwcyBzcGxpdCBOb2RlIGZyb20gTm9kZS4KZnVuYyAobm9kZSAqTm9kZSkgU2V0KGtleSBzdHJpbmcsIHZhbHVlIGFueSkgKG5ld1NlbGYgKk5vZGUsIHVwZGF0ZWQgYm9vbCkgewoJaWYgbm9kZSA9PSBuaWwgewoJCXJldHVybiBOZXdOb2RlKGtleSwgdmFsdWUpLCBmYWxzZQoJfQoJaWYgbm9kZS5oZWlnaHQgPT0gMCB7CgkJaWYga2V5IDwgbm9kZS5rZXkgewoJCQlyZXR1cm4gJk5vZGV7CgkJCQlrZXk6ICAgICAgIG5vZGUua2V5LAoJCQkJaGVpZ2h0OiAgICAxLAoJCQkJc2l6ZTogICAgICAyLAoJCQkJbGVmdE5vZGU6ICBOZXdOb2RlKGtleSwgdmFsdWUpLAoJCQkJcmlnaHROb2RlOiBub2RlLAoJCQl9LCBmYWxzZQoJCX0gZWxzZSBpZiBrZXkgPT0gbm9kZS5rZXkgewoJCQlyZXR1cm4gTmV3Tm9kZShrZXksIHZhbHVlKSwgdHJ1ZQoJCX0gZWxzZSB7CgkJCXJldHVybiAmTm9kZXsKCQkJCWtleTogICAgICAga2V5LAoJCQkJaGVpZ2h0OiAgICAxLAoJCQkJc2l6ZTogICAgICAyLAoJCQkJbGVmdE5vZGU6ICBub2RlLAoJCQkJcmlnaHROb2RlOiBOZXdOb2RlKGtleSwgdmFsdWUpLAoJCQl9LCBmYWxzZQoJCX0KCX0gZWxzZSB7CgkJbm9kZSA9IG5vZGUuX2NvcHkoKQoJCWlmIGtleSA8IG5vZGUua2V5IHsKCQkJbm9kZS5sZWZ0Tm9kZSwgdXBkYXRlZCA9IG5vZGUuZ2V0TGVmdE5vZGUoKS5TZXQoa2V5LCB2YWx1ZSkKCQl9IGVsc2UgewoJCQlub2RlLnJpZ2h0Tm9kZSwgdXBkYXRlZCA9IG5vZGUuZ2V0UmlnaHROb2RlKCkuU2V0KGtleSwgdmFsdWUpCgkJfQoJCWlmIHVwZGF0ZWQgewoJCQlyZXR1cm4gbm9kZSwgdXBkYXRlZAoJCX0gZWxzZSB7CgkJCW5vZGUuY2FsY0hlaWdodEFuZFNpemUoKQoJCQlyZXR1cm4gbm9kZS5iYWxhbmNlKCksIHVwZGF0ZWQKCQl9Cgl9Cn0KCi8vIFJlbW92ZSBkZWxldGVzIHRoZSBub2RlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgbm9kZS4KLy8gcmV0dXJucyB0aGUgbmV3IHJvb3Qgb2YgdGhlIHN1YnRyZWUsIHRoZSBuZXcgbGVmdG1vc3QgbGVhZiBrZXkgKGlmIGNoYW5nZWQpLAovLyB0aGUgcmVtb3ZlZCB2YWx1ZSBhbmQgdGhlIHJlbW92YWwgd2FzIHN1Y2Nlc3NmdWwuCmZ1bmMgKG5vZGUgKk5vZGUpIFJlbW92ZShrZXkgc3RyaW5nKSAoCgluZXdOb2RlICpOb2RlLCBuZXdLZXkgc3RyaW5nLCB2YWx1ZSBhbnksIHJlbW92ZWQgYm9vbCwKKSB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgIiIsIG5pbCwgZmFsc2UKCX0KCWlmIG5vZGUuaGVpZ2h0ID09IDAgewoJCWlmIGtleSA9PSBub2RlLmtleSB7CgkJCXJldHVybiBuaWwsICIiLCBub2RlLnZhbHVlLCB0cnVlCgkJfSBlbHNlIHsKCQkJcmV0dXJuIG5vZGUsICIiLCBuaWwsIGZhbHNlCgkJfQoJfSBlbHNlIHsKCQlpZiBrZXkgPCBub2RlLmtleSB7CgkJCXZhciBuZXdMZWZ0Tm9kZSAqTm9kZQoJCQluZXdMZWZ0Tm9kZSwgbmV3S2V5LCB2YWx1ZSwgcmVtb3ZlZCA9IG5vZGUuZ2V0TGVmdE5vZGUoKS5SZW1vdmUoa2V5KQoJCQlpZiAhcmVtb3ZlZCB7CgkJCQlyZXR1cm4gbm9kZSwgIiIsIHZhbHVlLCBmYWxzZQoJCQl9IGVsc2UgaWYgbmV3TGVmdE5vZGUgPT0gbmlsIHsgLy8gbGVmdCBub2RlIGhlbGQgdmFsdWUsIHdhcyByZW1vdmVkCgkJCQlyZXR1cm4gbm9kZS5yaWdodE5vZGUsIG5vZGUua2V5LCB2YWx1ZSwgdHJ1ZQoJCQl9CgkJCW5vZGUgPSBub2RlLl9jb3B5KCkKCQkJbm9kZS5sZWZ0Tm9kZSA9IG5ld0xlZnROb2RlCgkJCW5vZGUuY2FsY0hlaWdodEFuZFNpemUoKQoJCQlub2RlID0gbm9kZS5iYWxhbmNlKCkKCQkJcmV0dXJuIG5vZGUsIG5ld0tleSwgdmFsdWUsIHRydWUKCQl9IGVsc2UgewoJCQl2YXIgbmV3UmlnaHROb2RlICpOb2RlCgkJCW5ld1JpZ2h0Tm9kZSwgbmV3S2V5LCB2YWx1ZSwgcmVtb3ZlZCA9IG5vZGUuZ2V0UmlnaHROb2RlKCkuUmVtb3ZlKGtleSkKCQkJaWYgIXJlbW92ZWQgewoJCQkJcmV0dXJuIG5vZGUsICIiLCB2YWx1ZSwgZmFsc2UKCQkJfSBlbHNlIGlmIG5ld1JpZ2h0Tm9kZSA9PSBuaWwgeyAvLyByaWdodCBub2RlIGhlbGQgdmFsdWUsIHdhcyByZW1vdmVkCgkJCQlyZXR1cm4gbm9kZS5sZWZ0Tm9kZSwgIiIsIHZhbHVlLCB0cnVlCgkJCX0KCQkJbm9kZSA9IG5vZGUuX2NvcHkoKQoJCQlub2RlLnJpZ2h0Tm9kZSA9IG5ld1JpZ2h0Tm9kZQoJCQlpZiBuZXdLZXkgIT0gIiIgewoJCQkJbm9kZS5rZXkgPSBuZXdLZXkKCQkJfQoJCQlub2RlLmNhbGNIZWlnaHRBbmRTaXplKCkKCQkJbm9kZSA9IG5vZGUuYmFsYW5jZSgpCgkJCXJldHVybiBub2RlLCAiIiwgdmFsdWUsIHRydWUKCQl9Cgl9Cn0KCmZ1bmMgKG5vZGUgKk5vZGUpIGdldExlZnROb2RlKCkgKk5vZGUgewoJcmV0dXJuIG5vZGUubGVmdE5vZGUKfQoKZnVuYyAobm9kZSAqTm9kZSkgZ2V0UmlnaHROb2RlKCkgKk5vZGUgewoJcmV0dXJuIG5vZGUucmlnaHROb2RlCn0KCi8vIHJvdGF0ZVJpZ2h0IHBlcmZvcm1zIGEgcmlnaHQgcm90YXRpb24gb24gdGhlIG5vZGUgYW5kIHJldHVybnMgdGhlIG5ldyByb290LgovLyBOT1RFOiBvdmVyd3JpdGVzIG5vZGUKLy8gVE9ETzogb3B0aW1pemUgYmFsYW5jZSAmIHJvdGF0ZQpmdW5jIChub2RlICpOb2RlKSByb3RhdGVSaWdodCgpICpOb2RlIHsKCW5vZGUgPSBub2RlLl9jb3B5KCkKCWwgOj0gbm9kZS5nZXRMZWZ0Tm9kZSgpCglfbCA6PSBsLl9jb3B5KCkKCglfbHJDYWNoZWQgOj0gX2wucmlnaHROb2RlCglfbC5yaWdodE5vZGUgPSBub2RlCglub2RlLmxlZnROb2RlID0gX2xyQ2FjaGVkCgoJbm9kZS5jYWxjSGVpZ2h0QW5kU2l6ZSgpCglfbC5jYWxjSGVpZ2h0QW5kU2l6ZSgpCgoJcmV0dXJuIF9sCn0KCi8vIHJvdGF0ZUxlZnQgcGVyZm9ybXMgYSBsZWZ0IHJvdGF0aW9uIG9uIHRoZSBub2RlIGFuZCByZXR1cm5zIHRoZSBuZXcgcm9vdC4KLy8gTk9URTogb3ZlcndyaXRlcyBub2RlCi8vIFRPRE86IG9wdGltaXplIGJhbGFuY2UgJiByb3RhdGUKZnVuYyAobm9kZSAqTm9kZSkgcm90YXRlTGVmdCgpICpOb2RlIHsKCW5vZGUgPSBub2RlLl9jb3B5KCkKCXIgOj0gbm9kZS5nZXRSaWdodE5vZGUoKQoJX3IgOj0gci5fY29weSgpCgoJX3JsQ2FjaGVkIDo9IF9yLmxlZnROb2RlCglfci5sZWZ0Tm9kZSA9IG5vZGUKCW5vZGUucmlnaHROb2RlID0gX3JsQ2FjaGVkCgoJbm9kZS5jYWxjSGVpZ2h0QW5kU2l6ZSgpCglfci5jYWxjSGVpZ2h0QW5kU2l6ZSgpCgoJcmV0dXJuIF9yCn0KCi8vIGNhbGNIZWlnaHRBbmRTaXplIHVwZGF0ZXMgdGhlIGhlaWdodCBhbmQgc2l6ZSBvZiB0aGUgbm9kZSBiYXNlZCBvbiBpdHMgY2hpbGRyZW4uCi8vIE5PVEU6IG11dGF0ZXMgaGVpZ2h0IGFuZCBzaXplCmZ1bmMgKG5vZGUgKk5vZGUpIGNhbGNIZWlnaHRBbmRTaXplKCkgewoJbm9kZS5oZWlnaHQgPSBtYXhJbnQ4KG5vZGUuZ2V0TGVmdE5vZGUoKS5oZWlnaHQsIG5vZGUuZ2V0UmlnaHROb2RlKCkuaGVpZ2h0KSArIDEKCW5vZGUuc2l6ZSA9IG5vZGUuZ2V0TGVmdE5vZGUoKS5zaXplICsgbm9kZS5nZXRSaWdodE5vZGUoKS5zaXplCn0KCi8vIGNhbGNCYWxhbmNlIGNhbGN1bGF0ZXMgdGhlIGJhbGFuY2UgZmFjdG9yIG9mIHRoZSBub2RlLgpmdW5jIChub2RlICpOb2RlKSBjYWxjQmFsYW5jZSgpIGludCB7CglyZXR1cm4gaW50KG5vZGUuZ2V0TGVmdE5vZGUoKS5oZWlnaHQpIC0gaW50KG5vZGUuZ2V0UmlnaHROb2RlKCkuaGVpZ2h0KQp9CgovLyBiYWxhbmNlIGJhbGFuY2VzIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgbm9kZSBhbmQgcmV0dXJucyB0aGUgbmV3IHJvb3QuCi8vIE5PVEU6IGFzc3VtZXMgdGhhdCBub2RlIGNhbiBiZSBtb2RpZmllZAovLyBUT0RPOiBvcHRpbWl6ZSBiYWxhbmNlICYgcm90YXRlCmZ1bmMgKG5vZGUgKk5vZGUpIGJhbGFuY2UoKSAobmV3U2VsZiAqTm9kZSkgewoJYmFsYW5jZSA6PSBub2RlLmNhbGNCYWxhbmNlKCkKCWlmIGJhbGFuY2UgPiAxIHsKCQlpZiBub2RlLmdldExlZnROb2RlKCkuY2FsY0JhbGFuY2UoKSA+PSAwIHsKCQkJLy8gTGVmdCBMZWZ0IENhc2UKCQkJcmV0dXJuIG5vZGUucm90YXRlUmlnaHQoKQoJCX0gZWxzZSB7CgkJCS8vIExlZnQgUmlnaHQgQ2FzZQoJCQlsZWZ0IDo9IG5vZGUuZ2V0TGVmdE5vZGUoKQoJCQlub2RlLmxlZnROb2RlID0gbGVmdC5yb3RhdGVMZWZ0KCkKCQkJcmV0dXJuIG5vZGUucm90YXRlUmlnaHQoKQoJCX0KCX0KCWlmIGJhbGFuY2UgPCAtMSB7CgkJaWYgbm9kZS5nZXRSaWdodE5vZGUoKS5jYWxjQmFsYW5jZSgpIDw9IDAgewoJCQkvLyBSaWdodCBSaWdodCBDYXNlCgkJCXJldHVybiBub2RlLnJvdGF0ZUxlZnQoKQoJCX0gZWxzZSB7CgkJCS8vIFJpZ2h0IExlZnQgQ2FzZQoJCQlyaWdodCA6PSBub2RlLmdldFJpZ2h0Tm9kZSgpCgkJCW5vZGUucmlnaHROb2RlID0gcmlnaHQucm90YXRlUmlnaHQoKQoJCQlyZXR1cm4gbm9kZS5yb3RhdGVMZWZ0KCkKCQl9Cgl9CgkvLyBOb3RoaW5nIGNoYW5nZWQKCXJldHVybiBub2RlCn0KCi8vIFNob3J0Y3V0IGZvciBUcmF2ZXJzZUluUmFuZ2UuCmZ1bmMgKG5vZGUgKk5vZGUpIEl0ZXJhdGUoc3RhcnQsIGVuZCBzdHJpbmcsIGNiIGZ1bmMoKk5vZGUpIGJvb2wpIGJvb2wgewoJcmV0dXJuIG5vZGUuVHJhdmVyc2VJblJhbmdlKHN0YXJ0LCBlbmQsIHRydWUsIHRydWUsIGNiKQp9CgovLyBTaG9ydGN1dCBmb3IgVHJhdmVyc2VJblJhbmdlLgpmdW5jIChub2RlICpOb2RlKSBSZXZlcnNlSXRlcmF0ZShzdGFydCwgZW5kIHN0cmluZywgY2IgZnVuYygqTm9kZSkgYm9vbCkgYm9vbCB7CglyZXR1cm4gbm9kZS5UcmF2ZXJzZUluUmFuZ2Uoc3RhcnQsIGVuZCwgZmFsc2UsIHRydWUsIGNiKQp9CgovLyBUcmF2ZXJzZUluUmFuZ2UgdHJhdmVyc2VzIGFsbCBub2RlcywgaW5jbHVkaW5nIGlubmVyIG5vZGVzLgovLyBTdGFydCBpcyBpbmNsdXNpdmUgYW5kIGVuZCBpcyBleGNsdXNpdmUgd2hlbiBhc2NlbmRpbmcsCi8vIFN0YXJ0IGFuZCBlbmQgYXJlIGluY2x1c2l2ZSB3aGVuIGRlc2NlbmRpbmcuCi8vIEVtcHR5IHN0YXJ0IGFuZCBlbXB0eSBlbmQgZGVub3RlIG5vIHN0YXJ0IGFuZCBubyBlbmQuCi8vIElmIGxlYXZlc09ubHkgaXMgdHJ1ZSwgb25seSB2aXNpdCBsZWFmIG5vZGVzLgovLyBOT1RFOiBUbyBzaW11bGF0ZSBhbiBleGNsdXNpdmUgcmV2ZXJzZSB0cmF2ZXJzYWwsCi8vIGp1c3QgYXBwZW5kIDB4MDAgdG8gc3RhcnQuCmZ1bmMgKG5vZGUgKk5vZGUpIFRyYXZlcnNlSW5SYW5nZShzdGFydCwgZW5kIHN0cmluZywgYXNjZW5kaW5nIGJvb2wsIGxlYXZlc09ubHkgYm9vbCwgY2IgZnVuYygqTm9kZSkgYm9vbCkgYm9vbCB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CglhZnRlclN0YXJ0IDo9IChzdGFydCA9PSAiIiB8fCBzdGFydCA8IG5vZGUua2V5KQoJc3RhcnRPckFmdGVyIDo9IChzdGFydCA9PSAiIiB8fCBzdGFydCA8PSBub2RlLmtleSkKCWJlZm9yZUVuZCA6PSBmYWxzZQoJaWYgYXNjZW5kaW5nIHsKCQliZWZvcmVFbmQgPSAoZW5kID09ICIiIHx8IG5vZGUua2V5IDwgZW5kKQoJfSBlbHNlIHsKCQliZWZvcmVFbmQgPSAoZW5kID09ICIiIHx8IG5vZGUua2V5IDw9IGVuZCkKCX0KCgkvLyBSdW4gY2FsbGJhY2sgcGVyIGlubmVyL2xlYWYgbm9kZS4KCXN0b3AgOj0gZmFsc2UKCWlmICghbm9kZS5Jc0xlYWYoKSAmJiAhbGVhdmVzT25seSkgfHwKCQkobm9kZS5Jc0xlYWYoKSAmJiBzdGFydE9yQWZ0ZXIgJiYgYmVmb3JlRW5kKSB7CgkJc3RvcCA9IGNiKG5vZGUpCgkJaWYgc3RvcCB7CgkJCXJldHVybiBzdG9wCgkJfQoJfQoJaWYgbm9kZS5Jc0xlYWYoKSB7CgkJcmV0dXJuIHN0b3AKCX0KCglpZiBhc2NlbmRpbmcgewoJCS8vIGNoZWNrIGxvd2VyIG5vZGVzLCB0aGVuIGhpZ2hlcgoJCWlmIGFmdGVyU3RhcnQgewoJCQlzdG9wID0gbm9kZS5nZXRMZWZ0Tm9kZSgpLlRyYXZlcnNlSW5SYW5nZShzdGFydCwgZW5kLCBhc2NlbmRpbmcsIGxlYXZlc09ubHksIGNiKQoJCX0KCQlpZiBzdG9wIHsKCQkJcmV0dXJuIHN0b3AKCQl9CgkJaWYgYmVmb3JlRW5kIHsKCQkJc3RvcCA9IG5vZGUuZ2V0UmlnaHROb2RlKCkuVHJhdmVyc2VJblJhbmdlKHN0YXJ0LCBlbmQsIGFzY2VuZGluZywgbGVhdmVzT25seSwgY2IpCgkJfQoJfSBlbHNlIHsKCQkvLyBjaGVjayB0aGUgaGlnaGVyIG5vZGVzIGZpcnN0CgkJaWYgYmVmb3JlRW5kIHsKCQkJc3RvcCA9IG5vZGUuZ2V0UmlnaHROb2RlKCkuVHJhdmVyc2VJblJhbmdlKHN0YXJ0LCBlbmQsIGFzY2VuZGluZywgbGVhdmVzT25seSwgY2IpCgkJfQoJCWlmIHN0b3AgewoJCQlyZXR1cm4gc3RvcAoJCX0KCQlpZiBhZnRlclN0YXJ0IHsKCQkJc3RvcCA9IG5vZGUuZ2V0TGVmdE5vZGUoKS5UcmF2ZXJzZUluUmFuZ2Uoc3RhcnQsIGVuZCwgYXNjZW5kaW5nLCBsZWF2ZXNPbmx5LCBjYikKCQl9Cgl9CgoJcmV0dXJuIHN0b3AKfQoKLy8gVHJhdmVyc2VCeU9mZnNldCB0cmF2ZXJzZXMgYWxsIG5vZGVzLCBpbmNsdWRpbmcgaW5uZXIgbm9kZXMuCi8vIEEgbGltaXQgb2YgbWF0aC5NYXhJbnQgbWVhbnMgbm8gbGltaXQuCmZ1bmMgKG5vZGUgKk5vZGUpIFRyYXZlcnNlQnlPZmZzZXQob2Zmc2V0LCBsaW1pdCBpbnQsIGFzY2VuZGluZyBib29sLCBsZWF2ZXNPbmx5IGJvb2wsIGNiIGZ1bmMoKk5vZGUpIGJvb2wpIGJvb2wgewoJaWYgbm9kZSA9PSBuaWwgewoJCXJldHVybiBmYWxzZQoJfQoKCS8vIGZhc3QgcGF0aHMuIHRoZXNlIGhhcHBlbiBvbmx5IGlmIFRyYXZlcnNlQnlPZmZzZXQgaXMgY2FsbGVkIGRpcmVjdGx5IG9uIGEgbGVhZi4KCWlmIGxpbWl0IDw9IDAgfHwgb2Zmc2V0ID49IG5vZGUuc2l6ZSB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBub2RlLklzTGVhZigpIHsKCQlpZiBvZmZzZXQgPiAwIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCXJldHVybiBjYihub2RlKQoJfQoKCS8vIGdvIHRvIHRoZSBhY3R1YWwgcmVjdXJzaXZlIGZ1bmN0aW9uLgoJcmV0dXJuIG5vZGUudHJhdmVyc2VCeU9mZnNldChvZmZzZXQsIGxpbWl0LCBhc2NlbmRpbmcsIGxlYXZlc09ubHksIGNiKQp9CgovLyBUcmF2ZXJzZUJ5T2Zmc2V0IHRyYXZlcnNlcyB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhlIG5vZGUgYnkgb2Zmc2V0IGFuZCBsaW1pdCwKLy8gaW4gZWl0aGVyIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIG9yZGVyLCBhbmQgYXBwbGllcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCB0cmF2ZXJzZWQgbm9kZS4KLy8gSWYgbGVhdmVzT25seSBpcyB0cnVlLCBvbmx5IGxlYWYgbm9kZXMgYXJlIHZpc2l0ZWQuCmZ1bmMgKG5vZGUgKk5vZGUpIHRyYXZlcnNlQnlPZmZzZXQob2Zmc2V0LCBsaW1pdCBpbnQsIGFzY2VuZGluZyBib29sLCBsZWF2ZXNPbmx5IGJvb2wsIGNiIGZ1bmMoKk5vZGUpIGJvb2wpIGJvb2wgewoJLy8gY2FsbGVyIGd1YXJhbnRlZXM6IG9mZnNldCA8IG5vZGUuc2l6ZTsgbGltaXQgPiAwLgoJaWYgIWxlYXZlc09ubHkgewoJCWlmIGNiKG5vZGUpIHsKCQkJcmV0dXJuIHRydWUgLy8gU3RvcCB0cmF2ZXJzYWwgaWYgY2FsbGJhY2sgcmV0dXJucyB0cnVlCgkJfQoJfQoJZmlyc3QsIHNlY29uZCA6PSBub2RlLmdldExlZnROb2RlKCksIG5vZGUuZ2V0UmlnaHROb2RlKCkKCWlmICFhc2NlbmRpbmcgewoJCWZpcnN0LCBzZWNvbmQgPSBzZWNvbmQsIGZpcnN0Cgl9CglpZiBmaXJzdC5Jc0xlYWYoKSB7CgkJLy8gZWl0aGVyIHJ1biBvciBza2lwLCBiYXNlZCBvbiBvZmZzZXQKCQlpZiBvZmZzZXQgPiAwIHsKCQkJb2Zmc2V0LS0KCQl9IGVsc2UgewoJCQlpZiBjYihmaXJzdCkgewoJCQkJcmV0dXJuIHRydWUgLy8gU3RvcCB0cmF2ZXJzYWwgaWYgY2FsbGJhY2sgcmV0dXJucyB0cnVlCgkJCX0KCQkJbGltaXQtLQoJCQlpZiBsaW1pdCA8PSAwIHsKCQkJCXJldHVybiB0cnVlIC8vIFN0b3AgdHJhdmVyc2FsIHdoZW4gbGltaXQgaXMgcmVhY2hlZAoJCQl9CgkJfQoJfSBlbHNlIHsKCQkvLyBwb3NzaWJsZSBjYXNlczoKCQkvLyAxIHRoZSBvZmZzZXQgZ2l2ZW4gc2tpcHMgdGhlIGZpcnN0IG5vZGUgZW50aXJlbHkKCQkvLyAyIHRoZSBvZmZzZXQgc2tpcHMgbm9uZSBvciBwYXJ0IG9mIHRoZSBmaXJzdCBub2RlLCBidXQgdGhlIGxpbWl0IHJlcXVpcmVzIHNvbWUgb2YgdGhlIHNlY29uZCBub2RlLgoJCS8vIDMgdGhlIG9mZnNldCBza2lwcyBub25lIG9yIHBhcnQgb2YgdGhlIGZpcnN0IG5vZGUsIGFuZCB0aGUgbGltaXQgc3RvcHMgb3VyIHNlYXJjaCBvbiB0aGUgZmlyc3Qgbm9kZS4KCQlpZiBvZmZzZXQgPj0gZmlyc3Quc2l6ZSB7CgkJCW9mZnNldCAtPSBmaXJzdC5zaXplIC8vIDEKCQl9IGVsc2UgewoJCQlpZiBmaXJzdC50cmF2ZXJzZUJ5T2Zmc2V0KG9mZnNldCwgbGltaXQsIGFzY2VuZGluZywgbGVhdmVzT25seSwgY2IpIHsKCQkJCXJldHVybiB0cnVlCgkJCX0KCQkJLy8gbnVtYmVyIG9mIGxlYXZlcyB3aGljaCBjb3VsZCBhY3R1YWxseSBiZSBjYWxsZWQgZnJvbSBpbnNpZGUKCQkJZGVsdGEgOj0gZmlyc3Quc2l6ZSAtIG9mZnNldAoJCQlvZmZzZXQgPSAwCgkJCWlmIGRlbHRhID49IGxpbWl0IHsKCQkJCXJldHVybiB0cnVlIC8vIDMKCQkJfQoJCQlsaW1pdCAtPSBkZWx0YSAvLyAyCgkJfQoJfQoKCS8vIGJlY2F1c2Ugb2YgdGhlIGNhbGxlciBndWFyYW50ZWVzIGFuZCB0aGUgd2F5IHdlIGhhbmRsZSB0aGUgZmlyc3Qgbm9kZSwKCS8vIGF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGxpbWl0ID4gMCBhbmQgdGhlcmUgbXVzdCBiZSBzb21lIHZhbHVlcyBpbgoJLy8gdGhpcyBzZWNvbmQgbm9kZSB0aGF0IHdlIGluY2x1ZGUuCgoJLy8gPT4gaWYgdGhlIHNlY29uZCBub2RlIGlzIGEgbGVhZiwgaXQgaGFzIHRvIGJlIGluY2x1ZGVkLgoJaWYgc2Vjb25kLklzTGVhZigpIHsKCQlyZXR1cm4gY2Ioc2Vjb25kKQoJfQoJLy8gPT4gaWYgaXQgaXMgbm90IGEgbGVhZiwgaXQgd2lsbCBzdGlsbCBiZSBlbm91Z2ggdG8gcmVjdXJzaXZlbHkgY2FsbCB0aGlzCgkvLyBmdW5jdGlvbiB3aXRoIHRoZSB1cGRhdGVkIG9mZnNldCBhbmQgbGltaXQKCXJldHVybiBzZWNvbmQudHJhdmVyc2VCeU9mZnNldChvZmZzZXQsIGxpbWl0LCBhc2NlbmRpbmcsIGxlYXZlc09ubHksIGNiKQp9CgovLyBPbmx5IHVzZWQgaW4gdGVzdGluZy4uLgpmdW5jIChub2RlICpOb2RlKSBsbWQoKSAqTm9kZSB7CglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlyZXR1cm4gbm9kZQoJfQoJcmV0dXJuIG5vZGUuZ2V0TGVmdE5vZGUoKS5sbWQoKQp9CgovLyBPbmx5IHVzZWQgaW4gdGVzdGluZy4uLgpmdW5jIChub2RlICpOb2RlKSBybWQoKSAqTm9kZSB7CglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlyZXR1cm4gbm9kZQoJfQoJcmV0dXJuIG5vZGUuZ2V0UmlnaHROb2RlKCkucm1kKCkKfQoKZnVuYyBtYXhJbnQ4KGEsIGIgaW50OCkgaW50OCB7CglpZiBhID4gYiB7CgkJcmV0dXJuIGEKCX0KCXJldHVybiBiCn0KGrogCgh0cmVlLmdubxKtIHBhY2thZ2UgYXZsCgp0eXBlIElUcmVlIGludGVyZmFjZSB7CgkvLyByZWFkIG9wZXJhdGlvbnMKCglTaXplKCkgaW50CglIYXMoa2V5IHN0cmluZykgYm9vbAoJR2V0KGtleSBzdHJpbmcpICh2YWx1ZSBhbnksIGV4aXN0cyBib29sKQoJR2V0QnlJbmRleChpbmRleCBpbnQpIChrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpCglJdGVyYXRlKHN0YXJ0LCBlbmQgc3RyaW5nLCBjYiBJdGVyQ2JGbikgYm9vbAoJUmV2ZXJzZUl0ZXJhdGUoc3RhcnQsIGVuZCBzdHJpbmcsIGNiIEl0ZXJDYkZuKSBib29sCglJdGVyYXRlQnlPZmZzZXQob2Zmc2V0IGludCwgY291bnQgaW50LCBjYiBJdGVyQ2JGbikgYm9vbAoJUmV2ZXJzZUl0ZXJhdGVCeU9mZnNldChvZmZzZXQgaW50LCBjb3VudCBpbnQsIGNiIEl0ZXJDYkZuKSBib29sCgoJLy8gd3JpdGUgb3BlcmF0aW9ucwoKCVNldChrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpICh1cGRhdGVkIGJvb2wpCglSZW1vdmUoa2V5IHN0cmluZykgKHZhbHVlIGFueSwgcmVtb3ZlZCBib29sKQp9Cgp0eXBlIEl0ZXJDYkZuIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVHJlZQoKLy8gVGhlIHplcm8gc3RydWN0IGNhbiBiZSB1c2VkIGFzIGFuIGVtcHR5IHRyZWUuCnR5cGUgVHJlZSBzdHJ1Y3QgewoJbm9kZSAqTm9kZQp9CgovLyBOZXdUcmVlIGNyZWF0ZXMgYSBuZXcgZW1wdHkgQVZMIHRyZWUuCmZ1bmMgTmV3VHJlZSgpICpUcmVlIHsKCXJldHVybiAmVHJlZXsKCQlub2RlOiBuaWwsCgl9Cn0KCi8vIFNpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlyIGluIHRoZSB0cmVlLgpmdW5jICh0cmVlICpUcmVlKSBTaXplKCkgaW50IHsKCXJldHVybiB0cmVlLm5vZGUuU2l6ZSgpCn0KCi8vIEhhcyBjaGVja3Mgd2hldGhlciBhIGtleSBleGlzdHMgaW4gdGhlIHRyZWUuCi8vIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cywgb3RoZXJ3aXNlIGZhbHNlLgpmdW5jICh0cmVlICpUcmVlKSBIYXMoa2V5IHN0cmluZykgKGhhcyBib29sKSB7CglyZXR1cm4gdHJlZS5ub2RlLkhhcyhrZXkpCn0KCi8vIEdldCByZXRyaWV2ZXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LgovLyBJdCByZXR1cm5zIHRoZSB2YWx1ZSBhbmQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5IGV4aXN0cy4KZnVuYyAodHJlZSAqVHJlZSkgR2V0KGtleSBzdHJpbmcpICh2YWx1ZSBhbnksIGV4aXN0cyBib29sKSB7CglfLCB2YWx1ZSwgZXhpc3RzID0gdHJlZS5ub2RlLkdldChrZXkpCglyZXR1cm4KfQoKLy8gR2V0QnlJbmRleCByZXRyaWV2ZXMgdGhlIGtleS12YWx1ZSBwYWlyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIHRyZWUuCi8vIEl0IHJldHVybnMgdGhlIGtleSBhbmQgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LgpmdW5jICh0cmVlICpUcmVlKSBHZXRCeUluZGV4KGluZGV4IGludCkgKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgewoJcmV0dXJuIHRyZWUubm9kZS5HZXRCeUluZGV4KGluZGV4KQp9CgovLyBTZXQgaW5zZXJ0cyBhIGtleS12YWx1ZSBwYWlyIGludG8gdGhlIHRyZWUuCi8vIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCi8vIEl0IHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5IHdhcyBuZXdseSBpbnNlcnRlZCBvciB1cGRhdGVkLgpmdW5jICh0cmVlICpUcmVlKSBTZXQoa2V5IHN0cmluZywgdmFsdWUgYW55KSAodXBkYXRlZCBib29sKSB7CgluZXdub2RlLCB1cGRhdGVkIDo9IHRyZWUubm9kZS5TZXQoa2V5LCB2YWx1ZSkKCXRyZWUubm9kZSA9IG5ld25vZGUKCXJldHVybiB1cGRhdGVkCn0KCi8vIFJlbW92ZSByZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgdHJlZS4KLy8gSXQgcmV0dXJucyB0aGUgcmVtb3ZlZCB2YWx1ZSBhbmQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5IHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC4KZnVuYyAodHJlZSAqVHJlZSkgUmVtb3ZlKGtleSBzdHJpbmcpICh2YWx1ZSBhbnksIHJlbW92ZWQgYm9vbCkgewoJbmV3bm9kZSwgXywgdmFsdWUsIHJlbW92ZWQgOj0gdHJlZS5ub2RlLlJlbW92ZShrZXkpCgl0cmVlLm5vZGUgPSBuZXdub2RlCglyZXR1cm4gdmFsdWUsIHJlbW92ZWQKfQoKLy8gSXRlcmF0ZSBwZXJmb3JtcyBhbiBpbi1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUgd2l0aGluIHRoZSBzcGVjaWZpZWQga2V5IHJhbmdlLgovLyBJdCBjYWxscyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgZW5jb3VudGVyZWQuCi8vIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWUsIHRoZSBpdGVyYXRpb24gaXMgc3RvcHBlZC4KZnVuYyAodHJlZSAqVHJlZSkgSXRlcmF0ZShzdGFydCwgZW5kIHN0cmluZywgY2IgSXRlckNiRm4pIGJvb2wgewoJcmV0dXJuIHRyZWUubm9kZS5UcmF2ZXJzZUluUmFuZ2Uoc3RhcnQsIGVuZCwgdHJ1ZSwgdHJ1ZSwKCQlmdW5jKG5vZGUgKk5vZGUpIGJvb2wgewoJCQlyZXR1cm4gY2Iobm9kZS5LZXkoKSwgbm9kZS5WYWx1ZSgpKQoJCX0sCgkpCn0KCi8vIFJldmVyc2VJdGVyYXRlIHBlcmZvcm1zIGEgcmV2ZXJzZSBpbi1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUgd2l0aGluIHRoZSBzcGVjaWZpZWQga2V5IHJhbmdlLgovLyBJdCBjYWxscyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgZW5jb3VudGVyZWQuCi8vIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWUsIHRoZSBpdGVyYXRpb24gaXMgc3RvcHBlZC4KZnVuYyAodHJlZSAqVHJlZSkgUmV2ZXJzZUl0ZXJhdGUoc3RhcnQsIGVuZCBzdHJpbmcsIGNiIEl0ZXJDYkZuKSBib29sIHsKCXJldHVybiB0cmVlLm5vZGUuVHJhdmVyc2VJblJhbmdlKHN0YXJ0LCBlbmQsIGZhbHNlLCB0cnVlLAoJCWZ1bmMobm9kZSAqTm9kZSkgYm9vbCB7CgkJCXJldHVybiBjYihub2RlLktleSgpLCBub2RlLlZhbHVlKCkpCgkJfSwKCSkKfQoKLy8gSXRlcmF0ZUJ5T2Zmc2V0IHBlcmZvcm1zIGFuIGluLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZSBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgovLyBJdCBjYWxscyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgZW5jb3VudGVyZWQsIHVwIHRvIHRoZSBzcGVjaWZpZWQgY291bnQuCi8vIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWUsIHRoZSBpdGVyYXRpb24gaXMgc3RvcHBlZC4KZnVuYyAodHJlZSAqVHJlZSkgSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCBpbnQsIGNvdW50IGludCwgY2IgSXRlckNiRm4pIGJvb2wgewoJcmV0dXJuIHRyZWUubm9kZS5UcmF2ZXJzZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIHRydWUsIHRydWUsCgkJZnVuYyhub2RlICpOb2RlKSBib29sIHsKCQkJcmV0dXJuIGNiKG5vZGUuS2V5KCksIG5vZGUuVmFsdWUoKSkKCQl9LAoJKQp9CgovLyBSZXZlcnNlSXRlcmF0ZUJ5T2Zmc2V0IHBlcmZvcm1zIGEgcmV2ZXJzZSBpbi1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLy8gSXQgY2FsbHMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIGVuY291bnRlcmVkLCB1cCB0byB0aGUgc3BlY2lmaWVkIGNvdW50LgovLyBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLCB0aGUgaXRlcmF0aW9uIGlzIHN0b3BwZWQuCmZ1bmMgKHRyZWUgKlRyZWUpIFJldmVyc2VJdGVyYXRlQnlPZmZzZXQob2Zmc2V0IGludCwgY291bnQgaW50LCBjYiBJdGVyQ2JGbikgYm9vbCB7CglyZXR1cm4gdHJlZS5ub2RlLlRyYXZlcnNlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZmFsc2UsIHRydWUsCgkJZnVuYyhub2RlICpOb2RlKSBib29sIHsKCQkJcmV0dXJuIGNiKG5vZGUuS2V5KCksIG5vZGUuVmFsdWUoKSkKCQl9LAoJKQp9CgovLyBWZXJpZnkgdGhhdCBUcmVlIGltcGxlbWVudHMgVHJlZUludGVyZmFjZQp2YXIgXyBJVHJlZSA9ICgqVHJlZSkobmlsKQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDDIwMDAwMDB1Z25vdBISCIDC1y8SCzEwMDAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQM98Juph3c3ExWuNR5cvd2nj/+LswrQCqmctkDcIYvZPQWNgDH8V8RQA/tUPLtkIkzX7/IjAaFZ2+Pp5HnS4ZsESQBGvil8iVg4jCQSdbso4R1+J9j3y3Vl4y5fcboKVlpcBVhiXzB4fM3XCZesyelojHvfNobo8RQJXwf+Bd47cIVUaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=