Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
D65A1D9C6D9CBF48333B32296EA25879F0D490D59068BDC06359B07D84146C52
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
78,809,060
Gas consumed
FEE
300000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf15000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cuq+AwoML3ZtLm1fYWRkcGtnEti+AwooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhKbvgMKCWVzY3Jvd192NBIcZ25vLmxhbmQvci9zYW1jcmV3L2VzY3Jvd192NBrnuAIKCmVzY3Jvdy5nbm8S17gCcGFja2FnZSBlc2Nyb3dfdjQKCi8vIE1pbGVzdG9uZS1iYXNlZCBlc2Nyb3c6IG9uLWNoYWluIGZyZWVsYW5jZSBzZXJ2aWNlIGNvbnRyYWN0cyBmb3IgTWVtYmEuCi8vIFN1Y2Nlc3NvciBvZiBlc2Nyb3dfdjMgd2l0aCB0aGUgc2FtZSB1c2VyIEFQSTsgc2VlIERFU0lHTi5tZCBmb3Igd2hhdAovLyBjaGFuZ2VkIGFuZCB3aHkuCi8vCi8vIEZsb3c6IENyZWF0ZUNvbnRyYWN0IOKGkiBGdW5kTWlsZXN0b25lIOKGkiBDb21wbGV0ZU1pbGVzdG9uZSDihpIgUmVsZWFzZUZ1bmRzCi8vIERpc3B1dGVzOiBSYWlzZURpc3B1dGUg4oaSIGFkbWluIFJlc29sdmVEaXNwdXRlIChvciBDbGFpbURpc3B1dGVUaW1lb3V0IGFmdGVyCi8vICAgICAgICAgICBBdXRvUmVzb2x2ZUJsa3MpCi8vIFRpbWVvdXRzOiBDbGFpbVJlZnVuZCAoYSBmdW5kZWQgbWlsZXN0b25lIG5vYm9keSBjb21wbGV0ZWQsIGFmdGVyCi8vICAgICAgICAgICBBdXRvUmVmdW5kQmxrcyk7IEV4cGlyZVVuZnVuZGVkIChhIGNvbnRyYWN0IG5ldmVyIGZ1bmRlZCwgYWZ0ZXIKLy8gICAgICAgICAgIFVuZnVuZGVkRXhwaXJ5QmxrcykKLy8gQ2xlYW51cDogIEFyY2hpdmVDb250cmFjdCAoY2xpZW50IGRlbGV0ZXMgYSBzZXR0bGVkIGNvbnRyYWN0OyB0aGUgY2hhaW4KLy8gICAgICAgICAgIHJlZnVuZHMgdGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCB0byB0aGUgc2lnbmVyKQovLwovLyBJbnZhcmlhbnRzOgovLyAgIC0gU3RhdGUgaXMgdXBkYXRlZCBiZWZvcmUgYW55IGNvaW5zIGFyZSBzZW50LgovLyAgIC0gcmVhbG0gYmFsYW5jZSA+PSBUb3RhbExpYWJpbGl0aWVzKCkgKE5GLTIpLgovLyAgIC0gQSBjb250cmFjdCBpcyBvcGVuIHVudGlsIGl0IGlzIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQ7IGFuIG9wZW4gY29udHJhY3QKLy8gICAgIGhvbGRzIG9uZSBvZiBpdHMgY2xpZW50J3MgTWF4QWN0aXZlUGVyQ2xpZW50IHNsb3RzLgovLyAgIC0gY29tcGxldGVkIGFuZCBjYW5jZWxsZWQgYXJlIGFic29yYmluZyBhbmQgaG9sZCBubyBlc2Nyb3dlZCBmdW5kcy4KLy8KLy8gQ2FsbGVyIGF1dGhlbnRpY2F0aW9uOiBldmVyeSBjcm9zc2luZyBlbnRyeXBvaW50IGNoZWNrcyBjdXIuSXNDdXJyZW50KCkgYW5kCi8vIHJlYWRzIHRoZSBjYWxsZXIgZnJvbSBjdXIuUHJldmlvdXMoKS4gRXZlcnkgdXNlIG9mIHRoZSB1bnNhZmUgcnVudGltZQovLyBwYWNrYWdlIGlzIGluIG9yaWdpbi5nbm8uIFJlYWQtb25seSB2aWV3cyBhcmUgaW4gdmlld3MuZ25vLgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidW5pY29kZSIKCSJ1bmljb2RlL3V0ZjgiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvYXZsIgoJY2ZnICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfbWFya2V0X2NvbmZpZyIKKQoKLy8g4pSA4pSAIENvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIGxhbmVTZXJ2aWNlIGlzIHRoaXMgZW5naW5lJ3MgbGFuZSBrZXkgaW50byB0aGUgREFPIGZlZSBzcGluZQovLyAobWVtYmFfbWFya2V0X2NvbmZpZyksIHNlZWRlZCB0aGVyZSBhdCAyMDAgYnBzLgpjb25zdCBsYW5lU2VydmljZSA9ICJzZXJ2aWNlIgoKY29uc3QgKAoJLy8gUGxhdGZvcm1GZWVQY3QgaXMgb25seSB0aGUgZmFpbC1zYWZlIGZhbGxiYWNrIHJhdGUgKHNlZSByZXNvbHZlRmVlKTsgdGhlCgkvLyBsaXZlIHJhdGUgaXMgY2ZnLkdldEZlZUJQUyhsYW5lU2VydmljZSksIHJlYWQgYXQgZWFjaCBwYXlvdXQuCglQbGF0Zm9ybUZlZVBjdCA9IDIKCS8vIENhbmNlbEZlZVBjdCBpcyBwYWlkIHRvIHRoZSBmcmVlbGFuY2VyIGZyb20gZWFjaCBmdW5kZWQgbWlsZXN0b25lIHdoZW4KCS8vIHRoZSBjbGllbnQgY2FuY2Vscy4gRXNjcm93LWludGVybmFsLCBub3QgYSBwcm90b2NvbCBmZWUuCglDYW5jZWxGZWVQY3QgPSA1CgkvLyBUaW1lb3V0cywgaW4gYmxvY2tzLCBhcyBpbiB2MyAoc2l6ZWQgYXQgMyBzIHBlciBibG9jazsgYXQgZ25vbGFuZC0xJ3MKCS8vIH4zLjMgcyB0aGV5IGFyZSB+MzMgYW5kIH4zMSBkYXlzKS4gQmxvY2tzIGluc2lkZSBhIHBhdXNlJ3MgYmxvY2tpbmcKCS8vIHdpbmRvdyBkbyBub3QgY291bnQgKHNlZSB0aGUgcGF1c2Ugc2VjdGlvbikuCglBdXRvUmVmdW5kQmxrcyAgPSBpbnQ2NCg4NjQwMDApCglBdXRvUmVzb2x2ZUJsa3MgPSBpbnQ2NCg4MDY0MDApCgkvLyBVbmZ1bmRlZEV4cGlyeUJsa3M6IGEgY29udHJhY3Qgbm9uZSBvZiB3aG9zZSBtaWxlc3RvbmVzIHdhcyBldmVyIGZ1bmRlZAoJLy8gY2FuIGJlIGNhbmNlbGxlZCBieSBhbnlvbmUgYWZ0ZXIgdGhpcyBtYW55IGJsb2NrcywgZnJlZWluZyBpdHMgc2xvdC4KCVVuZnVuZGVkRXhwaXJ5QmxrcyA9IEF1dG9SZWZ1bmRCbGtzCgoJTWF4VGl0bGVMZW4gICAgICAgID0gMjAwICAvLyBieXRlcywgYWZ0ZXIgc2FuaXRpc2luZyAoYWxzbyBib3VuZHMgdGhlIGlucHV0KQoJTWF4RGVzY0xlbiAgICAgICAgID0gNTAwMCAvLyBieXRlcywgYWZ0ZXIgc2FuaXRpc2luZyAoYWxzbyBib3VuZHMgdGhlIGlucHV0KQoJTWF4TWlsZXN0b25lcyAgICAgID0gMjAKCU1pbk1pbGVzdG9uZUFtb3VudCA9IGludDY0KDEwMDApIC8vIDAuMDAxIEdOT1Q6IGJlbG93IH41MCB1Z25vdCBhIDIlIGZlZSB0cnVuY2F0ZXMgdG8gMAoJLy8gbWF4TWlsZXN0b25lc0FyZ0xlbiBib3VuZHMgdGhlIHJhdyBtaWxlc3RvbmVzIGFyZ3VtZW50IGJlZm9yZSBwYXJzaW5nOgoJLy8gMjAgZW50cmllcyBvZiBhIDIwMC1ieXRlIHRpdGxlLCBhIDE5LWRpZ2l0IGFtb3VudCBhbmQgc2VwYXJhdG9ycywgd2l0aAoJLy8gcm9vbSBmb3Igc3Vycm91bmRpbmcgc3BhY2VzLgoJbWF4TWlsZXN0b25lc0FyZ0xlbiA9IE1heE1pbGVzdG9uZXMgKiAoTWF4VGl0bGVMZW4gKyA2NCkKCgkvLyBNYXhBY3RpdmVQZXJDbGllbnQgYm91bmRzIHRoZSBvcGVuIGNvbnRyYWN0cyBvbmUgY2xpZW50IGFkZHJlc3MgbWF5CgkvLyBob2xkLiBJdCBjb3VudHMgb25seSBjb250cmFjdHMgdGhlIGFkZHJlc3MgY3JlYXRlZCwgbmV2ZXIgdGhvc2UgbmFtaW5nCgkvLyBpdCBhcyBmcmVlbGFuY2VyLCBzbyBub2JvZHkgY2FuIHVzZSB1cCBzb21lb25lIGVsc2UncyBzbG90cywgYW5kIGl0CgkvLyBib3VuZHMgd2hhdCBvbmUga2V5IGNhbiBsb2NrIChmaXZlIG9mIHRoZSBsYXJnZXN0IGNvbnRyYWN0cyBhcmUgYWJvdXQKCS8vIDE1IEdOT1Qgb2Ygc3RvcmFnZSBkZXBvc2l0KS4gVGhlcmUgaXMgbm8gZ2xvYmFsIGNhcDogbm90aGluZyBpdGVyYXRlcwoJLy8gb3ZlciBldmVyeSBjb250cmFjdCwgc28gYSBnbG9iYWwgbnVtYmVyIHdvdWxkIGJvdW5kIG5vIGdhcyBhbmQgd291bGQKCS8vIG9ubHkgZ2l2ZSBhIGZ1bmRlZCBhdHRhY2tlciBhIHN3aXRjaCB0byB0dXJuIGVzY3JvdyBvZmYgZm9yIGV2ZXJ5b25lLgoJTWF4QWN0aXZlUGVyQ2xpZW50ID0gNQopCgovLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgp0eXBlIENvbnRyYWN0U3RhdHVzIHN0cmluZwoKY29uc3QgKAoJU3RhdHVzQWN0aXZlICAgIENvbnRyYWN0U3RhdHVzID0gImFjdGl2ZSIKCVN0YXR1c0NvbXBsZXRlZCBDb250cmFjdFN0YXR1cyA9ICJjb21wbGV0ZWQiCglTdGF0dXNEaXNwdXRlZCAgQ29udHJhY3RTdGF0dXMgPSAiZGlzcHV0ZWQiCglTdGF0dXNDYW5jZWxsZWQgQ29udHJhY3RTdGF0dXMgPSAiY2FuY2VsbGVkIgopCgp0eXBlIE1pbGVzdG9uZVN0YXR1cyBzdHJpbmcKCmNvbnN0ICgKCU1zUGVuZGluZyAgIE1pbGVzdG9uZVN0YXR1cyA9ICJwZW5kaW5nIgoJTXNGdW5kZWQgICAgTWlsZXN0b25lU3RhdHVzID0gImZ1bmRlZCIKCU1zQ29tcGxldGVkIE1pbGVzdG9uZVN0YXR1cyA9ICJjb21wbGV0ZWQiCglNc1JlbGVhc2VkICBNaWxlc3RvbmVTdGF0dXMgPSAicmVsZWFzZWQiCglNc0Rpc3B1dGVkICBNaWxlc3RvbmVTdGF0dXMgPSAiZGlzcHV0ZWQiCglNc1JlZnVuZGVkICBNaWxlc3RvbmVTdGF0dXMgPSAicmVmdW5kZWQiCikKCnR5cGUgQ29udHJhY3Qgc3RydWN0IHsKCUlEICAgICAgICAgIHN0cmluZwoJQ2xpZW50ICAgICAgYWRkcmVzcwoJRnJlZWxhbmNlciAgYWRkcmVzcwoJVGl0bGUgICAgICAgc3RyaW5nCglEZXNjcmlwdGlvbiBzdHJpbmcKCVN0YXR1cyAgICAgIENvbnRyYWN0U3RhdHVzCglDcmVhdGVkQXQgICBpbnQ2NCAvLyBibG9jayBoZWlnaHQKCU1pbGVzdG9uZXMgIFtdTWlsZXN0b25lCgoJY3JlYXRlZFBhdXNlTWFyayBpbnQ2NCAvLyBwYXVzZWRCbG9ja3NBdChDcmVhdGVkQXQpLCBmb3IgVW5mdW5kZWRFeHBpcnlCbGtzCn0KCnR5cGUgTWlsZXN0b25lIHN0cnVjdCB7CglJRCAgICAgICAgICAgICAgIGludCAvLyBlcXVhbHMgdGhlIG1pbGVzdG9uZSdzIGluZGV4CglUaXRsZSAgICAgICAgICAgIHN0cmluZwoJQW1vdW50ICAgICAgICAgICBpbnQ2NCAvLyB1Z25vdAoJU3RhdHVzICAgICAgICAgICBNaWxlc3RvbmVTdGF0dXMKCUZ1bmRlZEF0ICAgICAgICAgaW50NjQgICAgICAgICAgIC8vIGJsb2NrIGhlaWdodCAoMCBpZiBub3QgZnVuZGVkKQoJQ29tcGxldGVkQXQgICAgICBpbnQ2NCAgICAgICAgICAgLy8gYmxvY2sgaGVpZ2h0ICgwIGlmIG5vdCBjb21wbGV0ZWQpCglEaXNwdXRlZEF0ICAgICAgIGludDY0ICAgICAgICAgICAvLyBibG9jayBoZWlnaHQgKDAgaWYgbm90IGRpc3B1dGVkKQoJUHJlRGlzcHV0ZVN0YXR1cyBNaWxlc3RvbmVTdGF0dXMgLy8gc3RhdHVzIGJlZm9yZSBkaXNwdXRlIChNc0Z1bmRlZCBvciBNc0NvbXBsZXRlZCkKCglmdW5kZWRQYXVzZU1hcmsgICBpbnQ2NCAvLyBwYXVzZWRCbG9ja3NBdChGdW5kZWRBdCksIGZvciBBdXRvUmVmdW5kQmxrcwoJZGlzcHV0ZWRQYXVzZU1hcmsgaW50NjQgLy8gcGF1c2VkQmxvY2tzQXQoRGlzcHV0ZWRBdCksIGZvciBBdXRvUmVzb2x2ZUJsa3MKfQoKLy8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKdmFyICgKCWNvbnRyYWN0cyAgICAgKmF2bC5UcmVlIC8vIGlkIC0+ICpDb250cmFjdDsgbGl2ZSAobm90IGFyY2hpdmVkKSBjb250cmFjdHMgb25seQoJY2xpZW50U2xvdHMgICAqYXZsLlRyZWUgLy8gY2xpZW50IGFkZHJlc3MgLT4gaW50IG9wZW4gY29udHJhY3RzIChyZW1vdmVkIG9uIGFyY2hpdmUgb25jZSAwKTsgImMvPGNsaWVudD4vPGlkPiIgLT4gbmlsIGNsaWVudCBpbmRleAoJbmV4dElEICAgICAgICBpbnQgICAgICAgLy8gbW9ub3RvbmljLCBuZXZlciByZXVzZWQKCWFjdGl2ZUNvdW50ICAgaW50ICAgICAgIC8vIG9wZW4gY29udHJhY3RzCglhcmNoaXZlZENvdW50IGludAoJdG90YWxMaWFibGUgICBpbnQ2NCAvLyBORi0yOiB1Z25vdCBvd2VkIHRvIGZ1bmRlZCwgY29tcGxldGVkIGFuZCBkaXNwdXRlZCBtaWxlc3RvbmVzCikKCmZ1bmMgaW5pdCgpIHsKCWNvbnRyYWN0cyA9IGF2bC5OZXdUcmVlKCkKCWNsaWVudFNsb3RzID0gYXZsLk5ld1RyZWUoKQp9CgovLyByZXNvbHZlRmVlIHJlYWRzIHRoZSAic2VydmljZSIgbGFuZSBmZWUgKGJwcykgYW5kIHRyZWFzdXJ5IGZyb20gdGhlIERBTyBmZWUKLy8gc3BpbmUgYXQgcGF5b3V0IHRpbWUuIFRoZSBjb25maWcgZ2V0dGVycyBhcmUgcHVyZSBhbmQgbm9uLWZhaWxpbmc7IG9uIGFuCi8vIG91dC1vZi1yYW5nZSByYXRlIG9yIGFuIGVtcHR5IG9yIG1hbGZvcm1lZCB0cmVhc3VyeSB0aGlzIGZhbGxzIGJhY2sgdG8gdGhlCi8vIGZyb3plbiByYXRlIGFuZCB0aGUgcmVhbG0ncyBmZWUgcmVjaXBpZW50IHJhdGhlciB0aGFuIHJldmVydGluZyBhIHBheW91dCwgc28KLy8gYSBjb25maWcgbWlzdGFrZSBuZXZlciBzdHJhbmRzIGVzY3Jvd2VkIGZ1bmRzLgpmdW5jIHJlc29sdmVGZWUoKSAoaW50NjQsIGFkZHJlc3MpIHsKCWJwcyA6PSBpbnQ2NChjZmcuR2V0RmVlQlBTKGxhbmVTZXJ2aWNlKSkKCWlmIGJwcyA8IDAgfHwgYnBzID4gY2ZnLk1heEZlZUJQUyB7CgkJYnBzID0gaW50NjQoUGxhdGZvcm1GZWVQY3QpICogMTAwCgl9Cgl0cmVhc3VyeSA6PSBjZmcuR2V0VHJlYXN1cnkoKQoJaWYgdHJlYXN1cnkgPT0gIiIgfHwgIXRyZWFzdXJ5LklzVmFsaWQoKSB7CgkJdHJlYXN1cnkgPSBmZWVSZWNpcGllbnQKCX0KCXJldHVybiBicHMsIHRyZWFzdXJ5Cn0KCi8vIGNhbGxlck9mIHJldHVybnMgdGhlIGltbWVkaWF0ZSBjYWxsZXIgb2YgYSBjcm9zc2luZyBlbnRyeXBvaW50LgpmdW5jIGNhbGxlck9mKGN1ciByZWFsbSkgYWRkcmVzcyB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygic3Bvb2ZlZCByZWFsbSIpCgl9CglyZXR1cm4gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCn0KCi8vIOKUgOKUgCBDb250cmFjdCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBDcmVhdGVDb250cmFjdCBjcmVhdGVzIGEgbmV3IGVzY3JvdyBjb250cmFjdCB3aXRoIG1pbGVzdG9uZXMsIGFzIHRoZQovLyBjYWxsZXIncyBjbGllbnQuIE1pbGVzdG9uZXMgZm9ybWF0OiAidGl0bGUxOmFtb3VudDEsdGl0bGUyOmFtb3VudDIiLgovLyBUaGUgY2FsbGVyIG11c3QgYmUgYSB1c2VyIChhIGRpcmVjdCBjYWxsIG9yIHRoZSB1c2VyJ3Mgb3duIHJ1biBzY3JpcHQpLCBzbyBhCi8vIHJlYWxtIGNhbm5vdCBtaW50IGNsaWVudCBpZGVudGl0aWVzIHdpdGggY3VyLlN1YiB0byBob2xkIHNsb3RzLgpmdW5jIENyZWF0ZUNvbnRyYWN0KGN1ciByZWFsbSwgZnJlZWxhbmNlciBhZGRyZXNzLCB0aXRsZSwgZGVzY3JpcHRpb24sIG1pbGVzdG9uZXMgc3RyaW5nKSBzdHJpbmcgewoJYXNzZXJ0QWNjZXB0c05ld01vbmV5KCkKCWNhbGxlciA6PSBjYWxsZXJPZihjdXIpCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyKCkgewoJCXBhbmljKCJDcmVhdGVDb250cmFjdCBtdXN0IGJlIGNhbGxlZCBieSBhIHVzZXIsIG5vdCBhIHJlYWxtIikKCX0KCWlmICFmcmVlbGFuY2VyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgZnJlZWxhbmNlciBhZGRyZXNzIikKCX0KCWlmIGZyZWVsYW5jZXIgPT0gY2FsbGVyIHsKCQlwYW5pYygiY2Fubm90IGhpcmUgeW91cnNlbGYiKQoJfQoJaWYgbGVuKHRpdGxlKSA9PSAwIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoInRpdGxlIG11c3QgYmUgMS0lZCBjaGFyYWN0ZXJzIiwgTWF4VGl0bGVMZW4pKQoJfQoJY2xlYW5UaXRsZSA6PSBjbGVhblRleHQodGl0bGUsICJ0aXRsZSIsIE1heFRpdGxlTGVuKQoJaWYgc3RyaW5ncy5UcmltU3BhY2UoY2xlYW5UaXRsZSkgPT0gIiIgewoJCXBhbmljKCJ0aXRsZSBtdXN0IGNvbnRhaW4gdmlzaWJsZSBjaGFyYWN0ZXJzIikKCX0KCWNsZWFuRGVzYyA6PSBjbGVhblRleHQoZGVzY3JpcHRpb24sICJkZXNjcmlwdGlvbiIsIE1heERlc2NMZW4pCgoJbXMgOj0gcGFyc2VNaWxlc3RvbmVzKG1pbGVzdG9uZXMpCglpZiBsZW4obXMpID09IDAgewoJCXBhbmljKCJhdCBsZWFzdCBvbmUgbWlsZXN0b25lIHJlcXVpcmVkIikKCX0KCWlmIGxlbihtcykgPiBNYXhNaWxlc3RvbmVzIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoIm1heGltdW0gJWQgbWlsZXN0b25lcyBhbGxvd2VkIiwgTWF4TWlsZXN0b25lcykpCgl9CgoJdGFrZVNsb3QoY2FsbGVyKQoJbiA6PSBuZXh0SUQKCWlkIDo9IHN0cmNvbnYuSXRvYShuKQoJbmV4dElEKysKCWNsaWVudFNsb3RzLlNldChpbmRleEtleShjYWxsZXIsIG4pLCBuaWwpIC8vIGNsaWVudCBpbmRleCAodmlld3MuZ25vKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJY29udHJhY3RzLlNldChpZCwgJkNvbnRyYWN0ewoJCUlEOiAgICAgICAgICAgICAgIGlkLAoJCUNsaWVudDogICAgICAgICAgIGNhbGxlciwKCQlGcmVlbGFuY2VyOiAgICAgICBmcmVlbGFuY2VyLAoJCVRpdGxlOiAgICAgICAgICAgIGNsZWFuVGl0bGUsCgkJRGVzY3JpcHRpb246ICAgICAgY2xlYW5EZXNjLAoJCVN0YXR1czogICAgICAgICAgIFN0YXR1c0FjdGl2ZSwKCQlDcmVhdGVkQXQ6ICAgICAgICBub3csCgkJTWlsZXN0b25lczogICAgICAgbXMsCgkJY3JlYXRlZFBhdXNlTWFyazogcGF1c2VkQmxvY2tzQXQobm93KSwKCX0pCgoJY2hhaW4uRW1pdCgiQ29udHJhY3RDcmVhdGVkIiwKCQkiaWQiLCBpZCwKCQkiY2xpZW50IiwgY2FsbGVyLlN0cmluZygpLAoJCSJmcmVlbGFuY2VyIiwgZnJlZWxhbmNlci5TdHJpbmcoKSwKCQkibWlsZXN0b25lcyIsIHN0cmNvbnYuSXRvYShsZW4obXMpKSwKCSkKCXJldHVybiBpZAp9CgovLyBGdW5kTWlsZXN0b25lIGRlcG9zaXRzIGV4YWN0bHkgdGhlIG1pbGVzdG9uZSBhbW91bnQuIENsaWVudCBvbmx5LCBhbmQgb25seQovLyBhcyBhIGRpcmVjdCB1c2VyIGNhbGw6IHRoZSB0eC1sZXZlbCBzZW5kIGxhbmRzIG9uIHRoZSBtZXNzYWdlJ3MgdGFyZ2V0Ci8vIHJlYWxtLCBzbyBmcm9tIGFuIGludGVybWVkaWFyeSByZWFsbSB0aGUgY29pbnMgd291bGQgbmV2ZXIgcmVhY2ggZXNjcm93Ci8vIHdoaWxlIHRoZSBtaWxlc3RvbmUgd2FzIG1hcmtlZCBmdW5kZWQuCmZ1bmMgRnVuZE1pbGVzdG9uZShjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nLCBtaWxlc3RvbmVJZHggaW50KSB7Cglhc3NlcnRBY2NlcHRzTmV3TW9uZXkoKQoJY2FsbGVyIDo9IGNhbGxlck9mKGN1cikKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJGdW5kTWlsZXN0b25lIG11c3QgYmUgYSBkaXJlY3QgdXNlciBjYWxsIikKCX0KCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCWlmIGMuQ2xpZW50ICE9IGNhbGxlciB7CgkJcGFuaWMoIm9ubHkgY2xpZW50IGNhbiBmdW5kIikKCX0KCWlmIGMuU3RhdHVzICE9IFN0YXR1c0FjdGl2ZSB7CgkJcGFuaWMoImNvbnRyYWN0IG5vdCBhY3RpdmUiKQoJfQoJbXMgOj0gbWlsZXN0b25lQXQoYywgbWlsZXN0b25lSWR4KQoJaWYgbXMuU3RhdHVzICE9IE1zUGVuZGluZyB7CgkJcGFuaWMoIm1pbGVzdG9uZSBhbHJlYWR5IGZ1bmRlZCBvciBwcm9jZXNzZWQiKQoJfQoJcmVxdWlyZUV4YWN0U2VuZChtcy5BbW91bnQsIGN1ci5QcmV2aW91cygpKQoKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCW1zLlN0YXR1cyA9IE1zRnVuZGVkCgltcy5GdW5kZWRBdCA9IG5vdwoJbXMuZnVuZGVkUGF1c2VNYXJrID0gcGF1c2VkQmxvY2tzQXQobm93KQoJdG90YWxMaWFibGUgKz0gbXMuQW1vdW50CgoJY2hhaW4uRW1pdCgiTWlsZXN0b25lRnVuZGVkIiwKCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCSJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChtcy5BbW91bnQsIDEwKSwKCSkKfQoKLy8gQ29tcGxldGVNaWxlc3RvbmUgbWFya3MgYSBmdW5kZWQgbWlsZXN0b25lIGRlbGl2ZXJlZC4gRnJlZWxhbmNlciBvbmx5LgpmdW5jIENvbXBsZXRlTWlsZXN0b25lKGN1ciByZWFsbSwgY29udHJhY3RJZCBzdHJpbmcsIG1pbGVzdG9uZUlkeCBpbnQpIHsKCWFzc2VydE9wZW4oKQoJY2FsbGVyIDo9IGNhbGxlck9mKGN1cikKCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCWlmIGMuRnJlZWxhbmNlciAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IGZyZWVsYW5jZXIgY2FuIG1hcmsgY29tcGxldGUiKQoJfQoJLy8gQSBkaXNwdXRlZCBjb250cmFjdCBpcyBmcm96ZW4gdW50aWwgdGhlIGRpc3B1dGUgaXMgcmVzb2x2ZWQuCglpZiBjLlN0YXR1cyAhPSBTdGF0dXNBY3RpdmUgewoJCXBhbmljKCJjb250cmFjdCBpcyAiICsgc3RyaW5nKGMuU3RhdHVzKSArICIg4oCUIGNhbm5vdCBjb21wbGV0ZSBtaWxlc3RvbmVzIGR1cmluZyBkaXNwdXRlIikKCX0KCW1zIDo9IG1pbGVzdG9uZUF0KGMsIG1pbGVzdG9uZUlkeCkKCWlmIG1zLlN0YXR1cyAhPSBNc0Z1bmRlZCB7CgkJcGFuaWMoIm1pbGVzdG9uZSBub3QgZnVuZGVkIikKCX0KCgltcy5TdGF0dXMgPSBNc0NvbXBsZXRlZAoJbXMuQ29tcGxldGVkQXQgPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCgljaGFpbi5FbWl0KCJNaWxlc3RvbmVDb21wbGV0ZWQiLAoJCSJjb250cmFjdElkIiwgY29udHJhY3RJZCwKCQkibWlsZXN0b25lIiwgc3RyY29udi5JdG9hKG1pbGVzdG9uZUlkeCksCgkJImZyZWVsYW5jZXIiLCBjYWxsZXIuU3RyaW5nKCksCgkpCn0KCi8vIFJlbGVhc2VGdW5kcyBwYXlzIGEgY29tcGxldGVkIG1pbGVzdG9uZSB0byB0aGUgZnJlZWxhbmNlciwgbWludXMgdGhlIGZlZS4KLy8gQ2xpZW50LCBvciBhZG1pbiBhcyB0aGUgdHJ1c3RlZCBhcmJpdGVyICh2MyBiZWhhdmlvdXIpLgpmdW5jIFJlbGVhc2VGdW5kcyhjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nLCBtaWxlc3RvbmVJZHggaW50KSB7Cglhc3NlcnRPcGVuKCkKCWNhbGxlciA6PSBjYWxsZXJPZihjdXIpCgljIDo9IGdldENvbnRyYWN0KGNvbnRyYWN0SWQpCglpZiBjLkNsaWVudCAhPSBjYWxsZXIgJiYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygib25seSBjbGllbnQgb3IgYWRtaW4gY2FuIHJlbGVhc2UiKQoJfQoJaWYgYy5TdGF0dXMgIT0gU3RhdHVzQWN0aXZlIHsKCQlwYW5pYygiY29udHJhY3QgaXMgIiArIHN0cmluZyhjLlN0YXR1cykgKyAiIOKAlCBjYW5ub3QgcmVsZWFzZSBmdW5kcyBkdXJpbmcgZGlzcHV0ZSIpCgl9CgltcyA6PSBtaWxlc3RvbmVBdChjLCBtaWxlc3RvbmVJZHgpCglpZiBtcy5TdGF0dXMgIT0gTXNDb21wbGV0ZWQgewoJCXBhbmljKCJtaWxlc3RvbmUgbm90IGNvbXBsZXRlZCIpCgl9CgoJbXMuU3RhdHVzID0gTXNSZWxlYXNlZAoJc2V0dGxlSWZGaW5pc2hlZChjKQoJdG90YWxMaWFibGUgLT0gbXMuQW1vdW50CgoJcCA6PSBwYXlGcmVlbGFuY2VyKGN1ciwgYywgbXMuQW1vdW50KQoKCWNoYWluLkVtaXQoIkZ1bmRzUmVsZWFzZWQiLAoJCSJjb250cmFjdElkIiwgY29udHJhY3RJZCwKCQkibWlsZXN0b25lIiwgc3RyY29udi5JdG9hKG1pbGVzdG9uZUlkeCksCgkJImZyZWVsYW5jZXIiLCBjLkZyZWVsYW5jZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KHAubmV0LCAxMCksCgkJImZlZSIsIHN0cmNvbnYuRm9ybWF0SW50KHAuZmVlLCAxMCksCgkJImJwcyIsIHN0cmNvbnYuRm9ybWF0SW50KHAuYnBzLCAxMCksCgkJInRyZWFzdXJ5IiwgcC50cmVhc3VyeS5TdHJpbmcoKSwKCQkic3RhdHVzIiwgc3RyaW5nKGMuU3RhdHVzKSwKCSkKfQoKLy8g4pSA4pSAIERpc3B1dGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gUmFpc2VEaXNwdXRlIGVzY2FsYXRlcyBhIGZ1bmRlZCBvciBjb21wbGV0ZWQgbWlsZXN0b25lIHRvIHRoZSBhZG1pbi4KLy8gQ2xpZW50IG9yIGZyZWVsYW5jZXIuCmZ1bmMgUmFpc2VEaXNwdXRlKGN1ciByZWFsbSwgY29udHJhY3RJZCBzdHJpbmcsIG1pbGVzdG9uZUlkeCBpbnQpIHsKCWFzc2VydE9wZW4oKQoJY2FsbGVyIDo9IGNhbGxlck9mKGN1cikKCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCWlmIGMuQ2xpZW50ICE9IGNhbGxlciAmJiBjLkZyZWVsYW5jZXIgIT0gY2FsbGVyIHsKCQlwYW5pYygib25seSBjbGllbnQgb3IgZnJlZWxhbmNlciBjYW4gZGlzcHV0ZSIpCgl9CglpZiAhaXNPcGVuKGMpIHsKCQlwYW5pYygiY29udHJhY3QgaXMgIiArIHN0cmluZyhjLlN0YXR1cykpCgl9CgltcyA6PSBtaWxlc3RvbmVBdChjLCBtaWxlc3RvbmVJZHgpCglpZiBtcy5TdGF0dXMgIT0gTXNGdW5kZWQgJiYgbXMuU3RhdHVzICE9IE1zQ29tcGxldGVkIHsKCQlwYW5pYygiY2FuIG9ubHkgZGlzcHV0ZSBmdW5kZWQgb3IgY29tcGxldGVkIG1pbGVzdG9uZXMiKQoJfQoKCS8vIENsYWltRGlzcHV0ZVRpbWVvdXQgcGF5cyB0aGUgZnJlZWxhbmNlciBpZiB0aGUgd29yayBoYWQgYmVlbiBkZWxpdmVyZWQKCS8vIChNc0NvbXBsZXRlZCkgYW5kIHJlZnVuZHMgdGhlIGNsaWVudCBvdGhlcndpc2UuCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgltcy5QcmVEaXNwdXRlU3RhdHVzID0gbXMuU3RhdHVzCgltcy5TdGF0dXMgPSBNc0Rpc3B1dGVkCgltcy5EaXNwdXRlZEF0ID0gbm93Cgltcy5kaXNwdXRlZFBhdXNlTWFyayA9IHBhdXNlZEJsb2Nrc0F0KG5vdykKCWMuU3RhdHVzID0gU3RhdHVzRGlzcHV0ZWQKCgljaGFpbi5FbWl0KCJEaXNwdXRlUmFpc2VkIiwKCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCSJyYWlzZWRCeSIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8gUmVzb2x2ZURpc3B1dGUgc2V0dGxlcyBhIGRpc3B1dGVkIG1pbGVzdG9uZS4gQWRtaW4gb25seS4KLy8gcmVmdW5kQ2xpZW50PXRydWUgcmVmdW5kcyB0aGUgY2xpZW50IGluIGZ1bGw7IGZhbHNlIHBheXMgdGhlIGZyZWVsYW5jZXIKLy8gbWludXMgdGhlIGZlZS4gVGhlIGNvbnRyYWN0IHRoZW4gcmV0dXJucyB0byBhY3RpdmUsIHN0YXlzIGRpc3B1dGVkIGlmCi8vIGFub3RoZXIgbWlsZXN0b25lIHN0aWxsIGlzLCBvciBzZXR0bGVzOiBjb21wbGV0ZWQgaWYgZXZlcnkgbWlsZXN0b25lIGlzCi8vIHJlbGVhc2VkLCBjYW5jZWxsZWQgaWYgZXZlcnkgbWlsZXN0b25lIGlzIHJlbGVhc2VkIG9yIHJlZnVuZGVkLgpmdW5jIFJlc29sdmVEaXNwdXRlKGN1ciByZWFsbSwgY29udHJhY3RJZCBzdHJpbmcsIG1pbGVzdG9uZUlkeCBpbnQsIHJlZnVuZENsaWVudCBib29sKSB7Cglhc3NlcnRPcGVuKCkKCWlmIGNhbGxlck9mKGN1cikgIT0gYWRtaW4gewoJCXBhbmljKCJvbmx5IGFkbWluIGNhbiByZXNvbHZlIGRpc3B1dGVzIikKCX0KCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCW1zIDo9IG1pbGVzdG9uZUF0KGMsIG1pbGVzdG9uZUlkeCkKCWlmIG1zLlN0YXR1cyAhPSBNc0Rpc3B1dGVkIHsKCQlwYW5pYygibWlsZXN0b25lIG5vdCBpbiBkaXNwdXRlIikKCX0KCglpZiByZWZ1bmRDbGllbnQgewoJCW1zLlN0YXR1cyA9IE1zUmVmdW5kZWQKCX0gZWxzZSB7CgkJbXMuU3RhdHVzID0gTXNSZWxlYXNlZAoJfQoJYy5TdGF0dXMgPSBTdGF0dXNBY3RpdmUKCWlmIGFueU1pbGVzdG9uZURpc3B1dGVkKGMpIHsKCQljLlN0YXR1cyA9IFN0YXR1c0Rpc3B1dGVkCgl9CglzZXR0bGVJZkZpbmlzaGVkKGMpCgl0b3RhbExpYWJsZSAtPSBtcy5BbW91bnQKCgl2YXIgcCBwYXlvdXQKCXJlc29sdXRpb24gOj0gInJlbGVhc2VkLXRvLWZyZWVsYW5jZXIiCglpZiByZWZ1bmRDbGllbnQgewoJCXJlc29sdXRpb24gPSAicmVmdW5kZWQtdG8tY2xpZW50IgoJCXNlbmQoY3VyLCBjLkNsaWVudCwgbXMuQW1vdW50KQoJCXAgPSBwYXlvdXR7bmV0OiBtcy5BbW91bnQsIHJlY2lwaWVudDogYy5DbGllbnR9Cgl9IGVsc2UgewoJCXAgPSBwYXlGcmVlbGFuY2VyKGN1ciwgYywgbXMuQW1vdW50KQoJfQoJY2hhaW4uRW1pdCgiRGlzcHV0ZVJlc29sdmVkIiwKCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCSJyZXNvbHV0aW9uIiwgcmVzb2x1dGlvbiwKCQkicmVjaXBpZW50IiwgcC5yZWNpcGllbnQuU3RyaW5nKCksCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KHAubmV0LCAxMCksCgkJImZlZSIsIHN0cmNvbnYuRm9ybWF0SW50KHAuZmVlLCAxMCksCgkJImJwcyIsIHN0cmNvbnYuRm9ybWF0SW50KHAuYnBzLCAxMCksCgkJInRyZWFzdXJ5IiwgcC50cmVhc3VyeS5TdHJpbmcoKSwKCQkic3RhdHVzIiwgc3RyaW5nKGMuU3RhdHVzKSwKCSkKfQoKLy8g4pSA4pSAIENhbmNlbGxhdGlvbiBhbmQgZXhwaXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gQ2FuY2VsQ29udHJhY3QgY2FuY2VscyBhbiBhY3RpdmUgY29udHJhY3QuIENsaWVudCBvbmx5LiBGdW5kZWQgbWlsZXN0b25lcwovLyBhcmUgcmVmdW5kZWQgbWludXMgQ2FuY2VsRmVlUGN0LCB3aGljaCBnb2VzIHRvIHRoZSBmcmVlbGFuY2VyOyBjb21wbGV0ZWQKLy8gbWlsZXN0b25lcyBhcmUgcGFpZCB0byB0aGUgZnJlZWxhbmNlciBtaW51cyB0aGUgc2VydmljZSBmZWUuCmZ1bmMgQ2FuY2VsQ29udHJhY3QoY3VyIHJlYWxtLCBjb250cmFjdElkIHN0cmluZykgewoJYXNzZXJ0T3BlbigpCgljYWxsZXIgOj0gY2FsbGVyT2YoY3VyKQoJYyA6PSBnZXRDb250cmFjdChjb250cmFjdElkKQoJaWYgYy5DbGllbnQgIT0gY2FsbGVyIHsKCQlwYW5pYygib25seSBjbGllbnQgY2FuIGNhbmNlbCIpCgl9CglpZiBjLlN0YXR1cyAhPSBTdGF0dXNBY3RpdmUgewoJCXBhbmljKCJjb250cmFjdCBub3QgYWN0aXZlIikKCX0KCgkvLyBPbmx5IG1pbGVzdG9uZXMgdHJhbnNpdGlvbmVkIGhlcmUgYXJlIHBhaWQsIHNvIGEgbWlsZXN0b25lIGFscmVhZHkKCS8vIHJlZnVuZGVkIG9yIHJlbGVhc2VkIGlzIG5ldmVyIHBhaWQgdHdpY2UuCgl2YXIgcmVmdW5kZWQsIHJlbGVhc2VkIFtdaW50Cglmb3IgaSA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCXN3aXRjaCBjLk1pbGVzdG9uZXNbaV0uU3RhdHVzIHsKCQljYXNlIE1zRnVuZGVkOgoJCQljLk1pbGVzdG9uZXNbaV0uU3RhdHVzID0gTXNSZWZ1bmRlZAoJCQlyZWZ1bmRlZCA9IGFwcGVuZChyZWZ1bmRlZCwgaSkKCQljYXNlIE1zQ29tcGxldGVkOgoJCQljLk1pbGVzdG9uZXNbaV0uU3RhdHVzID0gTXNSZWxlYXNlZAoJCQlyZWxlYXNlZCA9IGFwcGVuZChyZWxlYXNlZCwgaSkKCQl9Cgl9CglzZXR0bGUoYywgU3RhdHVzQ2FuY2VsbGVkKQoJZm9yIF8sIGkgOj0gcmFuZ2UgcmVmdW5kZWQgewoJCXRvdGFsTGlhYmxlIC09IGMuTWlsZXN0b25lc1tpXS5BbW91bnQKCX0KCWZvciBfLCBpIDo9IHJhbmdlIHJlbGVhc2VkIHsKCQl0b3RhbExpYWJsZSAtPSBjLk1pbGVzdG9uZXNbaV0uQW1vdW50Cgl9CgoJdmFyIHRvQ2xpZW50LCBjb21wZW5zYXRpb24sIHRvRnJlZWxhbmNlciwgZmVlcywgYnBzIGludDY0Cgl2YXIgdHJlYXN1cnkgYWRkcmVzcwoJZm9yIF8sIGkgOj0gcmFuZ2UgcmVmdW5kZWQgewoJCWFtb3VudCA6PSBjLk1pbGVzdG9uZXNbaV0uQW1vdW50CgkJZmVlIDo9IGJhc2lzUG9pbnRzRmVlKGFtb3VudCwgaW50NjQoQ2FuY2VsRmVlUGN0KSoxMDApCgkJc2VuZChjdXIsIGMuQ2xpZW50LCBhbW91bnQtZmVlKQoJCXNlbmQoY3VyLCBjLkZyZWVsYW5jZXIsIGZlZSkKCQl0b0NsaWVudCArPSBhbW91bnQgLSBmZWUKCQljb21wZW5zYXRpb24gKz0gZmVlCgl9Cglmb3IgXywgaSA6PSByYW5nZSByZWxlYXNlZCB7CgkJcCA6PSBwYXlGcmVlbGFuY2VyKGN1ciwgYywgYy5NaWxlc3RvbmVzW2ldLkFtb3VudCkKCQl0b0ZyZWVsYW5jZXIgKz0gcC5uZXQKCQlmZWVzICs9IHAuZmVlCgkJYnBzLCB0cmVhc3VyeSA9IHAuYnBzLCBwLnRyZWFzdXJ5Cgl9CgoJY2hhaW4uRW1pdCgiQ29udHJhY3RDYW5jZWxsZWQiLAoJCSJjb250cmFjdElkIiwgY29udHJhY3RJZCwKCQkiY2xpZW50IiwgYy5DbGllbnQuU3RyaW5nKCksCgkJImZyZWVsYW5jZXIiLCBjLkZyZWVsYW5jZXIuU3RyaW5nKCksCgkJInJlZnVuZGVkIiwgc3RyY29udi5JdG9hKGxlbihyZWZ1bmRlZCkpLAoJCSJyZWxlYXNlZCIsIHN0cmNvbnYuSXRvYShsZW4ocmVsZWFzZWQpKSwKCQkicmVmdW5kVG9DbGllbnQiLCBzdHJjb252LkZvcm1hdEludCh0b0NsaWVudCwgMTApLAoJCSJjYW5jZWxDb21wZW5zYXRpb24iLCBzdHJjb252LkZvcm1hdEludChjb21wZW5zYXRpb24sIDEwKSwKCQkiY2FuY2VsRmVlQnBzIiwgc3RyY29udi5Gb3JtYXRJbnQoaW50NjQoQ2FuY2VsRmVlUGN0KSoxMDAsIDEwKSwKCQkicmVsZWFzZWRUb0ZyZWVsYW5jZXIiLCBzdHJjb252LkZvcm1hdEludCh0b0ZyZWVsYW5jZXIsIDEwKSwKCQkiZmVlIiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlcywgMTApLAoJCSJicHMiLCBzdHJjb252LkZvcm1hdEludChicHMsIDEwKSwKCQkidHJlYXN1cnkiLCB0cmVhc3VyeS5TdHJpbmcoKSwKCSkKfQoKLy8gRXhwaXJlVW5mdW5kZWQgY2FuY2VscyBhIGNvbnRyYWN0IG5vbmUgb2Ygd2hvc2UgbWlsZXN0b25lcyB3YXMgZXZlciBmdW5kZWQsCi8vIG9uY2UgVW5mdW5kZWRFeHBpcnlCbGtzIGhhdmUgcGFzc2VkIHNpbmNlIGNyZWF0aW9uIChibG9ja2luZy13aW5kb3cgYmxvY2tzCi8vIGV4Y2x1ZGVkKS4gQW55b25lIG1heSBjYWxsLiBJdCBmcmVlcyB0aGUgY2xpZW50J3Mgc2xvdCBhbmQgbW92ZXMgbm8gY29pbnM7Ci8vIGl0IGRvZXMgbm90IGRlbGV0ZSwgc28gdGhlIHN0b3JhZ2UgZGVwb3NpdCBzdGF5cyBmb3IgdGhlIGNsaWVudCdzCi8vIEFyY2hpdmVDb250cmFjdC4KZnVuYyBFeHBpcmVVbmZ1bmRlZChjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nKSB7Cglhc3NlcnRPcGVuKCkKCWNhbGxlciA6PSBjYWxsZXJPZihjdXIpCgljIDo9IGdldENvbnRyYWN0KGNvbnRyYWN0SWQpCglpZiBjLlN0YXR1cyAhPSBTdGF0dXNBY3RpdmUgewoJCXBhbmljKCJjb250cmFjdCBub3QgYWN0aXZlIikKCX0KCWZvciBfLCBtIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJaWYgbS5TdGF0dXMgIT0gTXNQZW5kaW5nIHsKCQkJcGFuaWMoImNvbnRyYWN0IHdhcyBmdW5kZWQ7IHVzZSBDbGFpbVJlZnVuZCBvciBDYW5jZWxDb250cmFjdCIpCgkJfQoJfQoJZWxhcHNlZCA6PSBlbGFwc2VkT3BlbihjLkNyZWF0ZWRBdCwgYy5jcmVhdGVkUGF1c2VNYXJrKQoJaWYgZWxhcHNlZCA8IFVuZnVuZGVkRXhwaXJ5QmxrcyB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0b28gZWFybHk6ICVkIGJsb2NrcyByZW1haW5pbmciLCBVbmZ1bmRlZEV4cGlyeUJsa3MtZWxhcHNlZCkpCgl9CgoJc2V0dGxlKGMsIFN0YXR1c0NhbmNlbGxlZCkKCgljaGFpbi5FbWl0KCJDb250cmFjdEV4cGlyZWQiLAoJCSJjb250cmFjdElkIiwgY29udHJhY3RJZCwKCQkiY2xpZW50IiwgYy5DbGllbnQuU3RyaW5nKCksCgkJImV4cGlyZWRCeSIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8g4pSA4pSAIFRpbWVvdXRzIChwZXJtaXNzaW9ubGVzcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBDbGFpbVJlZnVuZCByZWZ1bmRzIGEgZnVuZGVkIG1pbGVzdG9uZSBub2JvZHkgY29tcGxldGVkIHdpdGhpbgovLyBBdXRvUmVmdW5kQmxrcyAoYmxvY2tpbmctd2luZG93IGJsb2NrcyBleGNsdWRlZCkuIEFueW9uZSBtYXkgY2FsbDsgdGhlCi8vIGNsaWVudCByZWNlaXZlcyB0aGUgZnVuZHMuIElmIG5vIG1pbGVzdG9uZSB0aGVuIGhvbGRzIGZ1bmRzIHRoZSBjb250cmFjdCBpcwovLyBjYW5jZWxsZWQsIHBlbmRpbmcgbWlsZXN0b25lcyBpbmNsdWRlZCAodjMgYmVoYXZpb3VyKS4KZnVuYyBDbGFpbVJlZnVuZChjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nLCBtaWxlc3RvbmVJZHggaW50KSB7Cglhc3NlcnRPcGVuKCkKCWMgOj0gZ2V0Q29udHJhY3QoY29udHJhY3RJZCkKCW1zIDo9IG1pbGVzdG9uZUF0KGMsIG1pbGVzdG9uZUlkeCkKCWlmIG1zLlN0YXR1cyAhPSBNc0Z1bmRlZCB7CgkJcGFuaWMoIm1pbGVzdG9uZSBub3QgZnVuZGVkIikKCX0KCWlmIG1zLkZ1bmRlZEF0ID09IDAgewoJCXBhbmljKCJtaWxlc3RvbmUgaGFzIG5vIGZ1bmRpbmcgcmVjb3JkIikKCX0KCWVsYXBzZWQgOj0gZWxhcHNlZE9wZW4obXMuRnVuZGVkQXQsIG1zLmZ1bmRlZFBhdXNlTWFyaykKCWlmIGVsYXBzZWQgPCBBdXRvUmVmdW5kQmxrcyB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0b28gZWFybHk6ICVkIGJsb2NrcyByZW1haW5pbmciLCBBdXRvUmVmdW5kQmxrcy1lbGFwc2VkKSkKCX0KCgltcy5TdGF0dXMgPSBNc1JlZnVuZGVkCglpZiBhbGxNaWxlc3RvbmVzVGVybWluYWwoYykgewoJCXNldHRsZShjLCBTdGF0dXNDYW5jZWxsZWQpCgl9Cgl0b3RhbExpYWJsZSAtPSBtcy5BbW91bnQKCglzZW5kKGN1ciwgYy5DbGllbnQsIG1zLkFtb3VudCkKCgljaGFpbi5FbWl0KCJSZWZ1bmRDbGFpbWVkIiwKCQkiY29udHJhY3RJZCIsIGNvbnRyYWN0SWQsCgkJIm1pbGVzdG9uZSIsIHN0cmNvbnYuSXRvYShtaWxlc3RvbmVJZHgpLAoJCSJyZWNpcGllbnQiLCBjLkNsaWVudC5TdHJpbmcoKSwKCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQobXMuQW1vdW50LCAxMCksCgkJInN0YXR1cyIsIHN0cmluZyhjLlN0YXR1cyksCgkpCn0KCi8vIENsYWltRGlzcHV0ZVRpbWVvdXQgcmVzb2x2ZXMgYSBkaXNwdXRlIHRoZSBhZG1pbiBoYXMgbm90IGFjdGVkIG9uIHdpdGhpbgovLyBBdXRvUmVzb2x2ZUJsa3MgKGJsb2NraW5nLXdpbmRvdyBibG9ja3MgZXhjbHVkZWQpLCBmb2xsb3dpbmcgdGhlIHByZS1kaXNwdXRlCi8vIHN0YXR1czogYSBkZWxpdmVyZWQgbWlsZXN0b25lIChNc0NvbXBsZXRlZCkgcGF5cyB0aGUgZnJlZWxhbmNlciBtaW51cyB0aGUKLy8gZmVlLCBhbiB1bmRlbGl2ZXJlZCBvbmUgKE1zRnVuZGVkKSByZWZ1bmRzIHRoZSBjbGllbnQuIEFueW9uZSBtYXkgY2FsbC4KZnVuYyBDbGFpbURpc3B1dGVUaW1lb3V0KGN1ciByZWFsbSwgY29udHJhY3RJZCBzdHJpbmcsIG1pbGVzdG9uZUlkeCBpbnQpIHsKCWFzc2VydE9wZW4oKQoJYyA6PSBnZXRDb250cmFjdChjb250cmFjdElkKQoJbXMgOj0gbWlsZXN0b25lQXQoYywgbWlsZXN0b25lSWR4KQoJaWYgbXMuU3RhdHVzICE9IE1zRGlzcHV0ZWQgewoJCXBhbmljKCJtaWxlc3RvbmUgbm90IGluIGRpc3B1dGUiKQoJfQoJaWYgbXMuRGlzcHV0ZWRBdCA9PSAwIHsKCQlwYW5pYygibWlsZXN0b25lIGhhcyBubyBkaXNwdXRlIHJlY29yZCIpCgl9CgllbGFwc2VkIDo9IGVsYXBzZWRPcGVuKG1zLkRpc3B1dGVkQXQsIG1zLmRpc3B1dGVkUGF1c2VNYXJrKQoJaWYgZWxhcHNlZCA8IEF1dG9SZXNvbHZlQmxrcyB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0b28gZWFybHk6ICVkIGJsb2NrcyByZW1haW5pbmciLCBBdXRvUmVzb2x2ZUJsa3MtZWxhcHNlZCkpCgl9CgoJcGF5VG9GcmVlbGFuY2VyIDo9IG1zLlByZURpc3B1dGVTdGF0dXMgPT0gTXNDb21wbGV0ZWQKCWlmIHBheVRvRnJlZWxhbmNlciB7CgkJbXMuU3RhdHVzID0gTXNSZWxlYXNlZAoJfSBlbHNlIHsKCQltcy5TdGF0dXMgPSBNc1JlZnVuZGVkCgl9CgljLlN0YXR1cyA9IFN0YXR1c0FjdGl2ZQoJaWYgYW55TWlsZXN0b25lRGlzcHV0ZWQoYykgewoJCWMuU3RhdHVzID0gU3RhdHVzRGlzcHV0ZWQKCX0KCWlmIGFsbE1pbGVzdG9uZXNSZWxlYXNlZChjKSB7CgkJc2V0dGxlKGMsIFN0YXR1c0NvbXBsZXRlZCkKCX0gZWxzZSBpZiBhbGxNaWxlc3RvbmVzVGVybWluYWwoYykgewoJCXNldHRsZShjLCBTdGF0dXNDYW5jZWxsZWQpCgl9Cgl0b3RhbExpYWJsZSAtPSBtcy5BbW91bnQKCgl2YXIgcCBwYXlvdXQKCXJlc29sdXRpb24gOj0gInJlZnVuZGVkLWNsaWVudC1uby1kZWxpdmVyeSIKCWlmIHBheVRvRnJlZWxhbmNlciB7CgkJcmVzb2x1dGlvbiA9ICJwYWlkLWZyZWVsYW5jZXItd29yay1kZWxpdmVyZWQiCgkJcCA9IHBheUZyZWVsYW5jZXIoY3VyLCBjLCBtcy5BbW91bnQpCgl9IGVsc2UgewoJCXNlbmQoY3VyLCBjLkNsaWVudCwgbXMuQW1vdW50KQoJCXAgPSBwYXlvdXR7bmV0OiBtcy5BbW91bnQsIHJlY2lwaWVudDogYy5DbGllbnR9Cgl9CgljaGFpbi5FbWl0KCJEaXNwdXRlVGltZWRPdXQiLAoJCSJjb250cmFjdElkIiwgY29udHJhY3RJZCwKCQkibWlsZXN0b25lIiwgc3RyY29udi5JdG9hKG1pbGVzdG9uZUlkeCksCgkJInJlc29sdXRpb24iLCByZXNvbHV0aW9uLAoJCSJyZWNpcGllbnQiLCBwLnJlY2lwaWVudC5TdHJpbmcoKSwKCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQocC5uZXQsIDEwKSwKCQkiZmVlIiwgc3RyY29udi5Gb3JtYXRJbnQocC5mZWUsIDEwKSwKCQkiYnBzIiwgc3RyY29udi5Gb3JtYXRJbnQocC5icHMsIDEwKSwKCQkidHJlYXN1cnkiLCBwLnRyZWFzdXJ5LlN0cmluZygpLAoJCSJzdGF0dXMiLCBzdHJpbmcoYy5TdGF0dXMpLAoJKQp9CgovLyDilIDilIAgQXJjaGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIEFyY2hpdmVDb250cmFjdCBkZWxldGVzIGEgc2V0dGxlZCBjb250cmFjdCAoY29tcGxldGVkIG9yIGNhbmNlbGxlZCwgd2l0aAovLyBub3RoaW5nIGVzY3Jvd2VkKS4gQ2xpZW50IG9ubHkuIFRoZSBmcmVlZCBieXRlcyBzaHJpbmsgdGhlIHJlYWxtJ3Mgc3RvcmFnZSwKLy8gYW5kIHRoZSBjaGFpbiByZWZ1bmRzIHRoZWlyIHN0b3JhZ2UgZGVwb3NpdCB0byB0aGUgc2lnbmVyIG9mIHRoaXMgbWVzc2FnZQovLyAoc2VlIERFU0lHTi5tZCksIHNvIHRoZSBjbGllbnQsIHdobyBwYWlkIGZvciB0aGUgY29udHJhY3Qgd2hlbiBjcmVhdGluZyBpdCwKLy8gZ2V0cyB0aGF0IGRlcG9zaXQgYmFjay4gVGhlIGlkIGlzIG5ldmVyIHJldXNlZC4gVGhlIENvbnRyYWN0QXJjaGl2ZWQgZXZlbnQKLy8gaXMgdGhlIHBlcm1hbmVudCByZWNvcmQ7IG5vdGhpbmcgb2YgdGhlIGNvbnRyYWN0IHN0YXlzIGluIHJlYWxtIHN0YXRlLgpmdW5jIEFyY2hpdmVDb250cmFjdChjdXIgcmVhbG0sIGNvbnRyYWN0SWQgc3RyaW5nKSB7Cglhc3NlcnRPcGVuKCkKCWNhbGxlciA6PSBjYWxsZXJPZihjdXIpCgljIDo9IGdldENvbnRyYWN0KGNvbnRyYWN0SWQpCglpZiBjLkNsaWVudCAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IGNsaWVudCBjYW4gYXJjaGl2ZSIpCgl9CglpZiBpc09wZW4oYykgewoJCXBhbmljKCJjb250cmFjdCBub3Qgc2V0dGxlZDogc3RhdHVzIGlzICIgKyBzdHJpbmcoYy5TdGF0dXMpKQoJfQoJdmFyIHJlbGVhc2VkLCByZWZ1bmRlZCBpbnQ2NAoJZm9yIF8sIG0gOj0gcmFuZ2UgYy5NaWxlc3RvbmVzIHsKCQlzd2l0Y2ggbS5TdGF0dXMgewoJCWNhc2UgTXNSZWxlYXNlZDoKCQkJcmVsZWFzZWQgKz0gbS5BbW91bnQKCQljYXNlIE1zUmVmdW5kZWQ6CgkJCXJlZnVuZGVkICs9IG0uQW1vdW50CgkJY2FzZSBNc1BlbmRpbmc6CgkJZGVmYXVsdDoKCQkJcGFuaWMoImVzY3Jvd2VkIGZ1bmRzIHJlbWFpbiBpbiBtaWxlc3RvbmUgIiArIHN0cmNvbnYuSXRvYShtLklEKSkKCQl9Cgl9CgloYXNoIDo9IGNvbnRlbnRIYXNoKGMpCgoJY29udHJhY3RzLlJlbW92ZShjb250cmFjdElkKQoJbiwgXyA6PSBzdHJjb252LkF0b2koY29udHJhY3RJZCkKCWNsaWVudFNsb3RzLlJlbW92ZShpbmRleEtleShjLkNsaWVudCwgbikpCglpZiBjbGllbnRBY3RpdmUoYy5DbGllbnQpID09IDAgewoJCWNsaWVudFNsb3RzLlJlbW92ZShjLkNsaWVudC5TdHJpbmcoKSkKCX0KCWFyY2hpdmVkQ291bnQrKwoKCS8vIG1pbGVzdG9uZSpUb3RhbCBhcmUgZXNjcm93IHByaW5jaXBhbCwgZ3Jvc3Mgb2YgZmVlcyBhbmQgb2YgdGhlIGNhbmNlbAoJLy8gY29tcGVuc2F0aW9uLiBUaGUgc3RvcmFnZS1kZXBvc2l0IHJlZnVuZCBpcyBub3QgYW4gZXNjcm93IGFtb3VudDogdGhlCgkvLyBjaGFpbiByZXBvcnRzIGl0IGluIGl0cyBvd24gU3RvcmFnZVVubG9ja0V2ZW50LgoJY2hhaW4uRW1pdCgiQ29udHJhY3RBcmNoaXZlZCIsCgkJImNvbnRyYWN0SWQiLCBjb250cmFjdElkLAoJCSJjbGllbnQiLCBjLkNsaWVudC5TdHJpbmcoKSwKCQkiZnJlZWxhbmNlciIsIGMuRnJlZWxhbmNlci5TdHJpbmcoKSwKCQkic3RhdHVzIiwgc3RyaW5nKGMuU3RhdHVzKSwKCQkibWlsZXN0b25lUmVsZWFzZWRUb3RhbCIsIHN0cmNvbnYuRm9ybWF0SW50KHJlbGVhc2VkLCAxMCksCgkJIm1pbGVzdG9uZVJlZnVuZGVkVG90YWwiLCBzdHJjb252LkZvcm1hdEludChyZWZ1bmRlZCwgMTApLAoJCSJjb250ZW50SGFzaCIsIGhhc2gsCgkpCn0KCi8vIOKUgOKUgCBTbG90cyBhbmQgc2V0dGxlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIGlzT3BlbiByZXBvcnRzIHdoZXRoZXIgYyBzdGlsbCBob2xkcyBhbiBhY3RpdmUgc2xvdC4KZnVuYyBpc09wZW4oYyAqQ29udHJhY3QpIGJvb2wgewoJcmV0dXJuIGMuU3RhdHVzICE9IFN0YXR1c0NvbXBsZXRlZCAmJiBjLlN0YXR1cyAhPSBTdGF0dXNDYW5jZWxsZWQKfQoKZnVuYyBjbGllbnRBY3RpdmUoY2xpZW50IGFkZHJlc3MpIGludCB7Cgl2LCBvayA6PSBjbGllbnRTbG90cy5HZXQoY2xpZW50LlN0cmluZygpKQoJaWYgIW9rIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHYuKGludCkKfQoKZnVuYyB0YWtlU2xvdChjbGllbnQgYWRkcmVzcykgewoJbiA6PSBjbGllbnRBY3RpdmUoY2xpZW50KQoJaWYgbiA+PSBNYXhBY3RpdmVQZXJDbGllbnQgewoJCXBhbmljKHVmbXQuU3ByaW50ZigibGltaXQgb2YgJWQgYWN0aXZlIGNvbnRyYWN0cyBmb3IgdGhpcyBjbGllbnQgcmVhY2hlZCIsIE1heEFjdGl2ZVBlckNsaWVudCkpCgl9CgljbGllbnRTbG90cy5TZXQoY2xpZW50LlN0cmluZygpLCBuKzEpCglhY3RpdmVDb3VudCsrCn0KCi8vIHNldHRsZSBtb3ZlcyBhbiBvcGVuIGNvbnRyYWN0IHRvIGEgdGVybWluYWwgc3RhdHVzIGFuZCByZWxlYXNlcyBpdHMgc2xvdC4KLy8gVGVybWluYWwgc3RhdHVzZXMgYXJlIGFic29yYmluZywgc28gdGhpcyBydW5zIGF0IG1vc3Qgb25jZSBwZXIgY29udHJhY3QuCmZ1bmMgc2V0dGxlKGMgKkNvbnRyYWN0LCBzdGF0dXMgQ29udHJhY3RTdGF0dXMpIHsKCWlmICFpc09wZW4oYykgewoJCXBhbmljKCJjb250cmFjdCBhbHJlYWR5IHNldHRsZWQiKQoJfQoJYy5TdGF0dXMgPSBzdGF0dXMKCW4gOj0gY2xpZW50QWN0aXZlKGMuQ2xpZW50KQoJaWYgbiA8PSAwIHx8IGFjdGl2ZUNvdW50IDw9IDAgewoJCXBhbmljKCJzbG90IGFjY291bnRpbmcgdW5kZXJmbG93IikKCX0KCS8vIEEgemVybyBjb3VudCBpcyBrZXB0IHVudGlsIHRoZSBjbGllbnQgYXJjaGl2ZXM6IHRoZSBjbGllbnQgcGFpZCBmb3IKCS8vIHRoaXMgdHJlZSBub2RlLCBhbmQgcmVtb3ZpbmcgaXQgaGVyZSB3b3VsZCByZWZ1bmQgaXRzIGRlcG9zaXQgdG8KCS8vIHdob2V2ZXIgc2lnbnMgdGhlIHNldHRsaW5nIG1lc3NhZ2UgKGEgcGVybWlzc2lvbmxlc3MgQ2xhaW1SZWZ1bmQKCS8vIGNhbGxlciwgdGhlIGFkbWluLCB0aGUgZnJlZWxhbmNlcikuCgljbGllbnRTbG90cy5TZXQoYy5DbGllbnQuU3RyaW5nKCksIG4tMSkKCWFjdGl2ZUNvdW50LS0KfQoKLy8gc2V0dGxlSWZGaW5pc2hlZCBzZXR0bGVzIGFuIG9wZW4gY29udHJhY3Qgd2hvc2UgbWlsZXN0b25lcyBhcmUgYWxsIHJlbGVhc2VkCi8vIChjb21wbGV0ZWQpIG9yIGFsbCByZWxlYXNlZCBvciByZWZ1bmRlZCAoY2FuY2VsbGVkKS4gQSBwZW5kaW5nLCBmdW5kZWQsCi8vIGNvbXBsZXRlZCBvciBkaXNwdXRlZCBtaWxlc3RvbmUga2VlcHMgaXQgb3Blbi4KZnVuYyBzZXR0bGVJZkZpbmlzaGVkKGMgKkNvbnRyYWN0KSB7CglpZiAhaXNPcGVuKGMpIHsKCQlyZXR1cm4KCX0KCWFsbFJlbGVhc2VkIDo9IHRydWUKCWZvciBfLCBtIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJaWYgbS5TdGF0dXMgIT0gTXNSZWxlYXNlZCAmJiBtLlN0YXR1cyAhPSBNc1JlZnVuZGVkIHsKCQkJcmV0dXJuCgkJfQoJCWlmIG0uU3RhdHVzICE9IE1zUmVsZWFzZWQgewoJCQlhbGxSZWxlYXNlZCA9IGZhbHNlCgkJfQoJfQoJaWYgYWxsUmVsZWFzZWQgewoJCXNldHRsZShjLCBTdGF0dXNDb21wbGV0ZWQpCgl9IGVsc2UgewoJCXNldHRsZShjLCBTdGF0dXNDYW5jZWxsZWQpCgl9Cn0KCi8vIOKUgOKUgCBQYXltZW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCnR5cGUgcGF5b3V0IHN0cnVjdCB7CglyZWNpcGllbnQgYWRkcmVzcwoJbmV0LCBmZWUgIGludDY0CglicHMgICAgICAgaW50NjQKCXRyZWFzdXJ5ICBhZGRyZXNzCn0KCmZ1bmMgc2VuZChjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgewoJaWYgYW1vdW50IDw9IDAgewoJCXJldHVybgoJfQoJYm5rIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikKCWJuay5TZW5kQ29pbnMoY3VyLkFkZHJlc3MoKSwgdG8sIGNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgYW1vdW50KX0pCn0KCi8vIHBheUZyZWVsYW5jZXIgcGF5cyBhbW91bnQgdG8gdGhlIGZyZWVsYW5jZXIgbWludXMgdGhlIHNlcnZpY2UgZmVlIHJlYWQgbGl2ZQovLyBmcm9tIHRoZSBmZWUgc3BpbmUsIHdoaWNoIGdvZXMgdG8gdGhlIHRyZWFzdXJ5LgpmdW5jIHBheUZyZWVsYW5jZXIoY3VyIHJlYWxtLCBjICpDb250cmFjdCwgYW1vdW50IGludDY0KSBwYXlvdXQgewoJYnBzLCB0cmVhc3VyeSA6PSByZXNvbHZlRmVlKCkKCWZlZSA6PSBiYXNpc1BvaW50c0ZlZShhbW91bnQsIGJwcykKCXNlbmQoY3VyLCBjLkZyZWVsYW5jZXIsIGFtb3VudC1mZWUpCglzZW5kKGN1ciwgdHJlYXN1cnksIGZlZSkKCXJldHVybiBwYXlvdXR7cmVjaXBpZW50OiBjLkZyZWVsYW5jZXIsIG5ldDogYW1vdW50IC0gZmVlLCBmZWU6IGZlZSwgYnBzOiBicHMsIHRyZWFzdXJ5OiB0cmVhc3VyeX0KfQoKLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jIGdldENvbnRyYWN0KGlkIHN0cmluZykgKkNvbnRyYWN0IHsKCXZhbCwgZXhpc3RzIDo9IGNvbnRyYWN0cy5HZXQoaWQpCglpZiAhZXhpc3RzIHsKCQlwYW5pYygiY29udHJhY3Qgbm90IGZvdW5kOiAiICsgaWQpCgl9CglyZXR1cm4gdmFsLigqQ29udHJhY3QpCn0KCmZ1bmMgbWlsZXN0b25lQXQoYyAqQ29udHJhY3QsIGlkeCBpbnQpICpNaWxlc3RvbmUgewoJaWYgaWR4IDwgMCB8fCBpZHggPj0gbGVuKGMuTWlsZXN0b25lcykgewoJCXBhbmljKCJpbnZhbGlkIG1pbGVzdG9uZSBpbmRleCIpCgl9CglyZXR1cm4gJmMuTWlsZXN0b25lc1tpZHhdCn0KCmZ1bmMgYWxsTWlsZXN0b25lc1JlbGVhc2VkKGMgKkNvbnRyYWN0KSBib29sIHsKCWZvciBfLCBtIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJaWYgbS5TdGF0dXMgIT0gTXNSZWxlYXNlZCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgYW55TWlsZXN0b25lRGlzcHV0ZWQoYyAqQ29udHJhY3QpIGJvb2wgewoJZm9yIF8sIG0gOj0gcmFuZ2UgYy5NaWxlc3RvbmVzIHsKCQlpZiBtLlN0YXR1cyA9PSBNc0Rpc3B1dGVkIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gYWxsTWlsZXN0b25lc1Rlcm1pbmFsIHJlcG9ydHMgd2hldGhlciBubyBtaWxlc3RvbmUgaG9sZHMgZnVuZHMgKHBlbmRpbmcgd2l0aAovLyBubyBmdW5kcyBjb3VudHMgYXMgdGVybWluYWwpLgpmdW5jIGFsbE1pbGVzdG9uZXNUZXJtaW5hbChjICpDb250cmFjdCkgYm9vbCB7Cglmb3IgXywgbSA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCWlmIG0uU3RhdHVzID09IE1zRnVuZGVkIHx8IG0uU3RhdHVzID09IE1zQ29tcGxldGVkIHx8IG0uU3RhdHVzID09IE1zRGlzcHV0ZWQgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgovLyBwYXJzZU1pbGVzdG9uZXMgcGFyc2VzICJ0aXRsZTE6YW1vdW50MSx0aXRsZTI6YW1vdW50MiIuIEJsYW5rIGVudHJpZXMgYXJlCi8vIHNraXBwZWQ7IGFueSBvdGhlciBtYWxmb3JtZWQgZW50cnkgcGFuaWNzLgpmdW5jIHBhcnNlTWlsZXN0b25lcyhpbnB1dCBzdHJpbmcpIFtdTWlsZXN0b25lIHsKCWlmIGxlbihpbnB1dCkgPiBtYXhNaWxlc3RvbmVzQXJnTGVuIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoIm1pbGVzdG9uZXMgYXJndW1lbnQgdG9vIGxvbmc6ICVkLyVkIGJ5dGVzIiwgbGVuKGlucHV0KSwgbWF4TWlsZXN0b25lc0FyZ0xlbikpCgl9Cgl2YXIgcmVzdWx0IFtdTWlsZXN0b25lCgl0b3RhbCA6PSBpbnQ2NCgwKQoJZm9yIGksIHAgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChpbnB1dCwgIiwiKSB7CgkJcCA9IHN0cmluZ3MuVHJpbVNwYWNlKHApCgkJaWYgbGVuKHApID09IDAgewoJCQljb250aW51ZQoJCX0KCQlrdiA6PSBzdHJpbmdzLlNwbGl0TihwLCAiOiIsIDIpCgkJaWYgbGVuKGt2KSAhPSAyIHsKCQkJcGFuaWModWZtdC5TcHJpbnRmKCJpbnZhbGlkIG1pbGVzdG9uZSBmb3JtYXQgYXQgcG9zaXRpb24gJWQ6IGV4cGVjdGVkICd0aXRsZTphbW91bnQnIiwgaSkpCgkJfQoJCXRpdGxlIDo9IHN0cmluZ3MuVHJpbVNwYWNlKGt2WzBdKQoJCWlmIGxlbih0aXRsZSkgPT0gMCB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigiZW1wdHkgbWlsZXN0b25lIHRpdGxlIGF0IHBvc2l0aW9uICVkIiwgaSkpCgkJfQoJCXRpdGxlID0gY2xlYW5UZXh0KHRpdGxlLCB1Zm10LlNwcmludGYoIm1pbGVzdG9uZSB0aXRsZSBhdCBwb3NpdGlvbiAlZCIsIGkpLCBNYXhUaXRsZUxlbikKCQlpZiBzdHJpbmdzLlRyaW1TcGFjZSh0aXRsZSkgPT0gIiIgewoJCQlwYW5pYyh1Zm10LlNwcmludGYoIm1pbGVzdG9uZSB0aXRsZSBhdCBwb3NpdGlvbiAlZCBoYXMgbm8gdmlzaWJsZSBjaGFyYWN0ZXJzIiwgaSkpCgkJfQoJCWFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoc3RyaW5ncy5UcmltU3BhY2Uoa3ZbMV0pLCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB8fCBhbW91bnQgPD0gMCB7CgkJCXBhbmljKHVmbXQuU3ByaW50ZigiaW52YWxpZCBtaWxlc3RvbmUgYW1vdW50IGF0IHBvc2l0aW9uICVkOiBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIiLCBpKSkKCQl9CgkJaWYgYW1vdW50IDwgTWluTWlsZXN0b25lQW1vdW50IHsKCQkJcGFuaWModWZtdC5TcHJpbnRmKCJtaWxlc3RvbmUgYW1vdW50IHRvbyBzbWFsbCBhdCBwb3NpdGlvbiAlZDogbWluaW11bSAlZCB1Z25vdCIsIGksIE1pbk1pbGVzdG9uZUFtb3VudCkpCgkJfQoJCWlmIGFtb3VudCA+IDkyMjMzNzIwMzY4NTQ3NzU4MDctdG90YWwgewoJCQlwYW5pYygiY29udHJhY3QgdG90YWwgb3ZlcmZsb3dzIGludDY0IikKCQl9CgkJdG90YWwgKz0gYW1vdW50CgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgTWlsZXN0b25lewoJCQlJRDogICAgIGxlbihyZXN1bHQpLAoJCQlUaXRsZTogIHRpdGxlLAoJCQlBbW91bnQ6IGFtb3VudCwKCQkJU3RhdHVzOiBNc1BlbmRpbmcsCgkJfSkKCX0KCXJldHVybiByZXN1bHQKfQoKLy8gVGltZS1ib3hlZCBlbWVyZ2VuY3kgcGF1c2UuCi8vCi8vIFBhdXNlIChhZG1pbikgaGFzIHR3byBlZmZlY3RzOgovLyAgIC0gTmV3IG1vbmV5IHN0b3BzOiBDcmVhdGVDb250cmFjdCBhbmQgRnVuZE1pbGVzdG9uZSBhYm9ydCB1bnRpbCBVbnBhdXNlLgovLyAgIC0gRXZlcnkgb3RoZXIgc3RhdGUtY2hhbmdpbmcgZW50cnlwb2ludCAoc2V0dGxlbWVudCwgZGlzcHV0ZXMsIHRpbWVvdXRzLAovLyAgICAgY2FuY2VsbGF0aW9uLCBleHBpcnksIGFyY2hpdmUpIGFib3J0cyBvbmx5IGR1cmluZyB0aGUgQkxPQ0tJTkcgV0lORE9XLAovLyAgICAgdGhlIGZpcnN0IE1heFBhdXNlQmxrcyBibG9ja3Mgb2YgdGhlIHBhdXNlLiBBZnRlciB0aGF0IGl0IHJlb3BlbnMgZXZlbiBpZgovLyAgICAgbm9ib2R5IHVucGF1c2VzLgovLwovLyBUaGUgdGltZW91dCBjbG9ja3MgKEF1dG9SZWZ1bmRCbGtzLCBBdXRvUmVzb2x2ZUJsa3MsIFVuZnVuZGVkRXhwaXJ5QmxrcykgZG8KLy8gbm90IHJ1biBpbnNpZGUgYSBibG9ja2luZyB3aW5kb3c6IGVhY2ggZGVhZGxpbmUgbW92ZXMgYnkgdGhlIHBhdXNlZCBibG9ja3MKLy8gdGhhdCBmZWxsIGluc2lkZSBpdC4gQWZ0ZXIgVW5wYXVzZSwgYSBuZXcgUGF1c2UgaXMgcmVmdXNlZCBmb3IKLy8gUGF1c2VDb29sZG93bkJsa3MsIHNvIHBhdXNlLCB1bnBhdXNlLCBwYXVzZSBjYW5ub3Qga2VlcCBleGl0cyBzaHV0LgovLwovLyBXaXRob3V0IHRoZSB0aW1lIGJveCBvbmUgYWRtaW4ga2V5IChhZnRlciB0aGUgREFPIGhhbmRvZmYsIGFueSBzaW5nbGUgbWVtYmVyCi8vIGFsbG93ZWQgdG8gY2FsbCB0aGUgZW1lcmdlbmN5IHBhdXNlKSBjb3VsZCBmcmVlemUgZXZlcnkgZXhpdCBmb3JldmVyLCBhbmQKLy8gbG9zaW5nIHRoZSBhZG1pbiBrZXkgZHVyaW5nIGEgcGF1c2Ugd291bGQgZG8gdGhlIHNhbWU6IGFkbWluIHJvdGF0aW9uIG5lZWRzCi8vIHRoZSBhZG1pbiBrZXkuCi8vCi8vIEFkbWluIGNvbnRyb2xzIChQYXVzZSwgVW5wYXVzZSwgYWRtaW4gYW5kIGZlZS1yZWNpcGllbnQgcm90YXRpb24pIGFyZSBuZXZlcgovLyBwYXVzZWQuCgpjb25zdCAoCgkvLyBNYXhQYXVzZUJsa3MgaXMgdGhlIGJsb2NraW5nIHdpbmRvdzogYWJvdXQgNyBkYXlzIGF0IGdub2xhbmQtMSdzCgkvLyBvYnNlcnZlZCBhdmVyYWdlIG9mIGFib3V0IDMuMyBzIHBlciBibG9jayAoNyoyNCozNjAwLzMuMyA9IDE4MywyNzMpLgoJTWF4UGF1c2VCbGtzID0gaW50NjQoMTgzMjczKQoJLy8gUGF1c2VDb29sZG93bkJsa3MgaXMgdGhlIG1pbmltdW0gZ2FwIGJldHdlZW4gYW4gVW5wYXVzZSBhbmQgdGhlIG5leHQKCS8vIFBhdXNlLCBzbyBhIHBhdXNlIGNhbiBob2xkIGV4aXRzIHNodXQgYXQgbW9zdCBoYWxmIG9mIHRoZSB0aW1lLgoJUGF1c2VDb29sZG93bkJsa3MgPSBNYXhQYXVzZUJsa3MKKQoKdmFyICgKCXBhdXNlZCAgICAgICAgICAgICBib29sCglwYXVzZWRBdCAgICAgICAgICAgaW50NjQgLy8gaGVpZ2h0IG9mIHRoZSBjdXJyZW50IHBhdXNlOyAwIHdoZW4gbm90IHBhdXNlZAoJcGF1c2VDb29sZG93blVudGlsIGludDY0IC8vIGZpcnN0IGhlaWdodCBhdCB3aGljaCBQYXVzZSBpcyBhY2NlcHRlZCBhZ2FpbgoJcGF1c2VkQmxvY2tzRG9uZSAgIGludDY0IC8vIGJsb2NraW5nLXdpbmRvdyBibG9ja3Mgb2YgZmluaXNoZWQgcGF1c2VzCikKCi8vIFBhdXNlSW5mbyBpcyB0aGUgcmVhZC1iYWNrIG9mIHRoZSBwYXVzZSBzdGF0ZS4KdHlwZSBQYXVzZUluZm8gc3RydWN0IHsKCVBhdXNlZCAgICAgICAgYm9vbCAgLy8gc2V0IGJ5IFBhdXNlLCBjbGVhcmVkIG9ubHkgYnkgVW5wYXVzZQoJUGF1c2VkQXQgICAgICBpbnQ2NCAvLyBoZWlnaHQgb2YgdGhlIGN1cnJlbnQgcGF1c2UgKDAgd2hlbiBub3QgcGF1c2VkKQoJRXhpdHNSZW9wZW5BdCBpbnQ2NCAvLyBQYXVzZWRBdCArIE1heFBhdXNlQmxrcyAoMCB3aGVuIG5vdCBwYXVzZWQpCglFeGl0c09wZW4gICAgIGJvb2wgIC8vIGZhbHNlIG9ubHkgaW5zaWRlIGEgYmxvY2tpbmcgd2luZG93CglDb29sZG93blVudGlsIGludDY0IC8vIGZpcnN0IGhlaWdodCBhdCB3aGljaCBQYXVzZSBpcyBhY2NlcHRlZAoJUGF1c2VkQmxvY2tzICBpbnQ2NCAvLyB0b3RhbCBibG9ja2luZy13aW5kb3cgYmxvY2tzIHNvIGZhciAoY2xvY2tzIHNraXAgdGhlbSkKfQoKLy8gUGF1c2VTdGF0ZSByZXR1cm5zIHRoZSBwYXVzZSBzdGF0ZSBhdCB0aGUgY3VycmVudCBoZWlnaHQuCmZ1bmMgUGF1c2VTdGF0ZSgpIFBhdXNlSW5mbyB7Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglzIDo9IFBhdXNlSW5mb3sKCQlQYXVzZWQ6ICAgICAgICBwYXVzZWQsCgkJRXhpdHNPcGVuOiAgICAgIWluQmxvY2tpbmdXaW5kb3cobm93KSwKCQlDb29sZG93blVudGlsOiBwYXVzZUNvb2xkb3duVW50aWwsCgkJUGF1c2VkQmxvY2tzOiAgcGF1c2VkQmxvY2tzQXQobm93KSwKCX0KCWlmIHBhdXNlZCB7CgkJcy5QYXVzZWRBdCA9IHBhdXNlZEF0CgkJcy5FeGl0c1Jlb3BlbkF0ID0gcGF1c2VkQXQgKyBNYXhQYXVzZUJsa3MKCX0KCXJldHVybiBzCn0KCi8vIElzUGF1c2VkIHJlcG9ydHMgd2hldGhlciB0aGUgcGF1c2UgZmxhZyBpcyBzZXQuIEV4aXRzIG1heSBhbHJlYWR5IGhhdmUKLy8gcmVvcGVuZWQ6IHNlZSBQYXVzZVN0YXRlKCkuRXhpdHNPcGVuLgpmdW5jIElzUGF1c2VkKCkgYm9vbCB7IHJldHVybiBwYXVzZWQgfQoKLy8gUGF1c2Ugc3RvcHMgbmV3IG1vbmV5IGFuZCwgZm9yIE1heFBhdXNlQmxrcywgZXZlcnkgb3RoZXIgc3RhdGUgY2hhbmdlLgovLyBBZG1pbiBvbmx5LiBSZWZ1c2VkIHdoaWxlIHBhdXNlZCBhbmQgZHVyaW5nIHRoZSBjb29sZG93biBhZnRlciBhbiBVbnBhdXNlLgpmdW5jIFBhdXNlKGN1ciByZWFsbSkgewoJYXNzZXJ0QWRtaW4oY3VyKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgcGF1c2VkIHsKCQlwYW5pYygiYWxyZWFkeSBwYXVzZWQiKQoJfQoJaWYgbm93IDwgcGF1c2VDb29sZG93blVudGlsIHsKCQlwYW5pYygicGF1c2UgY29vbGRvd246IG5leHQgcGF1c2UgYWxsb3dlZCBhdCBibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQocGF1c2VDb29sZG93blVudGlsLCAxMCkpCgl9CglwYXVzZWQgPSB0cnVlCglwYXVzZWRBdCA9IG5vdwoJY2hhaW4uRW1pdCgiUGF1c2VkIiwKCQkiYXQiLCBzdHJjb252LkZvcm1hdEludChub3csIDEwKSwKCQkiZXhpdHNSZW9wZW5BdCIsIHN0cmNvbnYuRm9ybWF0SW50KG5vdytNYXhQYXVzZUJsa3MsIDEwKSwKCSkKfQoKLy8gVW5wYXVzZSByZXN1bWVzIG5vcm1hbCBvcGVyYXRpb24gYW5kIHN0YXJ0cyB0aGUgY29vbGRvd24uIEFkbWluIG9ubHkuCmZ1bmMgVW5wYXVzZShjdXIgcmVhbG0pIHsKCWFzc2VydEFkbWluKGN1cikKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmICFwYXVzZWQgewoJCXBhbmljKCJub3QgcGF1c2VkIikKCX0KCXBhdXNlZEJsb2Nrc0RvbmUgPSBwYXVzZWRCbG9ja3NBdChub3cpCglwYXVzZWQgPSBmYWxzZQoJcGF1c2VkQXQgPSAwCglwYXVzZUNvb2xkb3duVW50aWwgPSBub3cgKyBQYXVzZUNvb2xkb3duQmxrcwoJY2hhaW4uRW1pdCgiVW5wYXVzZWQiLAoJCSJhdCIsIHN0cmNvbnYuRm9ybWF0SW50KG5vdywgMTApLAoJCSJjb29sZG93blVudGlsIiwgc3RyY29udi5Gb3JtYXRJbnQocGF1c2VDb29sZG93blVudGlsLCAxMCksCgkpCn0KCi8vIGluQmxvY2tpbmdXaW5kb3cgcmVwb3J0cyB3aGV0aGVyIG5vdyBmYWxscyBpbiB0aGUgZmlyc3QgTWF4UGF1c2VCbGtzIGJsb2NrcwovLyBvZiB0aGUgY3VycmVudCBwYXVzZS4KZnVuYyBpbkJsb2NraW5nV2luZG93KG5vdyBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gcGF1c2VkICYmIG5vdyA8IHBhdXNlZEF0K01heFBhdXNlQmxrcwp9CgovLyBwYXVzZWRCbG9ja3NBdCByZXR1cm5zIHRoZSBibG9ja2luZy13aW5kb3cgYmxvY2tzIHVwIHRvIG5vdywgZmluaXNoZWQgcGF1c2VzCi8vIGluY2x1ZGVkLiBUaW1lb3V0IGNsb2NrcyBzdWJ0cmFjdCB0aGUgZ3Jvd3RoIG9mIHRoaXMgdmFsdWUuCmZ1bmMgcGF1c2VkQmxvY2tzQXQobm93IGludDY0KSBpbnQ2NCB7Cgl0b3RhbCA6PSBwYXVzZWRCbG9ja3NEb25lCglpZiBwYXVzZWQgewoJCWVuZCA6PSBub3cKCQlpZiBlbmQgPiBwYXVzZWRBdCtNYXhQYXVzZUJsa3MgewoJCQllbmQgPSBwYXVzZWRBdCArIE1heFBhdXNlQmxrcwoJCX0KCQl0b3RhbCArPSBlbmQgLSBwYXVzZWRBdAoJfQoJcmV0dXJuIHRvdGFsCn0KCi8vIGFzc2VydEFjY2VwdHNOZXdNb25leSBndWFyZHMgQ3JlYXRlQ29udHJhY3QgYW5kIEZ1bmRNaWxlc3RvbmUuCmZ1bmMgYXNzZXJ0QWNjZXB0c05ld01vbmV5KCkgewoJaWYgcGF1c2VkIHsKCQlwYW5pYygicmVhbG0gaXMgcGF1c2VkIOKAlCBubyBuZXcgY29udHJhY3RzIG9yIGZ1bmRpbmcgdW50aWwgdW5wYXVzZWQiKQoJfQp9CgovLyBhc3NlcnRPcGVuIGd1YXJkcyBldmVyeSBvdGhlciBzdGF0ZS1jaGFuZ2luZyB1c2VyIGFuZCBhZG1pbiBlbnRyeXBvaW50LgpmdW5jIGFzc2VydE9wZW4oKSB7CglpZiBpbkJsb2NraW5nV2luZG93KHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgewoJCXBhbmljKCJyZWFsbSBpcyBwYXVzZWQg4oCUIGV4aXRzIHJlb3BlbiBhdCBibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQocGF1c2VkQXQrTWF4UGF1c2VCbGtzLCAxMCkpCgl9Cn0KCi8vIGVsYXBzZWRPcGVuIHJldHVybnMgdGhlIGJsb2NrcyBzaW5jZSBgc2luY2VgIHRoYXQgZmVsbCBvdXRzaWRlIGFueSBibG9ja2luZwovLyB3aW5kb3csIGdpdmVuIHBhdXNlZEJsb2Nrc0F0KHNpbmNlKSByZWNvcmRlZCBhcyBtYXJrLgpmdW5jIGVsYXBzZWRPcGVuKHNpbmNlLCBtYXJrIGludDY0KSBpbnQ2NCB7Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglyZXR1cm4gbm93IC0gc2luY2UgLSAocGF1c2VkQmxvY2tzQXQobm93KSAtIG1hcmspCn0KCi8vIOKUgOKUgCBBZG1pbiBhdXRob3JpdHkgYW5kIHRoZSBmYWxsYmFjayBmZWUgcmVjaXBpZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLwovLyBObyBhdXRob3JpdHkgaXMgY29tcGlsZWQgaW4uIGBhZG1pbmAgYW5kIGBmZWVSZWNpcGllbnRgIGFyZSBzZWVkZWQgYXQKLy8gcGFja2FnZSBsb2FkIGZyb20gdGhlIHB1Ymxpc2hpbmcgdHJhbnNhY3Rpb24ncyBzaWduZXIgKG9uIGdub2xhbmQtMSB0aGUKLy8gc2FtY3JldyBuYW1lc3BhY2UgbXVsdGlzaWcpLCBhbmQgZXZlcnkgZ2F0ZSByZWFkcyB0aGUgbXV0YWJsZSB2YXJpYWJsZXMuCi8vIFJlYWxtcyBhcmUgaW1tdXRhYmxlIGFuZCBtYWlubmV0IGhhcyBubyBmYXVjZXQsIHNvIGEgY29tcGlsZS10aW1lIGF1dGhvcml0eQovLyBjb3VsZCBuZXZlciBiZSBjb3JyZWN0ZWQ7IGxvc2luZyBpdCB3b3VsZCBkaXNhYmxlIFBhdXNlL1VucGF1c2UgYW5kCi8vIFJlc29sdmVEaXNwdXRlLCB0aGUgb25seSBwYXRoIHRoYXQgc2V0dGxlcyBhIGRpc3B1dGUgYmVmb3JlIGl0cyB0aW1lb3V0LgovLwovLyBCb3RoIHJvdGF0aW9ucyBhcmUgVFdPLVNURVA6IHRoZSBjdXJyZW50IGFkbWluIHN0YWdlcyBhbiBhZGRyZXNzLCBhbmQgdGhhdAovLyBhZGRyZXNzIG11c3QgYWNjZXB0IHdpdGggaXRzIG93biB0cmFuc2FjdGlvbi4gQSBvbmUtc3RlcCBzZXR0ZXIgY291bGQgaGFuZAovLyB0aGUgcm9sZSB0byBhbiBhZGRyZXNzIHRoYXQgY2Fubm90IGFjdCAoYSB0eXBvLCBhbiB1bmZ1bmRlZCBrZXkpLCB3aXRoIG5vCi8vIHdheSBiYWNrLiBUaGUgYWRtaW4gY2FuIGFib3J0IGEgc3RhZ2VkIHByb3Bvc2FsIHdpdGhvdXQgdGhlIHRhcmdldC4KLy8KLy8gUm90YXRpb24gc3RheXMgYXZhaWxhYmxlIHdoaWxlIHBhdXNlZC4gSXQgbmVlZHMgdGhlIGN1cnJlbnQgYWRtaW4ga2V5LCBzbwovLyBpdCBjYW5ub3QgcmVzY3VlIGEgcGF1c2UgYWZ0ZXIgdGhhdCBrZXkgaXMgbG9zdDsgdGhlIHBhdXNlJ3MgdGltZSBib3gKLy8gKHBhdXNlIHNlY3Rpb24gYWJvdmUpIGlzIHdoYXQga2VlcHMgZXhpdHMgZnJvbSBmcmVlemluZy4KCnZhciAoCgkvLyBhZG1pbiBpcyB0aGUgbGl2ZSBhdXRob3JpdHksIHNlZWRlZCB3aXRoIHRoZSBwdWJsaXNoZXIgYXQgbG9hZC4KCWFkbWluIGFkZHJlc3MgPSBwdWJsaXNoZXJBdExvYWQoKQoJLy8gcGVuZGluZ0FkbWluIGlzIHRoZSBzdGFnZWQgc3VjY2Vzc29yOyAiIiB3aGVuIG5vbmUuCglwZW5kaW5nQWRtaW4gYWRkcmVzcwoKCS8vIGZlZVJlY2lwaWVudCByZWNlaXZlcyB0aGUgcHJvdG9jb2wgZmVlIG9ubHkgd2hlbiBtZW1iYV9tYXJrZXRfY29uZmlnCgkvLyByZXBvcnRzIG5vIHRyZWFzdXJ5IChzZWUgcmVzb2x2ZUZlZSkuIFNlZWRlZCB3aXRoIHRoZSBwdWJsaXNoZXIuCglmZWVSZWNpcGllbnQgYWRkcmVzcyA9IHB1Ymxpc2hlckF0TG9hZCgpCgkvLyBwZW5kaW5nRmVlUmVjaXBpZW50IGlzIHRoZSBzdGFnZWQgc3VjY2Vzc29yOyAiIiB3aGVuIG5vbmUuCglwZW5kaW5nRmVlUmVjaXBpZW50IGFkZHJlc3MKKQoKLy8gYXNzZXJ0QWRtaW4gcmVqZWN0cyBhIHN0YWxlIG9yIHNpYmxpbmcgYGN1cmAsIHRoZW4gY2hlY2tzIHRoZSBjYWxsZXIuCmZ1bmMgYXNzZXJ0QWRtaW4oY3VyIHJlYWxtKSB7CglpZiBjYWxsZXJPZihjdXIpICE9IGFkbWluIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBvbmx5IGFkbWluIG1heSBwZXJmb3JtIHRoaXMgYWN0aW9uIikKCX0KfQoKLy8g4pSA4pSAIEFkbWluIHJvdGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gVHJhbnNmZXJPd25lcnNoaXAgc3RhZ2VzIGEgaGFuZG9mZiB0byBuZXdBZG1pbi4gQWRtaW4gb25seS4gQ2FsbGluZyBpdCBhZ2FpbgovLyByZXBsYWNlcyB0aGUgc3RhZ2VkIGFkZHJlc3MuCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBuZXdBZG1pbiBhZGRyZXNzKSB7Cglhc3NlcnRBZG1pbihjdXIpCglpZiAhbmV3QWRtaW4uSXNWYWxpZCgpIHsKCQlwYW5pYygibmV3QWRtaW4gbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MiKQoJfQoJcGVuZGluZ0FkbWluID0gbmV3QWRtaW4KCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVyU3RhcnRlZCIsICJwZW5kaW5nIiwgbmV3QWRtaW4uU3RyaW5nKCkpCn0KCi8vIEFjY2VwdE93bmVyc2hpcCBjb21wbGV0ZXMgdGhlIGhhbmRvZmYuIE9ubHkgdGhlIHN0YWdlZCBhZGRyZXNzIG1heSBjYWxsIGl0LAovLyBzbyB0aGUgb3V0Z29pbmcgYWRtaW4gY2Fubm90IGNvbGxhcHNlIHRoZSB0d28gc3RlcHMgaW50byBvbmUuCmZ1bmMgQWNjZXB0T3duZXJzaGlwKGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IGNhbGxlck9mKGN1cikKCWlmIHBlbmRpbmdBZG1pbiA9PSAiIiB7CgkJcGFuaWMoIm5vIHBlbmRpbmcgb3duZXJzaGlwIHRyYW5zZmVyIikKCX0KCWlmIGNhbGxlciAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IG9ubHkgdGhlIHBlbmRpbmcgYWRtaW4gbWF5IGFjY2VwdCIpCgl9CglhZG1pbiA9IHBlbmRpbmdBZG1pbgoJcGVuZGluZ0FkbWluID0gIiIKCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVyQWNjZXB0ZWQiLCAiYWRtaW4iLCBhZG1pbi5TdHJpbmcoKSkKfQoKLy8gQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIgY2xlYXJzIGEgc3RhZ2VkIGhhbmRvZmYuIEFkbWluIG9ubHkuCmZ1bmMgQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3VyIHJlYWxtKSB7Cglhc3NlcnRBZG1pbihjdXIpCglpZiBwZW5kaW5nQWRtaW4gPT0gIiIgewoJCXBhbmljKCJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciIpCgl9CgljYW5jZWxsZWQgOj0gcGVuZGluZ0FkbWluCglwZW5kaW5nQWRtaW4gPSAiIgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJDYW5jZWxsZWQiLCAiY2FuY2VsbGVkIiwgY2FuY2VsbGVkLlN0cmluZygpKQp9CgovLyBHZXRBZG1pbiByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgaG9sZHMgYWRtaW4uCmZ1bmMgR2V0QWRtaW4oKSBzdHJpbmcgeyByZXR1cm4gYWRtaW4uU3RyaW5nKCkgfQoKLy8gR2V0UGVuZGluZ0FkbWluIHJldHVybnMgdGhlIHN0YWdlZCBzdWNjZXNzb3IgKCIiIHdoZW4gbm9uZSkuCmZ1bmMgR2V0UGVuZGluZ0FkbWluKCkgc3RyaW5nIHsgcmV0dXJuIHBlbmRpbmdBZG1pbi5TdHJpbmcoKSB9CgovLyDilIDilIAgRmVlIHJlY2lwaWVudCByb3RhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIFByb3Bvc2VGZWVSZWNpcGllbnQgc3RhZ2VzIGEgbmV3IGZhbGxiYWNrIGZlZSByZWNpcGllbnQuIEFkbWluIG9ubHkuCmZ1bmMgUHJvcG9zZUZlZVJlY2lwaWVudChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzKSB7Cglhc3NlcnRBZG1pbihjdXIpCglpZiAhcmVjaXBpZW50LklzVmFsaWQoKSB7CgkJcGFuaWMoImZlZSByZWNpcGllbnQgbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MiKQoJfQoJcGVuZGluZ0ZlZVJlY2lwaWVudCA9IHJlY2lwaWVudAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50UHJvcG9zZWQiLCAicGVuZGluZyIsIHJlY2lwaWVudC5TdHJpbmcoKSkKfQoKLy8gQWNjZXB0RmVlUmVjaXBpZW50IGNvbXBsZXRlcyB0aGUgcm90YXRpb24uIE9ubHkgdGhlIHN0YWdlZCBhZGRyZXNzIG1heSBjYWxsCi8vIGl0LCB3aGljaCBwcm92ZXMgaXQgY2FuIHRyYW5zYWN0LgpmdW5jIEFjY2VwdEZlZVJlY2lwaWVudChjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSBjYWxsZXJPZihjdXIpCglpZiBwZW5kaW5nRmVlUmVjaXBpZW50ID09ICIiIHsKCQlwYW5pYygibm8gcGVuZGluZyBmZWUgcmVjaXBpZW50IikKCX0KCWlmIGNhbGxlciAhPSBwZW5kaW5nRmVlUmVjaXBpZW50IHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBvbmx5IHRoZSBwZW5kaW5nIGZlZSByZWNpcGllbnQgbWF5IGFjY2VwdCIpCgl9CglmZWVSZWNpcGllbnQgPSBwZW5kaW5nRmVlUmVjaXBpZW50CglwZW5kaW5nRmVlUmVjaXBpZW50ID0gIiIKCWNoYWluLkVtaXQoIkZlZVJlY2lwaWVudEFjY2VwdGVkIiwgInJlY2lwaWVudCIsIGZlZVJlY2lwaWVudC5TdHJpbmcoKSkKfQoKLy8gQ2FuY2VsRmVlUmVjaXBpZW50UHJvcG9zYWwgY2xlYXJzIGEgc3RhZ2VkIGZlZSByZWNpcGllbnQuIEFkbWluIG9ubHkuCmZ1bmMgQ2FuY2VsRmVlUmVjaXBpZW50UHJvcG9zYWwoY3VyIHJlYWxtKSB7Cglhc3NlcnRBZG1pbihjdXIpCglpZiBwZW5kaW5nRmVlUmVjaXBpZW50ID09ICIiIHsKCQlwYW5pYygibm8gcGVuZGluZyBmZWUgcmVjaXBpZW50IikKCX0KCWNhbmNlbGxlZCA6PSBwZW5kaW5nRmVlUmVjaXBpZW50CglwZW5kaW5nRmVlUmVjaXBpZW50ID0gIiIKCWNoYWluLkVtaXQoIkZlZVJlY2lwaWVudFByb3Bvc2FsQ2FuY2VsbGVkIiwgImNhbmNlbGxlZCIsIGNhbmNlbGxlZC5TdHJpbmcoKSkKfQoKLy8gR2V0RmVlUmVjaXBpZW50IHJldHVybnMgdGhlIGZhbGxiYWNrIGZlZSByZWNpcGllbnQuCmZ1bmMgR2V0RmVlUmVjaXBpZW50KCkgc3RyaW5nIHsgcmV0dXJuIGZlZVJlY2lwaWVudC5TdHJpbmcoKSB9CgovLyBHZXRQZW5kaW5nRmVlUmVjaXBpZW50IHJldHVybnMgdGhlIHN0YWdlZCBmZWUgcmVjaXBpZW50ICgiIiB3aGVuIG5vbmUpLgpmdW5jIEdldFBlbmRpbmdGZWVSZWNpcGllbnQoKSBzdHJpbmcgeyByZXR1cm4gcGVuZGluZ0ZlZVJlY2lwaWVudC5TdHJpbmcoKSB9CgovLyBiYXNpc1BvaW50c0ZlZSBjb21wdXRlcyBmbG9vcihhbW91bnQqYnBzLzEwMDAwKSB3aXRob3V0IG92ZXJmbG93aW5nIHRoZQovLyBpbnRlcm1lZGlhdGUgcHJvZHVjdC4gRm9yIG5vbm5lZ2F0aXZlIGFtb3VudCBhbmQgYnBzIDw9IDEwMDAwLCB0aGUgcXVvdGllbnQKLy8gcHJvZHVjdCBhbmQgZmluYWwgc3VtIGFyZSA8PSBhbW91bnQ7IHRoZSByZW1haW5kZXIgcHJvZHVjdCBpcyA8IDEwMDAwMDAwMC4KLy8gQ2FsbGVycyByZXRhaW4gdGhlaXIgZXhpc3RpbmcgY29uZmlndXJlZCByYXRlcywgcmVjaXBpZW50cyBhbmQgcm91bmRpbmcuCmZ1bmMgYmFzaXNQb2ludHNGZWUoYW1vdW50LCBicHMgaW50NjQpIGludDY0IHsKCWlmIGFtb3VudCA8IDAgfHwgYnBzIDwgMCB8fCBicHMgPiAxMDAwMCB7CgkJcGFuaWMoImludmFsaWQgZmVlIGlucHV0cyIpCgl9CglyZXR1cm4gKGFtb3VudC8xMDAwMCkqYnBzICsgKChhbW91bnQlMTAwMDApKmJwcykvMTAwMDAKfQoKLy8gY2xlYW5UZXh0IHZhbGlkYXRlcyBhbmQgc2FuaXRpc2VzIHVzZXIgdGV4dCBiZWZvcmUgaXQgaXMgc3RvcmVkIGFuZAovLyByZW5kZXJlZC4gSXQgcmVmdXNlcyBpbnB1dCBsb25nZXIgdGhhbiBtYXggYnl0ZXMsIGlucHV0IHRoYXQgaXMgbm90IHZhbGlkCi8vIFVURi04ICh0aGUgc2FuaXRpc2VyIHdvdWxkIG90aGVyd2lzZSB0dXJuIGVhY2ggYmFkIGJ5dGUgaW50byBhIDMtYnl0ZQovLyBVK0ZGRkQsIHN0b3JpbmcgdXAgdG8gdGhyZWUgdGltZXMgdGhlIGxpbWl0KSwgYW5kIGNvbnRyb2wgb3IgZm9ybWF0Ci8vIGNoYXJhY3RlcnMgKFxwe0NjfSwgXHB7Q2Z9OiBiaWRpIG92ZXJyaWRlcywgemVyby13aWR0aCBjaGFyYWN0ZXJzKSwgd2hpY2gKLy8gY291bGQgaGlkZSBvciByZW9yZGVyIHRleHQuIEl0IHRoZW4gc3RyaXBzIG1hcmtkb3duLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzIGFuZAovLyBsaW5lIGJyZWFrcyBhbmQgdGFicywgYXMgdjMgZGlkLiBTdHJpcHBpbmcgb25seSByZW1vdmVzIGJ5dGVzLCBzbyB0aGUgcmVzdWx0Ci8vIGlzIHdpdGhpbiBtYXg7IHRoYXQgaXMgY2hlY2tlZCBhZ2FpbiBiZWNhdXNlIHN0b3JhZ2UgaXMgYm91bmRlZCBieSBpdC4KZnVuYyBjbGVhblRleHQocywgd2hhdCBzdHJpbmcsIG1heCBpbnQpIHN0cmluZyB7CglpZiBsZW4ocykgPiBtYXggewoJCXBhbmljKHVmbXQuU3ByaW50ZigiJXMgbXVzdCBiZSBhdCBtb3N0ICVkIGJ5dGVzIiwgd2hhdCwgbWF4KSkKCX0KCWlmICF1dGY4LlZhbGlkU3RyaW5nKHMpIHsKCQlwYW5pYyh3aGF0ICsgIiBtdXN0IGJlIHZhbGlkIFVURi04IikKCX0KCXN0cmlwIDo9IGZhbHNlCglmb3IgXywgYyA6PSByYW5nZSBzIHsKCQlpZiBpc1N0cmlwcGVkKGMpIHsKCQkJc3RyaXAgPSB0cnVlCgkJCWNvbnRpbnVlCgkJfQoJCWlmIGMgPCAweDIwIHx8IGMgPT0gMHg3ZiB8fCAoYyA+PSAweDgwICYmIGMgPCAweGEwKSB8fCAobWF5QmVGb3JtYXQoYykgJiYgdW5pY29kZS5Jcyh1bmljb2RlLkNmLCBjKSkgewoJCQlwYW5pYyh3aGF0ICsgIiBjb250YWlucyBpbnZpc2libGUgb3IgY29udHJvbCBjaGFyYWN0ZXJzIikKCQl9Cgl9CglpZiAhc3RyaXAgewoJCXJldHVybiBzCgl9Cgl2YXIgb3V0IHN0cmluZ3MuQnVpbGRlcgoJZm9yIF8sIGMgOj0gcmFuZ2UgcyB7CgkJaWYgIWlzU3RyaXBwZWQoYykgewoJCQlvdXQuV3JpdGVSdW5lKGMpCgkJfQoJfQoJY2xlYW4gOj0gb3V0LlN0cmluZygpCglpZiBsZW4oY2xlYW4pID4gbWF4IHsKCQlwYW5pYyh1Zm10LlNwcmludGYoIiVzIG11c3QgYmUgYXQgbW9zdCAlZCBieXRlcyIsIHdoYXQsIG1heCkpCgl9CglyZXR1cm4gY2xlYW4KfQoKLy8gaXNTdHJpcHBlZCByZXBvcnRzIHRoZSBtYXJrZG93bi1zZW5zaXRpdmUgY2hhcmFjdGVycyBhbmQgbGluZSBicmVha3MgYW5kCi8vIHRhYnMgcmVtb3ZlZCBmcm9tIHN0b3JlZCB0ZXh0LCBhcyBpbiB2My4KZnVuYyBpc1N0cmlwcGVkKGMgcnVuZSkgYm9vbCB7Cglzd2l0Y2ggYyB7CgljYXNlICdbJywgJ10nLCAnKCcsICcpJywgJyMnLCAnKicsICdgJywgJyEnLCAnPCcsICc+JywgJ3wnLCAnXFwnLCAnXycsICd+JywgJ1xuJywgJ1xyJywgJ1x0JzoKCQlyZXR1cm4gdHJ1ZQoJfQoJcmV0dXJuIGZhbHNlCn0KCi8vIG1heUJlRm9ybWF0IGlzIGEgY2hlYXAgc3VwZXJzZXQgdGVzdCBmb3IgXHB7Q2Z9IChldmVyeSBmb3JtYXQgY2hhcmFjdGVyIGlzCi8vIFUrMDBBRCwgaW4gVSswNjAwLi5VKzIwNkYsIG9yIGF0IG9yIGFib3ZlIFUrRkVGRiksIHNvIGNvbW1vbiB0ZXh0IHNraXBzIHRoZQovLyB0YWJsZSBsb29rdXAuCmZ1bmMgbWF5QmVGb3JtYXQoYyBydW5lKSBib29sIHsKCXJldHVybiBjID09IDB4YWQgfHwgKGMgPj0gMHg2MDAgJiYgYyA8PSAweDIwNmYpIHx8IGMgPj0gMHhmZWZmCn0KGkMKC2dub21vZC50b21sEjRtb2R1bGUgPSAiZ25vLmxhbmQvci9zYW1jcmV3L2VzY3Jvd192NCIKZ25vID0gIjAuOSIKGsgMCgpvcmlnaW4uZ25vErkMcGFja2FnZSBlc2Nyb3dfdjQKCi8vIFRoZSBvbmx5IGNoYWluL3J1bnRpbWUvdW5zYWZlIHVzZXMgaW4gdGhpcyByZWFsbS4gTm90aGluZyBoZXJlIHJlYWRzIGEKLy8gY2FsbGVyIGZyb20gdGhlIHN0YWNrIGFuZCBubyBjcm9zc2luZyBlbnRyeXBvaW50IGlzIGRlY2xhcmVkIGluIHRoaXMgZmlsZToKLy8gZW50cnlwb2ludHMgYXV0aGVudGljYXRlIHdpdGggY3VyLklzQ3VycmVudCgpIGFuZCBjdXIuUHJldmlvdXMoKSwgYW5kCi8vIHJlcXVpcmVFeGFjdFNlbmQgb25seSBjaGVja3MgdGhlIGtpbmQgb2YgdGhlIGZyYW1lLXZlcmlmaWVkIGNhbGxlciBpdCBpcwovLyBoYW5kZWQuCgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIHB1Ymxpc2hlckF0TG9hZCBjYXB0dXJlcyB0aGUgQWRkUGFja2FnZSBzaWduZXIgZHVyaW5nIHBhY2thZ2UKLy8gaW5pdGlhbGl6YXRpb247IGl0IHNlZWRzIGFkbWluIGFuZCB0aGUgZmFsbGJhY2sgZmVlIHJlY2lwaWVudC4KZnVuYyBwdWJsaXNoZXJBdExvYWQoKSBhZGRyZXNzIHsgcmV0dXJuIHVuc2FmZS5PcmlnaW5DYWxsZXIoKSB9CgovLyByZXF1aXJlRXhhY3RTZW5kIHBhbmljcyB1bmxlc3MgY2FsbGVyICh0aGUgZW50cnlwb2ludCdzIGN1ci5QcmV2aW91cygpKSBpcwovLyBhIGRpcmVjdCB1c2VyIGNhbGwgYW5kIHRoZSB0cmFuc2FjdGlvbidzIHNlbmQgZW52ZWxvcGUgaG9sZHMgZXhhY3RseSBhbW91bnQKLy8gdWdub3QgYW5kIG5vIG90aGVyIGRlbm9tLiBPbmx5IGZvciBhIGRpcmVjdCB1c2VyIGNhbGwgaXMgdGhlIGVudmVsb3BlCi8vIGNyZWRpdGVkIHRvIHRoaXMgcmVhbG0sIHRoZSBtZXNzYWdlIHRhcmdldDsgYW55IG90aGVyIGRlbm9tIHdvdWxkIGJlCi8vIHN0cmFuZGVkIGhlcmUuIFRoZSBndWFyZCBzaXRzIGluIHRoaXMgZnVuY3Rpb24sIGJlZm9yZSB0aGUgcmVhZCwgc28gdGhlCi8vIGRlcGxveWVyJ3MgcGVyLWZ1bmN0aW9uIGZ1bmQtc2FmZXR5IHNjYW4gKGxpYi9kZXBsb3kuc2gpIHNlZXMgaXQuCmZ1bmMgcmVxdWlyZUV4YWN0U2VuZChhbW91bnQgaW50NjQsIGNhbGxlciByZWFsbSkgewoJaWYgIWNhbGxlci5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJGdW5kTWlsZXN0b25lIG11c3QgYmUgYSBkaXJlY3QgdXNlciBjYWxsIikKCX0KCXNlbnQgOj0gaW50NjQoMCkKCWZvciBfLCBjb2luIDo9IHJhbmdlIHVuc2FmZS5PcmlnaW5TZW5kKCkgewoJCWlmIGNvaW4uRGVub20gIT0gInVnbm90IiB7CgkJCXBhbmljKCJvbmx5IHVnbm90IGlzIGFjY2VwdGVkLCBnb3QgIiArIGNvaW4uRGVub20pCgkJfQoJCXNlbnQgKz0gY29pbi5BbW91bnQKCX0KCWlmIHNlbnQgIT0gYW1vdW50IHsKCQlwYW5pYyh1Zm10LlNwcmludGYoIm11c3Qgc2VuZCBleGFjdGx5ICVkIHVnbm90IChzZW50ICVkKSIsIGFtb3VudCwgc2VudCkpCgl9Cn0KCi8vIHJlYWxtQWRkcmVzcyBpcyB0aGlzIHJlYWxtJ3Mgb3duIGFkZHJlc3MsIGZvciB0aGUgTkYtMiBzb2x2ZW5jeSBnZXR0ZXIuCmZ1bmMgcmVhbG1BZGRyZXNzKCkgYWRkcmVzcyB7IHJldHVybiB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpIH0KGtB3Cgl2aWV3cy5nbm8SwndwYWNrYWdlIGVzY3Jvd192NAoKLy8gUmVhZC1vbmx5IHZpZXdzOiBORi0yIHNvbHZlbmN5IGdldHRlcnMsIGNvdW50ZXJzLCBnb3Zlcm5hbmNlIHJlYWRzLCBKU09OCi8vIHZpZXdzIGZvciBmcm9udGVuZHMgYW5kIFJlbmRlci4gTm90aGluZyBoZXJlIGNoYW5nZXMgc3RhdGUuIChBbGwgb2YgdGhpcwovLyBzaXRzIGluIG9uZSBmaWxlLCBsaWtlIHRoZSBzdGF0ZS1jaGFuZ2luZyBjb2RlIGluIGVzY3Jvdy5nbm8sIGJlY2F1c2UgZXZlcnkKLy8gZXh0cmEgZmlsZSBjb3N0cyBBZGRQYWNrYWdlIHN0b3JhZ2UuKQoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvaGV4IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoJY2ZnICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfbWFya2V0X2NvbmZpZyIKKQoKLy8g4pSA4pSAIE5GLTIgc29sdmVuY3kgZ2V0dGVycyAoTUFJTk5FVF9SRUFESU5FU1MubWQgwqczKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8KLy8gSW52YXJpYW50IHRoZSBzb2x2ZW5jeSBtb25pdG9yIHJlY29uY2lsZXM6IHJlYWxtIGJhbGFuY2UgPj0KLy8gVG90YWxMaWFiaWxpdGllcygpLiB0b3RhbExpYWJsZSByaXNlcyBieSB0aGUgbWlsZXN0b25lIGFtb3VudCBpbgovLyBGdW5kTWlsZXN0b25lIGFuZCBmYWxscyBieSBpdCBhdCBldmVyeSBwb2ludCBmdW5kcyBsZWF2ZSB0aGUgcmVhbG0uCgovLyBUb3RhbExpYWJpbGl0aWVzIHJldHVybnMgdGhlIHVnbm90IHRoZSByZWFsbSBvd2VzIGFjcm9zcyBmdW5kZWQsIGNvbXBsZXRlZAovLyBhbmQgZGlzcHV0ZWQgbWlsZXN0b25lcy4KZnVuYyBUb3RhbExpYWJpbGl0aWVzKCkgaW50NjQgeyByZXR1cm4gdG90YWxMaWFibGUgfQoKLy8gUmVhbG1BZGRyZXNzIGlzIHRoZSBORi0yIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgcmVhbG0ncyBvd24gYWRkcmVzcy4KZnVuYyBSZWFsbUFkZHJlc3MoKSBzdHJpbmcgeyByZXR1cm4gcmVhbG1BZGRyZXNzKCkuU3RyaW5nKCkgfQoKLy8g4pSA4pSAIFNsb3QgYW5kIGFyY2hpdmUgY291bnRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBHZXRBY3RpdmVDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlbiBjb250cmFjdHMgKG5vdCBjb21wbGV0ZWQgb3IKLy8gY2FuY2VsbGVkKS4KZnVuYyBHZXRBY3RpdmVDb3VudCgpIGludCB7IHJldHVybiBhY3RpdmVDb3VudCB9CgovLyBHZXRDbGllbnRBY3RpdmVDb3VudCByZXR1cm5zIHRoZSBvcGVuIGNvbnRyYWN0cyBjcmVhdGVkIGJ5IGNsaWVudCwgYm91bmRlZAovLyBieSBNYXhBY3RpdmVQZXJDbGllbnQuCmZ1bmMgR2V0Q2xpZW50QWN0aXZlQ291bnQoY2xpZW50IGFkZHJlc3MpIGludCB7IHJldHVybiBjbGllbnRBY3RpdmUoY2xpZW50KSB9CgovLyBHZXRMaXZlQ291bnQgcmV0dXJucyB0aGUgY29udHJhY3RzIHN0aWxsIHN0b3JlZDogb3BlbiBvbmVzIHBsdXMgc2V0dGxlZCBvbmVzCi8vIHRoZWlyIGNsaWVudCBoYXMgbm90IGFyY2hpdmVkLgpmdW5jIEdldExpdmVDb3VudCgpIGludCB7IHJldHVybiBjb250cmFjdHMuU2l6ZSgpIH0KCi8vIEdldEFyY2hpdmVkQ291bnQgcmV0dXJucyB0aGUgY29udHJhY3RzIGRlbGV0ZWQgYnkgQXJjaGl2ZUNvbnRyYWN0LgpmdW5jIEdldEFyY2hpdmVkQ291bnQoKSBpbnQgeyByZXR1cm4gYXJjaGl2ZWRDb3VudCB9CgovLyBHZXRDcmVhdGVkQ291bnQgcmV0dXJucyBldmVyeSBjb250cmFjdCBldmVyIGNyZWF0ZWQ7IGlkcyBydW4gZnJvbSAwIHRvCi8vIEdldENyZWF0ZWRDb3VudCgpLTEgYW5kIGFyZSBuZXZlciByZXVzZWQuCmZ1bmMgR2V0Q3JlYXRlZENvdW50KCkgaW50IHsgcmV0dXJuIG5leHRJRCB9CgovLyBWYWx1ZS1vbmx5IHJlYWRzIGZvciB0aGUgbWVtYmFfZGFvIGVzY3JvdyBhZGFwdGVyLCB1bmNoYW5nZWQgZnJvbSBlc2Nyb3dfdjM6Ci8vIG5vIENvbnRyYWN0IHBvaW50ZXIgb3IgcGVyc2lzdGVudCBtaWxlc3RvbmUgc2xpY2UgZXNjYXBlcy4gQW4gYXJjaGl2ZWQKLy8gY29udHJhY3QgcmVhZHMgYXMgYWJzZW50IChFeGlzdHMgZmFsc2UpLgoKdHlwZSBHb3Zlcm5hbmNlTWlsZXN0b25lIHN0cnVjdCB7CglJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CglBbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQKCVN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcKCUZ1bmRlZEF0LCBDb21wbGV0ZWRBdCwgRGlzcHV0ZWRBdCBpbnQ2NAoJUHJlRGlzcHV0ZVN0YXR1cyAgICAgICAgICAgICAgICAgIHN0cmluZwp9Cgp0eXBlIEdvdmVybmFuY2VDb250cmFjdCBzdHJ1Y3QgewoJRXhpc3RzICAgICAgICAgICAgICAgICAgYm9vbAoJSUQsIENvbnRlbnRIYXNoLCBTdGF0dXMgc3RyaW5nCglDbGllbnQsIEZyZWVsYW5jZXIgICAgICBhZGRyZXNzCglDb3VudCAgICAgICAgICAgICAgICAgICBpbnQKCU1pbGVzdG9uZXMgICAgICAgICAgICAgIFsyMF1Hb3Zlcm5hbmNlTWlsZXN0b25lCn0KCmZ1bmMgR2V0R292ZXJuYW5jZUNvbnRyYWN0KGlkIHN0cmluZykgR292ZXJuYW5jZUNvbnRyYWN0IHsKCXYsIG9rIDo9IGNvbnRyYWN0cy5HZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBHb3Zlcm5hbmNlQ29udHJhY3R7fQoJfQoJYyA6PSB2LigqQ29udHJhY3QpCglpZiBsZW4oYy5NaWxlc3RvbmVzKSA+IE1heE1pbGVzdG9uZXMgewoJCXBhbmljKCJpbnZhbGlkIGVzY3JvdyBtaWxlc3RvbmUgY291bnQiKQoJfQoJcyA6PSBHb3Zlcm5hbmNlQ29udHJhY3R7RXhpc3RzOiB0cnVlLCBJRDogYy5JRCwgU3RhdHVzOiBzdHJpbmcoYy5TdGF0dXMpLCBDbGllbnQ6IGMuQ2xpZW50LCBGcmVlbGFuY2VyOiBjLkZyZWVsYW5jZXIsIENvdW50OiBsZW4oYy5NaWxlc3RvbmVzKSwgQ29udGVudEhhc2g6IGNvbnRlbnRIYXNoKGMpfQoJZm9yIGksIG0gOj0gcmFuZ2UgYy5NaWxlc3RvbmVzIHsKCQlzLk1pbGVzdG9uZXNbaV0gPSBHb3Zlcm5hbmNlTWlsZXN0b25le0lEOiBtLklELCBBbW91bnQ6IG0uQW1vdW50LCBTdGF0dXM6IHN0cmluZyhtLlN0YXR1cyksIEZ1bmRlZEF0OiBtLkZ1bmRlZEF0LCBDb21wbGV0ZWRBdDogbS5Db21wbGV0ZWRBdCwgRGlzcHV0ZWRBdDogbS5EaXNwdXRlZEF0LCBQcmVEaXNwdXRlU3RhdHVzOiBzdHJpbmcobS5QcmVEaXNwdXRlU3RhdHVzKX0KCX0KCXJldHVybiBzCn0KCi8vIGNvbnRlbnRIYXNoIGRpZ2VzdHMgdGhlIGltbXV0YWJsZSBtZXRhZGF0YSBvZiBhIGNvbnRyYWN0IChwYXJ0aWVzLCB0ZXh0cywKLy8gY3JlYXRpb24gaGVpZ2h0LCBtaWxlc3RvbmUgdGl0bGVzIGFuZCBhbW91bnRzKSwgbm90IGl0cyBzdGF0ZS4KZnVuYyBjb250ZW50SGFzaChjICpDb250cmFjdCkgc3RyaW5nIHsKCW1ldGFkYXRhIDo9ICJlc2Nyb3ctbWV0YWRhdGEvdjEiICsgZXNjcm93TWV0YWRhdGFGaWVsZChjLklEKSArIGVzY3Jvd01ldGFkYXRhRmllbGQoc3RyaW5nKGMuQ2xpZW50KSkgKyBlc2Nyb3dNZXRhZGF0YUZpZWxkKHN0cmluZyhjLkZyZWVsYW5jZXIpKSArIGVzY3Jvd01ldGFkYXRhRmllbGQoYy5UaXRsZSkgKyBlc2Nyb3dNZXRhZGF0YUZpZWxkKGMuRGVzY3JpcHRpb24pICsgZXNjcm93TWV0YWRhdGFGaWVsZChzdHJjb252LkZvcm1hdEludChjLkNyZWF0ZWRBdCwgMTApKSArIGVzY3Jvd01ldGFkYXRhRmllbGQoc3RyY29udi5JdG9hKGxlbihjLk1pbGVzdG9uZXMpKSkKCWZvciBfLCBtIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJbWV0YWRhdGEgKz0gZXNjcm93TWV0YWRhdGFGaWVsZChzdHJjb252Lkl0b2EobS5JRCkpICsgZXNjcm93TWV0YWRhdGFGaWVsZChtLlRpdGxlKSArIGVzY3Jvd01ldGFkYXRhRmllbGQoc3RyY29udi5Gb3JtYXRJbnQobS5BbW91bnQsIDEwKSkKCX0KCWRpZ2VzdCA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShtZXRhZGF0YSkpCglyZXR1cm4gaGV4LkVuY29kZVRvU3RyaW5nKGRpZ2VzdFs6XSkKfQoKdHlwZSBHb3Zlcm5hbmNlRmVlVGVybXMgc3RydWN0IHsKCVJhd0JQUywgRWZmZWN0aXZlQlBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NAoJUmF3VHJlYXN1cnksIEZhbGxiYWNrVHJlYXN1cnksIEVmZmVjdGl2ZVRyZWFzdXJ5IGFkZHJlc3MKfQoKZnVuYyBHZXRHb3Zlcm5hbmNlRmVlVGVybXMoKSBHb3Zlcm5hbmNlRmVlVGVybXMgewoJYnBzLCB0cmVhc3VyeSA6PSByZXNvbHZlRmVlKCkKCXJldHVybiBHb3Zlcm5hbmNlRmVlVGVybXN7UmF3QlBTOiBpbnQ2NChjZmcuR2V0RmVlQlBTKGxhbmVTZXJ2aWNlKSksIEVmZmVjdGl2ZUJQUzogYnBzLCBSYXdUcmVhc3VyeTogY2ZnLkdldFRyZWFzdXJ5KCksIEZhbGxiYWNrVHJlYXN1cnk6IGZlZVJlY2lwaWVudCwgRWZmZWN0aXZlVHJlYXN1cnk6IHRyZWFzdXJ5fQp9CgpmdW5jIGVzY3Jvd01ldGFkYXRhRmllbGQodmFsdWUgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5JdG9hKGxlbih2YWx1ZSkpICsgIjoiICsgdmFsdWUgfQoKLy8gU3RydWN0dXJlZCByZWFkLW9ubHkgdmlld3MgZm9yIGZyb250ZW5kcyAoYWRkaXRpdmUgdG8gdGhlIGZyb3plbiBBUEk7IHRoZXkKLy8gY2hhbmdlIG5vIHN0YXRlIGFuZCBubyBleGlzdGluZyBiZWhhdmlvdXIpLiBFdmVyeSBpbnRlZ2VyIGlzIGEgZGVjaW1hbAovLyBzdHJpbmcsIGFic2VudCB2YWx1ZXMgYXJlIG51bGwsIGFuZCBhbiB1bmtub3duIG9yIGFyY2hpdmVkIGlkIHJlYWRzIGFzCi8vIHsiZXhpc3RzIjpmYWxzZSwuLi59LiBIZWlnaHRzIHN1Y2ggYXMgcmVmdW5kQXQgYXJlIHBhdXNlLWFkanVzdGVkIGRlYWRsaW5lcywKLy8gYXNzdW1pbmcgbm8gZnVydGhlciBwYXVzZS4gQ29udHJhY3QgbGlzdGluZ3Mgd2FsayBhdCBtb3N0IGxpbWl0KzEgZW50cmllcwovLyBvZiBhIHBlci1wYXJ0eSBpbmRleCwgbmV3ZXN0IGZpcnN0LgoKY29uc3QgbWF4UGFnZVNpemUgPSA1MAoKLy8gaW5kZXhQcmVmaXgga2V5cyB0aGUgY2xpZW50IGluZGV4IGluc2lkZSBjbGllbnRTbG90cyAodGhlIHBlci1jbGllbnQgc2xvdAovLyBjb3VudGVycyBhcmUga2V5ZWQgYnkgdGhlIGJhcmUgYWRkcmVzcywgd2hpY2ggbmV2ZXIgc3RhcnRzIHdpdGggImMvIik6IG9uZQovLyB0cmVlIGluc3RlYWQgb2YgdHdvIGtlZXBzIHRoZSBwYWNrYWdlIHNtYWxsZXIuCmNvbnN0IGluZGV4UHJlZml4ID0gImMvIgoKLy8gR2V0Q29udHJhY3RKU09OIHJldHVybnMgb25lIGNvbnRyYWN0IGFzIEpTT04uCmZ1bmMgR2V0Q29udHJhY3RKU09OKGlkIHN0cmluZykgc3RyaW5nIHsKCXYsIG9rIDo9IGNvbnRyYWN0cy5HZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBgeyJleGlzdHMiOmZhbHNlLCJpZCI6YCArIGpzdHIoaWQpICsgYH1gCgl9CgljIDo9IHYuKCpDb250cmFjdCkKCXZhciB0b3RhbCwgZXNjcm93ZWQsIHJlbGVhc2VkLCByZWZ1bmRlZCwgZnVuZGVkQXQsIHJlZnVuZEF0LCByZXNvbHZlQXQgaW50NjQKCXBlbmRpbmcgOj0gdHJ1ZQoJdmFyIG1zIHN0cmluZ3MuQnVpbGRlcgoJZm9yIGksIG0gOj0gcmFuZ2UgYy5NaWxlc3RvbmVzIHsKCQl0b3RhbCArPSBtLkFtb3VudAoJCW1SZWZ1bmQsIG1SZXNvbHZlIDo9IGludDY0KDApLCBpbnQ2NCgwKQoJCXN3aXRjaCBtLlN0YXR1cyB7CgkJY2FzZSBNc0Z1bmRlZDoKCQkJbVJlZnVuZCA9IGRlYWRsaW5lKG0uRnVuZGVkQXQsIG0uZnVuZGVkUGF1c2VNYXJrLCBBdXRvUmVmdW5kQmxrcykKCQkJcmVmdW5kQXQgPSBtaW5IZWlnaHQocmVmdW5kQXQsIG1SZWZ1bmQpCgkJCWVzY3Jvd2VkICs9IG0uQW1vdW50CgkJY2FzZSBNc0Rpc3B1dGVkOgoJCQltUmVzb2x2ZSA9IGRlYWRsaW5lKG0uRGlzcHV0ZWRBdCwgbS5kaXNwdXRlZFBhdXNlTWFyaywgQXV0b1Jlc29sdmVCbGtzKQoJCQlyZXNvbHZlQXQgPSBtaW5IZWlnaHQocmVzb2x2ZUF0LCBtUmVzb2x2ZSkKCQkJZXNjcm93ZWQgKz0gbS5BbW91bnQKCQljYXNlIE1zQ29tcGxldGVkOgoJCQllc2Nyb3dlZCArPSBtLkFtb3VudAoJCWNhc2UgTXNSZWxlYXNlZDoKCQkJcmVsZWFzZWQgKz0gbS5BbW91bnQKCQljYXNlIE1zUmVmdW5kZWQ6CgkJCXJlZnVuZGVkICs9IG0uQW1vdW50CgkJfQoJCWlmIG0uU3RhdHVzICE9IE1zUGVuZGluZyB7CgkJCXBlbmRpbmcgPSBmYWxzZQoJCX0KCQlmdW5kZWRBdCA9IG1pbkhlaWdodChmdW5kZWRBdCwgbS5GdW5kZWRBdCkKCQlpZiBpID4gMCB7CgkJCW1zLldyaXRlU3RyaW5nKCIsIikKCQl9CgkJbXMuV3JpdGVTdHJpbmcoYHsiaW5kZXgiOmAgKyBqaW50KGludDY0KGkpKSArIGAsInRpdGxlIjpgICsganN0cihtLlRpdGxlKSArCgkJCWAsImFtb3VudFVnbm90IjpgICsgamludChtLkFtb3VudCkgKyBgLCJzdGF0dXMiOmAgKyBqc3RyKHN0cmluZyhtLlN0YXR1cykpICsKCQkJYCwiZnVuZGVkQXRIZWlnaHQiOmAgKyBqaGVpZ2h0KG0uRnVuZGVkQXQpICsgYCwiY29tcGxldGVkQXRIZWlnaHQiOmAgKyBqaGVpZ2h0KG0uQ29tcGxldGVkQXQpICsKCQkJYCwiZGlzcHV0ZWRBdEhlaWdodCI6YCArIGpoZWlnaHQobS5EaXNwdXRlZEF0KSArIGAsInJlZnVuZEF0IjpgICsgamhlaWdodChtUmVmdW5kKSArCgkJCWAsInJlc29sdmVBdCI6YCArIGpoZWlnaHQobVJlc29sdmUpICsgYH1gKQoJfQoJZXhwaXJlQXQgOj0gaW50NjQoMCkKCWlmIHBlbmRpbmcgJiYgYy5TdGF0dXMgPT0gU3RhdHVzQWN0aXZlIHsKCQlleHBpcmVBdCA9IGRlYWRsaW5lKGMuQ3JlYXRlZEF0LCBjLmNyZWF0ZWRQYXVzZU1hcmssIFVuZnVuZGVkRXhwaXJ5QmxrcykKCX0KCXJldHVybiBgeyJleGlzdHMiOnRydWUsImlkIjpgICsganN0cihjLklEKSArIGAsImNsaWVudCI6YCArIGpzdHIoYy5DbGllbnQuU3RyaW5nKCkpICsKCQlgLCJmcmVlbGFuY2VyIjpgICsganN0cihjLkZyZWVsYW5jZXIuU3RyaW5nKCkpICsgYCwidGl0bGUiOmAgKyBqc3RyKGMuVGl0bGUpICsKCQlgLCJkZXNjcmlwdGlvbiI6YCArIGpzdHIoYy5EZXNjcmlwdGlvbikgKyBgLCJzdGF0dXMiOmAgKyBqc3RyKHN0cmluZyhjLlN0YXR1cykpICsKCQlgLCJjcmVhdGVkQXRIZWlnaHQiOmAgKyBqaW50KGMuQ3JlYXRlZEF0KSArIGAsImZ1bmRlZEF0SGVpZ2h0IjpgICsgamhlaWdodChmdW5kZWRBdCkgKwoJCWAsInJlZnVuZEF0IjpgICsgamhlaWdodChyZWZ1bmRBdCkgKyBgLCJleHBpcmVBdCI6YCArIGpoZWlnaHQoZXhwaXJlQXQpICsgYCwicmVzb2x2ZUF0IjpgICsgamhlaWdodChyZXNvbHZlQXQpICsKCQlgLCJtaWxlc3RvbmVzIjpbYCArIG1zLlN0cmluZygpICsgYF0sInRvdGFscyI6eyJhbW91bnRVZ25vdCI6YCArIGppbnQodG90YWwpICsKCQlgLCJlc2Nyb3dlZFVnbm90IjpgICsgamludChlc2Nyb3dlZCkgKyBgLCJyZWxlYXNlZFVnbm90IjpgICsgamludChyZWxlYXNlZCkgKwoJCWAsInJlZnVuZGVkVWdub3QiOmAgKyBqaW50KHJlZnVuZGVkKSArIGB9fWAKfQoKLy8gR2V0Q2xpZW50Q29udHJhY3RzSlNPTiBwYWdlcyB0aGUgbGl2ZSBjb250cmFjdHMgYSBjbGllbnQgY3JlYXRlZCwgbmV3ZXN0Ci8vIGZpcnN0OiB7Iml0ZW1zIjpbeyJpZCIsInN0YXR1cyIsImNyZWF0ZWRBdEhlaWdodCJ9Li4uXSwibmV4dCI6Y3Vyc29yfG51bGx9LgovLyBiZWZvcmUgaXMgIiIgZm9yIHRoZSBmaXJzdCBwYWdlIG9yIHRoZSBwcmV2aW91cyBwYWdlJ3MgbmV4dCBjdXJzb3I7IGxpbWl0Ci8vIGlzIGNsYW1wZWQgdG8gMS4uNTAuCmZ1bmMgR2V0Q2xpZW50Q29udHJhY3RzSlNPTihjbGllbnQgYWRkcmVzcywgYmVmb3JlIHN0cmluZywgbGltaXQgaW50KSBzdHJpbmcgewoJcmV0dXJuIGNvbnRyYWN0c1BhZ2UoY2xpZW50LCBiZWZvcmUsIGxpbWl0KQp9CgovLyBHZXRQYXVzZVN0YXRlSlNPTiByZXR1cm5zIFBhdXNlU3RhdGUoKSBhcyBKU09OLgpmdW5jIEdldFBhdXNlU3RhdGVKU09OKCkgc3RyaW5nIHsKCXAgOj0gUGF1c2VTdGF0ZSgpCglyZXR1cm4gYHsicGF1c2VkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHAuUGF1c2VkKSArIGAsInBhdXNlZEF0IjpgICsgamhlaWdodChwLlBhdXNlZEF0KSArCgkJYCwiZXhpdHNSZW9wZW5BdCI6YCArIGpoZWlnaHQocC5FeGl0c1Jlb3BlbkF0KSArIGAsImV4aXRzT3BlbiI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChwLkV4aXRzT3BlbikgKwoJCWAsImNvb2xkb3duVW50aWwiOmAgKyBqaW50KHAuQ29vbGRvd25VbnRpbCkgKyBgLCJwYXVzZWRCbG9ja3MiOmAgKyBqaW50KHAuUGF1c2VkQmxvY2tzKSArIGB9YAp9CgpmdW5jIGNvbnRyYWN0c1BhZ2Uod2hvIGFkZHJlc3MsIGJlZm9yZSBzdHJpbmcsIGxpbWl0IGludCkgc3RyaW5nIHsKCWlmIGxpbWl0IDwgMSB7CgkJbGltaXQgPSAxCgl9IGVsc2UgaWYgbGltaXQgPiBtYXhQYWdlU2l6ZSB7CgkJbGltaXQgPSBtYXhQYWdlU2l6ZQoJfQoJcHJlZml4IDo9IGluZGV4UHJlZml4ICsgd2hvLlN0cmluZygpICsgIi8iCgllbmQgOj0gcHJlZml4ICsgIn4iIC8vIGFmdGVyIGV2ZXJ5IGRpZ2l0CglpZiBiZWZvcmUgIT0gIiIgewoJCW4sIGVyciA6PSBzdHJjb252LkF0b2koYmVmb3JlKQoJCWlmIGVyciAhPSBuaWwgfHwgbiA8IDAgfHwgc3RyY29udi5JdG9hKG4pICE9IGJlZm9yZSB7CgkJCXBhbmljKCJpbnZhbGlkIGN1cnNvcjogIiArIGJlZm9yZSkKCQl9CgkJZW5kID0gaW5kZXhLZXkod2hvLCBuKQoJfQoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJY291bnQsIG5leHQsIGxhc3QgOj0gMCwgIm51bGwiLCAiIgoJY2xpZW50U2xvdHMuUmV2ZXJzZUl0ZXJhdGUocHJlZml4LCBlbmQsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgewoJCW4sIF8gOj0gc3RyY29udi5BdG9pKGtleVtsZW4ocHJlZml4KTpdKQoJCWlkIDo9IHN0cmNvbnYuSXRvYShuKQoJCWlmIGlkID09IGJlZm9yZSB7CgkJCXJldHVybiBmYWxzZSAvLyBlbmQgaXMgaW5jbHVzaXZlOyB0aGUgY3Vyc29yIGl0c2VsZiB3YXMgb24gdGhlIHByZXZpb3VzIHBhZ2UKCQl9CgkJaWYgY291bnQgPT0gbGltaXQgewoJCQluZXh0ID0ganN0cihsYXN0KQoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQljIDo9IGdldENvbnRyYWN0KGlkKQoJCWlmIGNvdW50ID4gMCB7CgkJCXNiLldyaXRlU3RyaW5nKCIsIikKCQl9CgkJc2IuV3JpdGVTdHJpbmcoYHsiaWQiOmAgKyBqc3RyKGlkKSArIGAsInN0YXR1cyI6YCArIGpzdHIoc3RyaW5nKGMuU3RhdHVzKSkgKwoJCQlgLCJjcmVhdGVkQXRIZWlnaHQiOmAgKyBqaW50KGMuQ3JlYXRlZEF0KSArIGB9YCkKCQljb3VudCsrCgkJbGFzdCA9IGlkCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIGB7Iml0ZW1zIjpbYCArIHNiLlN0cmluZygpICsgYF0sIm5leHQiOmAgKyBuZXh0ICsgYH1gCn0KCi8vIGluZGV4S2V5IG9yZGVycyBhIHBhcnR5J3MgY29udHJhY3RzIGJ5IGlkOiAxMC1kaWdpdCB6ZXJvIHBhZGRpbmcuCmZ1bmMgaW5kZXhLZXkod2hvIGFkZHJlc3MsIGlkIGludCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5JdG9hKGlkKQoJcmV0dXJuIGluZGV4UHJlZml4ICsgd2hvLlN0cmluZygpICsgIi8iICsgc3RyaW5ncy5SZXBlYXQoIjAiLCAxMC1sZW4ocykpICsgcwp9CgovLyBkZWFkbGluZSBpcyB0aGUgaGVpZ2h0IGF0IHdoaWNoIGEgY2xvY2sgc3RhcnRlZCBhdCBzaW5jZSAocGF1c2UgbWFyayB0YWtlbgovLyB0aGVuKSByZWFjaGVzIHNwYW4gdW5wYXVzZWQgYmxvY2tzLCBhc3N1bWluZyBubyBwYXVzZSBhZnRlciB0aGUgY3VycmVudCBvbmUuCmZ1bmMgZGVhZGxpbmUoc2luY2UsIG1hcmssIHNwYW4gaW50NjQpIGludDY0IHsKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIGluQmxvY2tpbmdXaW5kb3cobm93KSB7CgkJbm93ID0gcGF1c2VkQXQgKyBNYXhQYXVzZUJsa3MKCX0KCXJldHVybiBzaW5jZSArIHNwYW4gKyBwYXVzZWRCbG9ja3NBdChub3cpIC0gbWFyawp9CgpmdW5jIG1pbkhlaWdodChhLCBiIGludDY0KSBpbnQ2NCB7CglpZiBhID09IDAgfHwgKGIgIT0gMCAmJiBiIDwgYSkgewoJCXJldHVybiBiCgl9CglyZXR1cm4gYQp9CgpmdW5jIGppbnQobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIGAiYCArIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSArIGAiYCB9CgovLyBqaGVpZ2h0IGVuY29kZXMgMCAobm90IHNldCkgYXMgbnVsbC4KZnVuYyBqaGVpZ2h0KG4gaW50NjQpIHN0cmluZyB7CglpZiBuID09IDAgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBqaW50KG4pCn0KCi8vIGpzdHIgcXVvdGVzIHMgYXMgYSBKU09OIHN0cmluZy4gU3RvcmVkIHRleHQgaXMgdmFsaWQgVVRGLTggd2l0aG91dCBjb250cm9sCi8vIGNoYXJhY3RlcnM7IGlkcyBwYXNzZWQgYnkgY2FsbGVycyBhcmUgZXNjYXBlZCB0aGUgc2FtZSB3YXkuCmZ1bmMganN0cihzIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZUJ5dGUoJyInKQoJZm9yIF8sIHIgOj0gcmFuZ2UgcyB7CgkJc3dpdGNoIHsKCQljYXNlIHIgPT0gJyInIHx8IHIgPT0gJ1xcJzoKCQkJYi5Xcml0ZUJ5dGUoJ1xcJykKCQkJYi5Xcml0ZVJ1bmUocikKCQljYXNlIHIgPCAweDIwOgoJCQliLldyaXRlU3RyaW5nKGBcdTAwYCkKCQkJYi5Xcml0ZUJ5dGUoIjAxMjM0NTY3ODlhYmNkZWYiW3I+PjRdKQoJCQliLldyaXRlQnl0ZSgiMDEyMzQ1Njc4OWFiY2RlZiJbciYxNV0pCgkJZGVmYXVsdDoKCQkJYi5Xcml0ZVJ1bmUocikKCQl9Cgl9CgliLldyaXRlQnl0ZSgnIicpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBSZW5kZXIoKSBjb250cmFjdDoKLy8gICBIb21lIOKAlCBSZW5kZXIoIiIpIG9yIFJlbmRlcigicGFnZS9OIik6Ci8vICAgICAjIEVzY3JvdyBDb250cmFjdHMKLy8gICAgIHwgSUQgfCBUaXRsZSB8IENsaWVudCB8IEZyZWVsYW5jZXIgfCBTdGF0dXMgfCBUb3RhbCB8Ci8vICAgICAoUmVuZGVyUGFnZVNpemUgbGl2ZSBjb250cmFjdHMgcGVyIHBhZ2UsIGluIHRyZWUgb3JkZXIpCi8vICAgRGV0YWlsIOKAlCBSZW5kZXIoImNvbnRyYWN0L0lEIik6Ci8vICAgICAjIFRpdGxlCi8vICAgICAqKkNsaWVudDoqKiBnMS4uLgovLyAgICAgKipGcmVlbGFuY2VyOioqIGcxLi4uCi8vICAgICAqKlN0YXR1czoqKiBhY3RpdmUKLy8gICAgICMjIE1pbGVzdG9uZXMKLy8gICAgIC0gKipNaWxlc3RvbmUgVGl0bGUqKiDigJQgMTAwMDAwMCB1Z25vdCBbZnVuZGVkXQovLyAgIFN0YXRzIOKAlCBSZW5kZXIoInN0YXRzIik6IGNvdW50ZXJzIG9ubHksIG5vIGl0ZXJhdGlvbi4KLy8gQXJjaGl2ZWQgY29udHJhY3RzIGFyZSBnb25lIGZyb20gZXZlcnkgdmlldy4KCi8vIFJlbmRlclBhZ2VTaXplIGlzIHRoZSBudW1iZXIgb2YgY29udHJhY3RzIGxpc3RlZCBwZXIgaG9tZSBwYWdlLgpjb25zdCBSZW5kZXJQYWdlU2l6ZSA9IDIwCgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCB7CgljYXNlIHBhdGggPT0gIiI6CgkJcmV0dXJuIHJlbmRlckhvbWUoMSkKCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgInBhZ2UvIik6CgkJcGFnZSwgZXJyIDo9IHN0cmNvbnYuQXRvaShzdHJpbmdzLlRyaW1QcmVmaXgocGF0aCwgInBhZ2UvIikpCgkJaWYgZXJyICE9IG5pbCB8fCBwYWdlIDwgMSB7CgkJCXJldHVybiAiIyA0MDRcbk5vdCBmb3VuZDogIiArIHBhdGgKCQl9CgkJcmV0dXJuIHJlbmRlckhvbWUocGFnZSkKCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgImNvbnRyYWN0LyIpOgoJCXJldHVybiByZW5kZXJDb250cmFjdChzdHJpbmdzLlRyaW1QcmVmaXgocGF0aCwgImNvbnRyYWN0LyIpKQoJY2FzZSBwYXRoID09ICJzdGF0cyI6CgkJcmV0dXJuIHJlbmRlclN0YXRzKCkKCX0KCXJldHVybiAiIyA0MDRcbk5vdCBmb3VuZDogIiArIHBhdGgKfQoKZnVuYyByZW5kZXJIb21lKHBhZ2UgaW50KSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgRXNjcm93IENvbnRyYWN0c1xuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIk1pbGVzdG9uZS1iYXNlZCBlc2Nyb3cgZm9yIGZyZWVsYW5jZSBzZXJ2aWNlcyBvbiBHbm8uXG5cbiIpCgoJbGl2ZSA6PSBjb250cmFjdHMuU2l6ZSgpCglpZiBsaXZlID09IDAgewoJCXNiLldyaXRlU3RyaW5nKCIqTm8gY29udHJhY3RzIHlldC4qXG4iKQoJCXJldHVybiBzYi5TdHJpbmcoKQoJfQoJb2Zmc2V0IDo9IChwYWdlIC0gMSkgKiBSZW5kZXJQYWdlU2l6ZQoJaWYgb2Zmc2V0ID49IGxpdmUgewoJCXJldHVybiAiIyA0MDRcbk5vIHBhZ2UgIiArIHN0cmNvbnYuSXRvYShwYWdlKQoJfQoKCXNiLldyaXRlU3RyaW5nKCJ8IElEIHwgVGl0bGUgfCBDbGllbnQgfCBGcmVlbGFuY2VyIHwgU3RhdHVzIHwgVG90YWwgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IC0tLSB8IC0tLSB8IC0tLSB8IC0tLSB8IC0tLSB8IC0tLSB8XG4iKQoJY29udHJhY3RzLkl0ZXJhdGVCeU9mZnNldChvZmZzZXQsIFJlbmRlclBhZ2VTaXplLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWMgOj0gdmFsdWUuKCpDb250cmFjdCkKCQlzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgJXMgfCBbJXNdKDpjb250cmFjdC8lcykgfCAlcyB8ICVzIHwgJXMgfCAlZCB1Z25vdCB8XG4iLAoJCQljLklELCBjLlRpdGxlLCBjLklELCB0cnVuY0FkZHIoYy5DbGllbnQpLCB0cnVuY0FkZHIoYy5GcmVlbGFuY2VyKSwKCQkJc3RyaW5nKGMuU3RhdHVzKSwgY29udHJhY3RUb3RhbChjKSkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgb2Zmc2V0K1JlbmRlclBhZ2VTaXplIDwgbGl2ZSB7CgkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJcbltOZXh0IHBhZ2VdKDpwYWdlLyVkKVxuIiwgcGFnZSsxKSkKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckNvbnRyYWN0KGlkIHN0cmluZykgc3RyaW5nIHsKCXZhbCwgZXhpc3RzIDo9IGNvbnRyYWN0cy5HZXQoaWQpCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gIiMgNDA0XG5Db250cmFjdCBub3QgZm91bmQ6ICIgKyBpZAoJfQoJYyA6PSB2YWwuKCpDb250cmFjdCkKCgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyAiICsgYy5UaXRsZSArICJcblxuIikKCWlmIGxlbihjLkRlc2NyaXB0aW9uKSA+IDAgewoJCXNiLldyaXRlU3RyaW5nKGMuRGVzY3JpcHRpb24gKyAiXG5cbiIpCgl9CglzYi5Xcml0ZVN0cmluZygiKipJRDoqKiAiICsgYy5JRCArICJcbiIpCglzYi5Xcml0ZVN0cmluZygiKipDbGllbnQ6KiogIiArIGMuQ2xpZW50LlN0cmluZygpICsgIlxuIikKCXNiLldyaXRlU3RyaW5nKCIqKkZyZWVsYW5jZXI6KiogIiArIGMuRnJlZWxhbmNlci5TdHJpbmcoKSArICJcbiIpCglzYi5Xcml0ZVN0cmluZygiKipTdGF0dXM6KiogIiArIHN0cmluZyhjLlN0YXR1cykgKyAiXG4iKQoJc2IuV3JpdGVTdHJpbmcoIioqQ3JlYXRlZDoqKiBibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQoYy5DcmVhdGVkQXQsIDEwKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCIqKlRvdGFsIFZhbHVlOioqICIgKyBzdHJjb252LkZvcm1hdEludChjb250cmFjdFRvdGFsKGMpLCAxMCkgKyAiIHVnbm90XG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIE1pbGVzdG9uZXNcblxuIikKCWZvciBfLCBtcyA6PSByYW5nZSBjLk1pbGVzdG9uZXMgewoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiLSAqKiVzKiog4oCUICVkIHVnbm90IFslc10iLCBtcy5UaXRsZSwgbXMuQW1vdW50LCBzdHJpbmcobXMuU3RhdHVzKSkpCgkJaWYgbXMuRnVuZGVkQXQgPiAwIHsKCQkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIgKGZ1bmRlZCBibG9jayAlZCkiLCBtcy5GdW5kZWRBdCkpCgkJfQoJCWlmIG1zLkNvbXBsZXRlZEF0ID4gMCB7CgkJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIChjb21wbGV0ZWQgYmxvY2sgJWQpIiwgbXMuQ29tcGxldGVkQXQpKQoJCX0KCQlpZiBtcy5EaXNwdXRlZEF0ID4gMCB7CgkJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIChkaXNwdXRlZCBibG9jayAlZCkiLCBtcy5EaXNwdXRlZEF0KSkKCQl9CgkJc2IuV3JpdGVTdHJpbmcoIlxuIikKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclN0YXRzKCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIEVzY3JvdyBTdGF0c1xuXG4iKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqKkNyZWF0ZWQ6KiogJWRcbiIsIG5leHRJRCkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIioqT3BlbjoqKiAlZCAoYXQgbW9zdCAlZCBwZXIgY2xpZW50KVxuIiwgYWN0aXZlQ291bnQsIE1heEFjdGl2ZVBlckNsaWVudCkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIioqU2V0dGxlZCwgbm90IGFyY2hpdmVkOioqICVkXG4iLCBjb250cmFjdHMuU2l6ZSgpLWFjdGl2ZUNvdW50KSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKipBcmNoaXZlZDoqKiAlZFxuIiwgYXJjaGl2ZWRDb3VudCkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIioqTGlhYmlsaXRpZXM6KiogJWQgdWdub3RcbiIsIHRvdGFsTGlhYmxlKSkKCXAgOj0gUGF1c2VTdGF0ZSgpCglzd2l0Y2ggewoJY2FzZSAhcC5QYXVzZWQ6CgkJc2IuV3JpdGVTdHJpbmcoIioqUGF1c2VkOioqIG5vXG4iKQoJY2FzZSAhcC5FeGl0c09wZW46CgkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqKlBhdXNlZDoqKiB5ZXMsIHNpbmNlIGJsb2NrICVkOyBleGl0cyByZW9wZW4gYXQgYmxvY2sgJWRcbiIsIHAuUGF1c2VkQXQsIHAuRXhpdHNSZW9wZW5BdCkpCglkZWZhdWx0OgoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKipQYXVzZWQ6KiogbmV3IGNvbnRyYWN0cyBhbmQgZnVuZGluZyBvbmx5LCBzaW5jZSBibG9jayAlZFxuIiwgcC5QYXVzZWRBdCkpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gY29udHJhY3RUb3RhbCBjYW5ub3Qgb3ZlcmZsb3c6IENyZWF0ZUNvbnRyYWN0IHJlZnVzZXMgdG90YWxzIGFib3ZlIGludDY0LgpmdW5jIGNvbnRyYWN0VG90YWwoYyAqQ29udHJhY3QpIGludDY0IHsKCXRvdGFsIDo9IGludDY0KDApCglmb3IgXywgbXMgOj0gcmFuZ2UgYy5NaWxlc3RvbmVzIHsKCQl0b3RhbCArPSBtcy5BbW91bnQKCX0KCXJldHVybiB0b3RhbAp9CgpmdW5jIHRydW5jQWRkcihhZGRyIGFkZHJlc3MpIHN0cmluZyB7CglzIDo9IGFkZHIuU3RyaW5nKCkKCWlmIGxlbihzKSA+IDEzIHsKCQlyZXR1cm4gc1s6MTBdICsgIi4uLiIKCX0KCXJldHVybiBzCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0xNTAwMDAwMHVnbm90EhMIgIjevgESCzMwMDAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQL8Ref3Z77gstEDF0VziT7LGjvHWglJWtQSqnATDfoata6QiLC01xVZrsg1X27S3rYg3DWvM5iPPeUFGyUvVjtUSQH5BVeT/1AgYB21hlLmlHBCGitgszLzin0OxSqklCnSdPG00j+vQIonUNUv4HZJu04InAoMPVWCC7+5PAZ9mYkAaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=