Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
CD9967AF1818477B23808957E0F5FFBEA0069336B6833675CC04B084C9F1BB26
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
40,000,000
Requested gas limit
GAS USED
39,839,805
Gas consumed
FEE
50000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g17khqpukees4237dtn3astzapmp462vjhsz6st4
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cr34AQoML3ZtLm1fYWRkcGtnEqv4AQooZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NBL99wEKBmV4cGVjdBI6Z25vLmxhbmQvcC9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L2V4cGVjdBqHEQoJUkVBRE1FLm1kEvkQIyBFeHBlY3QgUGFja2FnZQoKUGFja2FnZSBmb3IgdGVzdGluZyBHbm8gcGFja2FnZXMgYW5kIHJlYWxtcyB1c2luZyBmdW5jdGlvbiBjaGFpbmluZyBhbmQgZXhwcmVzc2l2ZSBzZW1hbnRpY3MuCgojIyBBc3NlcnRpbmcgVmFsdWVzCgpVc2UgYFZhbHVlKClgIHRvIGNoZWNrIHRoYXQgYSB2YWx1ZSBtZWV0cyBleHBlY3RhdGlvbnMuIENoYWluIGBOb3QoKWAgdG8gbmVnYXRlIGFuIGFzc2VydGlvbiwKYW5kIHVzZSBgQXNJbnQoKWAsIGBBc1N0cmluZygpYCwgYEFzQm9vbGVhbigpYCAoYW5kIHNpbWlsYXIpIHRvIG5hcnJvdyB0byB0eXBlLXNwZWNpZmljIGFzc2VydGlvbnMuCgpbZW1iZWRtZF06IyAocmVhZG1lX3ZhbHVlX3Rlc3QuZ25vIGdvKQpgYGBnbwpwYWNrYWdlIGV4cGVjdF90ZXN0CgppbXBvcnQgKAoJImVycm9ycyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL2cxN2tocXB1a2VlczQyMzdkdG4zYXN0emFwbXA0NjJ2amhzejZzdDQvZXhwZWN0IgopCgpmdW5jIFRlc3RSZWFkbWVWYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKCS8vIEFzc2VydCBpbnRlZ2VyIHZhbHVlCglzY29yZSA6PSA0MgoJZXhwZWN0LlZhbHVlKHQsIHNjb3JlKS5Ub0VxdWFsKDQyKQoJZXhwZWN0LlZhbHVlKHQsIHNjb3JlKS5Ob3QoKS5Ub0VxdWFsKDApCglleHBlY3QuVmFsdWUodCwgc2NvcmUpLkFzSW50KCkuVG9CZUxvd2VyVGhhbigxMDApCgoJLy8gQXNzZXJ0IHN0cmluZyB2YWx1ZQoJbmFtZSA6PSAiQWxpY2UiCglleHBlY3QuVmFsdWUodCwgbmFtZSkuQXNTdHJpbmcoKS5Ub0VxdWFsKCJBbGljZSIpCglleHBlY3QuVmFsdWUodCwgbmFtZSkuQXNTdHJpbmcoKS5Ub0hhdmVMZW5ndGgoNSkKCgkvLyBBc3NlcnQgYm9vbGVhbiB2YWx1ZQoJZXhwZWN0LlZhbHVlKHQsIHRydWUpLkFzQm9vbGVhbigpLlRvQmVUcnV0aHkoKQoKCS8vIEFzc2VydCBwb2ludGVyIHZhbHVlCgl2YXIgdiBhbnkKCWV4cGVjdC5WYWx1ZSh0LCB2KS5Ub0JlTmlsKCkKCgkvLyBBc3NlcnQgZXJyb3IgdmFsdWUKCWVyciA6PSBlcnJvcnMuTmV3KCJmb28gYmFyIikKCWV4cGVjdC5WYWx1ZSh0LCBlcnIpLlRvRXF1YWwoZXJyKQoJZXhwZWN0LlZhbHVlKHQsIGVycikuVG9Db250YWluRXJyb3JTdHJpbmcoImZvbyIpCn0KYGBgCgojIyBBc3NlcnRpbmcgRnVuY3Rpb25zCgpVc2UgYEZ1bmMoKWAgdG8gY2hlY2sgdGhhdCBhIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IsIHBhbmljcywgb3IgcmV0dXJucyBhbiBleHBlY3RlZCB2YWx1ZS4KQ2hhaW4gYC5Ub0ZhaWwoKWAsIGAuVG9QYW5pYygpYCwgb3IgYC5Ub1JldHVybigpYCBhbmQgdGhlbiBhc3NlcnQgdGhlIG1lc3NhZ2Ugb3IgdmFsdWUuCgpQYWNrYWdlIHN1cHBvcnRzIGZvdXIgdHlwZSBvZiBmdW5jdGlvbnM6CgotIGZ1bmMoKQotIGZ1bmMoKSBhbnkKLSBmdW5jKCkgZXJyb3IKLSBmdW5jKCkgKGFueSwgZXJyb3IpCgpbZW1iZWRtZF06IyAocmVhZG1lX2Z1bmNfdGVzdC5nbm8gZ28pCmBgYGdvCnBhY2thZ2UgZXhwZWN0X3Rlc3QKCmltcG9ydCAoCgkiZXJyb3JzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9leHBlY3QiCikKCmZ1bmMgVGVzdFJlYWRtZUZ1bmModCAqdGVzdGluZy5UKSB7Cglmb28gOj0gZnVuYygpIGludCB7CgkJcmV0dXJuIDQyCgl9CgoJZm9vUGFuaWMgOj0gZnVuYygpIHsKCQlwYW5pYygiYm9vbSEiKQoJfQoKCWVyciA6PSBlcnJvcnMuTmV3KCJib29tISIpCglmb29FcnJvciA6PSBmdW5jKGVyciBlcnJvcikgZXJyb3IgewoJCXJldHVybiBlcnIKCX0KCgkvLyBBc3NlcnQgdGhhdCAiZm9vRXJyb3IiIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IKCWV4cGVjdC5GdW5jKHQsIGZ1bmMoKSBlcnJvciB7CgkJcmV0dXJuIGZvb0Vycm9yKGVycikKCX0pLlRvRmFpbCgpLldpdGhFcnJvcihlcnIpCgoJLy8gQXNzZXJ0IHRoYXQgImZvb1BhbmljIiBmdW5jdGlvbiBwYW5pY3Mgd2l0aCBhIG1lc3NhZ2UKCWV4cGVjdC5GdW5jKHQsIGZ1bmMoKSB7CgkJZm9vUGFuaWMoKQoJfSkuVG9QYW5pYygpLldpdGhNZXNzYWdlKCJib29tISIpCgoJLy8gQXNzZXJ0IHRoYXQgImZvbyIgZnVuY3Rpb24gcmV0dXJucyA0MgoJZXhwZWN0LkZ1bmModCwgZnVuYygpIGFueSB7CgkJcmV0dXJuIGZvbygpCgl9KS5Ub1JldHVybig0MikKfQpgYGAKGo4PCgtib29sZWFuLmdubxL+DnBhY2thZ2UgZXhwZWN0CgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gTmV3Qm9vbGVhbkNoZWNrZXIgY3JlYXRlcyBhIG5ldyBjaGVja2VyIG9mIGJvb2xlYW4gdmFsdWVzCmZ1bmMgTmV3Qm9vbGVhbkNoZWNrZXIoY3R4IENvbnRleHQsIHZhbHVlIGJvb2wpIEJvb2xlYW5DaGVja2VyIHsKCXJldHVybiBCb29sZWFuQ2hlY2tlcntjdHgsIHZhbHVlfQp9CgovLyBCb29sZWFuQ2hlY2tlciBhc3NlcnRzIGJvb2xlYW4gdmFsdWVzLgp0eXBlIEJvb2xlYW5DaGVja2VyIHN0cnVjdCB7CgljdHggICBDb250ZXh0Cgl2YWx1ZSBib29sCn0KCi8vIE5vdCBuZWdhdGVzIHRoZSBuZXh0IGNhbGxlZCBleHBlY3RhdGlvbi4KZnVuYyAoYyBCb29sZWFuQ2hlY2tlcikgTm90KCkgQm9vbGVhbkNoZWNrZXIgewoJYy5jdHgubmVnYXRlZCA9ICFjLmN0eC5uZWdhdGVkCglyZXR1cm4gYwp9CgovLyBUb0VxdWFsIGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIGFuIGV4cGVjdGVkIHZhbHVlLgpmdW5jIChjIEJvb2xlYW5DaGVja2VyKSBUb0VxdWFsKHYgYm9vbCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPT0gdiwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQlnb3QgOj0gZm9ybWF0Qm9vbGVhbihjLnZhbHVlKQoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQl3YW50IDo9IGZvcm1hdEJvb2xlYW4odikKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIG1hdGNoXG5Hb3Q6ICVzXG5XYW50OiAlcyIsIGdvdCwgd2FudCkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGRpZmZlcmVudFxuR290OiAlcyIsIGdvdCkKCX0pCn0KCi8vIFRvQmVGYWxzeSBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBmYWxzeS4KZnVuYyAoYyBCb29sZWFuQ2hlY2tlcikgVG9CZUZhbHN5KCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKCFjLnZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gIkV4cGVjdGVkIHZhbHVlIHRvIGJlIGZhbHN5IgoJCX0KCQlyZXR1cm4gIkV4cGVjdGVkIHZhbHVlIG5vdCB0byBiZSBmYWxzeSIKCX0pCn0KCi8vIFRvQmVUcnV0aHkgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgdHJ1dGh5LgpmdW5jIChjIEJvb2xlYW5DaGVja2VyKSBUb0JlVHJ1dGh5KCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiAiRXhwZWN0ZWQgdmFsdWUgdG8gYmUgdHJ1dGh5IgoJCX0KCQlyZXR1cm4gIkV4cGVjdGVkIHZhbHVlIG5vdCB0byBiZSB0cnV0aHkiCgl9KQp9CgpmdW5jIGFzQm9vbGVhbih2YWx1ZSBhbnkpIChib29sLCBlcnJvcikgewoJaWYgdmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gZmFsc2UsIG5pbAoJfQoKCXZhciBzIHN0cmluZwoJc3dpdGNoIHYgOj0gdmFsdWUuKHR5cGUpIHsKCWNhc2UgYm9vbDoKCQlyZXR1cm4gdiwgbmlsCgljYXNlIHN0cmluZzoKCQlzID0gdgoJY2FzZSBbXWJ5dGU6CgkJcyA9IHN0cmluZyh2KQoJY2FzZSBTdHJpbmdlcjoKCQlzID0gdi5TdHJpbmcoKQoJZGVmYXVsdDoKCQlyZXR1cm4gZmFsc2UsIEVyckluY29tcGF0aWJsZVR5cGUKCX0KCglpZiBzICE9ICIiIHsKCQlyZXR1cm4gc3RyY29udi5QYXJzZUJvb2wocykKCX0KCXJldHVybiBmYWxzZSwgbmlsCn0KCmZ1bmMgZm9ybWF0Qm9vbGVhbih2YWx1ZSBib29sKSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0Qm9vbCh2YWx1ZSkKfQoaqRAKC2NvbnRleHQuZ25vEpkQcGFja2FnZSBleHBlY3QKCmltcG9ydCAoCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCBkZWZhdWx0QXNzZXJ0RmFpbE1zZyA9ICJhc3NlcnQgZXhwZWN0YXRpb24gZmFpbGVkIgoKLy8gTmV3Q29udGV4dCBjcmVhdGVzIGEgbmV3IHRlc3RpbmcgY29udGV4dC4KZnVuYyBOZXdDb250ZXh0KHQgVGVzdGluZ1QpIENvbnRleHQgewoJcmV0dXJuIENvbnRleHR7dDogdH0KfQoKLy8gQ29udGV4dCBwcmVzZXJ2ZXMgdGhlIGN1cnJlbnQgdGVzdGluZyBjb250ZXh0Lgp0eXBlIENvbnRleHQgc3RydWN0IHsKCXQgICAgICAgVGVzdGluZ1QKCW5lZ2F0ZWQgYm9vbAoJcHJlZml4ICBzdHJpbmcKfQoKLy8gVCByZXR1cm5zIGNvbnRleHQncyB0ZXN0aW5nIFQgaW5zdGFuY2UuCmZ1bmMgKGMgQ29udGV4dCkgVCgpIFRlc3RpbmdUIHsKCWlmIGMudCA9PSBuaWwgewoJCXBhbmljKCJleHBlY3Q6IGNvbnRleHQgaXMgbm90IGluaXRpYWxpemVkIikKCX0KCXJldHVybiBjLnQKfQoKLy8gUHJlZml4IHJldHVybnMgY29udGV4dCdzIGVycm9yIHByZWZpeC4KZnVuYyAoYyBDb250ZXh0KSBQcmVmaXgoKSBzdHJpbmcgewoJcmV0dXJuIGMucHJlZml4Cn0KCi8vIElzTmVnYXRlZCBjaGVja3MgaWYgY3VycmVudCBjb250ZXh0IG5lZ2F0ZXMgY3VycmVudCBhc3NlcnQgZXhwZWN0YXRpb25zLgpmdW5jIChjIENvbnRleHQpIElzTmVnYXRlZCgpIGJvb2wgewoJcmV0dXJuIGMubmVnYXRlZAp9CgovLyBDaGVja0V4cGVjdGF0aW9uIGNoZWNrcyBhbiBhc3NlcnQgZXhwZWN0YXRpb24gYW5kIGNhbGxzIGEgY2FsbGJhY2sgb24gZmFpbC4KLy8gSXQgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGFzc2VydGVkIGV4cGVjdGF0aW9uIGZhaWxzLgovLyBDYWxsYmFjayBpcyBjYWxsZWQgd2hlbiBhIG5lZ2F0ZWQgYXNzZXJ0aW9uIHN1Y2NlZWRzIG9yIHdoZW4gbm9uIG5lZ2F0ZWQgYXNzZXJ0aW9uIGZhaWxzLgpmdW5jIChjIENvbnRleHQpIENoZWNrRXhwZWN0YXRpb24oc3VjY2VzcyBib29sLCBjYiBmdW5jKENvbnRleHQpIHN0cmluZykgYm9vbCB7CglmYWlsZWQgOj0gKGMubmVnYXRlZCAmJiBzdWNjZXNzKSB8fCAoIWMubmVnYXRlZCAmJiAhc3VjY2VzcykKCWlmIGZhaWxlZCB7CgkJbXNnIDo9IGNiKGMpCgkJaWYgc3RyaW5ncy5UcmltU3BhY2UobXNnKSA9PSAiIiB7CgkJCW1zZyA9IGRlZmF1bHRBc3NlcnRGYWlsTXNnCgkJfQoKCQljLkZhaWwobXNnKQoJfQoJcmV0dXJuIGZhaWxlZAp9CgovLyBGYWlsIG1ha2VzIHRoZSBjdXJyZW50IHRlc3QgZmFpbCB3aXRoIGEgY3VzdG9tIG1lc3NhZ2UuCmZ1bmMgKGMgQ29udGV4dCkgRmFpbChtc2cgc3RyaW5nLCBhcmdzIC4uLmFueSkgewoJaWYgYy5wcmVmaXggIT0gIiIgewoJCW1zZyA9IGMucHJlZml4ICsgIiAtICIgKyBtc2cKCX0KCgljLnQuRmF0YWxmKG1zZywgYXJncy4uLikKfQoKLy8gVGVzdGluZ1QgZGVmaW5lcyBhIG1pbmltYWwgaW50ZXJmYWNlIGZvciBgdGVzdGluZy5UYCBpbnN0YW5jZXMuCnR5cGUgVGVzdGluZ1QgaW50ZXJmYWNlIHsKCUhlbHBlcigpCglGYXRhbChhcmdzIC4uLmFueSkKCUZhdGFsZihmb3JtYXQgc3RyaW5nLCBhcmdzIC4uLmFueSkKfQoKLy8gTW9ja1Rlc3RpbmdUIGNyZWF0ZXMgYSBuZXcgdGVzdGluZyBtb2NrIHRoYXQgd3JpdGVzIHRlc3Rpbmcgb3V0cHV0IHRvIGEgc3RyaW5nIGJ1aWxkZXIuCmZ1bmMgTW9ja1Rlc3RpbmdUKG91dHB1dCAqc3RyaW5ncy5CdWlsZGVyKSBUZXN0aW5nVCB7CglyZXR1cm4gJnRlc3RpbmdUe291dHB1dH0KfQoKdHlwZSB0ZXN0aW5nVCBzdHJ1Y3R7IGJ1ZiAqc3RyaW5ncy5CdWlsZGVyIH0KCmZ1bmMgKHRlc3RpbmdUKSBIZWxwZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAge30KZnVuYyAodCB0ZXN0aW5nVCkgRmF0YWwoYXJncyAuLi5hbnkpICAgICAgICAgICAgICB7IHQuYnVmLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50bG4oYXJncy4uLikpIH0KZnVuYyAodCB0ZXN0aW5nVCkgRmF0YWxmKGZtdCBzdHJpbmcsIGFyZ3MgLi4uYW55KSB7IHQuYnVmLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZihmbXQrIlxuIiwgYXJncy4uLikpIH0KGs8ICgdkb2MuZ25vEsMILy8gUGFja2FnZSBleHBlY3QgcHJvdmlkZXMgdGVzdGluZyBzdXBwb3J0IGZvciBwYWNrYWdlcyBhbmQgcmVhbG1zLgovLwovLyBWYWx1ZXMgY2FuIGJlIGFzc2VydGVkIHVzaW5nIHRoZSBgVmFsdWUoKWAgZnVuY3Rpb24sIGZvciBleGFtcGxlOgovLwovLwlmdW5jIFRlc3RGb28odCAqdGVzdGluZy5UKSB7Ci8vCSAgZ290IDo9IDQyCi8vCSAgZXhwZWN0LlZhbHVlKHQsIGdvdCkuVG9FcXVhbCg0MikKLy8JICBleHBlY3QuVmFsdWUodCwgZ290KS5Ob3QoKS5Ub0VxdWFsKDApCi8vCi8vCSAgZXhwZWN0LlZhbHVlKHQsICJmb28iKS5Ub0VxdWFsKCJmb28iKQovLwkgIGV4cGVjdC5WYWx1ZSh0LCA0MikuQXNJbnQoKS5Ob3QoKS5Ub0JlR3JlYXRlclRoYW4oNTApCi8vCSAgZXhwZWN0LlZhbHVlKHQsICJUUlVFIikuQXNCb29sZWFuKCkuVG9CZVRydXRoeSgpCi8vCX0KLy8KLy8gRnVuY3Rpb25zIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzZXJ0IHJldHVybmVkIHZhbHVlcywgZXJyb3JzIG9yIHBhbmljcy4KLy8KLy8gUGFja2FnZSBzdXBwb3J0cyBmb3VyIHR5cGUgb2YgZnVuY3Rpb25zOgovLwovLyAgIC0gZnVuYygpCi8vICAgLSBmdW5jKCkgYW55Ci8vICAgLSBmdW5jKCkgZXJyb3IKLy8gICAtIGZ1bmMoKSAoYW55LCBlcnJvcikKLy8KLy8gRnVuY3Rpb25zIGNhbiBiZSBhc3NlcnRlZCB1c2luZyB0aGUgYEZ1bmMoKWAgZnVuY3Rpb24sIGZvciBleGFtcGxlOgovLwovLwlmdW5jIFRlc3RGb28odCAqdGVzdGluZy5UKSB7Ci8vCSAgZXhwZWN0LkZ1bmModCwgZnVuYygpIHsKLy8JICAgIHBhbmljKCJCb29tISIpCi8vCSAgfSkuVG9QYW5pYygpLldpdGhNZXNzYWdlKCJCb29tISIpCi8vCi8vCSAgd2FudEVyciA6PSBlcnJvcnMuTmV3KCJCb29tISIpCi8vCSAgZXhwZWN0LkZ1bmModCwgZnVuYygpIGVycm9yIHsKLy8JICAgIHJldHVybiB3YW50RXJyCi8vCSAgfSkuVG9GYWlsKCkuV2l0aE1lc3NhZ2UoIkJvb20hIikKLy8KLy8JICBleHBlY3QuRnVuYyh0LCBmdW5jKCkgZXJyb3IgewovLwkgICAgcmV0dXJuIHdhbnRFcnIKLy8JICB9KS5Ub0ZhaWwoKS5XaXRoRXJyb3Iod2FudEVycikKLy8JfQpwYWNrYWdlIGV4cGVjdAoaoAoKCWVycm9yLmdubxKSCnBhY2thZ2UgZXhwZWN0CgppbXBvcnQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCi8vIE5ld0Vycm9yQ2hlY2tlciBjcmVhdGVzIGEgbmV3IGNoZWNrZXIgb2YgZXJyb3JzLgpmdW5jIE5ld0Vycm9yQ2hlY2tlcihjdHggQ29udGV4dCwgZXJyIGVycm9yKSBFcnJvckNoZWNrZXIgewoJcmV0dXJuIEVycm9yQ2hlY2tlcntjdHgsIGVycn0KfQoKLy8gRXJyb3JDaGVja2VyIGFzc2VydHMgZXJyb3IgdmFsdWVzLgp0eXBlIEVycm9yQ2hlY2tlciBzdHJ1Y3QgewoJY3R4IENvbnRleHQKCWVyciBlcnJvcgp9CgovLyBOb3QgbmVnYXRlcyB0aGUgbmV4dCBjYWxsZWQgZXhwZWN0YXRpb24uCmZ1bmMgKGMgRXJyb3JDaGVja2VyKSBOb3QoKSBFcnJvckNoZWNrZXIgewoJYy5jdHgubmVnYXRlZCA9ICFjLmN0eC5uZWdhdGVkCglyZXR1cm4gYwp9CgovLyBXaXRoTWVzc2FnZSBhc3NlcnRzIHRoYXQgY3VycmVudCBlcnJvciBjb250YWlucyBhbiBleHBlY3RlZCBtZXNzYWdlLgpmdW5jIChjIEVycm9yQ2hlY2tlcikgV2l0aE1lc3NhZ2UobXNnIHN0cmluZykgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJaWYgYy5lcnIgPT0gbmlsIHsKCQljLmN0eC5GYWlsKCJFeHBlY3RlZCBhbiBlcnJvciB3aXRoIG1lc3NhZ2VcbkdvdDogbmlsXG5XYW50OiAlcyIsIG1zZykKCQlyZXR1cm4KCX0KCglOZXdNZXNzYWdlQ2hlY2tlcihjLmN0eCwgYy5lcnIuRXJyb3IoKSwgTWVzc2FnZVR5cGVFcnJvcikuV2l0aE1lc3NhZ2UobXNnKQp9CgovLyBXaXRoRXJyb3IgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgZXJyb3IgbWVzc2FnZSBpcyB0aGUgc2FtZSBhcyBhbiBleHBlY3RlZCBlcnJvci4KZnVuYyAoYyBFcnJvckNoZWNrZXIpIFdpdGhFcnJvcihlcnIgZXJyb3IpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoKCWlmIGMuZXJyID09IG5pbCB7CgkJaWYgZXJyICE9IG5pbCB7CgkJCWMuY3R4LkZhaWwoIkV4cGVjdGVkIGFuIGVycm9yXG5Hb3Q6IG5pbFxuV2FudDogJXMiLCBlcnIuRXJyb3IoKSkKCQl9CgkJcmV0dXJuCgl9CgoJZ290IDo9IGMuZXJyLkVycm9yKCkKCWMuY3R4LkNoZWNrRXhwZWN0YXRpb24oZ290ID09IGVyci5FcnJvcigpLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCBlcnJvcnMgdG8gbWF0Y2hcbkdvdDogJXNcbldhbnQ6ICVzIiwgZ290LCBlcnIuRXJyb3IoKSkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgZXJyb3JzIHRvIGJlIGRpZmZlcmVudFxuR290OiAlcyIsIGdvdCkKCX0pCn0KGp8ZCglmbG9hdC5nbm8SkRlwYWNrYWdlIGV4cGVjdAoKaW1wb3J0ICgKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIE5ld0Zsb2F0Q2hlY2tlciBjcmVhdGVzIGEgbmV3IGNoZWNrZXIgb2YgZmxvYXQ2NCB2YWx1ZXMuCmZ1bmMgTmV3RmxvYXRDaGVja2VyKGN0eCBDb250ZXh0LCB2YWx1ZSBmbG9hdDY0KSBGbG9hdENoZWNrZXIgewoJcmV0dXJuIEZsb2F0Q2hlY2tlcntjdHgsIHZhbHVlfQp9CgovLyBGbG9hdENoZWNrZXIgYXNzZXJ0cyBmbG9hdDY0IHZhbHVlcy4KdHlwZSBGbG9hdENoZWNrZXIgc3RydWN0IHsKCWN0eCAgIENvbnRleHQKCXZhbHVlIGZsb2F0NjQKfQoKLy8gTm90IG5lZ2F0ZXMgdGhlIG5leHQgY2FsbGVkIGV4cGVjdGF0aW9uLgpmdW5jIChjIEZsb2F0Q2hlY2tlcikgTm90KCkgRmxvYXRDaGVja2VyIHsKCWMuY3R4Lm5lZ2F0ZWQgPSAhYy5jdHgubmVnYXRlZAoJcmV0dXJuIGMKfQoKLy8gVG9FcXVhbCBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBlcXVhbCB0byBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBGbG9hdENoZWNrZXIpIFRvRXF1YWwodmFsdWUgZmxvYXQ2NCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPT0gdmFsdWUsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJZ290IDo9IGZvcm1hdEZsb2F0KGMudmFsdWUpCgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXdhbnQgOj0gZm9ybWF0RmxvYXQodmFsdWUpCgkJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlcyB0byBtYXRjaFxuR290OiAlc1xuV2FudDogJXMiLCBnb3QsIHdhbnQpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIGJlIGRpZmZlcmVudFxuR290OiAlcyIsIGdvdCkKCX0pCn0KCi8vIFRvQmVHcmVhdGVyVGhhbiBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgRmxvYXRDaGVja2VyKSBUb0JlR3JlYXRlclRoYW4odmFsdWUgZmxvYXQ2NCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPiB2YWx1ZSwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQlnb3QgOj0gZm9ybWF0RmxvYXQoYy52YWx1ZSkKCQl3YW50IDo9IGZvcm1hdEZsb2F0KHZhbHVlKQoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZXMgdG8gYmUgZ2VyYXRlciB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJCX0KCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZSB0byBub3QgdG8gYmUgZ3JlYXRlciB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJfSkKfQoKLy8gVG9CZUdyZWF0ZXJPckVxdWFsVGhhbiBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgRmxvYXRDaGVja2VyKSBUb0JlR3JlYXRlck9yRXF1YWxUaGFuKHZhbHVlIGZsb2F0NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlID49IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRGbG9hdChjLnZhbHVlKQoJCXdhbnQgOj0gZm9ybWF0RmxvYXQodmFsdWUpCgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlcyB0byBiZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIG5vdCB0byBiZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgl9KQp9CgovLyBUb0JlTG93ZXJUaGFuIGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGlzIGxvd2VyIHRoYW4gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgRmxvYXRDaGVja2VyKSBUb0JlTG93ZXJUaGFuKHZhbHVlIGZsb2F0NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlIDwgdmFsdWUsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJZ290IDo9IGZvcm1hdEZsb2F0KGMudmFsdWUpCgkJd2FudCA6PSBmb3JtYXRGbG9hdCh2YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGxvd2VyIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIG5vdCB0byBiZSBsb3dlciB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJfSkKfQoKLy8gVG9CZUxvd2VyT3JFcXVhbFRoYW4gYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBGbG9hdENoZWNrZXIpIFRvQmVMb3dlck9yRXF1YWxUaGFuKHZhbHVlIGZsb2F0NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlIDw9IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRGbG9hdChjLnZhbHVlKQoJCXdhbnQgOj0gZm9ybWF0RmxvYXQodmFsdWUpCgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlcyB0byBiZSBsb3dlciBvciBlcXVhbCB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJCX0KCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZSB0byBub3QgdG8gYmUgbG93ZXIgb3IgZXF1YWwgdGhhbiAlc1xuR290OiAlcyIsIHdhbnQsIGdvdCkKCX0pCn0KCmZ1bmMgZm9ybWF0RmxvYXQodmFsdWUgZmxvYXQ2NCkgc3RyaW5nIHsKCXJldHVybiBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIC0xLCA2NCkKfQoKZnVuYyBhc0Zsb2F0KHZhbHVlIGFueSkgKGZsb2F0NjQsIGVycm9yKSB7Cglzd2l0Y2ggdiA6PSB2YWx1ZS4odHlwZSkgewoJY2FzZSBmbG9hdDMyOgoJCXJldHVybiBmbG9hdDY0KHYpLCBuaWwKCWNhc2UgZmxvYXQ2NDoKCQlyZXR1cm4gdiwgbmlsCglkZWZhdWx0OgoJCXJldHVybiAwLCBFcnJJbmNvbXBhdGlibGVUeXBlCgl9Cn0KGqQmCghmdW5jLmdubxKXJnBhY2thZ2UgZXhwZWN0CgppbXBvcnQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCnR5cGUgKAoJLy8gRm4gZGVmaW5lcyBhIHR5cGUgZm9yIGdlbmVyaWMgZnVuY3Rpb25zLgoJRm4gPSBmdW5jKCkKCgkvLyBFcnJvckZuIGRlZmluZXMgYSB0eXBlIGZvciBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhbiBlcnJvci4KCUVycm9yRm4gPSBmdW5jKCkgZXJyb3IKCgkvLyBBbnlGbiBkZWZpbmVzIGEgdHlwZSBmb3IgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCByZXR1cm5zIGEgdmFsdWUuCglBbnlGbiA9IGZ1bmMoKSBhbnkKCgkvLyBBbnlFcnJvckZuIGRlZmluZXMgYSB0eXBlIGZvciBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhIHZhbHVlIGFuZCBhbiBlcnJvci4KCUFueUVycm9yRm4gPSBmdW5jKCkgKGFueSwgZXJyb3IpCikKCi8vIEZ1bmMgY3JlYXRlcyBhIG5ldyBjaGVja2VyIGZvciBmdW5jdGlvbnMuCmZ1bmMgRnVuYyh0IFRlc3RpbmdULCBmbiBhbnkpIEZ1bmNDaGVja2VyIHsKCXJldHVybiBGdW5jQ2hlY2tlcnsKCQljdHg6IE5ld0NvbnRleHQodCksCgkJZm46ICBmbiwKCX0KfQoKLy8gRnVuY0NoZWNrZXIgYXNzZXJ0cyBmdW5jdGlvbiBwYW5pY3MsIGVycm9ycyBhbmQgcmV0dXJuZWQgdmFsdWUuCnR5cGUgRnVuY0NoZWNrZXIgc3RydWN0IHsKCWN0eCBDb250ZXh0CglmbiAgYW55Cn0KCi8vIFdpdGhGYWlsUHJlZml4IGFzc2lnbnMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIHByZWZpeGVkIHRvIHRlc3RpbmcgZXJyb3JzIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzLgpmdW5jIChjIEZ1bmNDaGVja2VyKSBXaXRoRmFpbFByZWZpeChwcmVmaXggc3RyaW5nKSBGdW5jQ2hlY2tlciB7CgljLmN0eC5wcmVmaXggPSBwcmVmaXgKCXJldHVybiBjCn0KCi8vIE5vdCBuZWdhdGVzIHRoZSBuZXh0IGNhbGxlZCBleHBlY3RhdGlvbi4KZnVuYyAoYyBGdW5jQ2hlY2tlcikgTm90KCkgRnVuY0NoZWNrZXIgewoJYy5jdHgubmVnYXRlZCA9ICFjLmN0eC5uZWdhdGVkCglyZXR1cm4gYwp9CgovLyBUb0ZhaWwgcmV0dXJuIGFuIGVycm9yIGNoZWNrZXIgdG8gYXNzZXJ0IGlmIGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvci4KZnVuYyAoYyBGdW5jQ2hlY2tlcikgVG9GYWlsKCkgRXJyb3JDaGVja2VyIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoKCXZhciBlcnIgZXJyb3IKCXN3aXRjaCBmbiA6PSBjLmZuLih0eXBlKSB7CgljYXNlIEVycm9yRm46CgkJZXJyID0gZm4oKQoJY2FzZSBBbnlFcnJvckZuOgoJCV8sIGVyciA9IGZuKCkKCWRlZmF1bHQ6CgkJYy5jdHguRmFpbCgiVW5zdXBwb3J0ZWQgZXJyb3IgZnVuYyB0eXBlXG5Hb3Q6ICVUIiwgYy5mbikKCQlyZXR1cm4gRXJyb3JDaGVja2Vye30KCX0KCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGVyciAhPSBuaWwsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiAiRXhwZWN0ZWQgZnVuYyB0byByZXR1cm4gYW4gZXJyb3IiCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkZ1bmMgZmFpbGVkIHdpdGggZXJyb3JcbkdvdDogJXMiLCBlcnIuRXJyb3IoKSkKCX0pCgoJcmV0dXJuIE5ld0Vycm9yQ2hlY2tlcihjLmN0eCwgZXJyKQp9CgovLyBUb1BhbmljIHJldHVybiBhbiBtZXNzYWdlIGNoZWNrZXIgdG8gYXNzZXJ0IGlmIGN1cnJlbnQgZnVuY3Rpb24gcGFuaWNrZWQuCi8vIFRoaXMgYXNzZXJ0aW9uIGlzIGhhbmRsZWQgd2l0aGluIHRoZSBzYW1lIHJlYWxtLCB0byBhc3NlcnQgcGFuaWNzIHdoZW4gY3Jvc3NpbmcKLy8gdG8gYW5vdGhlciByZWFsbSB1c2UgdGhlIGBUb0Fib3J0KClgIGFzc2VydGlvbi4KLy8KLy8gRXhhbXBsZSB1c2FnZToKLy8KLy8JZnVuYyBUZXN0Rm9vKHQgKnRlc3RpbmcuVCkgewovLwkgIGV4cGVjdC5GdW5jKHQsIGZ1bmMoKSB7Ci8vCSAgICBGb28oY3Jvc3MpCi8vCSAgfSkuTm90KCkuVG9Dcm9zc1BhbmljKCkKLy8JfQpmdW5jIChjIEZ1bmNDaGVja2VyKSBUb1BhbmljKCkgTWVzc2FnZUNoZWNrZXIgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJdmFyICgKCQltc2cgICAgICBzdHJpbmcKCQlwYW5pY2tlZCBib29sCgkpCgoJc3dpdGNoIGZuIDo9IGMuZm4uKHR5cGUpIHsKCWNhc2UgRm46CgkJbXNnLCBwYW5pY2tlZCA9IGhhbmRsZVBhbmljKGZuKQoJY2FzZSBFcnJvckZuOgoJCW1zZywgcGFuaWNrZWQgPSBoYW5kbGVQYW5pYyhmdW5jKCkgeyBfID0gZm4oKSB9KQoJY2FzZSBBbnlGbjoKCQltc2csIHBhbmlja2VkID0gaGFuZGxlUGFuaWMoZnVuYygpIHsgXyA9IGZuKCkgfSkKCWNhc2UgQW55RXJyb3JGbjoKCQltc2csIHBhbmlja2VkID0gaGFuZGxlUGFuaWMoZnVuYygpIHsgXywgXyA9IGZuKCkgfSkKCWRlZmF1bHQ6CgkJYy5jdHguRmFpbCgiVW5zdXBwb3J0ZWQgZnVuYyB0eXBlXG5Hb3Q6ICVUIiwgYy5mbikKCQlyZXR1cm4gTWVzc2FnZUNoZWNrZXJ7fQoJfQoKCWMuY3R4LkNoZWNrRXhwZWN0YXRpb24ocGFuaWNrZWQsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiAiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gcGFuaWMiCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIGZ1bmMgbm90IHRvIHBhbmljXG5Hb3Q6ICVzIiwgbXNnKQoJfSkKCglyZXR1cm4gTmV3TWVzc2FnZUNoZWNrZXIoYy5jdHgsIG1zZywgTWVzc2FnZVR5cGVQYW5pYykKfQoKLy8gVG9Dcm9zc1BhbmljIHJldHVybiBhbiBtZXNzYWdlIGNoZWNrZXIgdG8gYXNzZXJ0IGlmIGN1cnJlbnQgZnVuY3Rpb24gcGFuaWNrZWQgd2hlbiBjcm9zc2luZy4KLy8gVGhpcyBhc3NlcnRpb24gaXMgaGFuZGxlZCBvbmx5IHdoZW4gbWFraW5nIGEgY3Jvc3NpbmcgY2FsbCB0byBhbm90aGVyIHJlYWxtLCB3aGVuIGFzc2VydGluZwovLyB3aXRoaW4gdGhlIHNhbWUgcmVhbG0gdXNlIGBUb1BhbmljKClgLgpmdW5jIChjIEZ1bmNDaGVja2VyKSBUb0Nyb3NzUGFuaWMoKSBNZXNzYWdlQ2hlY2tlciB7CgljLmN0eC5UKCkuSGVscGVyKCkKCgl2YXIgKAoJCW1zZyAgICAgIHN0cmluZwoJCXBhbmlja2VkIGJvb2wKCSkKCglzd2l0Y2ggZm4gOj0gYy5mbi4odHlwZSkgewoJY2FzZSBGbjoKCQltc2csIHBhbmlja2VkID0gaGFuZGxlQ3Jvc3NQYW5pYyhmbikKCWNhc2UgRXJyb3JGbjoKCQltc2csIHBhbmlja2VkID0gaGFuZGxlQ3Jvc3NQYW5pYyhmdW5jKCkgeyBfID0gZm4oKSB9KQoJY2FzZSBBbnlGbjoKCQltc2csIHBhbmlja2VkID0gaGFuZGxlQ3Jvc3NQYW5pYyhmdW5jKCkgeyBfID0gZm4oKSB9KQoJY2FzZSBBbnlFcnJvckZuOgoJCW1zZywgcGFuaWNrZWQgPSBoYW5kbGVDcm9zc1BhbmljKGZ1bmMoKSB7IF8sIF8gPSBmbigpIH0pCglkZWZhdWx0OgoJCWMuY3R4LkZhaWwoIlVuc3VwcG9ydGVkIGZ1bmMgdHlwZVxuR290OiAlVCIsIGMuZm4pCgkJcmV0dXJuIE1lc3NhZ2VDaGVja2Vye30KCX0KCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKHBhbmlja2VkLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gIkV4cGVjdGVkIGZ1bmN0aW9uIHRvIGNyb3NzIHBhbmljIgoJCX0KCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCBmdW5jIG5vdCB0byBjcm9zcyBwYW5pY1xuR290OiAlcyIsIG1zZykKCX0pCgoJcmV0dXJuIE5ld01lc3NhZ2VDaGVja2VyKGMuY3R4LCBtc2csIE1lc3NhZ2VUeXBlQ3Jvc3NQYW5pYykKfQoKLy8gVG9SZXR1cm4gYXNzZXJ0cyB0aGF0IGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJuZWQgYSB2YWx1ZSBlcXVhbCB0byBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBGdW5jQ2hlY2tlcikgVG9SZXR1cm4odmFsdWUgYW55KSB7CgljLmN0eC5UKCkuSGVscGVyKCkKCgl2YXIgKAoJCWVyciBlcnJvcgoJCXYgICBhbnkKCSkKCglpZiBmbiwgb2sgOj0gYy5mbi4oQW55Rm4pOyBvayB7CgkJdiA9IGZuKCkKCX0gZWxzZSBpZiBmbiwgb2sgOj0gYy5mbi4oQW55RXJyb3JGbik7IG9rIHsKCQl2LCBlcnIgPSBmbigpCgl9IGVsc2UgewoJCWMuY3R4LkZhaWwoIlVuc3VwcG9ydGVkIGZ1bmMgdHlwZVxuR290OiAlVCIsIGMuZm4pCgkJcmV0dXJuCgl9CgoJaWYgZXJyICE9IG5pbCB7CgkJYy5jdHguRmFpbCgiRnVuY3Rpb24gcmV0dXJuZWQgdW5leHBlY3RlZCBlcnJvclxuR290OiAlcyIsIGVyci5FcnJvcigpKQoJCXJldHVybgoJfQoKCWlmIGMuY3R4Lm5lZ2F0ZWQgewoJCVZhbHVlKGMuY3R4LlQoKSwgdikuTm90KCkuVG9FcXVhbCh2YWx1ZSkKCX0gZWxzZSB7CgkJVmFsdWUoYy5jdHguVCgpLCB2KS5Ub0VxdWFsKHZhbHVlKQoJfQp9CgpmdW5jIGhhbmRsZVBhbmljKGZuIGZ1bmMoKSkgKG1zZyBzdHJpbmcsIHBhbmlja2VkIGJvb2wpIHsKCWRlZmVyIGZ1bmMoKSB7CgkJciA6PSByZWNvdmVyKCkKCQlpZiByID09IG5pbCB7CgkJCXJldHVybgoJCX0KCgkJcGFuaWNrZWQgPSB0cnVlCgoJCWlmIGVyciwgb2sgOj0gci4oZXJyb3IpOyBvayB7CgkJCW1zZyA9IGVyci5FcnJvcigpCgkJCXJldHVybgoJCX0KCgkJaWYgcywgb2sgOj0gci4oc3RyaW5nKTsgb2sgewoJCQltc2cgPSBzCgkJCXJldHVybgoJCX0KCgkJbXNnID0gInVuc3VwcG9ydGVkIHBhbmljIHR5cGUiCgl9KCkKCglmbigpCglyZXR1cm4KfQoKZnVuYyBoYW5kbGVDcm9zc1BhbmljKGZuIGZ1bmMoKSkgKHN0cmluZywgYm9vbCkgewoJciA6PSByZXZpdmUoZm4pCglpZiByID09IG5pbCB7CgkJcmV0dXJuICIiLCBmYWxzZQoJfQoKCWlmIGVyciwgb2sgOj0gci4oZXJyb3IpOyBvayB7CgkJcmV0dXJuIGVyci5FcnJvcigpLCB0cnVlCgl9CgoJaWYgcywgb2sgOj0gci4oc3RyaW5nKTsgb2sgewoJCXJldHVybiBzLCB0cnVlCgl9CgoJcmV0dXJuICJ1bnN1cHBvcnRlZCBwYW5pYyB0eXBlIiwgdHJ1ZQp9ChphCgtnbm9tb2QudG9tbBJSbW9kdWxlID0gImduby5sYW5kL3AvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9leHBlY3QiCmdubyA9ICIwLjkiChqtGQoHaW50LmdubxKhGXBhY2thZ2UgZXhwZWN0CgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gTmV3SW50Q2hlY2tlciBjcmVhdGVzIGEgbmV3IGNoZWNrZXIgb2YgaW50NjQgdmFsdWVzLgpmdW5jIE5ld0ludENoZWNrZXIoY3R4IENvbnRleHQsIHZhbHVlIGludDY0KSBJbnRDaGVja2VyIHsKCXJldHVybiBJbnRDaGVja2Vye2N0eCwgdmFsdWV9Cn0KCi8vIEludENoZWNrZXIgYXNzZXJ0cyBpbnQ2NCB2YWx1ZXMuCnR5cGUgSW50Q2hlY2tlciBzdHJ1Y3QgewoJY3R4ICAgQ29udGV4dAoJdmFsdWUgaW50NjQKfQoKLy8gTm90IG5lZ2F0ZXMgdGhlIG5leHQgY2FsbGVkIGV4cGVjdGF0aW9uLgpmdW5jIChjIEludENoZWNrZXIpIE5vdCgpIEludENoZWNrZXIgewoJYy5jdHgubmVnYXRlZCA9ICFjLmN0eC5uZWdhdGVkCglyZXR1cm4gYwp9CgovLyBUb0VxdWFsIGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIGFuIGV4cGVjdGVkIHZhbHVlLgpmdW5jIChjIEludENoZWNrZXIpIFRvRXF1YWwodmFsdWUgaW50NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlID09IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRJbnQoYy52YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJd2FudCA6PSBmb3JtYXRJbnQodmFsdWUpCgkJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlcyB0byBtYXRjaFxuR290OiAlc1xuV2FudDogJXMiLCBnb3QsIHdhbnQpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIGJlIGRpZmZlcmVudFxuR290OiAlcyIsIGdvdCkKCX0pCn0KCi8vIFRvQmVHcmVhdGVyVGhhbiBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgSW50Q2hlY2tlcikgVG9CZUdyZWF0ZXJUaGFuKHZhbHVlIGludDY0KSB7CgljLmN0eC5UKCkuSGVscGVyKCkKCWMuY3R4LkNoZWNrRXhwZWN0YXRpb24oYy52YWx1ZSA+IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRJbnQoYy52YWx1ZSkKCQl3YW50IDo9IGZvcm1hdEludCh2YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGdlcmF0ZXIgdGhhbiAlc1xuR290OiAlcyIsIHdhbnQsIGdvdCkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWUgdG8gbm90IHRvIGJlIGdyZWF0ZXIgdGhhbiAlc1xuR290OiAlcyIsIHdhbnQsIGdvdCkKCX0pCn0KCi8vIFRvQmVHcmVhdGVyT3JFcXVhbFRoYW4gYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIGFuIGV4cGVjdGVkIHZhbHVlLgpmdW5jIChjIEludENoZWNrZXIpIFRvQmVHcmVhdGVyT3JFcXVhbFRoYW4odmFsdWUgaW50NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlID49IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRJbnQoYy52YWx1ZSkKCQl3YW50IDo9IGZvcm1hdEludCh2YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAlc1xuR290OiAlcyIsIHdhbnQsIGdvdCkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWUgdG8gbm90IHRvIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAlc1xuR290OiAlcyIsIHdhbnQsIGdvdCkKCX0pCn0KCi8vIFRvQmVMb3dlclRoYW4gYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgbG93ZXIgdGhhbiBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBJbnRDaGVja2VyKSBUb0JlTG93ZXJUaGFuKHZhbHVlIGludDY0KSB7CgljLmN0eC5UKCkuSGVscGVyKCkKCWMuY3R4LkNoZWNrRXhwZWN0YXRpb24oYy52YWx1ZSA8IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRJbnQoYy52YWx1ZSkKCQl3YW50IDo9IGZvcm1hdEludCh2YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGxvd2VyIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIG5vdCB0byBiZSBsb3dlciB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJfSkKfQoKLy8gVG9CZUxvd2VyT3JFcXVhbFRoYW4gYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBJbnRDaGVja2VyKSBUb0JlTG93ZXJPckVxdWFsVGhhbih2YWx1ZSBpbnQ2NCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPD0gdmFsdWUsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJZ290IDo9IGZvcm1hdEludChjLnZhbHVlKQoJCXdhbnQgOj0gZm9ybWF0SW50KHZhbHVlKQoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZXMgdG8gYmUgbG93ZXIgb3IgZXF1YWwgdGhhbiAlc1xuR290OiAlcyIsIHdhbnQsIGdvdCkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWUgdG8gbm90IHRvIGJlIGxvd2VyIG9yIGVxdWFsIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgl9KQp9CgpmdW5jIGZvcm1hdEludCh2YWx1ZSBpbnQ2NCkgc3RyaW5nIHsKCXJldHVybiBzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApCn0KCmZ1bmMgYXNJbnQodmFsdWUgYW55KSAoaW50NjQsIGVycm9yKSB7Cglzd2l0Y2ggdiA6PSB2YWx1ZS4odHlwZSkgewoJY2FzZSBpbnQ6CgkJcmV0dXJuIGludDY0KHYpLCBuaWwKCWNhc2UgaW50ODoKCQlyZXR1cm4gaW50NjQodiksIG5pbAoJY2FzZSBpbnQxNjoKCQlyZXR1cm4gaW50NjQodiksIG5pbAoJY2FzZSBpbnQzMjoKCQlyZXR1cm4gaW50NjQodiksIG5pbAoJY2FzZSBpbnQ2NDoKCQlyZXR1cm4gdiwgbmlsCglkZWZhdWx0OgoJCXJldHVybiAwLCBFcnJJbmNvbXBhdGlibGVUeXBlCgl9Cn0KGqAJCgttZXNzYWdlLmdubxKQCXBhY2thZ2UgZXhwZWN0CgppbXBvcnQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCmNvbnN0ICgKCU1lc3NhZ2VUeXBlQ3Jvc3NQYW5pYyBNZXNzYWdlVHlwZSA9ICJjcm9zcyBwYW5pYyIKCU1lc3NhZ2VUeXBlRXJyb3IgICAgICAgICAgICAgICAgICA9ICJlcnJvciIKCU1lc3NhZ2VUeXBlUGFuaWMgICAgICAgICAgICAgICAgICA9ICJwYW5pYyIKKQoKLy8gTWVzc2FnZVR5cGUgZGVmaW5lcyBhIHR5cGUgZm9yIG1lc3NhZ2UgY2hlY2tlciBlcnJvcnMuCnR5cGUgTWVzc2FnZVR5cGUgc3RyaW5nCgovLyBOZXdNZXNzYWdlQ2hlY2tlciBjcmVhdGVzIGEgbmV3IGNoZWNrZXIgZm9yIHRleHQgbWVzc2FnZXMuCmZ1bmMgTmV3TWVzc2FnZUNoZWNrZXIoY3R4IENvbnRleHQsIG1zZyBzdHJpbmcsIHQgTWVzc2FnZVR5cGUpIE1lc3NhZ2VDaGVja2VyIHsKCXJldHVybiBNZXNzYWdlQ2hlY2tlcntjdHgsIG1zZywgdH0KfQoKLy8gTWVzc2FnZUNoZWNrZXIgYXNzZXJ0cyB0ZXh0IG1lc3NhZ2VzLgp0eXBlIE1lc3NhZ2VDaGVja2VyIHN0cnVjdCB7CgljdHggICAgIENvbnRleHQKCW1zZyAgICAgc3RyaW5nCgltc2dUeXBlIE1lc3NhZ2VUeXBlCn0KCi8vIE5vdCBuZWdhdGVzIHRoZSBuZXh0IGNhbGxlZCBleHBlY3RhdGlvbi4KZnVuYyAoYyBNZXNzYWdlQ2hlY2tlcikgTm90KCkgTWVzc2FnZUNoZWNrZXIgewoJYy5jdHgubmVnYXRlZCA9ICFjLmN0eC5uZWdhdGVkCglyZXR1cm4gYwp9CgovLyBXaXRoTWVzc2FnZSBhc3NlcnRzIHRoYXQgYSBtZXNzYWdlIGlzIGVxdWFsIHRvIGFuIGV4cGVjdGVkIG1lc3NhZ2UuCmZ1bmMgKGMgTWVzc2FnZUNoZWNrZXIpIFdpdGhNZXNzYWdlKG1zZyBzdHJpbmcpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLm1zZyA9PSBtc2csIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkICVzIG1lc3NhZ2UgdG8gbWF0Y2hcbkdvdDogJXNcbldhbnQ6ICVzIiwgc3RyaW5nKGMubXNnVHlwZSksIGMubXNnLCBtc2cpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkICVzIG1lc3NhZ2UgdG8gYmUgZGlmZmVyZW50XG5Hb3Q6ICVzIiwgc3RyaW5nKGMubXNnVHlwZSksIGMubXNnKQoJfSkKfQoa9xAKCnN0cmluZy5nbm8S6BBwYWNrYWdlIGV4cGVjdAoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gRXJySW5jb21wYXRpYmxlVHlwZSBpbmRpY2F0ZXMgdGhhdCBhIHZhbHVlIGNhbid0IGJlIGNhc3RlZCB0byBhIGRpZmZlcmVudCB0eXBlLgp2YXIgRXJySW5jb21wYXRpYmxlVHlwZSA9IGVycm9ycy5OZXcoImluY29tcGF0aWJsZSB0eXBlIikKCi8vIE5ld1N0cmluZ0NoZWNrZXIgY3JlYXRlcyBhIG5ldyBjaGVja2VyIG9mIHN0cmluZyB2YWx1ZXMuCmZ1bmMgTmV3U3RyaW5nQ2hlY2tlcihjdHggQ29udGV4dCwgdmFsdWUgc3RyaW5nKSBTdHJpbmdDaGVja2VyIHsKCXJldHVybiBTdHJpbmdDaGVja2Vye2N0eCwgdmFsdWV9Cn0KCi8vIFN0cmluZ0NoZWNrZXIgYXNzZXJ0cyBzdHJpbmcgdmFsdWVzLgp0eXBlIFN0cmluZ0NoZWNrZXIgc3RydWN0IHsKCWN0eCAgIENvbnRleHQKCXZhbHVlIHN0cmluZwp9CgovLyBOb3QgbmVnYXRlcyB0aGUgbmV4dCBjYWxsZWQgZXhwZWN0YXRpb24uCmZ1bmMgKGMgU3RyaW5nQ2hlY2tlcikgTm90KCkgU3RyaW5nQ2hlY2tlciB7CgljLmN0eC5uZWdhdGVkID0gIWMuY3R4Lm5lZ2F0ZWQKCXJldHVybiBjCn0KCi8vIFRvRXF1YWwgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgZXF1YWwgdG8gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgU3RyaW5nQ2hlY2tlcikgVG9FcXVhbCh2IHN0cmluZykgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPT0gdiwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIG1hdGNoXG5Hb3Q6ICVzXG5XYW50OiAlcyIsIGMudmFsdWUsIHYpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlcyB0byBiZSBkaWZmZXJlbnRcbkdvdDogJXMiLCBjLnZhbHVlKQoJfSkKfQoKLy8gVG9CZUVtcHR5IGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZy4KZnVuYyAoYyBTdHJpbmdDaGVja2VyKSBUb0JlRW1wdHkoKSB7CgljLmN0eC5UKCkuSGVscGVyKCkKCWMuY3R4LkNoZWNrRXhwZWN0YXRpb24oYy52YWx1ZSA9PSAiIiwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgc3RyaW5nIHRvIGJlIGVtcHR5XG5Hb3Q6ICVzIiwgYy52YWx1ZSkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiVW5leHBlY3RlZCBlbXB0eSBzdHJpbmciKQoJfSkKfQoKLy8gVG9IYXZlTGVuZ3RoIGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGhhcyBhbiBleHBlY3RlZCBsZW5ndGguCmZ1bmMgKGMgU3RyaW5nQ2hlY2tlcikgVG9IYXZlTGVuZ3RoKGxlbmd0aCBpbnQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihsZW4oYy52YWx1ZSkgPT0gbGVuZ3RoLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBsZW4oYy52YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgc3RyaW5nIGxlbmd0aCB0byBtYXRjaFxuR290OiAlZFxuV2FudDogJWQiLCBnb3QsIGxlbmd0aCkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgc3RyaW5nIGxlbmd0aHMgdG8gYmUgZGlmZmVyZW50XG5Hb3Q6ICVkIiwgZ290KQoJfSkKfQoKLy8gU3RyaW5nZXIgZGVmaW5lcyBhbiBpbnRlcmZhY2UgZm9yIHZhbHVlcyB0aGF0IGhhcyBhIFN0cmluZyBtZXRob2QuCnR5cGUgU3RyaW5nZXIgaW50ZXJmYWNlIHsKCVN0cmluZygpIHN0cmluZwp9CgpmdW5jIGFzU3RyaW5nKHZhbHVlIGFueSkgKHN0cmluZywgZXJyb3IpIHsKCXN3aXRjaCB2IDo9IHZhbHVlLih0eXBlKSB7CgljYXNlIHN0cmluZzoKCQlyZXR1cm4gdiwgbmlsCgljYXNlIFtdYnl0ZToKCQlyZXR1cm4gc3RyaW5nKHYpLCBuaWwKCWNhc2UgU3RyaW5nZXI6CgkJcmV0dXJuIHYuU3RyaW5nKCksIG5pbAoJY2FzZSBhZGRyZXNzOgoJCXJldHVybiB2LlN0cmluZygpLCBuaWwKCWRlZmF1bHQ6CgkJcmV0dXJuICIiLCBFcnJJbmNvbXBhdGlibGVUeXBlCgl9Cn0KGsIaCgh1aW50LmdubxK1GnBhY2thZ2UgZXhwZWN0CgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gTmV3VWludENoZWNrZXIgY3JlYXRlcyBhIG5ldyBjaGVja2VyIG9mIHVpbnQ2NCB2YWx1ZXMuCmZ1bmMgTmV3VWludENoZWNrZXIoY3R4IENvbnRleHQsIHZhbHVlIHVpbnQ2NCkgVWludENoZWNrZXIgewoJcmV0dXJuIFVpbnRDaGVja2Vye2N0eCwgdmFsdWV9Cn0KCi8vIFVpbnRDaGVja2VyIGFzc2VydHMgdWludDY0IHZhbHVlcy4KdHlwZSBVaW50Q2hlY2tlciBzdHJ1Y3QgewoJY3R4ICAgQ29udGV4dAoJdmFsdWUgdWludDY0Cn0KCi8vIE5vdCBuZWdhdGVzIHRoZSBuZXh0IGNhbGxlZCBleHBlY3RhdGlvbi4KZnVuYyAoYyBVaW50Q2hlY2tlcikgTm90KCkgVWludENoZWNrZXIgewoJYy5jdHgubmVnYXRlZCA9ICFjLmN0eC5uZWdhdGVkCglyZXR1cm4gYwp9CgovLyBUb0VxdWFsIGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIGFuIGV4cGVjdGVkIHZhbHVlLgpmdW5jIChjIFVpbnRDaGVja2VyKSBUb0VxdWFsKHZhbHVlIHVpbnQ2NCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPT0gdmFsdWUsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCWdvdCA6PSBmb3JtYXRVaW50KGMudmFsdWUpCgkJCXdhbnQgOj0gZm9ybWF0VWludCh2YWx1ZSkKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIG1hdGNoXG5Hb3Q6ICVzXG5XYW50OiAlcyIsIGdvdCwgd2FudCkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWUgdG8gYmUgZGlmZmVyZW50XG5Hb3Q6ICVzIiwgZm9ybWF0VWludChjLnZhbHVlKSkKCX0pCn0KCi8vIFRvQmVHcmVhdGVyVGhhbiBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgVWludENoZWNrZXIpIFRvQmVHcmVhdGVyVGhhbih2YWx1ZSB1aW50NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlID4gdmFsdWUsIGZ1bmMoY3R4IENvbnRleHQpIHN0cmluZyB7CgkJZ290IDo9IGZvcm1hdFVpbnQoYy52YWx1ZSkKCQl3YW50IDo9IGZvcm1hdFVpbnQodmFsdWUpCgkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlcyB0byBiZSBnZXJhdGVyIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIG5vdCB0byBiZSBncmVhdGVyIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgl9KQp9CgovLyBUb0JlR3JlYXRlck9yRXF1YWxUaGFuIGFzc2VydHMgdGhhdCBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBVaW50Q2hlY2tlcikgVG9CZUdyZWF0ZXJPckVxdWFsVGhhbih2YWx1ZSB1aW50NjQpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlID49IHZhbHVlLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWdvdCA6PSBmb3JtYXRVaW50KGMudmFsdWUpCgkJd2FudCA6PSBmb3JtYXRVaW50KHZhbHVlKQoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZXMgdG8gYmUgZ3JlYXRlciBvciBlcXVhbCB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJCX0KCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZSB0byBub3QgdG8gYmUgZ3JlYXRlciBvciBlcXVhbCB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJfSkKfQoKLy8gVG9CZUxvd2VyVGhhbiBhc3NlcnRzIHRoYXQgY3VycmVudCB2YWx1ZSBpcyBsb3dlciB0aGFuIGFuIGV4cGVjdGVkIHZhbHVlLgpmdW5jIChjIFVpbnRDaGVja2VyKSBUb0JlTG93ZXJUaGFuKHZhbHVlIHVpbnQ2NCkgewoJYy5jdHguVCgpLkhlbHBlcigpCgljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGMudmFsdWUgPCB2YWx1ZSwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQlnb3QgOj0gZm9ybWF0VWludChjLnZhbHVlKQoJCXdhbnQgOj0gZm9ybWF0VWludCh2YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGxvd2VyIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIG5vdCB0byBiZSBsb3dlciB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJfSkKfQoKLy8gVG9CZUxvd2VyT3JFcXVhbFRoYW4gYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiBhbiBleHBlY3RlZCB2YWx1ZS4KZnVuYyAoYyBVaW50Q2hlY2tlcikgVG9CZUxvd2VyT3JFcXVhbFRoYW4odmFsdWUgdWludDY0KSB7CgljLmN0eC5UKCkuSGVscGVyKCkKCWMuY3R4LkNoZWNrRXhwZWN0YXRpb24oYy52YWx1ZSA8PSB2YWx1ZSwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQlnb3QgOj0gZm9ybWF0VWludChjLnZhbHVlKQoJCXdhbnQgOj0gZm9ybWF0VWludCh2YWx1ZSkKCQlpZiAhY3R4LklzTmVnYXRlZCgpIHsKCQkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGxvd2VyIG9yIGVxdWFsIHRoYW4gJXNcbkdvdDogJXMiLCB3YW50LCBnb3QpCgkJfQoJCXJldHVybiB1Zm10LlNwcmludGYoIkV4cGVjdGVkIHZhbHVlIHRvIG5vdCB0byBiZSBsb3dlciBvciBlcXVhbCB0aGFuICVzXG5Hb3Q6ICVzIiwgd2FudCwgZ290KQoJfSkKfQoKZnVuYyBmb3JtYXRVaW50KHZhbHVlIHVpbnQ2NCkgc3RyaW5nIHsKCXJldHVybiBzdHJjb252LkZvcm1hdFVpbnQodmFsdWUsIDEwKQp9CgpmdW5jIGFzVWludCh2YWx1ZSBhbnkpICh1aW50NjQsIGVycm9yKSB7Cglzd2l0Y2ggdiA6PSB2YWx1ZS4odHlwZSkgewoJY2FzZSB1aW50OgoJCXJldHVybiB1aW50NjQodiksIG5pbAoJY2FzZSB1aW50ODoKCQlyZXR1cm4gdWludDY0KHYpLCBuaWwKCWNhc2UgdWludDE2OgoJCXJldHVybiB1aW50NjQodiksIG5pbAoJY2FzZSB1aW50MzI6CgkJcmV0dXJuIHVpbnQ2NCh2KSwgbmlsCgljYXNlIHVpbnQ2NDoKCQlyZXR1cm4gdiwgbmlsCgljYXNlIGludDoKCQlpZiB2IDwgMCB7CgkJCXJldHVybiAwLCBFcnJJbmNvbXBhdGlibGVUeXBlCgkJfQoJCXJldHVybiB1aW50NjQodiksIG5pbAoJZGVmYXVsdDoKCQlyZXR1cm4gMCwgRXJySW5jb21wYXRpYmxlVHlwZQoJfQp9ChqYJQoJdmFsdWUuZ25vEoolcGFja2FnZSBleHBlY3QKCmltcG9ydCAoCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBWYWx1ZSBjcmVhdGVzIGEgbmV3IGNoZWNrZXIgdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcy4KZnVuYyBWYWx1ZSh0IFRlc3RpbmdULCB2YWx1ZSBhbnkpIFZhbHVlQ2hlY2tlciB7CglyZXR1cm4gVmFsdWVDaGVja2VyewoJCWN0eDogICBOZXdDb250ZXh0KHQpLAoJCXZhbHVlOiB2YWx1ZSwKCX0KfQoKLy8gVmFsdWVDaGVja2VyIGFzc2VydHMgdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcy4KdHlwZSBWYWx1ZUNoZWNrZXIgc3RydWN0IHsKCWN0eCAgIENvbnRleHQKCXZhbHVlIGFueQp9CgovLyBXaXRoRmFpbFByZWZpeCBhc3NpZ25zIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBwcmVmaXhlZCB0byB0ZXN0aW5nIGVycm9ycyB3aGVuIGFuIGFzc2VydGlvbiBmYWlscy4KZnVuYyAoYyBWYWx1ZUNoZWNrZXIpIFdpdGhGYWlsUHJlZml4KHByZWZpeCBzdHJpbmcpIFZhbHVlQ2hlY2tlciB7CgljLmN0eC5wcmVmaXggPSBwcmVmaXgKCXJldHVybiBjCn0KCi8vIE5vdCBuZWdhdGVzIHRoZSBuZXh0IGNhbGxlZCBleHBlY3RhdGlvbi4KZnVuYyAoYyBWYWx1ZUNoZWNrZXIpIE5vdCgpIFZhbHVlQ2hlY2tlciB7CgljLmN0eC5uZWdhdGVkID0gIWMuY3R4Lm5lZ2F0ZWQKCXJldHVybiBjCn0KCi8vIFRvQmVOaWwgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgbmlsLgpmdW5jIChjIFZhbHVlQ2hlY2tlcikgVG9CZU5pbCgpIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihjLnZhbHVlID09IG5pbCB8fCBpc3R5cGVkbmlsKGMudmFsdWUpLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2YWx1ZSB0byBiZSBuaWxcbkdvdDogJXYiLCBjLnZhbHVlKQoJCX0KCQlyZXR1cm4gIkV4cGVjdGVkIGEgbm9uIG5pbCB2YWx1ZSIKCX0pCn0KCi8vIFRvRXF1YWwgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgdmFsdWUgaXMgZXF1YWwgdG8gYW4gZXhwZWN0ZWQgdmFsdWUuCmZ1bmMgKGMgVmFsdWVDaGVja2VyKSBUb0VxdWFsKHZhbHVlIGFueSkgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJLy8gQXNzZXJ0IGVycm9yIHZhbHVlcyBmaXJzdCB0byBhbGxvdyBjb21wYXJpbmcgZXJyb3JzIHRvIHN0cmluZyB2YWx1ZXMKCWlmIGVyciwgb2sgOj0gYy52YWx1ZS4oZXJyb3IpOyBvayB7CgkJd2FudCwgb2sgOj0gdmFsdWUuKGVycm9yKQoJCWlmICFvayB7CgkJCWMuY3R4LkZhaWwoIkZhaWxlZDogZXhwZWN0ZWQgYW4gZXJyb3IgdmFsdWVcbkdvdDogJVQiLCB2YWx1ZSkKCQkJcmV0dXJuCgkJfQoKCQljLmN0eC5DaGVja0V4cGVjdGF0aW9uKGVyci5FcnJvcigpID09IHdhbnQuRXJyb3IoKSwgZnVuYyhjdHggQ29udGV4dCkgc3RyaW5nIHsKCQkJaWYgIWN0eC5Jc05lZ2F0ZWQoKSB7CgkJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCBlcnJvcnMgdG8gbWF0Y2hcbkdvdDogJXNcbldhbnQ6ICVzIiwgZXJyLkVycm9yKCksIHdhbnQuRXJyb3IoKSkKCQkJfQoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCBlcnJvcnMgdG8gYmUgZGlmZmVyZW50XG5Hb3Q6ICVzIiwgZXJyLkVycm9yKCkpCgkJfSkKCgkJcmV0dXJuCgl9CgoJc3dpdGNoIHYgOj0gdmFsdWUuKHR5cGUpIHsKCWNhc2Ugc3RyaW5nOgoJCWMuQXNTdHJpbmcoKS5Ub0VxdWFsKHYpCgljYXNlIFtdYnl0ZToKCQljLkFzU3RyaW5nKCkuVG9FcXVhbChzdHJpbmcodikpCgljYXNlIFN0cmluZ2VyOgoJCWMuQXNTdHJpbmcoKS5Ub0VxdWFsKHYuU3RyaW5nKCkpCgljYXNlIGJvb2w6CgkJYy5Bc0Jvb2xlYW4oKS5Ub0VxdWFsKHYpCgljYXNlIGZsb2F0MzI6CgkJYy5Bc0Zsb2F0KCkuVG9FcXVhbChmbG9hdDY0KHYpKQoJY2FzZSBmbG9hdDY0OgoJCWMuQXNGbG9hdCgpLlRvRXF1YWwodikKCWNhc2UgdWludDoKCQljLkFzVWludCgpLlRvRXF1YWwodWludDY0KHYpKQoJY2FzZSB1aW50ODoKCQljLkFzVWludCgpLlRvRXF1YWwodWludDY0KHYpKQoJY2FzZSB1aW50MTY6CgkJYy5Bc1VpbnQoKS5Ub0VxdWFsKHVpbnQ2NCh2KSkKCWNhc2UgdWludDMyOgoJCWMuQXNVaW50KCkuVG9FcXVhbCh1aW50NjQodikpCgljYXNlIHVpbnQ2NDoKCQljLkFzVWludCgpLlRvRXF1YWwodikKCWNhc2UgaW50OgoJCWMuQXNJbnQoKS5Ub0VxdWFsKGludDY0KHYpKQoJY2FzZSBpbnQ4OgoJCWMuQXNJbnQoKS5Ub0VxdWFsKGludDY0KHYpKQoJY2FzZSBpbnQxNjoKCQljLkFzSW50KCkuVG9FcXVhbChpbnQ2NCh2KSkKCWNhc2UgaW50MzI6CgkJYy5Bc0ludCgpLlRvRXF1YWwoaW50NjQodikpCgljYXNlIGludDY0OgoJCWMuQXNJbnQoKS5Ub0VxdWFsKHYpCgljYXNlIGVycm9yOgoJCWMuY3R4LkZhaWwoIkVycm9yIGlzIG5vdCBlcXVhbCB0byB2YWx1ZVxuR290OiAlcyIsIHYuRXJyb3IoKSkKCWRlZmF1bHQ6CgkJYy5jdHguRmFpbCgiVW5zdXBwb3J0ZWQgdHlwZTogJVQiLCB2YWx1ZSkKCX0KfQoKLy8gVG9Db250YWluRXJyb3JTdHJpbmcgYXNzZXJ0cyB0aGF0IGN1cnJlbnQgZXJyb3IgdmFsdWUgY29udGFpbnMgYW4gZXJyb3Igc3RyaW5nLgpmdW5jIChjIFZhbHVlQ2hlY2tlcikgVG9Db250YWluRXJyb3JTdHJpbmcobXNnIHN0cmluZykgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJZXJyLCBvayA6PSBjLnZhbHVlLihlcnJvcikKCWlmICFvayB7CgkJYy5jdHguRmFpbCgiRmFpbGVkOiBleHBlY3RlZCBhbiBlcnJvciB2YWx1ZVxuR290OiAlVCIsIGMudmFsdWUpCgkJcmV0dXJuCgl9CgoJYy5jdHguQ2hlY2tFeHBlY3RhdGlvbihzdHJpbmdzLkNvbnRhaW5zKGVyci5FcnJvcigpLCBtc2cpLCBmdW5jKGN0eCBDb250ZXh0KSBzdHJpbmcgewoJCWlmICFjdHguSXNOZWdhdGVkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCJFeHBlY3RlZCBlcnJvciBtZXNzYWdlIHRvIGNvbnRhaW46ICVzXG5Hb3Q6ICVzIiwgbXNnLCBlcnIuRXJyb3IoKSkKCQl9CgkJcmV0dXJuIHVmbXQuU3ByaW50ZigiRXhwZWN0ZWQgZXJyb3IgbWVzc2FnZSBub3QgdG8gY29udGFpbjogJXNcbkdvdDogJXMiLCBtc2csIGVyci5FcnJvcigpKQoJfSkKfQoKLy8gQXNTdHJpbmcgcmV0dXJucyBhIGNoZWNrZXIgdG8gYXNzZXJ0IGN1cnJlbnQgdmFsdWUgYXMgYSBzdHJpbmcuCmZ1bmMgKGMgVmFsdWVDaGVja2VyKSBBc1N0cmluZygpIFN0cmluZ0NoZWNrZXIgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJdiwgZXJyIDo9IGFzU3RyaW5nKGMudmFsdWUpCglpZiBlcnIgIT0gbmlsIHsKCQljLmN0eC5GYWlsKCJGYWlsZWQ6ICVzOiBleHBlY3RlZCBhIHN0cmluZyB2YWx1ZVxuR290OiAlVCIsIGVyci5FcnJvcigpLCBjLnZhbHVlKQoJCXJldHVybiBTdHJpbmdDaGVja2Vye30KCX0KCglyZXR1cm4gTmV3U3RyaW5nQ2hlY2tlcihjLmN0eCwgdikKfQoKLy8gQXNCb29sZWFuIHJldHVybnMgYSBjaGVja2VyIHRvIGFzc2VydCBjdXJyZW50IHZhbHVlIGFzIGEgYm9vbGVhbi4KZnVuYyAoYyBWYWx1ZUNoZWNrZXIpIEFzQm9vbGVhbigpIEJvb2xlYW5DaGVja2VyIHsKCWMuY3R4LlQoKS5IZWxwZXIoKQoKCXYsIGVyciA6PSBhc0Jvb2xlYW4oYy52YWx1ZSkKCWlmIGVyciAhPSBuaWwgewoJCWMuY3R4LkZhaWwoIkZhaWxlZDogJXM6IGV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZVxuR290OiAlVCIsIGVyci5FcnJvcigpLCBjLnZhbHVlKQoJCXJldHVybiBCb29sZWFuQ2hlY2tlcnt9Cgl9CgoJcmV0dXJuIE5ld0Jvb2xlYW5DaGVja2VyKGMuY3R4LCB2KQp9CgovLyBBc0Zsb2F0IHJldHVybnMgYSBjaGVja2VyIHRvIGFzc2VydCBjdXJyZW50IHZhbHVlIGFzIGEgZmxvYXQ2NC4KZnVuYyAoYyBWYWx1ZUNoZWNrZXIpIEFzRmxvYXQoKSBGbG9hdENoZWNrZXIgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJdiwgZXJyIDo9IGFzRmxvYXQoYy52YWx1ZSkKCWlmIGVyciAhPSBuaWwgewoJCWMuY3R4LkZhaWwoIiVzOiBleHBlY3RlZCBhIGZsb2F0IHZhbHVlXG5Hb3Q6ICVUIiwgZXJyLkVycm9yKCksIGMudmFsdWUpCgkJcmV0dXJuIEZsb2F0Q2hlY2tlcnt9Cgl9CgoJcmV0dXJuIE5ld0Zsb2F0Q2hlY2tlcihjLmN0eCwgdikKfQoKLy8gQXNVaW50IHJldHVybnMgYSBjaGVja2VyIHRvIGFzc2VydCBjdXJyZW50IHZhbHVlIGFzIGEgdWludDY0LgpmdW5jIChjIFZhbHVlQ2hlY2tlcikgQXNVaW50KCkgVWludENoZWNrZXIgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJdiwgZXJyIDo9IGFzVWludChjLnZhbHVlKQoJaWYgZXJyICE9IG5pbCB7CgkJYy5jdHguRmFpbCgiRmFpbGVkOiAlczogZXhwZWN0ZWQgYSB1aW50IHZhbHVlXG5Hb3Q6ICVUIiwgZXJyLkVycm9yKCksIGMudmFsdWUpCgkJcmV0dXJuIFVpbnRDaGVja2Vye30KCX0KCglyZXR1cm4gTmV3VWludENoZWNrZXIoYy5jdHgsIHYpCn0KCi8vIEFzSW50IHJldHVybnMgYSBjaGVja2VyIHRvIGFzc2VydCBjdXJyZW50IHZhbHVlIGFzIGEgaW50NjQuCmZ1bmMgKGMgVmFsdWVDaGVja2VyKSBBc0ludCgpIEludENoZWNrZXIgewoJYy5jdHguVCgpLkhlbHBlcigpCgoJdiwgZXJyIDo9IGFzSW50KGMudmFsdWUpCglpZiBlcnIgIT0gbmlsIHsKCQljLmN0eC5GYWlsKCJGYWlsZWQ6ICVzOiBleHBlY3RlZCBhbiBpbnQgdmFsdWVcbkdvdDogJVQiLCBlcnIuRXJyb3IoKSwgYy52YWx1ZSkKCQlyZXR1cm4gSW50Q2hlY2tlcnt9Cgl9CgoJcmV0dXJuIE5ld0ludENoZWNrZXIoYy5jdHgsIHYpCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhEIgOiSJhIKNTAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQLg/HIt+xiL9BCyqzFswoh/47e7ozrWoMlW2tsQ5FheyBJA8h6vVRhZ5q0J2kejzgARSv4PKsINtwkn3LxfQ3oFmbFHynz1uv67F2FMzKegEA57zGZt1mh+4tmCg4vAiQhOGRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==