Transaction executed successfully

Transaction Details

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

Transaction hash
8D3F78F601D891DB2204AAB3C50E968565FE35646AC326860C311E3FB800D253

Transaction overview

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

Execution summary

TX INDEX
1
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
169,225,945
Gas consumed
FEE
500000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf25000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CrvtBwoML3ZtLm1fYWRkcGtnEqntBwooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLs7AcKE21lbWJhX3dlaWdodGVkX2hvc3QSJmduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9ob3N0GpcnChRhcHBzdG9yZV9hY3Rpb25zLmdubxL+JnBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKKQoKY29uc3QgQXBwc3RvcmVQYXRoID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9hcHBzdG9yZV92MyIKY29uc3QgQXBwc3RvcmVNYXhGZWUgPSBpbnQ2NCgxMDAwMDAwMDApCgp0eXBlIEFwcHN0b3JlS2luZCBzdHJpbmcKCmNvbnN0ICgKCUFwcHN0b3JlQWNjZXB0ICAgICAgICBBcHBzdG9yZUtpbmQgPSAiYWNjZXB0LW93bmVyIgoJQXBwc3RvcmVSZXR1cm4gICAgICAgIEFwcHN0b3JlS2luZCA9ICJyZXR1cm4tb3duZXIiCglBcHBzdG9yZUFib3J0UmV0dXJuICAgQXBwc3RvcmVLaW5kID0gImFib3J0LXJldHVybiIKCUFwcHN0b3JlQWRkQ3VyYXRvciAgICBBcHBzdG9yZUtpbmQgPSAiYWRkLWN1cmF0b3IiCglBcHBzdG9yZVJlbW92ZUN1cmF0b3IgQXBwc3RvcmVLaW5kID0gInJlbW92ZS1jdXJhdG9yIgoJQXBwc3RvcmVGZWUgICAgICAgICAgIEFwcHN0b3JlS2luZCA9ICJzZXQtZmVlIgoJQXBwc3RvcmVUcmVhc3VyeSAgICAgIEFwcHN0b3JlS2luZCA9ICJzZXQtdHJlYXN1cnkiCglBcHBzdG9yZVVucGF1c2UgICAgICAgQXBwc3RvcmVLaW5kID0gInVucGF1c2UiCglBcHBzdG9yZVNlYWwgICAgICAgICAgQXBwc3RvcmVLaW5kID0gInNlYWwtaW1wb3J0IgoJQXBwc3RvcmVBcHByb3ZlICAgICAgIEFwcHN0b3JlS2luZCA9ICJhcHByb3ZlIgoJQXBwc3RvcmVSZWplY3QgICAgICAgIEFwcHN0b3JlS2luZCA9ICJyZWplY3QiCglBcHBzdG9yZURlbGlzdCAgICAgICAgQXBwc3RvcmVLaW5kID0gImRlbGlzdCIKCUFwcHN0b3JlUmVzdG9yZSAgICAgICBBcHBzdG9yZUtpbmQgPSAicmVzdG9yZSIKCUFwcHN0b3JlQ2xlYXJGbGFncyAgICBBcHBzdG9yZUtpbmQgPSAiY2xlYXItZmxhZ3MiCikKCnR5cGUgQXBwc3RvcmVQb2xpY3kgc3RydWN0eyBkYW8sIHN1Y2Nlc3NvciwgdHJlYXN1cnkgYWRkcmVzcyB9CgpmdW5jIE5ld0FwcHN0b3JlUG9saWN5KGRhbywgc3VjY2Vzc29yLCB0cmVhc3VyeSBhZGRyZXNzKSBBcHBzdG9yZVBvbGljeSB7CglpZiBkYW8gIT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSB7CgkJcGFuaWMoImFwcHN0b3JlIHBvbGljeSByZXF1aXJlcyB0aGUgZm91bmRpbmcgREFPIGFkZHJlc3MiKQoJfQoJZm9yIF8sIGEgOj0gcmFuZ2UgW11hZGRyZXNze3N1Y2Nlc3NvciwgdHJlYXN1cnl9IHsKCQlpZiAhYS5Jc1ZhbGlkKCkgfHwgYSA9PSBkYW8gfHwgYSA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhBcHBzdG9yZVBhdGgpIHsKCQkJcGFuaWMoImFwcHN0b3JlIGRlc3RpbmF0aW9uIG11c3QgYmUgdmFsaWQgYW5kIGRpc3RpbmN0IGZyb20gREFPIGFuZCB0YXJnZXQiKQoJCX0KCX0KCXJldHVybiBBcHBzdG9yZVBvbGljeXtkYW8sIHN1Y2Nlc3NvciwgdHJlYXN1cnl9Cn0KZnVuYyAocCBBcHBzdG9yZVBvbGljeSkgREFPKCkgYWRkcmVzcyAgICAgICB7IHJldHVybiBwLmRhbyB9CmZ1bmMgKHAgQXBwc3RvcmVQb2xpY3kpIFN1Y2Nlc3NvcigpIGFkZHJlc3MgeyByZXR1cm4gcC5zdWNjZXNzb3IgfQpmdW5jIChwIEFwcHN0b3JlUG9saWN5KSBUcmVhc3VyeSgpIGFkZHJlc3MgIHsgcmV0dXJuIHAudHJlYXN1cnkgfQoKdHlwZSBBcHBzdG9yZUFjdGlvbiBzdHJ1Y3QgewoJa2luZCAgICAgICAgIEFwcHN0b3JlS2luZAoJcmVjaXBpZW50ICAgIGFkZHJlc3MKCWZlZSAgICAgICAgICBpbnQ2NAoJcGF0aCwgcmVhc29uIHN0cmluZwp9CgpmdW5jIChwIEFwcHN0b3JlUG9saWN5KSBBY2NlcHQoKSBBcHBzdG9yZUFjdGlvbiB7IHJldHVybiBBcHBzdG9yZUFjdGlvbntraW5kOiBBcHBzdG9yZUFjY2VwdH0gfQpmdW5jIChwIEFwcHN0b3JlUG9saWN5KSBSZXR1cm4oKSBBcHBzdG9yZUFjdGlvbiB7CglyZXR1cm4gQXBwc3RvcmVBY3Rpb257a2luZDogQXBwc3RvcmVSZXR1cm4sIHJlY2lwaWVudDogcC5zdWNjZXNzb3J9Cn0KZnVuYyAocCBBcHBzdG9yZVBvbGljeSkgQWJvcnRSZXR1cm4oKSBBcHBzdG9yZUFjdGlvbiB7CglyZXR1cm4gQXBwc3RvcmVBY3Rpb257a2luZDogQXBwc3RvcmVBYm9ydFJldHVybiwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEFwcHN0b3JlUG9saWN5KSBTZXRUcmVhc3VyeSgpIEFwcHN0b3JlQWN0aW9uIHsKCXJldHVybiBBcHBzdG9yZUFjdGlvbntraW5kOiBBcHBzdG9yZVRyZWFzdXJ5LCByZWNpcGllbnQ6IHAudHJlYXN1cnl9Cn0KZnVuYyBBcHBzdG9yZUN1cmF0b3Iod2hvIGFkZHJlc3MsIGdyYW50IGJvb2wpIEFwcHN0b3JlQWN0aW9uIHsKCWsgOj0gQXBwc3RvcmVSZW1vdmVDdXJhdG9yCglpZiBncmFudCB7CgkJayA9IEFwcHN0b3JlQWRkQ3VyYXRvcgoJfQoJYSA6PSBBcHBzdG9yZUFjdGlvbntraW5kOiBrLCByZWNpcGllbnQ6IHdob30KCWEuQnl0ZXMoKQoJcmV0dXJuIGEKfQpmdW5jIEFwcHN0b3JlUmVnaXN0cmF0aW9uRmVlKGZlZSBpbnQ2NCkgQXBwc3RvcmVBY3Rpb24gewoJYSA6PSBBcHBzdG9yZUFjdGlvbntraW5kOiBBcHBzdG9yZUZlZSwgZmVlOiBmZWV9CglhLkJ5dGVzKCkKCXJldHVybiBhCn0KZnVuYyBBcHBzdG9yZVJlc3VtZSgpIEFwcHN0b3JlQWN0aW9uICAgICB7IHJldHVybiBBcHBzdG9yZUFjdGlvbntraW5kOiBBcHBzdG9yZVVucGF1c2V9IH0KZnVuYyBBcHBzdG9yZVNlYWxJbXBvcnQoKSBBcHBzdG9yZUFjdGlvbiB7IHJldHVybiBBcHBzdG9yZUFjdGlvbntraW5kOiBBcHBzdG9yZVNlYWx9IH0KZnVuYyBBcHBzdG9yZU1vZGVyYXRpb24oa2luZCBBcHBzdG9yZUtpbmQsIHBhdGgsIHJlYXNvbiBzdHJpbmcpIEFwcHN0b3JlQWN0aW9uIHsKCWEgOj0gQXBwc3RvcmVBY3Rpb257a2luZDoga2luZCwgcGF0aDogcGF0aCwgcmVhc29uOiByZWFzb259CglpZiAhYS5Jc0xpc3RpbmcoKSB7CgkJcGFuaWMoInVuc3VwcG9ydGVkIGFwcHN0b3JlIG1vZGVyYXRpb24iKQoJfQoJYS5CeXRlcygpCglyZXR1cm4gYQp9CmZ1bmMgKGEgQXBwc3RvcmVBY3Rpb24pIEtpbmQoKSBBcHBzdG9yZUtpbmQgeyByZXR1cm4gYS5raW5kIH0KZnVuYyAoYSBBcHBzdG9yZUFjdGlvbikgUmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiBhLnJlY2lwaWVudCB9CmZ1bmMgKGEgQXBwc3RvcmVBY3Rpb24pIEZlZSgpIGludDY0ICAgICAgICAgeyByZXR1cm4gYS5mZWUgfQpmdW5jIChhIEFwcHN0b3JlQWN0aW9uKSBQYXRoKCkgc3RyaW5nICAgICAgIHsgcmV0dXJuIGEucGF0aCB9CmZ1bmMgKGEgQXBwc3RvcmVBY3Rpb24pIFJlYXNvbigpIHN0cmluZyAgICAgeyByZXR1cm4gYS5yZWFzb24gfQpmdW5jIChhIEFwcHN0b3JlQWN0aW9uKSBJc0xpc3RpbmcoKSBib29sIHsKCXJldHVybiBhLmtpbmQgPT0gQXBwc3RvcmVBcHByb3ZlIHx8IGEua2luZCA9PSBBcHBzdG9yZVJlamVjdCB8fCBhLmtpbmQgPT0gQXBwc3RvcmVEZWxpc3QgfHwgYS5raW5kID09IEFwcHN0b3JlUmVzdG9yZSB8fCBhLmtpbmQgPT0gQXBwc3RvcmVDbGVhckZsYWdzCn0KZnVuYyAoYSBBcHBzdG9yZUFjdGlvbikgQnl0ZXMoKSBzdHJpbmcgewoJaWYgYS5Jc0xpc3RpbmcoKSB7CgkJaWYgYS5yZWNpcGllbnQgIT0gIiIgfHwgYS5mZWUgIT0gMCB8fCBsZW4oYS5wYXRoKSA+IDIwMCB8fCAhKHN0cmluZ3MuSGFzUHJlZml4KGEucGF0aCwgImduby5sYW5kL3IvIikgfHwgc3RyaW5ncy5IYXNQcmVmaXgoYS5wYXRoLCAiZ25vLmxhbmQvcC8iKSkgfHwgbGVuKGEucmVhc29uKSA+IDUwMCB8fCAoYS5raW5kICE9IEFwcHN0b3JlUmVqZWN0ICYmIGEucmVhc29uICE9ICIiKSB7CgkJCXBhbmljKCJpbnZhbGlkIGFwcHN0b3JlIG1vZGVyYXRpb24iKQoJCX0KCX0gZWxzZSB7CgkJaWYgYS5wYXRoICE9ICIiIHx8IGEucmVhc29uICE9ICIiIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCBhcHBzdG9yZSBhY3Rpb24iKQoJCX0KCQlzd2l0Y2ggYS5raW5kIHsKCQljYXNlIEFwcHN0b3JlQWNjZXB0LCBBcHBzdG9yZVVucGF1c2UsIEFwcHN0b3JlU2VhbDoKCQkJaWYgYS5yZWNpcGllbnQgIT0gIiIgfHwgYS5mZWUgIT0gMCB7CgkJCQlwYW5pYygibWFsZm9ybWVkIGFwcHN0b3JlIGFjdGlvbiIpCgkJCX0KCQljYXNlIEFwcHN0b3JlUmV0dXJuLCBBcHBzdG9yZUFib3J0UmV0dXJuLCBBcHBzdG9yZVRyZWFzdXJ5LCBBcHBzdG9yZUFkZEN1cmF0b3IsIEFwcHN0b3JlUmVtb3ZlQ3VyYXRvcjoKCQkJaWYgIWEucmVjaXBpZW50LklzVmFsaWQoKSB8fCBhLmZlZSAhPSAwIHsKCQkJCXBhbmljKCJpbnZhbGlkIGFwcHN0b3JlIHJlY2lwaWVudCIpCgkJCX0KCQljYXNlIEFwcHN0b3JlRmVlOgoJCQlpZiBhLnJlY2lwaWVudCAhPSAiIiB8fCBhLmZlZSA8IDAgfHwgYS5mZWUgPiBBcHBzdG9yZU1heEZlZSB7CgkJCQlwYW5pYygiaW52YWxpZCBhcHBzdG9yZSBmZWUiKQoJCQl9CgkJZGVmYXVsdDoKCQkJcGFuaWMoInVuc3VwcG9ydGVkIGFwcHN0b3JlIGFjdGlvbiIpCgkJfQoJfQoJcmV0dXJuICJhcHBzdG9yZS92MXwiICsgQXBwc3RvcmVQYXRoICsgInwiICsgcXVvdGVKU09OKHN0cmluZyhhLmtpbmQpKSArICJ8IiArIHF1b3RlSlNPTihzdHJpbmcoYS5yZWNpcGllbnQpKSArICJ8IiArIHN0cmNvbnYuRm9ybWF0SW50KGEuZmVlLCAxMCkgKyAifCIgKyBxdW90ZUpTT04oYS5wYXRoKSArICJ8IiArIHF1b3RlSlNPTihhLnJlYXNvbikKfQpmdW5jIChhIEFwcHN0b3JlQWN0aW9uKSBDYXRlZ29yeSgpIG1lbWJhX3dlaWdodGVkX3BvbGljeS5DYXRlZ29yeSB7CglhLkJ5dGVzKCkKCWlmIGEuSXNMaXN0aW5nKCkgewoJCXJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuUm91dGluZQoJfQoJc3dpdGNoIGEua2luZCB7CgljYXNlIEFwcHN0b3JlRmVlLCBBcHBzdG9yZVRyZWFzdXJ5LCBBcHBzdG9yZVVucGF1c2U6CgkJcmV0dXJuIG1lbWJhX3dlaWdodGVkX3BvbGljeS5GaW5hbmNpYWwKCX0KCXJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ3JpdGljYWwKfQoamygKEWFwcHN0b3JlX2hvc3QuZ25vEoUocGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCgp0eXBlIEFwcHN0b3JlTGlzdGluZyBzdHJ1Y3QgewoJRXhpc3RzICAgICAgICAgICAgICAgICAgICAgIGJvb2wKCUNvbnRlbnRIYXNoLCBTdGF0dXMsIFJlYXNvbiBzdHJpbmcKCUNyZWRpdCAgICAgICAgICAgICAgICAgICAgICBib29sCglGbGFncyAgICAgICAgICAgICAgICAgICAgICAgaW50CglDbGVhcktleXMgICAgICAgICAgICAgICAgICAgc3RyaW5nCn0KdHlwZSBBcHBzdG9yZVN0YXRlIHN0cnVjdCB7CglPd25lciwgUGVuZGluZ093bmVyLCBUcmVhc3VyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCglGZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NAoJUGF1c2VkLCBTZWFsZWQsIE93bmVyQ3VyYXRvciwgREFPQ3VyYXRvciwgU3VjY2Vzc29yQ3VyYXRvciwgU3ViamVjdEN1cmF0b3IgYm9vbAoJTGlzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwc3RvcmVMaXN0aW5nCn0KdHlwZSBhcHBzdG9yZVByb3Bvc2FsIHN0cnVjdCB7CglhY3Rpb24gQXBwc3RvcmVBY3Rpb24KCWJlZm9yZSBBcHBzdG9yZVN0YXRlCn0KCmZ1bmMgYXBwc3RvcmVDb21taXRtZW50KGEgQXBwc3RvcmVBY3Rpb24sIHMgQXBwc3RvcmVTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBhLkJ5dGVzKCkgKyAifGJlZm9yZXwiICsgYXBwc3RvcmVTdGF0ZUpTT04ocykKfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUFwcHN0b3JlQXV0aG9yaXR5KHMgQXBwc3RvcmVTdGF0ZSkgewoJaWYgaC5hcHBzdG9yZVBvbGljeSA9PSBuaWwgewoJCXBhbmljKCJhcHBzdG9yZSBhY3Rpb25zIGFyZSBub3QgY29uZmlndXJlZCIpCgl9CglpZiAhcy5Pd25lci5Jc1ZhbGlkKCkgfHwgIXMuVHJlYXN1cnkuSXNWYWxpZCgpIHx8IChzLlBlbmRpbmdPd25lciAhPSAiIiAmJiAhcy5QZW5kaW5nT3duZXIuSXNWYWxpZCgpKSB8fCBzLkZlZSA8IDAgfHwgcy5GZWUgPiBBcHBzdG9yZU1heEZlZSB7CgkJcGFuaWMoImludmFsaWQgYXBwc3RvcmUgcHJlLXN0YXRlIikKCX0KfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUFwcHN0b3JlKGEgQXBwc3RvcmVBY3Rpb24sIHMgQXBwc3RvcmVTdGF0ZSkgewoJaC52YWxpZGF0ZUFwcHN0b3JlQXV0aG9yaXR5KHMpCglhLkJ5dGVzKCkKCXAgOj0gaC5hcHBzdG9yZVBvbGljeQoJaWYgIWEuSXNMaXN0aW5nKCkgJiYgcy5MaXN0aW5nICE9IChBcHBzdG9yZUxpc3Rpbmd7fSkgewoJCXBhbmljKCJ1bmV4cGVjdGVkIGFwcHN0b3JlIGxpc3Rpbmcgc3RhdGUiKQoJfQoJaWYgYS5raW5kICE9IEFwcHN0b3JlQWRkQ3VyYXRvciAmJiBhLmtpbmQgIT0gQXBwc3RvcmVSZW1vdmVDdXJhdG9yICYmIHMuU3ViamVjdEN1cmF0b3IgewoJCXBhbmljKCJ1bmV4cGVjdGVkIGFwcHN0b3JlIGN1cmF0b3Igc3RhdGUiKQoJfQoJaWYgYS5raW5kID09IEFwcHN0b3JlQWNjZXB0IHsKCQlpZiBzLk93bmVyID09IHAuREFPKCkgfHwgcy5QZW5kaW5nT3duZXIgIT0gcC5EQU8oKSB7CgkJCXBhbmljKCJEQU8gaXMgbm90IHBlbmRpbmcgYXBwc3RvcmUgb3duZXIiKQoJCX0KCQlyZXR1cm4KCX0KCWlmIHMuT3duZXIgIT0gcC5EQU8oKSB7CgkJcGFuaWMoIkRBTyBpcyBub3QgYXBwc3RvcmUgb3duZXIiKQoJfQoJaWYgYS5raW5kID09IEFwcHN0b3JlQWJvcnRSZXR1cm4gewoJCWlmIGEucmVjaXBpZW50ICE9IHAuU3VjY2Vzc29yKCkgfHwgcy5QZW5kaW5nT3duZXIgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJhcHBzdG9yZSByZXR1cm4gZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CgkJcmV0dXJuCgl9CglpZiBzLlBlbmRpbmdPd25lciAhPSAiIiB7CgkJcGFuaWMoImFwcHN0b3JlIGF1dGhvcml0eSB0cmFuc2ZlciBpcyBwZW5kaW5nIikKCX0KCWlmIGEuSXNMaXN0aW5nKCkgewoJCWwgOj0gcy5MaXN0aW5nCgkJaWYgIXMuREFPQ3VyYXRvciB7CgkJCXBhbmljKCJEQU8gaXMgbm90IGFwcHN0b3JlIGN1cmF0b3IiKQoJCX0KCQlpZiAhbC5FeGlzdHMgfHwgbC5Db250ZW50SGFzaCA9PSAiIiB8fCBsLkZsYWdzIDwgMCB7CgkJCXBhbmljKCJpbnZhbGlkIGFwcHN0b3JlIGxpc3RpbmciKQoJCX0KCQlzd2l0Y2ggYS5raW5kIHsKCQljYXNlIEFwcHN0b3JlQXBwcm92ZToKCQkJaWYgbC5TdGF0dXMgIT0gInBlbmRpbmciICYmIGwuU3RhdHVzICE9ICJyZWplY3RlZCIgewoJCQkJcGFuaWMoImFwcHN0b3JlIGFwcHJvdmFsIHJlcXVpcmVzIHBlbmRpbmcgb3IgcmVqZWN0ZWQgbGlzdGluZyIpCgkJCX0KCQljYXNlIEFwcHN0b3JlUmVqZWN0OgoJCQlpZiBsLlN0YXR1cyAhPSAicGVuZGluZyIgewoJCQkJcGFuaWMoImFwcHN0b3JlIHJlamVjdGlvbiByZXF1aXJlcyBwZW5kaW5nIGxpc3RpbmciKQoJCQl9CgkJY2FzZSBBcHBzdG9yZURlbGlzdDoKCQkJaWYgbC5TdGF0dXMgPT0gImRlbGlzdGVkIiB7CgkJCQlwYW5pYygiYXBwc3RvcmUgZGVsaXN0IGlzIGEgbm8tb3AiKQoJCQl9CgkJY2FzZSBBcHBzdG9yZVJlc3RvcmU6CgkJCWlmIGwuU3RhdHVzICE9ICJkZWxpc3RlZCIgewoJCQkJcGFuaWMoImFwcHN0b3JlIHJlc3RvcmUgcmVxdWlyZXMgZGVsaXN0ZWQgbGlzdGluZyIpCgkJCX0KCQljYXNlIEFwcHN0b3JlQ2xlYXJGbGFnczoKCQkJaWYgbC5GbGFncyA8PSAwIHx8IGwuQ2xlYXJLZXlzID09ICIiIHsKCQkJCXBhbmljKCJhcHBzdG9yZSBoYXMgbm8gcmVtb3ZhYmxlIGZsYWdzIikKCQkJfQoJCX0KCQlyZXR1cm4KCX0KCXN3aXRjaCBhLmtpbmQgewoJY2FzZSBBcHBzdG9yZVJldHVybjoKCQlpZiBhLnJlY2lwaWVudCAhPSBwLlN1Y2Nlc3NvcigpIHsKCQkJcGFuaWMoImFwcHN0b3JlIHN1Y2Nlc3NvciBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCWNhc2UgQXBwc3RvcmVUcmVhc3VyeToKCQlpZiBhLnJlY2lwaWVudCAhPSBwLlRyZWFzdXJ5KCkgewoJCQlwYW5pYygiYXBwc3RvcmUgdHJlYXN1cnkgZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CgkJaWYgcy5UcmVhc3VyeSA9PSBhLnJlY2lwaWVudCB7CgkJCXBhbmljKCJhcHBzdG9yZSB0cmVhc3VyeSBpcyBhIG5vLW9wIikKCQl9CgljYXNlIEFwcHN0b3JlRmVlOgoJCWlmIHMuRmVlID09IGEuZmVlIHsKCQkJcGFuaWMoImFwcHN0b3JlIGZlZSBpcyBhIG5vLW9wIikKCQl9CgljYXNlIEFwcHN0b3JlQWRkQ3VyYXRvcjoKCQlpZiBzLlN1YmplY3RDdXJhdG9yIHsKCQkJcGFuaWMoImFwcHN0b3JlIGN1cmF0b3IgZ3JhbnQgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBBcHBzdG9yZVJlbW92ZUN1cmF0b3I6CgkJaWYgIXMuU3ViamVjdEN1cmF0b3IgewoJCQlwYW5pYygiYXBwc3RvcmUgY3VyYXRvciByZW1vdmFsIGlzIGEgbm8tb3AiKQoJCX0KCWNhc2UgQXBwc3RvcmVVbnBhdXNlOgoJCWlmICFzLlBhdXNlZCB7CgkJCXBhbmljKCJhcHBzdG9yZSB1bnBhdXNlIGlzIGEgbm8tb3AiKQoJCX0KCWNhc2UgQXBwc3RvcmVTZWFsOgoJCWlmIHMuU2VhbGVkIHsKCQkJcGFuaWMoImFwcHN0b3JlIGltcG9ydCBhbHJlYWR5IHNlYWxlZCIpCgkJfQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgYXBwc3RvcmUgYWN0aW9uIikKCX0KfQpmdW5jIChoICpIb3N0KSBQcm9wb3NlQXBwc3RvcmUoYSBBcHBzdG9yZUFjdGlvbiwgcyBBcHBzdG9yZVN0YXRlLCBybG0gcmVhbG0pIHVpbnQ2NCB7Cgl3aG8gOj0gYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCWgudmFsaWRhdGVBcHBzdG9yZShhLCBzKQoJcCA6PSAmcm9sZVByb3Bvc2Fse3Byb3Bvc2VyOiB3aG8sIGFwcHN0b3JlOiAmYXBwc3RvcmVQcm9wb3NhbHthY3Rpb246IGEsIGJlZm9yZTogc319CglwLmJhbGxvdCA9IGgucG9saWN5Lk5ld1Byb3Bvc2FsKGEuQ2F0ZWdvcnkoKSwgYXBwc3RvcmVDb21taXRtZW50KGEsIHMpKQoJaC5hZGRQcm9wb3NhbChwKQoJcmV0dXJuIHVpbnQ2NChsZW4oaC5wcm9wb3NhbHMpKQp9CmZ1bmMgKGggKkhvc3QpIGludmFsaWRhdGVBcHBzdG9yZVBlZXJzKGNhdXNlIHN0cmluZywgaWQgdWludDY0KSB7CgltZW1iZXJzIDo9IFtdbWVtYmFfd2VpZ2h0ZWRfcG9saWN5Lk1lbWJlcnt9Cglmb3IgXywgc2VhdCA6PSByYW5nZSBoLnNlYXRzIHsKCQltZW1iZXJzID0gYXBwZW5kKG1lbWJlcnMsIHNlYXQuTWVtYmVyKQoJfQoJaC5wb2xpY3kuUmVjb25maWd1cmUobWVtYmVycykKCWgucmVjb3JkSW52YWxpZGF0aW9uKGNhdXNlLCBpZCwgQXBwc3RvcmVQYXRoKQp9CmZ1bmMgKGggKkhvc3QpIENvbnN1bWVBcHBzdG9yZShpZCB1aW50NjQsIHMgQXBwc3RvcmVTdGF0ZSwgcmxtIHJlYWxtKSBBcHBzdG9yZUFjdGlvbiB7Cglhc3NlcnRDYWxsZXIoaCwgcmxtKQoJcCA6PSBoLnByb3Bvc2FsKGlkKQoJaWYgcC5hcHBzdG9yZSA9PSBuaWwgewoJCXBhbmljKCJwcm9wb3NhbCBpcyBub3QgYW4gYXBwc3RvcmUgYWN0aW9uIikKCX0KCWgudmFsaWRhdGVBcHBzdG9yZShwLmFwcHN0b3JlLmFjdGlvbiwgcykKCXAuYmFsbG90LkNvbnN1bWUoYXBwc3RvcmVDb21taXRtZW50KHAuYXBwc3RvcmUuYWN0aW9uLCBzKSkKCWguaW52YWxpZGF0ZUFwcHN0b3JlUGVlcnMoSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQpCglyZXR1cm4gcC5hcHBzdG9yZS5hY3Rpb24KfQpmdW5jIChoICpIb3N0KSBQcmVwYXJlQXBwc3RvcmVFbWVyZ2VuY3lQYXVzZShzIEFwcHN0b3JlU3RhdGUsIHJsbSByZWFsbSkgewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCWgudmFsaWRhdGVBcHBzdG9yZUF1dGhvcml0eShzKQoJaWYgcy5Pd25lciAhPSBoLmFwcHN0b3JlUG9saWN5LkRBTygpIHsKCQlwYW5pYygiREFPIGlzIG5vdCBhcHBzdG9yZSBvd25lciIpCgl9CglpZiBzLlBhdXNlZCB7CgkJcGFuaWMoImFwcHN0b3JlIGlzIGFscmVhZHkgcGF1c2VkIikKCX0KCWlmIHMuTGlzdGluZyAhPSAoQXBwc3RvcmVMaXN0aW5ne30pIHx8IHMuU3ViamVjdEN1cmF0b3IgewoJCXBhbmljKCJ1bmV4cGVjdGVkIGFwcHN0b3JlIHBhdXNlIHN0YXRlIikKCX0KCWguaW52YWxpZGF0ZUFwcHN0b3JlUGVlcnMoSW52YWxpZGF0ZWRCeVBhdXNlLCAwKQp9ChroDwoSYXBwc3RvcmVfcmVhZHMuZ25vEtEPcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgInN0cmNvbnYiCgpmdW5jIChoICpIb3N0KSBhcHBzdG9yZUNvbmZpZ0pTT04oKSBzdHJpbmcgewoJaWYgaC5hcHBzdG9yZVBvbGljeSA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGAsImFwcHN0b3JlUG9saWN5Ijp7InRhcmdldCI6YCArIHF1b3RlSlNPTihBcHBzdG9yZVBhdGgpICsgYCwic3VjY2Vzc29yIjpgICsgcXVvdGVKU09OKHN0cmluZyhoLmFwcHN0b3JlUG9saWN5LlN1Y2Nlc3NvcigpKSkgKyBgLCJ0cmVhc3VyeSI6YCArIHF1b3RlSlNPTihzdHJpbmcoaC5hcHBzdG9yZVBvbGljeS5UcmVhc3VyeSgpKSkgKyBgLCJtYXhSZWdpc3RyYXRpb25GZWUiOiIxMDAwMDAwMDAiLCJjdXJhdG9yQ2F0ZWdvcnkiOiJjcml0aWNhbCIsInNlYWxDYXRlZ29yeSI6ImNyaXRpY2FsIiwibW9kZXJhdGlvbkNhdGVnb3J5Ijoicm91dGluZSIsInVucGF1c2VDYXRlZ29yeSI6ImZpbmFuY2lhbCIsImVtZXJnZW5jeVBhdXNlIjp0cnVlLCJyZXR1cm5TdGFnZXNPbmx5Ijp0cnVlLCJpbnZhbGlkYXRlc090aGVyUHJvcG9zYWxzIjp0cnVlfWAKfQpmdW5jIGFwcHN0b3JlTGlzdGluZ0pTT04ocyBBcHBzdG9yZUxpc3RpbmcpIHN0cmluZyB7CglyZXR1cm4gYHsiZXhpc3RzIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuRXhpc3RzKSArIGAsImNvbnRlbnRIYXNoIjpgICsgcXVvdGVKU09OKHMuQ29udGVudEhhc2gpICsgYCwic3RhdHVzIjpgICsgcXVvdGVKU09OKHMuU3RhdHVzKSArIGAsInJlYXNvbiI6YCArIHF1b3RlSlNPTihzLlJlYXNvbikgKyBgLCJjcmVkaXQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5DcmVkaXQpICsgYCwiZmxhZ3MiOmAgKyBxdW90ZUpTT04oc3RyY29udi5JdG9hKHMuRmxhZ3MpKSArIGAsImNsZWFyS2V5cyI6YCArIHF1b3RlSlNPTihzLkNsZWFyS2V5cykgKyBgfWAKfQpmdW5jIGFwcHN0b3JlU3RhdGVKU09OKHMgQXBwc3RvcmVTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJvd25lciI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5Pd25lcikpICsgYCwicGVuZGluZ093bmVyIjpgICsgcXVvdGVKU09OKHN0cmluZyhzLlBlbmRpbmdPd25lcikpICsgYCwidHJlYXN1cnkiOmAgKyBxdW90ZUpTT04oc3RyaW5nKHMuVHJlYXN1cnkpKSArIGAsImZlZSI6YCArIHF1b3RlSlNPTihzdHJjb252LkZvcm1hdEludChzLkZlZSwgMTApKSArIGAsInBhdXNlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChzLlBhdXNlZCkgKyBgLCJzZWFsZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5TZWFsZWQpICsgYCwib3duZXJDdXJhdG9yIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuT3duZXJDdXJhdG9yKSArIGAsImRhb0N1cmF0b3IiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5EQU9DdXJhdG9yKSArIGAsInN1Y2Nlc3NvckN1cmF0b3IiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5TdWNjZXNzb3JDdXJhdG9yKSArIGAsInN1YmplY3RDdXJhdG9yIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuU3ViamVjdEN1cmF0b3IpICsgYCwibGlzdGluZyI6YCArIGFwcHN0b3JlTGlzdGluZ0pTT04ocy5MaXN0aW5nKSArIGB9YAp9CmZ1bmMgYXBwc3RvcmVBY3Rpb25KU09OKGEgQXBwc3RvcmVBY3Rpb24sIHMgQXBwc3RvcmVTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJ0eXBlIjoiYXBwc3RvcmUiLCJ0YXJnZXQiOmAgKyBxdW90ZUpTT04oQXBwc3RvcmVQYXRoKSArIGAsIm9wZXJhdGlvbiI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5LaW5kKCkpKSArIGAsInJlY2lwaWVudCI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5SZWNpcGllbnQoKSkpICsgYCwiZmVlIjpgICsgcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0SW50KGEuRmVlKCksIDEwKSkgKyBgLCJwYXRoIjpgICsgcXVvdGVKU09OKGEuUGF0aCgpKSArIGAsInJlYXNvbiI6YCArIHF1b3RlSlNPTihhLlJlYXNvbigpKSArIGAsImJlZm9yZSI6YCArIGFwcHN0b3JlU3RhdGVKU09OKHMpICsgYH1gCn0KGvAYChJhcmNhZGVfYWN0aW9ucy5nbm8S2RhwYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAoCgkiY2hhaW4iCgkiZ25vLmxhbmQvcC9zYW1jcmV3L21lbWJhX3dlaWdodGVkX3BvbGljeSIKKQoKY29uc3QgQXJjYWRlUGF0aCA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxIgoKdHlwZSBBcmNhZGVBY3Rpb25LaW5kIHN0cmluZwoKY29uc3QgKAoJQXJjYWRlQWNjZXB0T3duZXIgICAgQXJjYWRlQWN0aW9uS2luZCA9ICJhY2NlcHQtb3duZXIiCglBcmNhZGVSZXR1cm5Pd25lciAgICBBcmNhZGVBY3Rpb25LaW5kID0gInJldHVybi1vd25lciIKCUFyY2FkZUFib3J0UmV0dXJuICAgIEFyY2FkZUFjdGlvbktpbmQgPSAiYWJvcnQtcmV0dXJuIgoJQXJjYWRlQWRkQXR0ZXN0ZXIgICAgQXJjYWRlQWN0aW9uS2luZCA9ICJhZGQtYXR0ZXN0ZXIiCglBcmNhZGVSZW1vdmVBdHRlc3RlciBBcmNhZGVBY3Rpb25LaW5kID0gInJlbW92ZS1hdHRlc3RlciIKCUFyY2FkZVVucGF1c2UgICAgICAgIEFyY2FkZUFjdGlvbktpbmQgPSAidW5wYXVzZSIKKQoKdHlwZSBBcmNhZGVQb2xpY3kgc3RydWN0eyBkYW8sIHN1Y2Nlc3NvciBhZGRyZXNzIH0KCmZ1bmMgTmV3QXJjYWRlUG9saWN5KGRhbywgc3VjY2Vzc29yIGFkZHJlc3MpIEFyY2FkZVBvbGljeSB7CglpZiAhZGFvLklzVmFsaWQoKSB8fCBkYW8gIT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSB7CgkJcGFuaWMoImFyY2FkZSBwb2xpY3kgcmVxdWlyZXMgdGhlIGZvdW5kaW5nIERBTyBhZGRyZXNzIikKCX0KCWlmICFzdWNjZXNzb3IuSXNWYWxpZCgpIHx8IHN1Y2Nlc3NvciA9PSBkYW8gfHwgc3VjY2Vzc29yID09IGNoYWluLlBhY2thZ2VBZGRyZXNzKEFyY2FkZVBhdGgpIHsKCQlwYW5pYygiYXJjYWRlIHBvbGljeSByZXF1aXJlcyBhIHZhbGlkIGRpc3RpbmN0IHN1Y2Nlc3NvciIpCgl9CglyZXR1cm4gQXJjYWRlUG9saWN5e2RhbzogZGFvLCBzdWNjZXNzb3I6IHN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEFyY2FkZVBvbGljeSkgREFPKCkgYWRkcmVzcyAgICAgICB7IHJldHVybiBwLmRhbyB9CmZ1bmMgKHAgQXJjYWRlUG9saWN5KSBTdWNjZXNzb3IoKSBhZGRyZXNzIHsgcmV0dXJuIHAuc3VjY2Vzc29yIH0KCnR5cGUgQXJjYWRlQWN0aW9uIHN0cnVjdCB7CglraW5kICAgICAgQXJjYWRlQWN0aW9uS2luZAoJcmVjaXBpZW50IGFkZHJlc3MKCWF0dGVzdGVyICBhZGRyZXNzCn0KCmZ1bmMgKHAgQXJjYWRlUG9saWN5KSBBY2NlcHQoKSBBcmNhZGVBY3Rpb24geyByZXR1cm4gQXJjYWRlQWN0aW9ue2tpbmQ6IEFyY2FkZUFjY2VwdE93bmVyfSB9CmZ1bmMgKHAgQXJjYWRlUG9saWN5KSBSZXR1cm4oKSBBcmNhZGVBY3Rpb24gewoJcmV0dXJuIEFyY2FkZUFjdGlvbntraW5kOiBBcmNhZGVSZXR1cm5Pd25lciwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEFyY2FkZVBvbGljeSkgQWJvcnRSZXR1cm4oKSBBcmNhZGVBY3Rpb24gewoJcmV0dXJuIEFyY2FkZUFjdGlvbntraW5kOiBBcmNhZGVBYm9ydFJldHVybiwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEFyY2FkZVBvbGljeSkgQWRkQXR0ZXN0ZXIod2hvIGFkZHJlc3MpIEFyY2FkZUFjdGlvbiB7CglpZiB3aG8gPT0gcC5EQU8oKSB8fCB3aG8gPT0gcC5TdWNjZXNzb3IoKSB8fCB3aG8gPT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoQXJjYWRlUGF0aCkgewoJCXBhbmljKCJhcmNhZGUgYXR0ZXN0ZXIgbXVzdCBiZSBhIGRlZGljYXRlZCBleHRlcm5hbCBhY2NvdW50IikKCX0KCWEgOj0gQXJjYWRlQWN0aW9ue2tpbmQ6IEFyY2FkZUFkZEF0dGVzdGVyLCBhdHRlc3Rlcjogd2hvfQoJYS5CeXRlcygpCglyZXR1cm4gYQp9CmZ1bmMgQXJjYWRlUmV2b2tlQXR0ZXN0ZXIod2hvIGFkZHJlc3MpIEFyY2FkZUFjdGlvbiB7CglhIDo9IEFyY2FkZUFjdGlvbntraW5kOiBBcmNhZGVSZW1vdmVBdHRlc3RlciwgYXR0ZXN0ZXI6IHdob30KCWEuQnl0ZXMoKQoJcmV0dXJuIGEKfQpmdW5jIEFyY2FkZVJlc3VtZSgpIEFyY2FkZUFjdGlvbiAgICAgICAgICAgICAgeyByZXR1cm4gQXJjYWRlQWN0aW9ue2tpbmQ6IEFyY2FkZVVucGF1c2V9IH0KZnVuYyAoYSBBcmNhZGVBY3Rpb24pIEtpbmQoKSBBcmNhZGVBY3Rpb25LaW5kIHsgcmV0dXJuIGEua2luZCB9CmZ1bmMgKGEgQXJjYWRlQWN0aW9uKSBSZWNpcGllbnQoKSBhZGRyZXNzICAgICB7IHJldHVybiBhLnJlY2lwaWVudCB9CmZ1bmMgKGEgQXJjYWRlQWN0aW9uKSBBdHRlc3RlcigpIGFkZHJlc3MgICAgICB7IHJldHVybiBhLmF0dGVzdGVyIH0KZnVuYyAoYSBBcmNhZGVBY3Rpb24pIEJ5dGVzKCkgc3RyaW5nIHsKCWJhc2UgOj0gImFyY2FkZS92MXwiICsgQXJjYWRlUGF0aCArICJ8IiArIHN0cmluZyhhLmtpbmQpCglzd2l0Y2ggYS5raW5kIHsKCWNhc2UgQXJjYWRlQWNjZXB0T3duZXIsIEFyY2FkZVVucGF1c2U6CgkJaWYgYS5yZWNpcGllbnQgIT0gIiIgfHwgYS5hdHRlc3RlciAhPSAiIiB7CgkJCXBhbmljKCJtYWxmb3JtZWQgYXJjYWRlIGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlCgljYXNlIEFyY2FkZVJldHVybk93bmVyLCBBcmNhZGVBYm9ydFJldHVybjoKCQlpZiAhYS5yZWNpcGllbnQuSXNWYWxpZCgpIHx8IGEuYXR0ZXN0ZXIgIT0gIiIgewoJCQlwYW5pYygibWFsZm9ybWVkIGFyY2FkZSByZXR1cm4gYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UgKyAifCIgKyBzdHJpbmcoYS5yZWNpcGllbnQpCgljYXNlIEFyY2FkZUFkZEF0dGVzdGVyLCBBcmNhZGVSZW1vdmVBdHRlc3RlcjoKCQlpZiAhYS5hdHRlc3Rlci5Jc1ZhbGlkKCkgfHwgYS5yZWNpcGllbnQgIT0gIiIgewoJCQlwYW5pYygiaW52YWxpZCBhcmNhZGUgYXR0ZXN0ZXIgYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UgKyAifCIgKyBzdHJpbmcoYS5hdHRlc3RlcikKCWRlZmF1bHQ6CgkJcGFuaWMoInVuc3VwcG9ydGVkIGFyY2FkZSBhY3Rpb24iKQoJfQp9CmZ1bmMgKGEgQXJjYWRlQWN0aW9uKSBDYXRlZ29yeSgpIG1lbWJhX3dlaWdodGVkX3BvbGljeS5DYXRlZ29yeSB7CglhLkJ5dGVzKCkKCWlmIGEua2luZCA9PSBBcmNhZGVVbnBhdXNlIHsKCQlyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkZpbmFuY2lhbAoJfQoJcmV0dXJuIG1lbWJhX3dlaWdodGVkX3BvbGljeS5Dcml0aWNhbAp9ChqgGwoPYXJjYWRlX2hvc3QuZ25vEowbcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCgovLyBFeHBsaWNpdCBhbGxvd2xpc3QgYml0cyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgb3duZXIncyBpbXBsaWNpdCBhdHRlc3RlciByaWdodC4KdHlwZSBBcmNhZGVTdGF0ZSBzdHJ1Y3QgewoJT3duZXIsIFBlbmRpbmdPd25lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcwoJUGF1c2VkLCBPd25lckxpc3RlZCwgREFPTGlzdGVkLCBTdWNjZXNzb3JMaXN0ZWQsIFN1YmplY3RMaXN0ZWQgYm9vbAp9CnR5cGUgYXJjYWRlUHJvcG9zYWwgc3RydWN0IHsKCWFjdGlvbiBBcmNhZGVBY3Rpb24KCWJlZm9yZSBBcmNhZGVTdGF0ZQp9CgpmdW5jIGFyY2FkZUNvbW1pdG1lbnQoYSBBcmNhZGVBY3Rpb24sIHMgQXJjYWRlU3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYS5CeXRlcygpICsgInxiZWZvcmV8IiArIGFyY2FkZVN0YXRlSlNPTihzKQp9CmZ1bmMgKGggKkhvc3QpIHZhbGlkYXRlQXJjYWRlQXV0aG9yaXR5KHMgQXJjYWRlU3RhdGUpIHsKCWlmIGguYXJjYWRlUG9saWN5ID09IG5pbCB7CgkJcGFuaWMoImFyY2FkZSBhY3Rpb25zIGFyZSBub3QgY29uZmlndXJlZCIpCgl9CglpZiAhcy5Pd25lci5Jc1ZhbGlkKCkgfHwgKHMuUGVuZGluZ093bmVyICE9ICIiICYmICFzLlBlbmRpbmdPd25lci5Jc1ZhbGlkKCkpIHsKCQlwYW5pYygiaW52YWxpZCBhcmNhZGUgYXV0aG9yaXR5IHByZS1zdGF0ZSIpCgl9Cn0KZnVuYyAoaCAqSG9zdCkgdmFsaWRhdGVBcmNhZGUoYSBBcmNhZGVBY3Rpb24sIHMgQXJjYWRlU3RhdGUpIHsKCWgudmFsaWRhdGVBcmNhZGVBdXRob3JpdHkocykKCWEuQnl0ZXMoKQoJcCA6PSBoLmFyY2FkZVBvbGljeQoJaWYgYS5BdHRlc3RlcigpID09ICIiICYmIHMuU3ViamVjdExpc3RlZCB7CgkJcGFuaWMoInVuZXhwZWN0ZWQgYXJjYWRlIHN1YmplY3QgcHJlLXN0YXRlIikKCX0KCWlmIGEuS2luZCgpID09IEFyY2FkZUFjY2VwdE93bmVyIHsKCQlpZiBzLk93bmVyID09IHAuREFPKCkgfHwgcy5QZW5kaW5nT3duZXIgIT0gcC5EQU8oKSB7CgkJCXBhbmljKCJEQU8gaXMgbm90IHBlbmRpbmcgYXJjYWRlIG93bmVyIikKCQl9CgkJcmV0dXJuCgl9CglpZiBzLk93bmVyICE9IHAuREFPKCkgewoJCXBhbmljKCJEQU8gaXMgbm90IGFyY2FkZSBvd25lciIpCgl9CglpZiBhLktpbmQoKSA9PSBBcmNhZGVBYm9ydFJldHVybiB7CgkJaWYgYS5SZWNpcGllbnQoKSAhPSBwLlN1Y2Nlc3NvcigpIHx8IHMuUGVuZGluZ093bmVyICE9IHAuU3VjY2Vzc29yKCkgewoJCQlwYW5pYygiYXJjYWRlIHJldHVybiBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCQlyZXR1cm4KCX0KCWlmIHMuUGVuZGluZ093bmVyICE9ICIiIHsKCQlwYW5pYygiYXJjYWRlIGF1dGhvcml0eSB0cmFuc2ZlciBpcyBwZW5kaW5nIikKCX0KCXN3aXRjaCBhLktpbmQoKSB7CgljYXNlIEFyY2FkZVJldHVybk93bmVyOgoJCWlmIGEuUmVjaXBpZW50KCkgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJhcmNhZGUgc3VjY2Vzc29yIGRvZXMgbm90IG1hdGNoIHBvbGljeSIpCgkJfQoJY2FzZSBBcmNhZGVBZGRBdHRlc3RlcjoKCQlwLkFkZEF0dGVzdGVyKGEuQXR0ZXN0ZXIoKSkKCQlpZiBzLlN1YmplY3RMaXN0ZWQgewoJCQlwYW5pYygiYXJjYWRlIGF0dGVzdGVyIGdyYW50IGlzIGEgbm8tb3AiKQoJCX0KCWNhc2UgQXJjYWRlUmVtb3ZlQXR0ZXN0ZXI6CgkJaWYgIXMuU3ViamVjdExpc3RlZCB7CgkJCXBhbmljKCJhcmNhZGUgYXR0ZXN0ZXIgcmVtb3ZhbCBpcyBhIG5vLW9wIikKCQl9CgljYXNlIEFyY2FkZVVucGF1c2U6CgkJaWYgIXMuUGF1c2VkIHsKCQkJcGFuaWMoImFyY2FkZSB1bnBhdXNlIGlzIGEgbm8tb3AiKQoJCX0KCWRlZmF1bHQ6CgkJcGFuaWMoInVuc3VwcG9ydGVkIGFyY2FkZSBhY3Rpb24iKQoJfQp9CmZ1bmMgKGggKkhvc3QpIFByb3Bvc2VBcmNhZGUoYSBBcmNhZGVBY3Rpb24sIHMgQXJjYWRlU3RhdGUsIHJsbSByZWFsbSkgdWludDY0IHsKCXdobyA6PSBhc3NlcnRDYWxsZXIoaCwgcmxtKQoJaC52YWxpZGF0ZUFyY2FkZShhLCBzKQoJcCA6PSAmcm9sZVByb3Bvc2Fse3Byb3Bvc2VyOiB3aG8sIGFyY2FkZTogJmFyY2FkZVByb3Bvc2Fse2FjdGlvbjogYSwgYmVmb3JlOiBzfX0KCXAuYmFsbG90ID0gaC5wb2xpY3kuTmV3UHJvcG9zYWwoYS5DYXRlZ29yeSgpLCBhcmNhZGVDb21taXRtZW50KGEsIHMpKQoJaC5hZGRQcm9wb3NhbChwKQoJcmV0dXJuIHVpbnQ2NChsZW4oaC5wcm9wb3NhbHMpKQp9CmZ1bmMgKGggKkhvc3QpIGludmFsaWRhdGVBcmNhZGVQZWVycyhjYXVzZSBzdHJpbmcsIGlkIHVpbnQ2NCkgewoJbWVtYmVycyA6PSBbXW1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7fQoJZm9yIF8sIHNlYXQgOj0gcmFuZ2UgaC5zZWF0cyB7CgkJbWVtYmVycyA9IGFwcGVuZChtZW1iZXJzLCBzZWF0Lk1lbWJlcikKCX0KCWgucG9saWN5LlJlY29uZmlndXJlKG1lbWJlcnMpCgloLnJlY29yZEludmFsaWRhdGlvbihjYXVzZSwgaWQsIEFyY2FkZVBhdGgpCn0KZnVuYyAoaCAqSG9zdCkgQ29uc3VtZUFyY2FkZShpZCB1aW50NjQsIHMgQXJjYWRlU3RhdGUsIHJsbSByZWFsbSkgQXJjYWRlQWN0aW9uIHsKCWFzc2VydENhbGxlcihoLCBybG0pCglwIDo9IGgucHJvcG9zYWwoaWQpCglpZiBwLmFyY2FkZSA9PSBuaWwgewoJCXBhbmljKCJwcm9wb3NhbCBpcyBub3QgYW4gYXJjYWRlIGFjdGlvbiIpCgl9CgloLnZhbGlkYXRlQXJjYWRlKHAuYXJjYWRlLmFjdGlvbiwgcykKCXAuYmFsbG90LkNvbnN1bWUoYXJjYWRlQ29tbWl0bWVudChwLmFyY2FkZS5hY3Rpb24sIHMpKQoJaC5pbnZhbGlkYXRlQXJjYWRlUGVlcnMoSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQpCglyZXR1cm4gcC5hcmNhZGUuYWN0aW9uCn0KCi8vIEEgZml4ZWQgcGF1c2Utb25seSBjYXBhYmlsaXR5LCBub3QgYSBwcm9wb3NhbCBjYXRlZ29yeSBvciBhIGJvb2wtY29udHJvbGxlZAovLyBlc2NhcGUuIEFuIGFscmVhZHktcGF1c2VkIGNhbGwgY2Fubm90IGludmFsaWRhdGUgcGVuZGluZyB1bnBhdXNlIGFwcHJvdmFscy4KZnVuYyAoaCAqSG9zdCkgUHJlcGFyZUFyY2FkZUVtZXJnZW5jeVBhdXNlKHMgQXJjYWRlU3RhdGUsIHJsbSByZWFsbSkgewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCWgudmFsaWRhdGVBcmNhZGVBdXRob3JpdHkocykKCWlmIHMuT3duZXIgIT0gaC5hcmNhZGVQb2xpY3kuREFPKCkgewoJCXBhbmljKCJEQU8gaXMgbm90IGFyY2FkZSBvd25lciIpCgl9CglpZiBzLlBhdXNlZCB7CgkJcGFuaWMoImFyY2FkZSBpcyBhbHJlYWR5IHBhdXNlZCIpCgl9CglpZiBzLlN1YmplY3RMaXN0ZWQgewoJCXBhbmljKCJ1bmV4cGVjdGVkIGFyY2FkZSBzdWJqZWN0IHByZS1zdGF0ZSIpCgl9CgloLmludmFsaWRhdGVBcmNhZGVQZWVycyhJbnZhbGlkYXRlZEJ5UGF1c2UsIDApCn0KGqAJChBhcmNhZGVfcmVhZHMuZ25vEosJcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgInN0cmNvbnYiCgpmdW5jIChoICpIb3N0KSBhcmNhZGVDb25maWdKU09OKCkgc3RyaW5nIHsKCWlmIGguYXJjYWRlUG9saWN5ID09IG5pbCB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gYCwiYXJjYWRlUG9saWN5Ijp7InRhcmdldCI6YCArIHF1b3RlSlNPTihBcmNhZGVQYXRoKSArIGAsInN1Y2Nlc3NvciI6YCArIHF1b3RlSlNPTihzdHJpbmcoaC5hcmNhZGVQb2xpY3kuU3VjY2Vzc29yKCkpKSArIGAsImF0dGVzdGVyQ2F0ZWdvcnkiOiJjcml0aWNhbCIsInVucGF1c2VDYXRlZ29yeSI6ImZpbmFuY2lhbCIsImVtZXJnZW5jeVBhdXNlIjp0cnVlLCJyZXR1cm5TdGFnZXNPbmx5Ijp0cnVlLCJpbnZhbGlkYXRlc090aGVyUHJvcG9zYWxzIjp0cnVlfWAKfQpmdW5jIGFyY2FkZVN0YXRlSlNPTihzIEFyY2FkZVN0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGB7Im93bmVyIjpgICsgcXVvdGVKU09OKHN0cmluZyhzLk93bmVyKSkgKyBgLCJwZW5kaW5nT3duZXIiOmAgKyBxdW90ZUpTT04oc3RyaW5nKHMuUGVuZGluZ093bmVyKSkgKyBgLCJwYXVzZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5QYXVzZWQpICsgYCwib3duZXJMaXN0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5Pd25lckxpc3RlZCkgKyBgLCJkYW9MaXN0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5EQU9MaXN0ZWQpICsgYCwic3VjY2Vzc29yTGlzdGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuU3VjY2Vzc29yTGlzdGVkKSArIGAsInN1YmplY3RMaXN0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5TdWJqZWN0TGlzdGVkKSArIGB9YAp9CmZ1bmMgYXJjYWRlQWN0aW9uSlNPTihhIEFyY2FkZUFjdGlvbiwgcyBBcmNhZGVTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJ0eXBlIjoiYXJjYWRlIiwidGFyZ2V0IjpgICsgcXVvdGVKU09OKEFyY2FkZVBhdGgpICsgYCwib3BlcmF0aW9uIjpgICsgcXVvdGVKU09OKHN0cmluZyhhLktpbmQoKSkpICsgYCwicmVjaXBpZW50IjpgICsgcXVvdGVKU09OKHN0cmluZyhhLlJlY2lwaWVudCgpKSkgKyBgLCJhdHRlc3RlciI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5BdHRlc3RlcigpKSkgKyBgLCJiZWZvcmUiOmAgKyBhcmNhZGVTdGF0ZUpTT04ocykgKyBgfWAKfQoakBgKEmJhZGdlc19hY3Rpb25zLmdubxL5F3BhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgopCgpjb25zdCBCYWRnZXNQYXRoID0gImduby5sYW5kL3Ivc2FtY3Jldy9nbm9idWlsZGVyc19iYWRnZXNfdjIiCgp0eXBlIEJhZGdlc0FjdGlvbktpbmQgc3RyaW5nCgpjb25zdCAoCglCYWRnZXNBY2NlcHRPd25lciBCYWRnZXNBY3Rpb25LaW5kID0gImFjY2VwdC1vd25lciIKCUJhZGdlc1JldHVybk93bmVyIEJhZGdlc0FjdGlvbktpbmQgPSAicmV0dXJuLW93bmVyIgoJQmFkZ2VzQWJvcnRSZXR1cm4gQmFkZ2VzQWN0aW9uS2luZCA9ICJhYm9ydC1yZXR1cm4iCglCYWRnZXNBZGRBZG1pbiAgICBCYWRnZXNBY3Rpb25LaW5kID0gImFkZC1hZG1pbiIKCUJhZGdlc1JlbW92ZUFkbWluIEJhZGdlc0FjdGlvbktpbmQgPSAicmVtb3ZlLWFkbWluIgoJQmFkZ2VzVW5wYXVzZSAgICAgQmFkZ2VzQWN0aW9uS2luZCA9ICJ1bnBhdXNlIgopCgp0eXBlIEJhZGdlc1BvbGljeSBzdHJ1Y3R7IGRhbywgc3VjY2Vzc29yIGFkZHJlc3MgfQoKZnVuYyBOZXdCYWRnZXNQb2xpY3koZGFvLCBzdWNjZXNzb3IgYWRkcmVzcykgQmFkZ2VzUG9saWN5IHsKCWlmICFkYW8uSXNWYWxpZCgpIHx8IGRhbyAhPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2RhbyIpIHsKCQlwYW5pYygiYmFkZ2VzIHBvbGljeSByZXF1aXJlcyB0aGUgZm91bmRpbmcgREFPIGFkZHJlc3MiKQoJfQoJaWYgIXN1Y2Nlc3Nvci5Jc1ZhbGlkKCkgfHwgc3VjY2Vzc29yID09IGRhbyB8fCBzdWNjZXNzb3IgPT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoQmFkZ2VzUGF0aCkgewoJCXBhbmljKCJiYWRnZXMgcG9saWN5IHJlcXVpcmVzIGEgdmFsaWQgZGlzdGluY3Qgc3VjY2Vzc29yIikKCX0KCXJldHVybiBCYWRnZXNQb2xpY3l7ZGFvOiBkYW8sIHN1Y2Nlc3Nvcjogc3VjY2Vzc29yfQp9CmZ1bmMgKHAgQmFkZ2VzUG9saWN5KSBEQU8oKSBhZGRyZXNzICAgICAgIHsgcmV0dXJuIHAuZGFvIH0KZnVuYyAocCBCYWRnZXNQb2xpY3kpIFN1Y2Nlc3NvcigpIGFkZHJlc3MgeyByZXR1cm4gcC5zdWNjZXNzb3IgfQoKdHlwZSBCYWRnZXNBY3Rpb24gc3RydWN0IHsKCWtpbmQgICAgICBCYWRnZXNBY3Rpb25LaW5kCglyZWNpcGllbnQgYWRkcmVzcwoJc3ViamVjdCAgIGFkZHJlc3MKfQoKZnVuYyAocCBCYWRnZXNQb2xpY3kpIEFjY2VwdCgpIEJhZGdlc0FjdGlvbiB7IHJldHVybiBCYWRnZXNBY3Rpb257a2luZDogQmFkZ2VzQWNjZXB0T3duZXJ9IH0KZnVuYyAocCBCYWRnZXNQb2xpY3kpIFJldHVybigpIEJhZGdlc0FjdGlvbiB7CglyZXR1cm4gQmFkZ2VzQWN0aW9ue2tpbmQ6IEJhZGdlc1JldHVybk93bmVyLCByZWNpcGllbnQ6IHAuc3VjY2Vzc29yfQp9CmZ1bmMgKHAgQmFkZ2VzUG9saWN5KSBBYm9ydFJldHVybigpIEJhZGdlc0FjdGlvbiB7CglyZXR1cm4gQmFkZ2VzQWN0aW9ue2tpbmQ6IEJhZGdlc0Fib3J0UmV0dXJuLCByZWNpcGllbnQ6IHAuc3VjY2Vzc29yfQp9CmZ1bmMgKHAgQmFkZ2VzUG9saWN5KSBBZGRBZG1pbih3aG8gYWRkcmVzcykgQmFkZ2VzQWN0aW9uIHsKCWlmIHdobyA9PSBwLmRhbyB8fCB3aG8gPT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoQmFkZ2VzUGF0aCkgewoJCXBhbmljKCJiYWRnZXMgYWRtaW4gbXVzdCBiZSBhbiBleHRlcm5hbCBhY2NvdW50IikKCX0KCWEgOj0gQmFkZ2VzQWN0aW9ue2tpbmQ6IEJhZGdlc0FkZEFkbWluLCBzdWJqZWN0OiB3aG99CglhLkJ5dGVzKCkKCXJldHVybiBhCn0KZnVuYyBCYWRnZXNSZXZva2VBZG1pbih3aG8gYWRkcmVzcykgQmFkZ2VzQWN0aW9uIHsKCWEgOj0gQmFkZ2VzQWN0aW9ue2tpbmQ6IEJhZGdlc1JlbW92ZUFkbWluLCBzdWJqZWN0OiB3aG99CglhLkJ5dGVzKCkKCXJldHVybiBhCn0KZnVuYyBCYWRnZXNSZXN1bWUoKSBCYWRnZXNBY3Rpb24gICAgICAgICAgICAgIHsgcmV0dXJuIEJhZGdlc0FjdGlvbntraW5kOiBCYWRnZXNVbnBhdXNlfSB9CmZ1bmMgKGEgQmFkZ2VzQWN0aW9uKSBLaW5kKCkgQmFkZ2VzQWN0aW9uS2luZCB7IHJldHVybiBhLmtpbmQgfQpmdW5jIChhIEJhZGdlc0FjdGlvbikgUmVjaXBpZW50KCkgYWRkcmVzcyAgICAgeyByZXR1cm4gYS5yZWNpcGllbnQgfQpmdW5jIChhIEJhZGdlc0FjdGlvbikgU3ViamVjdCgpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gYS5zdWJqZWN0IH0KZnVuYyAoYSBCYWRnZXNBY3Rpb24pIEJ5dGVzKCkgc3RyaW5nIHsKCWJhc2UgOj0gImJhZGdlcy92MXwiICsgQmFkZ2VzUGF0aCArICJ8IiArIHN0cmluZyhhLmtpbmQpCglzd2l0Y2ggYS5raW5kIHsKCWNhc2UgQmFkZ2VzQWNjZXB0T3duZXIsIEJhZGdlc1VucGF1c2U6CgkJaWYgYS5yZWNpcGllbnQgIT0gIiIgfHwgYS5zdWJqZWN0ICE9ICIiIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCBiYWRnZXMgYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UKCWNhc2UgQmFkZ2VzUmV0dXJuT3duZXIsIEJhZGdlc0Fib3J0UmV0dXJuOgoJCWlmICFhLnJlY2lwaWVudC5Jc1ZhbGlkKCkgfHwgYS5zdWJqZWN0ICE9ICIiIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCBiYWRnZXMgcmV0dXJuIGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQoJY2FzZSBCYWRnZXNBZGRBZG1pbiwgQmFkZ2VzUmVtb3ZlQWRtaW46CgkJaWYgIWEuc3ViamVjdC5Jc1ZhbGlkKCkgfHwgYS5yZWNpcGllbnQgIT0gIiIgewoJCQlwYW5pYygiaW52YWxpZCBiYWRnZXMgYWRtaW4gYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UgKyAifCIgKyBzdHJpbmcoYS5zdWJqZWN0KQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgYmFkZ2VzIGFjdGlvbiIpCgl9Cn0KZnVuYyAoYSBCYWRnZXNBY3Rpb24pIENhdGVnb3J5KCkgbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNhdGVnb3J5IHsKCWEuQnl0ZXMoKQoJaWYgYS5raW5kID09IEJhZGdlc1VucGF1c2UgewoJCXJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuRmluYW5jaWFsCgl9CglyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNyaXRpY2FsCn0KGsEdCg9iYWRnZXNfaG9zdC5nbm8SrR1wYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAiZ25vLmxhbmQvcC9zYW1jcmV3L21lbWJhX3dlaWdodGVkX3BvbGljeSIKCmNvbnN0IEJhZGdlc01heEFkbWlucyA9IDEwCgovLyBBZG1pbiBiaXRzIGFyZSBleHBsaWNpdCBncmFudHMuIFRoZSBjdXJyZW50IG93bmVyJ3MgYXV0aG9yaXR5IHRvIGFwcG9pbnQgaXMKLy8gc2VwYXJhdGUgZnJvbSB0aG9zZSBiaXRzLCBidXQgdGFyZ2V0IG93bmVyc2hpcCBhbHdheXMgaW5zdGFsbHMgYW4gYWRtaW4gZ3JhbnQuCnR5cGUgQmFkZ2VzU3RhdGUgc3RydWN0IHsKCU93bmVyLCBQZW5kaW5nT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKCVBhdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKCUFkbWluQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludAoJT3duZXJBZG1pbiwgREFPQWRtaW4sIFN1Y2Nlc3NvckFkbWluLCBTdWJqZWN0QWRtaW4gYm9vbAp9CnR5cGUgYmFkZ2VzUHJvcG9zYWwgc3RydWN0IHsKCWFjdGlvbiBCYWRnZXNBY3Rpb24KCWJlZm9yZSBCYWRnZXNTdGF0ZQp9CgpmdW5jIGJhZGdlc0NvbW1pdG1lbnQoYSBCYWRnZXNBY3Rpb24sIHMgQmFkZ2VzU3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYS5CeXRlcygpICsgInxiZWZvcmV8IiArIGJhZGdlc1N0YXRlSlNPTihzKQp9CmZ1bmMgKGggKkhvc3QpIHZhbGlkYXRlQmFkZ2VzQXV0aG9yaXR5KHMgQmFkZ2VzU3RhdGUpIHsKCWlmIGguYmFkZ2VzUG9saWN5ID09IG5pbCB7CgkJcGFuaWMoImJhZGdlcyBhY3Rpb25zIGFyZSBub3QgY29uZmlndXJlZCIpCgl9CglpZiAhcy5Pd25lci5Jc1ZhbGlkKCkgfHwgKHMuUGVuZGluZ093bmVyICE9ICIiICYmICFzLlBlbmRpbmdPd25lci5Jc1ZhbGlkKCkpIHx8ICFzLk93bmVyQWRtaW4gfHwgcy5BZG1pbkNvdW50IDwgMSB8fCBzLkFkbWluQ291bnQgPiBCYWRnZXNNYXhBZG1pbnMgewoJCXBhbmljKCJpbnZhbGlkIGJhZGdlcyBhdXRob3JpdHkgcHJlLXN0YXRlIikKCX0KfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUJhZGdlcyhhIEJhZGdlc0FjdGlvbiwgcyBCYWRnZXNTdGF0ZSkgewoJaC52YWxpZGF0ZUJhZGdlc0F1dGhvcml0eShzKQoJYS5CeXRlcygpCglwIDo9IGguYmFkZ2VzUG9saWN5CglpZiBhLlN1YmplY3QoKSA9PSAiIiAmJiBzLlN1YmplY3RBZG1pbiB7CgkJcGFuaWMoInVuZXhwZWN0ZWQgYmFkZ2VzIHN1YmplY3QgcHJlLXN0YXRlIikKCX0KCWlmIGEuS2luZCgpID09IEJhZGdlc0FjY2VwdE93bmVyIHsKCQlpZiBzLk93bmVyID09IHAuREFPKCkgfHwgcy5QZW5kaW5nT3duZXIgIT0gcC5EQU8oKSB7CgkJCXBhbmljKCJEQU8gaXMgbm90IHBlbmRpbmcgYmFkZ2VzIG93bmVyIikKCQl9CgkJcmV0dXJuCgl9CglpZiBzLk93bmVyICE9IHAuREFPKCkgfHwgIXMuREFPQWRtaW4gewoJCXBhbmljKCJEQU8gaXMgbm90IGJhZGdlcyBvd25lci9hZG1pbiIpCgl9CglpZiBhLktpbmQoKSA9PSBCYWRnZXNBYm9ydFJldHVybiB7CgkJaWYgYS5SZWNpcGllbnQoKSAhPSBwLlN1Y2Nlc3NvcigpIHx8IHMuUGVuZGluZ093bmVyICE9IHAuU3VjY2Vzc29yKCkgewoJCQlwYW5pYygiYmFkZ2VzIHJldHVybiBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCQlyZXR1cm4KCX0KCWlmIHMuUGVuZGluZ093bmVyICE9ICIiIHsKCQlwYW5pYygiYmFkZ2VzIGF1dGhvcml0eSB0cmFuc2ZlciBpcyBwZW5kaW5nIikKCX0KCXN3aXRjaCBhLktpbmQoKSB7CgljYXNlIEJhZGdlc1JldHVybk93bmVyOgoJCWlmIGEuUmVjaXBpZW50KCkgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJiYWRnZXMgc3VjY2Vzc29yIGRvZXMgbm90IG1hdGNoIHBvbGljeSIpCgkJfQoJY2FzZSBCYWRnZXNBZGRBZG1pbjoKCQlwLkFkZEFkbWluKGEuU3ViamVjdCgpKQoJCWlmIHMuU3ViamVjdEFkbWluIHsKCQkJcGFuaWMoImJhZGdlcyBhZG1pbiBncmFudCBpcyBhIG5vLW9wIikKCQl9CgkJaWYgcy5BZG1pbkNvdW50ID49IEJhZGdlc01heEFkbWlucyB7CgkJCXBhbmljKCJiYWRnZXMgYWRtaW4gbGltaXQgcmVhY2hlZCIpCgkJfQoJY2FzZSBCYWRnZXNSZW1vdmVBZG1pbjoKCQlpZiBhLlN1YmplY3QoKSA9PSBzLk93bmVyIHsKCQkJcGFuaWMoImNhbm5vdCByZW1vdmUgYmFkZ2VzIG93bmVyIGFkbWluIikKCQl9CgkJaWYgIXMuU3ViamVjdEFkbWluIHsKCQkJcGFuaWMoImJhZGdlcyBhZG1pbiByZW1vdmFsIGlzIGEgbm8tb3AiKQoJCX0KCWNhc2UgQmFkZ2VzVW5wYXVzZToKCQlpZiAhcy5QYXVzZWQgewoJCQlwYW5pYygiYmFkZ2VzIHVucGF1c2UgaXMgYSBuby1vcCIpCgkJfQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgYmFkZ2VzIGFjdGlvbiIpCgl9Cn0KZnVuYyAoaCAqSG9zdCkgUHJvcG9zZUJhZGdlcyhhIEJhZGdlc0FjdGlvbiwgcyBCYWRnZXNTdGF0ZSwgcmxtIHJlYWxtKSB1aW50NjQgewoJd2hvIDo9IGFzc2VydENhbGxlcihoLCBybG0pCgloLnZhbGlkYXRlQmFkZ2VzKGEsIHMpCglwIDo9ICZyb2xlUHJvcG9zYWx7cHJvcG9zZXI6IHdobywgYmFkZ2VzOiAmYmFkZ2VzUHJvcG9zYWx7YWN0aW9uOiBhLCBiZWZvcmU6IHN9fQoJcC5iYWxsb3QgPSBoLnBvbGljeS5OZXdQcm9wb3NhbChhLkNhdGVnb3J5KCksIGJhZGdlc0NvbW1pdG1lbnQoYSwgcykpCgloLmFkZFByb3Bvc2FsKHApCglyZXR1cm4gdWludDY0KGxlbihoLnByb3Bvc2FscykpCn0KZnVuYyAoaCAqSG9zdCkgaW52YWxpZGF0ZUJhZGdlc1BlZXJzKGNhdXNlIHN0cmluZywgaWQgdWludDY0KSB7CgltZW1iZXJzIDo9IFtdbWVtYmFfd2VpZ2h0ZWRfcG9saWN5Lk1lbWJlcnt9Cglmb3IgXywgc2VhdCA6PSByYW5nZSBoLnNlYXRzIHsKCQltZW1iZXJzID0gYXBwZW5kKG1lbWJlcnMsIHNlYXQuTWVtYmVyKQoJfQoJaC5wb2xpY3kuUmVjb25maWd1cmUobWVtYmVycykKCWgucmVjb3JkSW52YWxpZGF0aW9uKGNhdXNlLCBpZCwgQmFkZ2VzUGF0aCkKfQpmdW5jIChoICpIb3N0KSBDb25zdW1lQmFkZ2VzKGlkIHVpbnQ2NCwgcyBCYWRnZXNTdGF0ZSwgcmxtIHJlYWxtKSBCYWRnZXNBY3Rpb24gewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCXAgOj0gaC5wcm9wb3NhbChpZCkKCWlmIHAuYmFkZ2VzID09IG5pbCB7CgkJcGFuaWMoInByb3Bvc2FsIGlzIG5vdCBhIGJhZGdlcyBhY3Rpb24iKQoJfQoJaC52YWxpZGF0ZUJhZGdlcyhwLmJhZGdlcy5hY3Rpb24sIHMpCglwLmJhbGxvdC5Db25zdW1lKGJhZGdlc0NvbW1pdG1lbnQocC5iYWRnZXMuYWN0aW9uLCBzKSkKCWguaW52YWxpZGF0ZUJhZGdlc1BlZXJzKEludmFsaWRhdGVkQnlFeGVjdXRpb24sIGlkKQoJcmV0dXJuIHAuYmFkZ2VzLmFjdGlvbgp9CmZ1bmMgKGggKkhvc3QpIFByZXBhcmVCYWRnZXNFbWVyZ2VuY3lQYXVzZShzIEJhZGdlc1N0YXRlLCBybG0gcmVhbG0pIHsKCWFzc2VydENhbGxlcihoLCBybG0pCgloLnZhbGlkYXRlQmFkZ2VzQXV0aG9yaXR5KHMpCglpZiBzLk93bmVyICE9IGguYmFkZ2VzUG9saWN5LkRBTygpIHx8ICFzLkRBT0FkbWluIHsKCQlwYW5pYygiREFPIGlzIG5vdCBiYWRnZXMgb3duZXIvYWRtaW4iKQoJfQoJaWYgcy5QYXVzZWQgewoJCXBhbmljKCJiYWRnZXMgaXMgYWxyZWFkeSBwYXVzZWQiKQoJfQoJaWYgcy5TdWJqZWN0QWRtaW4gewoJCXBhbmljKCJ1bmV4cGVjdGVkIGJhZGdlcyBzdWJqZWN0IHByZS1zdGF0ZSIpCgl9CgloLmludmFsaWRhdGVCYWRnZXNQZWVycyhJbnZhbGlkYXRlZEJ5UGF1c2UsIDApCn0KGs4JChBiYWRnZXNfcmVhZHMuZ25vErkJcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgInN0cmNvbnYiCgpmdW5jIChoICpIb3N0KSBiYWRnZXNDb25maWdKU09OKCkgc3RyaW5nIHsKCWlmIGguYmFkZ2VzUG9saWN5ID09IG5pbCB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gYCwiYmFkZ2VzUG9saWN5Ijp7InRhcmdldCI6YCArIHF1b3RlSlNPTihCYWRnZXNQYXRoKSArIGAsInN1Y2Nlc3NvciI6YCArIHF1b3RlSlNPTihzdHJpbmcoaC5iYWRnZXNQb2xpY3kuU3VjY2Vzc29yKCkpKSArIGAsImFkbWluQ2F0ZWdvcnkiOiJjcml0aWNhbCIsInVucGF1c2VDYXRlZ29yeSI6ImZpbmFuY2lhbCIsImVtZXJnZW5jeVBhdXNlIjp0cnVlLCJyZXR1cm5TdGFnZXNPbmx5Ijp0cnVlLCJpbnZhbGlkYXRlc090aGVyUHJvcG9zYWxzIjp0cnVlfWAKfQpmdW5jIGJhZGdlc1N0YXRlSlNPTihzIEJhZGdlc1N0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGB7Im93bmVyIjpgICsgcXVvdGVKU09OKHN0cmluZyhzLk93bmVyKSkgKyBgLCJwZW5kaW5nT3duZXIiOmAgKyBxdW90ZUpTT04oc3RyaW5nKHMuUGVuZGluZ093bmVyKSkgKyBgLCJwYXVzZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5QYXVzZWQpICsgYCwiYWRtaW5Db3VudCI6YCArIHF1b3RlSlNPTihzdHJjb252Lkl0b2Eocy5BZG1pbkNvdW50KSkgKyBgLCJvd25lckFkbWluIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuT3duZXJBZG1pbikgKyBgLCJkYW9BZG1pbiI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChzLkRBT0FkbWluKSArIGAsInN1Y2Nlc3NvckFkbWluIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuU3VjY2Vzc29yQWRtaW4pICsgYCwic3ViamVjdEFkbWluIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuU3ViamVjdEFkbWluKSArIGB9YAp9CmZ1bmMgYmFkZ2VzQWN0aW9uSlNPTihhIEJhZGdlc0FjdGlvbiwgcyBCYWRnZXNTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJ0eXBlIjoiYmFkZ2VzIiwidGFyZ2V0IjpgICsgcXVvdGVKU09OKEJhZGdlc1BhdGgpICsgYCwib3BlcmF0aW9uIjpgICsgcXVvdGVKU09OKHN0cmluZyhhLktpbmQoKSkpICsgYCwicmVjaXBpZW50IjpgICsgcXVvdGVKU09OKHN0cmluZyhhLlJlY2lwaWVudCgpKSkgKyBgLCJzdWJqZWN0IjpgICsgcXVvdGVKU09OKHN0cmluZyhhLlN1YmplY3QoKSkpICsgYCwiYmVmb3JlIjpgICsgYmFkZ2VzU3RhdGVKU09OKHMpICsgYH1gCn0KGogqChRjaGFubmVsc19hY3Rpb25zLmdubxLvKXBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkiZ25vLmxhbmQvcC9zYW1jcmV3L21lbWJhX3dlaWdodGVkX3BvbGljeSIKKQoKY29uc3QgQ2hhbm5lbHNQYXRoID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW9fY2hhbm5lbHNfdjIiCgp0eXBlIENoYW5uZWxzQWN0aW9uS2luZCBzdHJpbmcKCmNvbnN0ICgKCUNoYW5uZWxzQWNjZXB0T3duZXIgQ2hhbm5lbHNBY3Rpb25LaW5kID0gImFjY2VwdC1vd25lciIKCUNoYW5uZWxzUmV0dXJuT3duZXIgQ2hhbm5lbHNBY3Rpb25LaW5kID0gInJldHVybi1vd25lciIKCUNoYW5uZWxzQWJvcnRSZXR1cm4gQ2hhbm5lbHNBY3Rpb25LaW5kID0gImFib3J0LXJldHVybiIKCUNoYW5uZWxzQWRkTWVtYmVyIENoYW5uZWxzQWN0aW9uS2luZCA9ICJhZGQtbWVtYmVyIgoJQ2hhbm5lbHNSZW1vdmVNZW1iZXIgQ2hhbm5lbHNBY3Rpb25LaW5kID0gInJlbW92ZS1tZW1iZXIiCglDaGFubmVsc1NldFJvbGVzIENoYW5uZWxzQWN0aW9uS2luZCA9ICJzZXQtcm9sZXMiCglDaGFubmVsc0NyZWF0ZVRleHQgQ2hhbm5lbHNBY3Rpb25LaW5kID0gImNyZWF0ZS10ZXh0LWNoYW5uZWwiCglDaGFubmVsc1VucGF1c2UgQ2hhbm5lbHNBY3Rpb25LaW5kID0gInVucGF1c2UiCikKCnR5cGUgQ2hhbm5lbHNQb2xpY3kgc3RydWN0eyBkYW8sIHN1Y2Nlc3NvciBhZGRyZXNzIH0KCmZ1bmMgTmV3Q2hhbm5lbHNQb2xpY3koZGFvLCBzdWNjZXNzb3IgYWRkcmVzcykgQ2hhbm5lbHNQb2xpY3kgewoJaWYgIWRhby5Jc1ZhbGlkKCkgfHwgZGFvICE9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvIikgewoJCXBhbmljKCJjaGFubmVscyBwb2xpY3kgcmVxdWlyZXMgdGhlIGZvdW5kaW5nIERBTyBhZGRyZXNzIikKCX0KCWlmICFzdWNjZXNzb3IuSXNWYWxpZCgpIHx8IHN1Y2Nlc3NvciA9PSBkYW8gfHwgc3VjY2Vzc29yID09IGNoYWluLlBhY2thZ2VBZGRyZXNzKENoYW5uZWxzUGF0aCkgewoJCXBhbmljKCJjaGFubmVscyBwb2xpY3kgcmVxdWlyZXMgYSB2YWxpZCBkaXN0aW5jdCBzdWNjZXNzb3IiKQoJfQoJcmV0dXJuIENoYW5uZWxzUG9saWN5e2RhbzogZGFvLCBzdWNjZXNzb3I6IHN1Y2Nlc3Nvcn0KfQpmdW5jIChwIENoYW5uZWxzUG9saWN5KSBEQU8oKSBhZGRyZXNzIHsgcmV0dXJuIHAuZGFvIH0KZnVuYyAocCBDaGFubmVsc1BvbGljeSkgU3VjY2Vzc29yKCkgYWRkcmVzcyB7IHJldHVybiBwLnN1Y2Nlc3NvciB9Cgp0eXBlIENoYW5uZWxzQWN0aW9uIHN0cnVjdCB7CglraW5kIENoYW5uZWxzQWN0aW9uS2luZAoJcmVjaXBpZW50LCBzdWJqZWN0IGFkZHJlc3MKCXJvbGVzIHN0cmluZwoJbmFtZSwgZGVzY3JpcHRpb24gc3RyaW5nCn0KZnVuYyAocCBDaGFubmVsc1BvbGljeSkgQWNjZXB0KCkgQ2hhbm5lbHNBY3Rpb24geyByZXR1cm4gQ2hhbm5lbHNBY3Rpb257a2luZDogQ2hhbm5lbHNBY2NlcHRPd25lcn0gfQpmdW5jIChwIENoYW5uZWxzUG9saWN5KSBSZXR1cm4oKSBDaGFubmVsc0FjdGlvbiB7IHJldHVybiBDaGFubmVsc0FjdGlvbntraW5kOiBDaGFubmVsc1JldHVybk93bmVyLCByZWNpcGllbnQ6IHAuc3VjY2Vzc29yfSB9CmZ1bmMgKHAgQ2hhbm5lbHNQb2xpY3kpIEFib3J0UmV0dXJuKCkgQ2hhbm5lbHNBY3Rpb24geyByZXR1cm4gQ2hhbm5lbHNBY3Rpb257a2luZDogQ2hhbm5lbHNBYm9ydFJldHVybiwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0gfQpmdW5jIChwIENoYW5uZWxzUG9saWN5KSBBZGRNZW1iZXIod2hvIGFkZHJlc3MsIHJvbGVzIHN0cmluZykgQ2hhbm5lbHNBY3Rpb24geyBhOj1DaGFubmVsc0FjdGlvbntraW5kOiBDaGFubmVsc0FkZE1lbWJlciwgc3ViamVjdDp3aG8sIHJvbGVzOnJvbGVzfTsgYS5CeXRlcygpOyByZXR1cm4gYSB9CmZ1bmMgKHAgQ2hhbm5lbHNQb2xpY3kpIFJlbW92ZU1lbWJlcih3aG8gYWRkcmVzcykgQ2hhbm5lbHNBY3Rpb24geyBhOj1DaGFubmVsc0FjdGlvbntraW5kOiBDaGFubmVsc1JlbW92ZU1lbWJlciwgc3ViamVjdDp3aG99OyBhLkJ5dGVzKCk7IHJldHVybiBhIH0KZnVuYyAocCBDaGFubmVsc1BvbGljeSkgU2V0Um9sZXMod2hvIGFkZHJlc3MsIHJvbGVzIHN0cmluZykgQ2hhbm5lbHNBY3Rpb24geyBhOj1DaGFubmVsc0FjdGlvbntraW5kOiBDaGFubmVsc1NldFJvbGVzLCBzdWJqZWN0Ondobywgcm9sZXM6cm9sZXN9OyBhLkJ5dGVzKCk7IHJldHVybiBhIH0KZnVuYyAocCBDaGFubmVsc1BvbGljeSkgQ3JlYXRlVGV4dChuYW1lLCBkZXNjcmlwdGlvbiBzdHJpbmcpIENoYW5uZWxzQWN0aW9uIHsgYTo9Q2hhbm5lbHNBY3Rpb257a2luZDogQ2hhbm5lbHNDcmVhdGVUZXh0LCBuYW1lOm5hbWUsIGRlc2NyaXB0aW9uOmRlc2NyaXB0aW9ufTsgYS5CeXRlcygpOyByZXR1cm4gYSB9CmZ1bmMgQ2hhbm5lbHNSZXN1bWUoKSBDaGFubmVsc0FjdGlvbiB7IHJldHVybiBDaGFubmVsc0FjdGlvbntraW5kOiBDaGFubmVsc1VucGF1c2V9IH0KZnVuYyAoYSBDaGFubmVsc0FjdGlvbikgS2luZCgpIENoYW5uZWxzQWN0aW9uS2luZCB7IHJldHVybiBhLmtpbmQgfQpmdW5jIChhIENoYW5uZWxzQWN0aW9uKSBSZWNpcGllbnQoKSBhZGRyZXNzIHsgcmV0dXJuIGEucmVjaXBpZW50IH0KZnVuYyAoYSBDaGFubmVsc0FjdGlvbikgU3ViamVjdCgpIGFkZHJlc3MgeyByZXR1cm4gYS5zdWJqZWN0IH0KZnVuYyAoYSBDaGFubmVsc0FjdGlvbikgUm9sZXMoKSBzdHJpbmcgeyByZXR1cm4gYS5yb2xlcyB9CmZ1bmMgKGEgQ2hhbm5lbHNBY3Rpb24pIE5hbWUoKSBzdHJpbmcgeyByZXR1cm4gYS5uYW1lIH0KZnVuYyAoYSBDaGFubmVsc0FjdGlvbikgRGVzY3JpcHRpb24oKSBzdHJpbmcgeyByZXR1cm4gYS5kZXNjcmlwdGlvbiB9CgpmdW5jIHZhbGlkQ2hhbm5lbHNOYW1lKG5hbWUgc3RyaW5nKSBib29sIHsKCWlmIGxlbihuYW1lKTwxIHx8IGxlbihuYW1lKT41MCB7IHJldHVybiBmYWxzZSB9Cglmb3IgXyxjOj1yYW5nZSBuYW1lIHsgaWYgISgoYz49J2EnJiZjPD0neicpfHwoYz49JzAnJiZjPD0nOScpfHxjPT0nLScpIHsgcmV0dXJuIGZhbHNlIH0gfQoJcmV0dXJuIHRydWUKfQpmdW5jIHZhbGlkQ2hhbm5lbHNEZXNjcmlwdGlvbihkZXNjcmlwdGlvbiBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKGRlc2NyaXB0aW9uKTwxIHx8IGxlbihkZXNjcmlwdGlvbik+MjAwIHsgcmV0dXJuIGZhbHNlIH0KCWZvciBfLGM6PXJhbmdlIGRlc2NyaXB0aW9uIHsgaWYgYzwzMiB8fCBjPT0xMjcgeyByZXR1cm4gZmFsc2UgfSB9CglyZXR1cm4gdHJ1ZQp9CgovLyBPbmx5IHRoZSBmb3VyIHRhcmdldCBBQ0wgcm9sZXMgYXJlIHJlcHJlc2VudGFibGU7IGV2ZXJ5IHJvbGUgbGlzdCBoYXMgYQovLyBjYW5vbmljYWwgb3JkZXIsIHNvIGEgdm90ZWQgY29tbWl0bWVudCBjYW5ub3QgYWxpYXMgYW5vdGhlciByb2xlIGdyYW50LgpmdW5jIGNhbm9uaWNhbENoYW5uZWxzUm9sZXMocm9sZXMgc3RyaW5nKSBib29sIHsKCWlmIHJvbGVzID09ICIiIHsgcmV0dXJuIGZhbHNlIH0KCXBhcnRzOj1zdHJpbmdzLlNwbGl0KHJvbGVzLCAiLCIpCglpZiBsZW4ocGFydHMpPjQgeyByZXR1cm4gZmFsc2UgfQoJcHJldmlvdXM6PS0xCglmb3IgXyxwYXJ0Oj1yYW5nZSBwYXJ0cyB7CgkJaW5kZXg6PS0xCgkJc3dpdGNoIHBhcnQgeyBjYXNlICJhZG1pbiI6IGluZGV4PTA7IGNhc2UgImRldiI6IGluZGV4PTE7IGNhc2UgIm9wcyI6IGluZGV4PTI7IGNhc2UgIm1lbWJlciI6IGluZGV4PTMgfQoJCWlmIGluZGV4PD1wcmV2aW91cyB7IHJldHVybiBmYWxzZSB9CgkJcHJldmlvdXM9aW5kZXgKCX0KCXJldHVybiB0cnVlCn0KZnVuYyAoYSBDaGFubmVsc0FjdGlvbikgQnl0ZXMoKSBzdHJpbmcgewoJYmFzZTo9ImNoYW5uZWxzL3YxfCIrQ2hhbm5lbHNQYXRoKyJ8IitzdHJpbmcoYS5raW5kKQoJc3dpdGNoIGEua2luZCB7CgljYXNlIENoYW5uZWxzQWNjZXB0T3duZXIsIENoYW5uZWxzVW5wYXVzZToKCQlpZiBhLnJlY2lwaWVudCE9IiIgfHwgYS5zdWJqZWN0IT0iIiB8fCBhLnJvbGVzIT0iIiB8fCBhLm5hbWUhPSIiIHx8IGEuZGVzY3JpcHRpb24hPSIiIHsgcGFuaWMoIm1hbGZvcm1lZCBjaGFubmVscyBhY3Rpb24iKSB9CgkJcmV0dXJuIGJhc2UKCWNhc2UgQ2hhbm5lbHNSZXR1cm5Pd25lciwgQ2hhbm5lbHNBYm9ydFJldHVybjoKCQlpZiAhYS5yZWNpcGllbnQuSXNWYWxpZCgpIHx8IGEuc3ViamVjdCE9IiIgfHwgYS5yb2xlcyE9IiIgfHwgYS5uYW1lIT0iIiB8fCBhLmRlc2NyaXB0aW9uIT0iIiB7IHBhbmljKCJtYWxmb3JtZWQgY2hhbm5lbHMgcmV0dXJuIGFjdGlvbiIpIH0KCQlyZXR1cm4gYmFzZSsifCIrc3RyaW5nKGEucmVjaXBpZW50KQoJY2FzZSBDaGFubmVsc0FkZE1lbWJlciwgQ2hhbm5lbHNTZXRSb2xlczoKCQlpZiAhYS5zdWJqZWN0LklzVmFsaWQoKSB8fCBhLnJlY2lwaWVudCE9IiIgfHwgYS5uYW1lIT0iIiB8fCBhLmRlc2NyaXB0aW9uIT0iIiB8fCAhY2Fub25pY2FsQ2hhbm5lbHNSb2xlcyhhLnJvbGVzKSB7IHBhbmljKCJpbnZhbGlkIGNoYW5uZWxzIG1lbWJlciBhY3Rpb24iKSB9CgkJcmV0dXJuIGJhc2UrInwiK3N0cmluZyhhLnN1YmplY3QpKyJ8IitzdHJjb252Lkl0b2EobGVuKGEucm9sZXMpKSsiOiIrYS5yb2xlcwoJY2FzZSBDaGFubmVsc1JlbW92ZU1lbWJlcjoKCQlpZiAhYS5zdWJqZWN0LklzVmFsaWQoKSB8fCBhLnJlY2lwaWVudCE9IiIgfHwgYS5yb2xlcyE9IiIgfHwgYS5uYW1lIT0iIiB8fCBhLmRlc2NyaXB0aW9uIT0iIiB7IHBhbmljKCJpbnZhbGlkIGNoYW5uZWxzIG1lbWJlciBhY3Rpb24iKSB9CgkJcmV0dXJuIGJhc2UrInwiK3N0cmluZyhhLnN1YmplY3QpCgljYXNlIENoYW5uZWxzQ3JlYXRlVGV4dDoKCQlpZiBhLnJlY2lwaWVudCE9IiIgfHwgYS5zdWJqZWN0IT0iIiB8fCBhLnJvbGVzIT0iIiB8fCAhdmFsaWRDaGFubmVsc05hbWUoYS5uYW1lKSB8fCAhdmFsaWRDaGFubmVsc0Rlc2NyaXB0aW9uKGEuZGVzY3JpcHRpb24pIHsgcGFuaWMoImludmFsaWQgY2hhbm5lbHMgdGV4dCBjcmVhdGlvbiIpIH0KCQlyZXR1cm4gYmFzZSsifCIrYS5uYW1lKyJ8IitzdHJjb252Lkl0b2EobGVuKGEuZGVzY3JpcHRpb24pKSsiOiIrYS5kZXNjcmlwdGlvbgoJZGVmYXVsdDogcGFuaWMoInVuc3VwcG9ydGVkIGNoYW5uZWxzIGFjdGlvbiIpCgl9Cn0KZnVuYyAoYSBDaGFubmVsc0FjdGlvbikgQ2F0ZWdvcnkoKSBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ2F0ZWdvcnkgewoJYS5CeXRlcygpCglpZiBhLmtpbmQ9PUNoYW5uZWxzVW5wYXVzZSB7IHJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuRmluYW5jaWFsIH0KCXJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ3JpdGljYWwKfQoa2CAKEWNoYW5uZWxzX2hvc3QuZ25vEsIgcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgKAoJImNoYWluIgoJImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCikKCnR5cGUgQ2hhbm5lbHNTdGF0ZSBzdHJ1Y3QgewoJT3duZXIsIFBlbmRpbmdPd25lciBhZGRyZXNzCglQYXVzZWQgYm9vbAoJTWVtYmVyQ291bnQgaW50CglNZW1iZXJzaGlwUmV2aXNpb24gdWludDY0CglPd25lck1lbWJlciwgREFPTWVtYmVyLCBTdWNjZXNzb3JNZW1iZXIsIFN1YmplY3RNZW1iZXIgYm9vbAoJT3duZXJSb2xlcywgREFPUm9sZXMsIFN1Y2Nlc3NvclJvbGVzLCBTdWJqZWN0Um9sZXMgc3RyaW5nCglDaGFubmVsQ291bnQgaW50CglDaGFubmVsRXhpc3RzIGJvb2wKCUNoYW5uZWxEZXNjcmlwdGlvbiwgQ2hhbm5lbFR5cGUsIENoYW5uZWxSZWFkUm9sZXMsIENoYW5uZWxXcml0ZVJvbGVzIHN0cmluZwp9CnR5cGUgY2hhbm5lbHNQcm9wb3NhbCBzdHJ1Y3QgeyBhY3Rpb24gQ2hhbm5lbHNBY3Rpb247IGJlZm9yZSBDaGFubmVsc1N0YXRlIH0KCmZ1bmMgY2hhbm5lbHNDb21taXRtZW50KGEgQ2hhbm5lbHNBY3Rpb24sIHMgQ2hhbm5lbHNTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBhLkJ5dGVzKCkrInxiZWZvcmV8IitjaGFubmVsc1N0YXRlSlNPTihzKQp9CmZ1bmMgKGggKkhvc3QpIHZhbGlkYXRlQ2hhbm5lbHMoYSBDaGFubmVsc0FjdGlvbiwgcyBDaGFubmVsc1N0YXRlKSB7CglpZiBoLmNoYW5uZWxzUG9saWN5PT1uaWwgeyBwYW5pYygiY2hhbm5lbHMgYWN0aW9ucyBhcmUgbm90IGNvbmZpZ3VyZWQiKSB9CglhLkJ5dGVzKCkKCXA6PWguY2hhbm5lbHNQb2xpY3kKCWlmICFzLk93bmVyLklzVmFsaWQoKSB8fCAocy5QZW5kaW5nT3duZXIhPSIiICYmICFzLlBlbmRpbmdPd25lci5Jc1ZhbGlkKCkpIHx8IHMuTWVtYmVyQ291bnQ8MSB8fCAhcy5Pd25lck1lbWJlciB8fCBzLkNoYW5uZWxDb3VudDwwIHx8IHMuQ2hhbm5lbENvdW50PjIwIHsKCQlwYW5pYygiaW52YWxpZCBjaGFubmVscyBhdXRob3JpdHkgcHJlLXN0YXRlIikKCX0KCWlmIGEuU3ViamVjdCgpPT0iIiAmJiAocy5TdWJqZWN0TWVtYmVyIHx8IHMuU3ViamVjdFJvbGVzIT0iIikgeyBwYW5pYygidW5leHBlY3RlZCBjaGFubmVscyBzdWJqZWN0IHByZS1zdGF0ZSIpIH0KCWlmIGEuTmFtZSgpPT0iIiAmJiAocy5DaGFubmVsRXhpc3RzIHx8IHMuQ2hhbm5lbERlc2NyaXB0aW9uIT0iIiB8fCBzLkNoYW5uZWxUeXBlIT0iIiB8fCBzLkNoYW5uZWxSZWFkUm9sZXMhPSIiIHx8IHMuQ2hhbm5lbFdyaXRlUm9sZXMhPSIiKSB7IHBhbmljKCJ1bmV4cGVjdGVkIGNoYW5uZWxzIGNyZWF0aW9uIHByZS1zdGF0ZSIpIH0KCWlmIGEuS2luZCgpPT1DaGFubmVsc0FjY2VwdE93bmVyIHsKCQlpZiBzLk93bmVyPT1wLkRBTygpIHx8IHMuUGVuZGluZ093bmVyIT1wLkRBTygpIHx8IHMuREFPTWVtYmVyIHsKCQkJcGFuaWMoIkRBTyBpcyBub3QgcGVuZGluZyBjaGFubmVscyBvd25lciBvciBhbHJlYWR5IGhhcyBtZW1iZXJzaGlwIikKCQl9CgkJcmV0dXJuCgl9CglpZiBzLk93bmVyIT1wLkRBTygpIHx8ICFzLkRBT01lbWJlciB8fCBzLkRBT1JvbGVzIT1zLk93bmVyUm9sZXMgeyBwYW5pYygiREFPIGlzIG5vdCBjaGFubmVscyBvd25lciIpIH0KCWlmIGEuS2luZCgpPT1DaGFubmVsc0Fib3J0UmV0dXJuIHsKCQlpZiBhLlJlY2lwaWVudCgpIT1wLlN1Y2Nlc3NvcigpIHx8IHMuUGVuZGluZ093bmVyIT1wLlN1Y2Nlc3NvcigpIHsgcGFuaWMoImNoYW5uZWxzIHJldHVybiBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKSB9CgkJcmV0dXJuCgl9CglpZiBzLlBlbmRpbmdPd25lciE9IiIgeyBwYW5pYygiY2hhbm5lbHMgYXV0aG9yaXR5IHRyYW5zZmVyIGlzIHBlbmRpbmciKSB9Cglzd2l0Y2ggYS5LaW5kKCkgewoJY2FzZSBDaGFubmVsc1JldHVybk93bmVyOgoJCWlmIGEuUmVjaXBpZW50KCkhPXAuU3VjY2Vzc29yKCkgfHwgcy5TdWNjZXNzb3JNZW1iZXIgeyBwYW5pYygiY2hhbm5lbHMgc3VjY2Vzc29yIG1pc21hdGNoIG9yIHByZWV4aXN0aW5nIG1lbWJlcnNoaXAiKSB9CgljYXNlIENoYW5uZWxzQWRkTWVtYmVyLCBDaGFubmVsc1JlbW92ZU1lbWJlciwgQ2hhbm5lbHNTZXRSb2xlczoKCQlpZiBhLlN1YmplY3QoKT09cC5EQU8oKSB8fCBhLlN1YmplY3QoKT09Y2hhaW4uUGFja2FnZUFkZHJlc3MoQ2hhbm5lbHNQYXRoKSB8fCAoYS5TdWJqZWN0KCk9PXAuU3VjY2Vzc29yKCkgJiYgYS5LaW5kKCkhPUNoYW5uZWxzUmVtb3ZlTWVtYmVyKSB7CgkJCXBhbmljKCJjaGFubmVscyBtZW1iZXIgYWN0aW9uIHRhcmdldHMgcHJvdGVjdGVkIGF1dGhvcml0eSIpCgkJfQoJCWlmIGEuS2luZCgpPT1DaGFubmVsc0FkZE1lbWJlciAmJiBzLlN1YmplY3RNZW1iZXIgeyBwYW5pYygiY2hhbm5lbHMgbWVtYmVyIGFscmVhZHkgZXhpc3RzIikgfQoJCWlmIGEuS2luZCgpIT1DaGFubmVsc0FkZE1lbWJlciAmJiAhcy5TdWJqZWN0TWVtYmVyIHsgcGFuaWMoImNoYW5uZWxzIG1lbWJlciBkb2VzIG5vdCBleGlzdCIpIH0KCQlpZiBhLktpbmQoKT09Q2hhbm5lbHNTZXRSb2xlcyAmJiBzLlN1YmplY3RSb2xlcz09YS5Sb2xlcygpIHsgcGFuaWMoImNoYW5uZWxzIHJvbGVzIGFyZSB1bmNoYW5nZWQiKSB9CgljYXNlIENoYW5uZWxzQ3JlYXRlVGV4dDoKCQlpZiBzLkNoYW5uZWxDb3VudD49MjAgfHwgcy5DaGFubmVsRXhpc3RzIHsgcGFuaWMoImNoYW5uZWxzIHRleHQgY3JlYXRpb24gdW5hdmFpbGFibGUiKSB9CgljYXNlIENoYW5uZWxzVW5wYXVzZToKCQlpZiAhcy5QYXVzZWQgeyBwYW5pYygiY2hhbm5lbHMgdW5wYXVzZSBpcyBhIG5vLW9wIikgfQoJZGVmYXVsdDogcGFuaWMoInVuc3VwcG9ydGVkIGNoYW5uZWxzIGFjdGlvbiIpCgl9Cn0KZnVuYyAoaCAqSG9zdCkgUHJvcG9zZUNoYW5uZWxzKGEgQ2hhbm5lbHNBY3Rpb24sIHMgQ2hhbm5lbHNTdGF0ZSwgcmxtIHJlYWxtKSB1aW50NjQgewoJd2hvOj1hc3NlcnRDYWxsZXIoaCxybG0pCgloLnZhbGlkYXRlQ2hhbm5lbHMoYSxzKQoJcDo9JnJvbGVQcm9wb3NhbHtwcm9wb3Nlcjp3aG8sY2hhbm5lbHM6JmNoYW5uZWxzUHJvcG9zYWx7YWN0aW9uOmEsYmVmb3JlOnN9fQoJcC5iYWxsb3Q9aC5wb2xpY3kuTmV3UHJvcG9zYWwoYS5DYXRlZ29yeSgpLGNoYW5uZWxzQ29tbWl0bWVudChhLHMpKQoJaC5hZGRQcm9wb3NhbChwKQoJcmV0dXJuIHVpbnQ2NChsZW4oaC5wcm9wb3NhbHMpKQp9CmZ1bmMgKGggKkhvc3QpIGludmFsaWRhdGVDaGFubmVsc1BlZXJzKGNhdXNlIHN0cmluZywgaWQgdWludDY0KSB7CgltZW1iZXJzOj1bXW1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7fQoJZm9yIF8sc2VhdDo9cmFuZ2UgaC5zZWF0cyB7IG1lbWJlcnM9YXBwZW5kKG1lbWJlcnMsc2VhdC5NZW1iZXIpIH0KCWgucG9saWN5LlJlY29uZmlndXJlKG1lbWJlcnMpCgloLnJlY29yZEludmFsaWRhdGlvbihjYXVzZSwgaWQsIENoYW5uZWxzUGF0aCkKfQpmdW5jIChoICpIb3N0KSBDb25zdW1lQ2hhbm5lbHMoaWQgdWludDY0LCBzIENoYW5uZWxzU3RhdGUsIHJsbSByZWFsbSkgQ2hhbm5lbHNBY3Rpb24gewoJYXNzZXJ0Q2FsbGVyKGgscmxtKQoJcDo9aC5wcm9wb3NhbChpZCkKCWlmIHAuY2hhbm5lbHM9PW5pbCB7IHBhbmljKCJwcm9wb3NhbCBpcyBub3QgYSBjaGFubmVscyBhY3Rpb24iKSB9CgloLnZhbGlkYXRlQ2hhbm5lbHMocC5jaGFubmVscy5hY3Rpb24scykKCXAuYmFsbG90LkNvbnN1bWUoY2hhbm5lbHNDb21taXRtZW50KHAuY2hhbm5lbHMuYWN0aW9uLHMpKQoJaC5pbnZhbGlkYXRlQ2hhbm5lbHNQZWVycyhJbnZhbGlkYXRlZEJ5RXhlY3V0aW9uLCBpZCkKCXJldHVybiBwLmNoYW5uZWxzLmFjdGlvbgp9CmZ1bmMgKGggKkhvc3QpIFByZXBhcmVDaGFubmVsc0VtZXJnZW5jeVBhdXNlKHMgQ2hhbm5lbHNTdGF0ZSwgcmxtIHJlYWxtKSB7Cglhc3NlcnRDYWxsZXIoaCxybG0pCglpZiBoLmNoYW5uZWxzUG9saWN5PT1uaWwgfHwgcy5Pd25lciE9aC5jaGFubmVsc1BvbGljeS5EQU8oKSB8fCBzLlBhdXNlZCB8fCAhcy5Pd25lck1lbWJlciB8fCAhcy5EQU9NZW1iZXIgfHwgcy5EQU9Sb2xlcyE9cy5Pd25lclJvbGVzIHsKCQlwYW5pYygiY2hhbm5lbHMgZW1lcmdlbmN5IHBhdXNlIHVuYXZhaWxhYmxlIikKCX0KCWguaW52YWxpZGF0ZUNoYW5uZWxzUGVlcnMoSW52YWxpZGF0ZWRCeVBhdXNlLCAwKQp9ChrgDgoSY2hhbm5lbHNfcmVhZHMuZ25vEskOcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgInN0cmNvbnYiCgpmdW5jIChoICpIb3N0KSBjaGFubmVsc0NvbmZpZ0pTT04oKSBzdHJpbmcgewoJaWYgaC5jaGFubmVsc1BvbGljeT09bmlsIHsgcmV0dXJuICIiIH0KCXJldHVybiBgLCJjaGFubmVsc1BvbGljeSI6eyJ0YXJnZXQiOmArcXVvdGVKU09OKENoYW5uZWxzUGF0aCkrYCwic3VjY2Vzc29yIjpgK3F1b3RlSlNPTihzdHJpbmcoaC5jaGFubmVsc1BvbGljeS5TdWNjZXNzb3IoKSkpK2AsIm1lbWJlckNhdGVnb3J5IjoiY3JpdGljYWwiLCJ1bnBhdXNlQ2F0ZWdvcnkiOiJmaW5hbmNpYWwiLCJlbWVyZ2VuY3lQYXVzZSI6dHJ1ZSwicmV0dXJuU3RhZ2VzT25seSI6dHJ1ZSwiaW52YWxpZGF0ZXNPdGhlclByb3Bvc2FscyI6dHJ1ZX1gCn0KZnVuYyBjaGFubmVsc1N0YXRlSlNPTihzIENoYW5uZWxzU3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYHsib3duZXIiOmArcXVvdGVKU09OKHN0cmluZyhzLk93bmVyKSkrYCwicGVuZGluZ093bmVyIjpgK3F1b3RlSlNPTihzdHJpbmcocy5QZW5kaW5nT3duZXIpKStgLCJwYXVzZWQiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuUGF1c2VkKStgLCJtZW1iZXJDb3VudCI6YCtxdW90ZUpTT04oc3RyY29udi5JdG9hKHMuTWVtYmVyQ291bnQpKStgLCJtZW1iZXJzaGlwUmV2aXNpb24iOmArcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0VWludChzLk1lbWJlcnNoaXBSZXZpc2lvbiwxMCkpK2AsIm93bmVyTWVtYmVyIjpgK3N0cmNvbnYuRm9ybWF0Qm9vbChzLk93bmVyTWVtYmVyKStgLCJkYW9NZW1iZXIiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuREFPTWVtYmVyKStgLCJzdWNjZXNzb3JNZW1iZXIiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuU3VjY2Vzc29yTWVtYmVyKStgLCJzdWJqZWN0TWVtYmVyIjpgK3N0cmNvbnYuRm9ybWF0Qm9vbChzLlN1YmplY3RNZW1iZXIpK2AsIm93bmVyUm9sZXMiOmArcXVvdGVKU09OKHMuT3duZXJSb2xlcykrYCwiZGFvUm9sZXMiOmArcXVvdGVKU09OKHMuREFPUm9sZXMpK2AsInN1Y2Nlc3NvclJvbGVzIjpgK3F1b3RlSlNPTihzLlN1Y2Nlc3NvclJvbGVzKStgLCJzdWJqZWN0Um9sZXMiOmArcXVvdGVKU09OKHMuU3ViamVjdFJvbGVzKStgLCJjaGFubmVsQ291bnQiOmArcXVvdGVKU09OKHN0cmNvbnYuSXRvYShzLkNoYW5uZWxDb3VudCkpK2AsImNoYW5uZWxFeGlzdHMiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuQ2hhbm5lbEV4aXN0cykrYCwiY2hhbm5lbERlc2NyaXB0aW9uIjpgK3F1b3RlSlNPTihzLkNoYW5uZWxEZXNjcmlwdGlvbikrYCwiY2hhbm5lbFR5cGUiOmArcXVvdGVKU09OKHMuQ2hhbm5lbFR5cGUpK2AsImNoYW5uZWxSZWFkUm9sZXMiOmArcXVvdGVKU09OKHMuQ2hhbm5lbFJlYWRSb2xlcykrYCwiY2hhbm5lbFdyaXRlUm9sZXMiOmArcXVvdGVKU09OKHMuQ2hhbm5lbFdyaXRlUm9sZXMpK2B9YAp9CmZ1bmMgY2hhbm5lbHNBY3Rpb25KU09OKGEgQ2hhbm5lbHNBY3Rpb24sIHMgQ2hhbm5lbHNTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJ0eXBlIjoiY2hhbm5lbHMiLCJ0YXJnZXQiOmArcXVvdGVKU09OKENoYW5uZWxzUGF0aCkrYCwib3BlcmF0aW9uIjpgK3F1b3RlSlNPTihzdHJpbmcoYS5LaW5kKCkpKStgLCJyZWNpcGllbnQiOmArcXVvdGVKU09OKHN0cmluZyhhLlJlY2lwaWVudCgpKSkrYCwic3ViamVjdCI6YCtxdW90ZUpTT04oc3RyaW5nKGEuU3ViamVjdCgpKSkrYCwicm9sZXMiOmArcXVvdGVKU09OKGEuUm9sZXMoKSkrYCwibmFtZSI6YCtxdW90ZUpTT04oYS5OYW1lKCkpK2AsImRlc2NyaXB0aW9uIjpgK3F1b3RlSlNPTihhLkRlc2NyaXB0aW9uKCkpK2AsImJlZm9yZSI6YCtjaGFubmVsc1N0YXRlSlNPTihzKStgfWAKfQoawR4KEmVzY3Jvd19hY3Rpb25zLmdubxKqHnBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgoJInN0cmNvbnYiCikKCmNvbnN0IEVzY3Jvd1BhdGggPSAiZ25vLmxhbmQvci9zYW1jcmV3L2VzY3Jvd192NCIKCnR5cGUgRXNjcm93QWN0aW9uS2luZCBzdHJpbmcKCmNvbnN0ICgKCUVzY3Jvd0FjY2VwdE93bmVyICAgRXNjcm93QWN0aW9uS2luZCA9ICJhY2NlcHQtb3duZXIiCglFc2Nyb3dSZXR1cm5Pd25lciAgIEVzY3Jvd0FjdGlvbktpbmQgPSAicmV0dXJuLW93bmVyIgoJRXNjcm93QWJvcnRSZXR1cm4gICBFc2Nyb3dBY3Rpb25LaW5kID0gImFib3J0LXJldHVybiIKCUVzY3Jvd1VucGF1c2UgICAgICAgRXNjcm93QWN0aW9uS2luZCA9ICJ1bnBhdXNlIgoJRXNjcm93UmVmdW5kQ2xpZW50ICBFc2Nyb3dBY3Rpb25LaW5kID0gInJlZnVuZC1jbGllbnQiCglFc2Nyb3dQYXlGcmVlbGFuY2VyIEVzY3Jvd0FjdGlvbktpbmQgPSAicGF5LWZyZWVsYW5jZXIiCgkvLyBFc2Nyb3dTZXRGZWVSZWNpcGllbnQgc3RhZ2VzIGEgbmV3IGZhbGxiYWNrIGZlZSByZWNpcGllbnQgKGVzY3Jvd192NAoJLy8gdHdvLXN0ZXAgcm90YXRpb24pOyB0aGUgc3RhZ2VkIGFkZHJlc3MgYWNjZXB0cyB3aXRoIGl0cyBvd24gdHJhbnNhY3Rpb24uCglFc2Nyb3dTZXRGZWVSZWNpcGllbnQgRXNjcm93QWN0aW9uS2luZCA9ICJzZXQtZmVlLXJlY2lwaWVudCIKKQoKdHlwZSBFc2Nyb3dQb2xpY3kgc3RydWN0eyBkYW8sIHN1Y2Nlc3NvciBhZGRyZXNzIH0KCmZ1bmMgTmV3RXNjcm93UG9saWN5KGRhbywgc3VjY2Vzc29yIGFkZHJlc3MpIEVzY3Jvd1BvbGljeSB7CglpZiAhZGFvLklzVmFsaWQoKSB8fCBkYW8gIT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSB7CgkJcGFuaWMoImVzY3JvdyBwb2xpY3kgcmVxdWlyZXMgdGhlIGZvdW5kaW5nIERBTyBhZGRyZXNzIikKCX0KCWlmICFzdWNjZXNzb3IuSXNWYWxpZCgpIHx8IHN1Y2Nlc3NvciA9PSBkYW8gfHwgc3VjY2Vzc29yID09IGNoYWluLlBhY2thZ2VBZGRyZXNzKEVzY3Jvd1BhdGgpIHsKCQlwYW5pYygiZXNjcm93IHBvbGljeSByZXF1aXJlcyBhIHZhbGlkIGRpc3RpbmN0IHN1Y2Nlc3NvciIpCgl9CglyZXR1cm4gRXNjcm93UG9saWN5e2RhbzogZGFvLCBzdWNjZXNzb3I6IHN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEVzY3Jvd1BvbGljeSkgREFPKCkgYWRkcmVzcyAgICAgICB7IHJldHVybiBwLmRhbyB9CmZ1bmMgKHAgRXNjcm93UG9saWN5KSBTdWNjZXNzb3IoKSBhZGRyZXNzIHsgcmV0dXJuIHAuc3VjY2Vzc29yIH0KCnR5cGUgRXNjcm93QWN0aW9uIHN0cnVjdCB7CglraW5kICAgICAgIEVzY3Jvd0FjdGlvbktpbmQKCXJlY2lwaWVudCAgYWRkcmVzcwoJY29udHJhY3RJRCBzdHJpbmcKCW1pbGVzdG9uZSAgaW50Cn0KCmZ1bmMgKHAgRXNjcm93UG9saWN5KSBBY2NlcHQoKSBFc2Nyb3dBY3Rpb24geyByZXR1cm4gRXNjcm93QWN0aW9ue2tpbmQ6IEVzY3Jvd0FjY2VwdE93bmVyfSB9CmZ1bmMgKHAgRXNjcm93UG9saWN5KSBSZXR1cm4oKSBFc2Nyb3dBY3Rpb24gewoJcmV0dXJuIEVzY3Jvd0FjdGlvbntraW5kOiBFc2Nyb3dSZXR1cm5Pd25lciwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEVzY3Jvd1BvbGljeSkgQWJvcnRSZXR1cm4oKSBFc2Nyb3dBY3Rpb24gewoJcmV0dXJuIEVzY3Jvd0FjdGlvbntraW5kOiBFc2Nyb3dBYm9ydFJldHVybiwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIEVzY3Jvd1Jlc3VtZSgpIEVzY3Jvd0FjdGlvbiB7IHJldHVybiBFc2Nyb3dBY3Rpb257a2luZDogRXNjcm93VW5wYXVzZX0gfQpmdW5jIEVzY3Jvd0ZlZVJlY2lwaWVudChyZWNpcGllbnQgYWRkcmVzcykgRXNjcm93QWN0aW9uIHsKCWEgOj0gRXNjcm93QWN0aW9ue2tpbmQ6IEVzY3Jvd1NldEZlZVJlY2lwaWVudCwgcmVjaXBpZW50OiByZWNpcGllbnR9CglhLkJ5dGVzKCkKCXJldHVybiBhCn0KZnVuYyBFc2Nyb3dSZXNvbHV0aW9uKGlkIHN0cmluZywgaW5kZXggaW50LCByZWZ1bmQgYm9vbCkgRXNjcm93QWN0aW9uIHsKCWtpbmQgOj0gRXNjcm93UGF5RnJlZWxhbmNlcgoJaWYgcmVmdW5kIHsKCQlraW5kID0gRXNjcm93UmVmdW5kQ2xpZW50Cgl9CglhIDo9IEVzY3Jvd0FjdGlvbntraW5kOiBraW5kLCBjb250cmFjdElEOiBpZCwgbWlsZXN0b25lOiBpbmRleH0KCWEuQnl0ZXMoKQoJcmV0dXJuIGEKfQpmdW5jIChhIEVzY3Jvd0FjdGlvbikgS2luZCgpIEVzY3Jvd0FjdGlvbktpbmQgeyByZXR1cm4gYS5raW5kIH0KZnVuYyAoYSBFc2Nyb3dBY3Rpb24pIFJlY2lwaWVudCgpIGFkZHJlc3MgICAgIHsgcmV0dXJuIGEucmVjaXBpZW50IH0KZnVuYyAoYSBFc2Nyb3dBY3Rpb24pIENvbnRyYWN0SUQoKSBzdHJpbmcgICAgIHsgcmV0dXJuIGEuY29udHJhY3RJRCB9CmZ1bmMgKGEgRXNjcm93QWN0aW9uKSBNaWxlc3RvbmUoKSBpbnQgICAgICAgICB7IHJldHVybiBhLm1pbGVzdG9uZSB9CmZ1bmMgKGEgRXNjcm93QWN0aW9uKSBJc1Jlc29sdXRpb24oKSBib29sIHsKCXJldHVybiBhLmtpbmQgPT0gRXNjcm93UmVmdW5kQ2xpZW50IHx8IGEua2luZCA9PSBFc2Nyb3dQYXlGcmVlbGFuY2VyCn0KZnVuYyAoYSBFc2Nyb3dBY3Rpb24pIEJ5dGVzKCkgc3RyaW5nIHsKCWJhc2UgOj0gImVzY3Jvdy92MXwiICsgRXNjcm93UGF0aCArICJ8IiArIHN0cmluZyhhLmtpbmQpCglpZiBhLklzUmVzb2x1dGlvbigpIHsKCQluLCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQoYS5jb250cmFjdElELCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB8fCBzdHJjb252LkZvcm1hdFVpbnQobiwgMTApICE9IGEuY29udHJhY3RJRCB8fCBhLm1pbGVzdG9uZSA8IDAgfHwgYS5taWxlc3RvbmUgPj0gMjAgfHwgYS5yZWNpcGllbnQgIT0gIiIgewoJCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgcmVzb2x1dGlvbiBhY3Rpb24iKQoJCX0KCQlyZXR1cm4gYmFzZSArICJ8IiArIGEuY29udHJhY3RJRCArICJ8IiArIHN0cmNvbnYuSXRvYShhLm1pbGVzdG9uZSkKCX0KCWlmIGEuY29udHJhY3RJRCAhPSAiIiB8fCBhLm1pbGVzdG9uZSAhPSAwIHsKCQlwYW5pYygibWFsZm9ybWVkIGVzY3JvdyBhY3Rpb24iKQoJfQoJc3dpdGNoIGEua2luZCB7CgljYXNlIEVzY3Jvd0FjY2VwdE93bmVyLCBFc2Nyb3dVbnBhdXNlOgoJCWlmIGEucmVjaXBpZW50ICE9ICIiIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCBlc2Nyb3cgYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UKCWNhc2UgRXNjcm93UmV0dXJuT3duZXIsIEVzY3Jvd0Fib3J0UmV0dXJuOgoJCWlmICFhLnJlY2lwaWVudC5Jc1ZhbGlkKCkgewoJCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgcmV0dXJuIGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQoJY2FzZSBFc2Nyb3dTZXRGZWVSZWNpcGllbnQ6CgkJaWYgIWEucmVjaXBpZW50LklzVmFsaWQoKSB7CgkJCXBhbmljKCJpbnZhbGlkIGVzY3JvdyBmZWUgcmVjaXBpZW50IGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgZXNjcm93IGFjdGlvbiIpCgl9Cn0KZnVuYyAoYSBFc2Nyb3dBY3Rpb24pIENhdGVnb3J5KCkgbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNhdGVnb3J5IHsKCWEuQnl0ZXMoKQoJaWYgYS5Jc1Jlc29sdXRpb24oKSB8fCBhLmtpbmQgPT0gRXNjcm93VW5wYXVzZSB8fCBhLmtpbmQgPT0gRXNjcm93U2V0RmVlUmVjaXBpZW50IHsKCQlyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkZpbmFuY2lhbAoJfQoJcmV0dXJuIG1lbWJhX3dlaWdodGVkX3BvbGljeS5Dcml0aWNhbAp9ChrONgoPZXNjcm93X2hvc3QuZ25vEro2cGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiZ25vLmxhbmQvcC9zYW1jcmV3L21lbWJhX3dlaWdodGVkX3BvbGljeSIKKQoKdHlwZSBFc2Nyb3dNaWxlc3RvbmUgc3RydWN0IHsKCUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQKCUFtb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NAoJU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZwoJRnVuZGVkQXQsIENvbXBsZXRlZEF0LCBEaXNwdXRlZEF0IGludDY0CglQcmVEaXNwdXRlU3RhdHVzICAgICAgICAgICAgICAgICAgc3RyaW5nCn0KdHlwZSBFc2Nyb3dDb250cmFjdCBzdHJ1Y3QgewoJRXhpc3RzICAgICAgICAgICAgICAgICAgYm9vbAoJSUQsIENvbnRlbnRIYXNoLCBTdGF0dXMgc3RyaW5nCglDbGllbnQsIEZyZWVsYW5jZXIgICAgICBhZGRyZXNzCglDb3VudCAgICAgICAgICAgICAgICAgICBpbnQKCU1pbGVzdG9uZXMgICAgICAgICAgICAgIFsyMF1Fc2Nyb3dNaWxlc3RvbmUKfQp0eXBlIEVzY3Jvd0ZlZVRlcm1zIHN0cnVjdCB7CglSYXdCUFMsIEVmZmVjdGl2ZUJQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQKCVJhd1RyZWFzdXJ5LCBGYWxsYmFja1RyZWFzdXJ5LCBFZmZlY3RpdmVUcmVhc3VyeSBhZGRyZXNzCn0KLy8gRXNjcm93U3RhdGUgaXMgdGhlIGVzY3Jvd192NCBzdGF0ZSBhIHByb3Bvc2FsIGZyZWV6ZXMuIFRoZSBwYXVzZSBmaWVsZHMgY29weQovLyBQYXVzZUluZm8gZXhjZXB0IFBhdXNlZEJsb2Nrcywgd2hpY2ggZ3Jvd3MgZXZlcnkgYmxvY2suIEV4aXRzT3BlbiBpcyBhbHNvCi8vIGhlaWdodC1kZXJpdmVkOiBpdCBpcyByZWFkIGZyZXNoIGF0IHByb3Bvc2FsIGFuZCBleGVjdXRpb24gdGltZSBhbmQgbmV2ZXIKLy8gZW50ZXJzIHRoZSBjb21taXRtZW50IChlc2Nyb3dTdGF0ZUpTT04pLCBzbyBhIHBhdXNlIGFnZWluZyBwYXN0IGl0cyBibG9ja2luZwovLyB3aW5kb3cgY2Fubm90IG1ha2UgYSBmcm96ZW4gcHJvcG9zYWwgc3RhbGUuCnR5cGUgRXNjcm93U3RhdGUgc3RydWN0IHsKCU93bmVyLCBQZW5kaW5nT3duZXIgICAgICAgICAgICAgICBhZGRyZXNzCglGZWVSZWNpcGllbnQsIFBlbmRpbmdGZWVSZWNpcGllbnQgYWRkcmVzcwoJUGF1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKCVBhdXNlZEF0LCBFeGl0c1Jlb3BlbkF0ICAgICAgICAgICBpbnQ2NAoJQ29vbGRvd25VbnRpbCAgICAgICAgICAgICAgICAgICAgIGludDY0CglFeGl0c09wZW4gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAoJQ29udHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgIEVzY3Jvd0NvbnRyYWN0CglGZWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXNjcm93RmVlVGVybXMKfQp0eXBlIGVzY3Jvd1Byb3Bvc2FsIHN0cnVjdCB7CglhY3Rpb24gRXNjcm93QWN0aW9uCgliZWZvcmUgRXNjcm93U3RhdGUKfQoKZnVuYyBlc2Nyb3dDb21taXRtZW50KGEgRXNjcm93QWN0aW9uLCBzIEVzY3Jvd1N0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGEuQnl0ZXMoKSArICJ8YmVmb3JlfCIgKyBlc2Nyb3dTdGF0ZUpTT04ocykKfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUVzY3Jvd0F1dGhvcml0eShzIEVzY3Jvd1N0YXRlKSB7CglpZiBoLmVzY3Jvd1BvbGljeSA9PSBuaWwgewoJCXBhbmljKCJlc2Nyb3cgYWN0aW9ucyBhcmUgbm90IGNvbmZpZ3VyZWQiKQoJfQoJaWYgIXMuT3duZXIuSXNWYWxpZCgpIHx8IChzLlBlbmRpbmdPd25lciAhPSAiIiAmJiAhcy5QZW5kaW5nT3duZXIuSXNWYWxpZCgpKSB8fCAhcy5GZWVSZWNpcGllbnQuSXNWYWxpZCgpIHx8IChzLlBlbmRpbmdGZWVSZWNpcGllbnQgIT0gIiIgJiYgIXMuUGVuZGluZ0ZlZVJlY2lwaWVudC5Jc1ZhbGlkKCkpIHsKCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgYXV0aG9yaXR5IHByZS1zdGF0ZSIpCgl9CglpZiBzLkNvb2xkb3duVW50aWwgPCAwIHx8ICghcy5QYXVzZWQgJiYgKHMuUGF1c2VkQXQgIT0gMCB8fCBzLkV4aXRzUmVvcGVuQXQgIT0gMCB8fCAhcy5FeGl0c09wZW4pKSB8fCAocy5QYXVzZWQgJiYgKHMuUGF1c2VkQXQgPD0gMCB8fCBzLkV4aXRzUmVvcGVuQXQgPD0gcy5QYXVzZWRBdCkpIHsKCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgcGF1c2UgcHJlLXN0YXRlIikKCX0KfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUVzY3JvdyhhIEVzY3Jvd0FjdGlvbiwgcyBFc2Nyb3dTdGF0ZSkgewoJaC52YWxpZGF0ZUVzY3Jvd0F1dGhvcml0eShzKQoJYS5CeXRlcygpCglwIDo9IGguZXNjcm93UG9saWN5CglpZiAhYS5Jc1Jlc29sdXRpb24oKSAmJiAocy5Db250cmFjdCAhPSAoRXNjcm93Q29udHJhY3R7fSkgfHwgcy5GZWVzICE9IChFc2Nyb3dGZWVUZXJtc3t9KSkgewoJCXBhbmljKCJ1bmV4cGVjdGVkIGVzY3JvdyBkaXNwdXRlIHByZS1zdGF0ZSIpCgl9CglpZiBhLktpbmQoKSA9PSBFc2Nyb3dBY2NlcHRPd25lciB7CgkJaWYgcy5Pd25lciA9PSBwLkRBTygpIHx8IHMuUGVuZGluZ093bmVyICE9IHAuREFPKCkgewoJCQlwYW5pYygiREFPIGlzIG5vdCBwZW5kaW5nIGVzY3JvdyBvd25lciIpCgkJfQoJCXJldHVybgoJfQoJaWYgcy5Pd25lciAhPSBwLkRBTygpIHsKCQlwYW5pYygiREFPIGlzIG5vdCBlc2Nyb3cgb3duZXIiKQoJfQoJaWYgYS5LaW5kKCkgPT0gRXNjcm93QWJvcnRSZXR1cm4gewoJCWlmIGEuUmVjaXBpZW50KCkgIT0gcC5TdWNjZXNzb3IoKSB8fCBzLlBlbmRpbmdPd25lciAhPSBwLlN1Y2Nlc3NvcigpIHsKCQkJcGFuaWMoImVzY3JvdyByZXR1cm4gZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CgkJcmV0dXJuCgl9CglpZiBzLlBlbmRpbmdPd25lciAhPSAiIiB7CgkJcGFuaWMoImVzY3JvdyBhdXRob3JpdHkgdHJhbnNmZXIgaXMgcGVuZGluZyIpCgl9Cglzd2l0Y2ggYS5LaW5kKCkgewoJY2FzZSBFc2Nyb3dSZXR1cm5Pd25lcjoKCQlpZiBhLlJlY2lwaWVudCgpICE9IHAuU3VjY2Vzc29yKCkgewoJCQlwYW5pYygiZXNjcm93IHN1Y2Nlc3NvciBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCWNhc2UgRXNjcm93VW5wYXVzZToKCQlpZiAhcy5QYXVzZWQgewoJCQlwYW5pYygiZXNjcm93IHVucGF1c2UgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBFc2Nyb3dTZXRGZWVSZWNpcGllbnQ6CgkJciA6PSBhLlJlY2lwaWVudCgpCgkJaWYgciA9PSBwLkRBTygpIHx8IHIgPT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoRXNjcm93UGF0aCkgewoJCQlwYW5pYygiZXNjcm93IGZlZSByZWNpcGllbnQgY2Fubm90IGJlIGdvdmVybmFuY2Ugb3IgZXNjcm93IikKCQl9CgkJaWYgciA9PSBzLkZlZVJlY2lwaWVudCB8fCByID09IHMuUGVuZGluZ0ZlZVJlY2lwaWVudCB7CgkJCXBhbmljKCJlc2Nyb3cgZmVlIHJlY2lwaWVudCBjaGFuZ2UgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBFc2Nyb3dSZWZ1bmRDbGllbnQsIEVzY3Jvd1BheUZyZWVsYW5jZXI6CgkJLy8gZXNjcm93X3Y0IHJlZnVzZXMgUmVzb2x2ZURpc3B1dGUgaW5zaWRlIGEgcGF1c2UncyBibG9ja2luZyB3aW5kb3c7CgkJLy8gcmVmdXNlIHRoZSBwcm9wb3NhbCB0aGVuIHRvbywgYXQgY3JlYXRpb24gYW5kIGFnYWluIGF0IGV4ZWN1dGlvbi4KCQlpZiBzLlBhdXNlZCAmJiAhcy5FeGl0c09wZW4gewoJCQlwYW5pYygiZXNjcm93IGV4aXRzIGFyZSBwYXVzZWQiKQoJCX0KCQljIDo9IHMuQ29udHJhY3QKCQlpZiAhYy5FeGlzdHMgfHwgYy5JRCAhPSBhLkNvbnRyYWN0SUQoKSB8fCBjLkNvdW50IDwgMSB8fCBjLkNvdW50ID4gMjAgfHwgYS5NaWxlc3RvbmUoKSA+PSBjLkNvdW50IHx8IGxlbihjLkNvbnRlbnRIYXNoKSAhPSA2NCB8fCAhYy5DbGllbnQuSXNWYWxpZCgpIHsKCQkJcGFuaWMoImludmFsaWQgZXNjcm93IGNvbnRyYWN0IHByZS1zdGF0ZSIpCgkJfQoJCWZvciBpLCBtIDo9IHJhbmdlIGMuTWlsZXN0b25lcyB7CgkJCWlmIGkgPj0gYy5Db3VudCB7CgkJCQlpZiBtICE9IChFc2Nyb3dNaWxlc3RvbmV7fSkgewoJCQkJCXBhbmljKCJ1bmV4cGVjdGVkIGVzY3JvdyBtaWxlc3RvbmUgcHJlLXN0YXRlIikKCQkJCX0KCQkJCWNvbnRpbnVlCgkJCX0KCQkJaWYgbS5BbW91bnQgPD0gMCB7CgkJCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgbWlsZXN0b25lIGFtb3VudCIpCgkJCX0KCQl9CgkJbSA6PSBjLk1pbGVzdG9uZXNbYS5NaWxlc3RvbmUoKV0KCQlpZiBjLlN0YXR1cyAhPSAiZGlzcHV0ZWQiIHx8IG0uU3RhdHVzICE9ICJkaXNwdXRlZCIgfHwgKG0uUHJlRGlzcHV0ZVN0YXR1cyAhPSAiZnVuZGVkIiAmJiBtLlByZURpc3B1dGVTdGF0dXMgIT0gImNvbXBsZXRlZCIpIHsKCQkJcGFuaWMoImVzY3JvdyBtaWxlc3RvbmUgaXMgbm90IGRpc3B1dGVkIikKCQl9CgkJaWYgYS5LaW5kKCkgPT0gRXNjcm93UmVmdW5kQ2xpZW50IHsKCQkJaWYgYy5DbGllbnQgPT0gcC5EQU8oKSB8fCBjLkNsaWVudCA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhFc2Nyb3dQYXRoKSB7CgkJCQlwYW5pYygiZXNjcm93IHBheW91dCBjYW5ub3QgYmUgdHJhcHBlZCBpbiBnb3Zlcm5hbmNlIG9yIGVzY3JvdyIpCgkJCX0KCQkJaWYgcy5GZWVzICE9IChFc2Nyb3dGZWVUZXJtc3t9KSB7CgkJCQlwYW5pYygidW5leHBlY3RlZCBlc2Nyb3cgcmVmdW5kIGZlZSB0ZXJtcyIpCgkJCX0KCQkJcmV0dXJuCgkJfQoJCWlmICFjLkZyZWVsYW5jZXIuSXNWYWxpZCgpIHx8IHMuRmVlcy5FZmZlY3RpdmVCUFMgPCAwIHx8IHMuRmVlcy5FZmZlY3RpdmVCUFMgPiA1MDAgewoJCQlwYW5pYygiaW52YWxpZCBlc2Nyb3cgcGF5b3V0IHRlcm1zIikKCQl9CgkJaWYgYy5GcmVlbGFuY2VyID09IHAuREFPKCkgfHwgYy5GcmVlbGFuY2VyID09IGNoYWluLlBhY2thZ2VBZGRyZXNzKEVzY3Jvd1BhdGgpIHsKCQkJcGFuaWMoImVzY3JvdyBwYXlvdXQgY2Fubm90IGJlIHRyYXBwZWQgaW4gZ292ZXJuYW5jZSBvciBlc2Nyb3ciKQoJCX0KCQlmZWUgOj0gKG0uQW1vdW50LzEwMDAwKSpzLkZlZXMuRWZmZWN0aXZlQlBTICsgKChtLkFtb3VudCUxMDAwMCkqcy5GZWVzLkVmZmVjdGl2ZUJQUykvMTAwMDAKCQlpZiBmZWUgPiAwICYmIChzLkZlZXMuRWZmZWN0aXZlVHJlYXN1cnkgPT0gcC5EQU8oKSB8fCBzLkZlZXMuRWZmZWN0aXZlVHJlYXN1cnkgPT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoRXNjcm93UGF0aCkpIHsKCQkJcGFuaWMoImVzY3JvdyBwYXlvdXQgY2Fubm90IGJlIHRyYXBwZWQgaW4gZ292ZXJuYW5jZSBvciBlc2Nyb3ciKQoJCX0KCQlpZiBmZWUgPiAwICYmICFzLkZlZXMuRWZmZWN0aXZlVHJlYXN1cnkuSXNWYWxpZCgpIHsKCQkJcGFuaWMoImludmFsaWQgZXNjcm93IGZlZSByZWNpcGllbnQiKQoJCX0KCWRlZmF1bHQ6CgkJcGFuaWMoInVuc3VwcG9ydGVkIGVzY3JvdyBhY3Rpb24iKQoJfQp9CmZ1bmMgKGggKkhvc3QpIFByb3Bvc2VFc2Nyb3coYSBFc2Nyb3dBY3Rpb24sIHMgRXNjcm93U3RhdGUsIHJsbSByZWFsbSkgdWludDY0IHsKCXdobyA6PSBhc3NlcnRDYWxsZXIoaCwgcmxtKQoJaC52YWxpZGF0ZUVzY3JvdyhhLCBzKQoJcCA6PSAmcm9sZVByb3Bvc2Fse3Byb3Bvc2VyOiB3aG8sIGVzY3JvdzogJmVzY3Jvd1Byb3Bvc2Fse2FjdGlvbjogYSwgYmVmb3JlOiBzfX0KCXAuYmFsbG90ID0gaC5wb2xpY3kuTmV3UHJvcG9zYWwoYS5DYXRlZ29yeSgpLCBlc2Nyb3dDb21taXRtZW50KGEsIHMpKQoJaC5hZGRQcm9wb3NhbChwKQoJcmV0dXJuIHVpbnQ2NChsZW4oaC5wcm9wb3NhbHMpKQp9CmZ1bmMgKGggKkhvc3QpIGludmFsaWRhdGVFc2Nyb3dQZWVycyhjYXVzZSBzdHJpbmcsIGlkIHVpbnQ2NCkgewoJbWVtYmVycyA6PSBbXW1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7fQoJZm9yIF8sIHMgOj0gcmFuZ2UgaC5zZWF0cyB7CgkJbWVtYmVycyA9IGFwcGVuZChtZW1iZXJzLCBzLk1lbWJlcikKCX0KCWgucG9saWN5LlJlY29uZmlndXJlKG1lbWJlcnMpCgloLnJlY29yZEludmFsaWRhdGlvbihjYXVzZSwgaWQsIEVzY3Jvd1BhdGgpCn0KZnVuYyAoaCAqSG9zdCkgQ29uc3VtZUVzY3JvdyhpZCB1aW50NjQsIHMgRXNjcm93U3RhdGUsIHJsbSByZWFsbSkgRXNjcm93QWN0aW9uIHsKCWFzc2VydENhbGxlcihoLCBybG0pCglwIDo9IGgucHJvcG9zYWwoaWQpCglpZiBwLmVzY3JvdyA9PSBuaWwgewoJCXBhbmljKCJwcm9wb3NhbCBpcyBub3QgYW4gZXNjcm93IGFjdGlvbiIpCgl9CgloLnZhbGlkYXRlRXNjcm93KHAuZXNjcm93LmFjdGlvbiwgcykKCXAuYmFsbG90LkNvbnN1bWUoZXNjcm93Q29tbWl0bWVudChwLmVzY3Jvdy5hY3Rpb24sIHMpKQoJaC5pbnZhbGlkYXRlRXNjcm93UGVlcnMoSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQpCglyZXR1cm4gcC5lc2Nyb3cuYWN0aW9uCn0KZnVuYyAoaCAqSG9zdCkgUHJlcGFyZUVzY3Jvd0VtZXJnZW5jeVBhdXNlKHMgRXNjcm93U3RhdGUsIHJsbSByZWFsbSkgewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCWgudmFsaWRhdGVFc2Nyb3dBdXRob3JpdHkocykKCWlmIHMuT3duZXIgIT0gaC5lc2Nyb3dQb2xpY3kuREFPKCkgewoJCXBhbmljKCJEQU8gaXMgbm90IGVzY3JvdyBvd25lciIpCgl9CglpZiBzLlBhdXNlZCB7CgkJcGFuaWMoImVzY3JvdyBpcyBhbHJlYWR5IHBhdXNlZCIpCgl9CgkvLyBlc2Nyb3dfdjQgcmVmdXNlcyBhIFBhdXNlIGJlZm9yZSBpdHMgY29vbGRvd24gZW5kcy4gUmVmdXNlIGhlcmUgZmlyc3QsCgkvLyBiZWZvcmUgaW52YWxpZGF0aW5nIGFueSBwcm9wb3NhbC4KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IHMuQ29vbGRvd25VbnRpbCB7CgkJcGFuaWMoImVzY3JvdyBwYXVzZSBjb29sZG93biIpCgl9CglpZiBzLkNvbnRyYWN0ICE9IChFc2Nyb3dDb250cmFjdHt9KSB8fCBzLkZlZXMgIT0gKEVzY3Jvd0ZlZVRlcm1ze30pIHsKCQlwYW5pYygidW5leHBlY3RlZCBlc2Nyb3cgZGlzcHV0ZSBwcmUtc3RhdGUiKQoJfQoJaC5pbnZhbGlkYXRlRXNjcm93UGVlcnMoSW52YWxpZGF0ZWRCeVBhdXNlLCAwKQp9ChqaFgoQZXNjcm93X3JlYWRzLmdubxKFFnBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICJzdHJjb252IgoKZnVuYyAoaCAqSG9zdCkgZXNjcm93Q29uZmlnSlNPTigpIHN0cmluZyB7CglpZiBoLmVzY3Jvd1BvbGljeSA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGAsImVzY3Jvd1BvbGljeSI6eyJ0YXJnZXQiOmAgKyBxdW90ZUpTT04oRXNjcm93UGF0aCkgKyBgLCJzdWNjZXNzb3IiOmAgKyBxdW90ZUpTT04oc3RyaW5nKGguZXNjcm93UG9saWN5LlN1Y2Nlc3NvcigpKSkgKyBgLCJyZXNvbHV0aW9uQ2F0ZWdvcnkiOiJmaW5hbmNpYWwiLCJ1bnBhdXNlQ2F0ZWdvcnkiOiJmaW5hbmNpYWwiLCJmZWVSZWNpcGllbnRDYXRlZ29yeSI6ImZpbmFuY2lhbCIsImVtZXJnZW5jeVBhdXNlIjp0cnVlLCJyZXR1cm5TdGFnZXNPbmx5Ijp0cnVlLCJpbnZhbGlkYXRlc090aGVyUHJvcG9zYWxzIjp0cnVlfWAKfQpmdW5jIGVzY3Jvd051bWJlcihuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSkgfQoKLy8gT25seSBkaXNwdXRlIGFjdGlvbnMgbmFtZSBhIG1pbGVzdG9uZTsgZm9yIHRoZSBvdGhlcnMgaXQgaXMgbnVsbCwgc28gaXQKLy8gY2Fubm90IGJlIG1pc3Rha2VuIGZvciBtaWxlc3RvbmUgMC4KZnVuYyBlc2Nyb3dNaWxlc3RvbmVKU09OKGEgRXNjcm93QWN0aW9uKSBzdHJpbmcgewoJaWYgYS5LaW5kKCkgIT0gRXNjcm93UmVmdW5kQ2xpZW50ICYmIGEuS2luZCgpICE9IEVzY3Jvd1BheUZyZWVsYW5jZXIgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBlc2Nyb3dOdW1iZXIoaW50NjQoYS5NaWxlc3RvbmUoKSkpCn0KZnVuYyBlc2Nyb3dTdGF0ZUpTT04ocyBFc2Nyb3dTdGF0ZSkgc3RyaW5nIHsKCWMgOj0gcy5Db250cmFjdAoJbWlsZXN0b25lcyA6PSAiWyIKCWZvciBpIDo9IDA7IGkgPCBjLkNvdW50OyBpKysgewoJCWlmIGkgPiAwIHsKCQkJbWlsZXN0b25lcyArPSAiLCIKCQl9CgkJbSA6PSBjLk1pbGVzdG9uZXNbaV0KCQltaWxlc3RvbmVzICs9IGB7ImlkIjpgICsgZXNjcm93TnVtYmVyKGludDY0KG0uSUQpKSArIGAsImFtb3VudCI6YCArIGVzY3Jvd051bWJlcihtLkFtb3VudCkgKyBgLCJzdGF0dXMiOmAgKyBxdW90ZUpTT04obS5TdGF0dXMpICsgYCwiZnVuZGVkQXQiOmAgKyBlc2Nyb3dOdW1iZXIobS5GdW5kZWRBdCkgKyBgLCJjb21wbGV0ZWRBdCI6YCArIGVzY3Jvd051bWJlcihtLkNvbXBsZXRlZEF0KSArIGAsImRpc3B1dGVkQXQiOmAgKyBlc2Nyb3dOdW1iZXIobS5EaXNwdXRlZEF0KSArIGAsInByZURpc3B1dGVTdGF0dXMiOmAgKyBxdW90ZUpTT04obS5QcmVEaXNwdXRlU3RhdHVzKSArIGB9YAoJfQoJbWlsZXN0b25lcyArPSAiXSIKCXJldHVybiBgeyJvd25lciI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5Pd25lcikpICsgYCwicGVuZGluZ093bmVyIjpgICsgcXVvdGVKU09OKHN0cmluZyhzLlBlbmRpbmdPd25lcikpICsgYCwiZmVlUmVjaXBpZW50IjpgICsgcXVvdGVKU09OKHN0cmluZyhzLkZlZVJlY2lwaWVudCkpICsgYCwicGVuZGluZ0ZlZVJlY2lwaWVudCI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5QZW5kaW5nRmVlUmVjaXBpZW50KSkgKyBgLCJwYXVzZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5QYXVzZWQpICsgYCwicGF1c2VkQXQiOmAgKyBlc2Nyb3dOdW1iZXIocy5QYXVzZWRBdCkgKyBgLCJleGl0c1Jlb3BlbkF0IjpgICsgZXNjcm93TnVtYmVyKHMuRXhpdHNSZW9wZW5BdCkgKyBgLCJjb29sZG93blVudGlsIjpgICsgZXNjcm93TnVtYmVyKHMuQ29vbGRvd25VbnRpbCkgKyBgLCJjb250cmFjdCI6eyJleGlzdHMiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woYy5FeGlzdHMpICsgYCwiaWQiOmAgKyBxdW90ZUpTT04oYy5JRCkgKyBgLCJjb250ZW50SGFzaCI6YCArIHF1b3RlSlNPTihjLkNvbnRlbnRIYXNoKSArIGAsInN0YXR1cyI6YCArIHF1b3RlSlNPTihjLlN0YXR1cykgKyBgLCJjbGllbnQiOmAgKyBxdW90ZUpTT04oc3RyaW5nKGMuQ2xpZW50KSkgKyBgLCJmcmVlbGFuY2VyIjpgICsgcXVvdGVKU09OKHN0cmluZyhjLkZyZWVsYW5jZXIpKSArIGAsImNvdW50IjpgICsgZXNjcm93TnVtYmVyKGludDY0KGMuQ291bnQpKSArIGAsIm1pbGVzdG9uZXMiOmAgKyBtaWxlc3RvbmVzICsgYH0sImZlZXMiOnsicmF3QlBTIjpgICsgZXNjcm93TnVtYmVyKHMuRmVlcy5SYXdCUFMpICsgYCwiZWZmZWN0aXZlQlBTIjpgICsgZXNjcm93TnVtYmVyKHMuRmVlcy5FZmZlY3RpdmVCUFMpICsgYCwicmF3VHJlYXN1cnkiOmAgKyBxdW90ZUpTT04oc3RyaW5nKHMuRmVlcy5SYXdUcmVhc3VyeSkpICsgYCwiZmFsbGJhY2tUcmVhc3VyeSI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5GZWVzLkZhbGxiYWNrVHJlYXN1cnkpKSArIGAsImVmZmVjdGl2ZVRyZWFzdXJ5IjpgICsgcXVvdGVKU09OKHN0cmluZyhzLkZlZXMuRWZmZWN0aXZlVHJlYXN1cnkpKSArIGB9fWAKfQpmdW5jIGVzY3Jvd0FjdGlvbkpTT04oYSBFc2Nyb3dBY3Rpb24sIHMgRXNjcm93U3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYHsidHlwZSI6ImVzY3JvdyIsInRhcmdldCI6YCArIHF1b3RlSlNPTihFc2Nyb3dQYXRoKSArIGAsIm9wZXJhdGlvbiI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5LaW5kKCkpKSArIGAsInJlY2lwaWVudCI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5SZWNpcGllbnQoKSkpICsgYCwiY29udHJhY3RJZCI6YCArIHF1b3RlSlNPTihhLkNvbnRyYWN0SUQoKSkgKyBgLCJtaWxlc3RvbmVJbmRleCI6YCArIGVzY3Jvd01pbGVzdG9uZUpTT04oYSkgKyBgLCJiZWZvcmUiOmAgKyBlc2Nyb3dTdGF0ZUpTT04ocykgKyBgfWAKfQoathcKEGZlZWRfYWN0aW9ucy5nbm8SoRdwYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAoCgkiY2hhaW4iCgkiZ25vLmxhbmQvcC9zYW1jcmV3L21lbWJhX3dlaWdodGVkX3BvbGljeSIKKQoKY29uc3QgRmVlZFBhdGggPSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2ZlZWRfdjEiCgp0eXBlIEZlZWRBY3Rpb25LaW5kIHN0cmluZwoKY29uc3QgKAoJRmVlZEFjY2VwdE93bmVyICAgICBGZWVkQWN0aW9uS2luZCA9ICJhY2NlcHQtb3duZXIiCglGZWVkUmV0dXJuT3duZXIgICAgIEZlZWRBY3Rpb25LaW5kID0gInJldHVybi1vd25lciIKCUZlZWRBYm9ydFJldHVybiAgICAgRmVlZEFjdGlvbktpbmQgPSAiYWJvcnQtcmV0dXJuIgoJRmVlZEFkZE1vZGVyYXRvciAgICBGZWVkQWN0aW9uS2luZCA9ICJhZGQtbW9kZXJhdG9yIgoJRmVlZFJlbW92ZU1vZGVyYXRvciBGZWVkQWN0aW9uS2luZCA9ICJyZW1vdmUtbW9kZXJhdG9yIgoJRmVlZFVucGF1c2UgICAgICAgICBGZWVkQWN0aW9uS2luZCA9ICJ1bnBhdXNlIgopCgp0eXBlIEZlZWRQb2xpY3kgc3RydWN0eyBkYW8sIHN1Y2Nlc3NvciBhZGRyZXNzIH0KCmZ1bmMgTmV3RmVlZFBvbGljeShkYW8sIHN1Y2Nlc3NvciBhZGRyZXNzKSBGZWVkUG9saWN5IHsKCWlmICFkYW8uSXNWYWxpZCgpIHx8IGRhbyAhPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2RhbyIpIHsKCQlwYW5pYygiZmVlZCBwb2xpY3kgcmVxdWlyZXMgdGhlIGZvdW5kaW5nIERBTyBhZGRyZXNzIikKCX0KCWlmICFzdWNjZXNzb3IuSXNWYWxpZCgpIHx8IHN1Y2Nlc3NvciA9PSBkYW8gfHwgc3VjY2Vzc29yID09IGNoYWluLlBhY2thZ2VBZGRyZXNzKEZlZWRQYXRoKSB7CgkJcGFuaWMoImZlZWQgcG9saWN5IHJlcXVpcmVzIGEgdmFsaWQgZGlzdGluY3Qgc3VjY2Vzc29yIikKCX0KCXJldHVybiBGZWVkUG9saWN5e2RhbzogZGFvLCBzdWNjZXNzb3I6IHN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEZlZWRQb2xpY3kpIERBTygpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gcC5kYW8gfQpmdW5jIChwIEZlZWRQb2xpY3kpIFN1Y2Nlc3NvcigpIGFkZHJlc3MgeyByZXR1cm4gcC5zdWNjZXNzb3IgfQoKdHlwZSBGZWVkQWN0aW9uIHN0cnVjdCB7CglraW5kICAgICAgRmVlZEFjdGlvbktpbmQKCXJlY2lwaWVudCBhZGRyZXNzCglzdWJqZWN0ICAgYWRkcmVzcwp9CgpmdW5jIChwIEZlZWRQb2xpY3kpIEFjY2VwdCgpIEZlZWRBY3Rpb24geyByZXR1cm4gRmVlZEFjdGlvbntraW5kOiBGZWVkQWNjZXB0T3duZXJ9IH0KZnVuYyAocCBGZWVkUG9saWN5KSBSZXR1cm4oKSBGZWVkQWN0aW9uIHsKCXJldHVybiBGZWVkQWN0aW9ue2tpbmQ6IEZlZWRSZXR1cm5Pd25lciwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIEZlZWRQb2xpY3kpIEFib3J0UmV0dXJuKCkgRmVlZEFjdGlvbiB7CglyZXR1cm4gRmVlZEFjdGlvbntraW5kOiBGZWVkQWJvcnRSZXR1cm4sIHJlY2lwaWVudDogcC5zdWNjZXNzb3J9Cn0KZnVuYyAocCBGZWVkUG9saWN5KSBBZGRNb2RlcmF0b3Iod2hvIGFkZHJlc3MpIEZlZWRBY3Rpb24gewoJaWYgd2hvID09IHAuZGFvIHx8IHdobyA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhGZWVkUGF0aCkgewoJCXBhbmljKCJmZWVkIG1vZGVyYXRvciBtdXN0IGJlIGFuIGV4dGVybmFsIGFjY291bnQiKQoJfQoJYSA6PSBGZWVkQWN0aW9ue2tpbmQ6IEZlZWRBZGRNb2RlcmF0b3IsIHN1YmplY3Q6IHdob30KCWEuQnl0ZXMoKQoJcmV0dXJuIGEKfQpmdW5jIEZlZWRSZXZva2VNb2RlcmF0b3Iod2hvIGFkZHJlc3MpIEZlZWRBY3Rpb24gewoJYSA6PSBGZWVkQWN0aW9ue2tpbmQ6IEZlZWRSZW1vdmVNb2RlcmF0b3IsIHN1YmplY3Q6IHdob30KCWEuQnl0ZXMoKQoJcmV0dXJuIGEKfQpmdW5jIEZlZWRSZXN1bWUoKSBGZWVkQWN0aW9uICAgICAgICAgICAgICB7IHJldHVybiBGZWVkQWN0aW9ue2tpbmQ6IEZlZWRVbnBhdXNlfSB9CmZ1bmMgKGEgRmVlZEFjdGlvbikgS2luZCgpIEZlZWRBY3Rpb25LaW5kIHsgcmV0dXJuIGEua2luZCB9CmZ1bmMgKGEgRmVlZEFjdGlvbikgUmVjaXBpZW50KCkgYWRkcmVzcyAgIHsgcmV0dXJuIGEucmVjaXBpZW50IH0KZnVuYyAoYSBGZWVkQWN0aW9uKSBTdWJqZWN0KCkgYWRkcmVzcyAgICAgeyByZXR1cm4gYS5zdWJqZWN0IH0KZnVuYyAoYSBGZWVkQWN0aW9uKSBCeXRlcygpIHN0cmluZyB7CgliYXNlIDo9ICJmZWVkL3YxfCIgKyBGZWVkUGF0aCArICJ8IiArIHN0cmluZyhhLmtpbmQpCglzd2l0Y2ggYS5raW5kIHsKCWNhc2UgRmVlZEFjY2VwdE93bmVyLCBGZWVkVW5wYXVzZToKCQlpZiBhLnJlY2lwaWVudCAhPSAiIiB8fCBhLnN1YmplY3QgIT0gIiIgewoJCQlwYW5pYygibWFsZm9ybWVkIGZlZWQgYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UKCWNhc2UgRmVlZFJldHVybk93bmVyLCBGZWVkQWJvcnRSZXR1cm46CgkJaWYgIWEucmVjaXBpZW50LklzVmFsaWQoKSB8fCBhLnN1YmplY3QgIT0gIiIgewoJCQlwYW5pYygibWFsZm9ybWVkIGZlZWQgcmV0dXJuIGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQoJY2FzZSBGZWVkQWRkTW9kZXJhdG9yLCBGZWVkUmVtb3ZlTW9kZXJhdG9yOgoJCWlmICFhLnN1YmplY3QuSXNWYWxpZCgpIHx8IGEucmVjaXBpZW50ICE9ICIiIHsKCQkJcGFuaWMoImludmFsaWQgZmVlZCBtb2RlcmF0b3IgYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UgKyAifCIgKyBzdHJpbmcoYS5zdWJqZWN0KQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgZmVlZCBhY3Rpb24iKQoJfQp9CmZ1bmMgKGEgRmVlZEFjdGlvbikgQ2F0ZWdvcnkoKSBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ2F0ZWdvcnkgewoJYS5CeXRlcygpCglpZiBhLmtpbmQgPT0gRmVlZFVucGF1c2UgewoJCXJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuRmluYW5jaWFsCgl9CglyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNyaXRpY2FsCn0KGsAbCg1mZWVkX2hvc3QuZ25vEq4bcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCgovLyBGZWVkIG1vZGVyYXRvcnMgYXJlIGV4cGxpY2l0IGdyYW50cy4gT3duZXJzaGlwIGl0c2VsZiBjYW4gbW9kZXJhdGUsIHNvIHRoZQovLyBvdXRnb2luZyBvd25lciBtdXN0IG5vdCByZXRhaW4gYSBzZXBhcmF0ZSBtb2RlcmF0b3IgZ3JhbnQgYWZ0ZXIgaGFuZG9mZi4KdHlwZSBGZWVkU3RhdGUgc3RydWN0IHsKCU93bmVyLCBQZW5kaW5nT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCglQYXVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAoJTW9kZXJhdG9yQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludAoJT3duZXJNb2RlcmF0b3IsIERBT01vZGVyYXRvciwgU3VjY2Vzc29yTW9kZXJhdG9yLCBTdWJqZWN0TW9kZXJhdG9yIGJvb2wKfQp0eXBlIGZlZWRQcm9wb3NhbCBzdHJ1Y3QgewoJYWN0aW9uIEZlZWRBY3Rpb24KCWJlZm9yZSBGZWVkU3RhdGUKfQoKZnVuYyBmZWVkQ29tbWl0bWVudChhIEZlZWRBY3Rpb24sIHMgRmVlZFN0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGEuQnl0ZXMoKSArICJ8YmVmb3JlfCIgKyBmZWVkU3RhdGVKU09OKHMpCn0KZnVuYyAoaCAqSG9zdCkgdmFsaWRhdGVGZWVkQXV0aG9yaXR5KHMgRmVlZFN0YXRlKSB7CglpZiBoLmZlZWRQb2xpY3kgPT0gbmlsIHsKCQlwYW5pYygiZmVlZCBhY3Rpb25zIGFyZSBub3QgY29uZmlndXJlZCIpCgl9CglpZiAhcy5Pd25lci5Jc1ZhbGlkKCkgfHwgKHMuUGVuZGluZ093bmVyICE9ICIiICYmICFzLlBlbmRpbmdPd25lci5Jc1ZhbGlkKCkpIHsKCQlwYW5pYygiaW52YWxpZCBmZWVkIGF1dGhvcml0eSBwcmUtc3RhdGUiKQoJfQoJaWYgcy5Nb2RlcmF0b3JDb3VudCA8IDAgewoJCXBhbmljKCJpbnZhbGlkIGZlZWQgbW9kZXJhdG9yIGNvdW50IikKCX0KfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUZlZWQoYSBGZWVkQWN0aW9uLCBzIEZlZWRTdGF0ZSkgewoJaC52YWxpZGF0ZUZlZWRBdXRob3JpdHkocykKCWEuQnl0ZXMoKQoJcCA6PSBoLmZlZWRQb2xpY3kKCWlmIGEuU3ViamVjdCgpID09ICIiICYmIHMuU3ViamVjdE1vZGVyYXRvciB7CgkJcGFuaWMoInVuZXhwZWN0ZWQgZmVlZCBzdWJqZWN0IHByZS1zdGF0ZSIpCgl9CglpZiBhLktpbmQoKSA9PSBGZWVkQWNjZXB0T3duZXIgewoJCWlmIHMuT3duZXIgPT0gcC5EQU8oKSB8fCBzLlBlbmRpbmdPd25lciAhPSBwLkRBTygpIHx8IHMuT3duZXJNb2RlcmF0b3IgewoJCQlwYW5pYygiREFPIGlzIG5vdCBwZW5kaW5nIGZlZWQgb3duZXIgb3IgcHJldmlvdXMgb3duZXIgcmV0YWlucyBtb2RlcmF0aW9uIikKCQl9CgkJcmV0dXJuCgl9CglpZiBzLk93bmVyICE9IHAuREFPKCkgewoJCXBhbmljKCJEQU8gaXMgbm90IGZlZWQgb3duZXIiKQoJfQoJaWYgYS5LaW5kKCkgPT0gRmVlZEFib3J0UmV0dXJuIHsKCQlpZiBhLlJlY2lwaWVudCgpICE9IHAuU3VjY2Vzc29yKCkgfHwgcy5QZW5kaW5nT3duZXIgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJmZWVkIHJldHVybiBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCQlyZXR1cm4KCX0KCWlmIHMuUGVuZGluZ093bmVyICE9ICIiIHsKCQlwYW5pYygiZmVlZCBhdXRob3JpdHkgdHJhbnNmZXIgaXMgcGVuZGluZyIpCgl9Cglzd2l0Y2ggYS5LaW5kKCkgewoJY2FzZSBGZWVkUmV0dXJuT3duZXI6CgkJaWYgYS5SZWNpcGllbnQoKSAhPSBwLlN1Y2Nlc3NvcigpIHx8IHMuREFPTW9kZXJhdG9yIHsKCQkJcGFuaWMoImZlZWQgc3VjY2Vzc29yIG1pc21hdGNoIG9yIERBTyByZXRhaW5zIG1vZGVyYXRpb24iKQoJCX0KCWNhc2UgRmVlZEFkZE1vZGVyYXRvcjoKCQlwLkFkZE1vZGVyYXRvcihhLlN1YmplY3QoKSkKCQlpZiBzLlN1YmplY3RNb2RlcmF0b3IgewoJCQlwYW5pYygiZmVlZCBtb2RlcmF0b3IgZ3JhbnQgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBGZWVkUmVtb3ZlTW9kZXJhdG9yOgoJCWlmICFzLlN1YmplY3RNb2RlcmF0b3IgewoJCQlwYW5pYygiZmVlZCBtb2RlcmF0b3IgcmVtb3ZhbCBpcyBhIG5vLW9wIikKCQl9CgljYXNlIEZlZWRVbnBhdXNlOgoJCWlmICFzLlBhdXNlZCB7CgkJCXBhbmljKCJmZWVkIHVucGF1c2UgaXMgYSBuby1vcCIpCgkJfQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgZmVlZCBhY3Rpb24iKQoJfQp9CmZ1bmMgKGggKkhvc3QpIFByb3Bvc2VGZWVkKGEgRmVlZEFjdGlvbiwgcyBGZWVkU3RhdGUsIHJsbSByZWFsbSkgdWludDY0IHsKCXdobyA6PSBhc3NlcnRDYWxsZXIoaCwgcmxtKQoJaC52YWxpZGF0ZUZlZWQoYSwgcykKCXAgOj0gJnJvbGVQcm9wb3NhbHtwcm9wb3Nlcjogd2hvLCBmZWVkOiAmZmVlZFByb3Bvc2Fse2FjdGlvbjogYSwgYmVmb3JlOiBzfX0KCXAuYmFsbG90ID0gaC5wb2xpY3kuTmV3UHJvcG9zYWwoYS5DYXRlZ29yeSgpLCBmZWVkQ29tbWl0bWVudChhLCBzKSkKCWguYWRkUHJvcG9zYWwocCkKCXJldHVybiB1aW50NjQobGVuKGgucHJvcG9zYWxzKSkKfQpmdW5jIChoICpIb3N0KSBpbnZhbGlkYXRlRmVlZFBlZXJzKGNhdXNlIHN0cmluZywgaWQgdWludDY0KSB7CgltZW1iZXJzIDo9IFtdbWVtYmFfd2VpZ2h0ZWRfcG9saWN5Lk1lbWJlcnt9Cglmb3IgXywgc2VhdCA6PSByYW5nZSBoLnNlYXRzIHsKCQltZW1iZXJzID0gYXBwZW5kKG1lbWJlcnMsIHNlYXQuTWVtYmVyKQoJfQoJaC5wb2xpY3kuUmVjb25maWd1cmUobWVtYmVycykKCWgucmVjb3JkSW52YWxpZGF0aW9uKGNhdXNlLCBpZCwgRmVlZFBhdGgpCn0KZnVuYyAoaCAqSG9zdCkgQ29uc3VtZUZlZWQoaWQgdWludDY0LCBzIEZlZWRTdGF0ZSwgcmxtIHJlYWxtKSBGZWVkQWN0aW9uIHsKCWFzc2VydENhbGxlcihoLCBybG0pCglwIDo9IGgucHJvcG9zYWwoaWQpCglpZiBwLmZlZWQgPT0gbmlsIHsKCQlwYW5pYygicHJvcG9zYWwgaXMgbm90IGEgZmVlZCBhY3Rpb24iKQoJfQoJaC52YWxpZGF0ZUZlZWQocC5mZWVkLmFjdGlvbiwgcykKCXAuYmFsbG90LkNvbnN1bWUoZmVlZENvbW1pdG1lbnQocC5mZWVkLmFjdGlvbiwgcykpCgloLmludmFsaWRhdGVGZWVkUGVlcnMoSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQpCglyZXR1cm4gcC5mZWVkLmFjdGlvbgp9CmZ1bmMgKGggKkhvc3QpIFByZXBhcmVGZWVkRW1lcmdlbmN5UGF1c2UocyBGZWVkU3RhdGUsIHJsbSByZWFsbSkgewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCWgudmFsaWRhdGVGZWVkQXV0aG9yaXR5KHMpCglpZiBzLk93bmVyICE9IGguZmVlZFBvbGljeS5EQU8oKSB8fCBzLlBhdXNlZCB8fCBzLlN1YmplY3RNb2RlcmF0b3IgewoJCXBhbmljKCJmZWVkIGVtZXJnZW5jeSBwYXVzZSB1bmF2YWlsYWJsZSIpCgl9CgloLmludmFsaWRhdGVGZWVkUGVlcnMoSW52YWxpZGF0ZWRCeVBhdXNlLCAwKQp9ChreCQoOZmVlZF9yZWFkcy5nbm8SywlwYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAic3RyY29udiIKCmZ1bmMgKGggKkhvc3QpIGZlZWRDb25maWdKU09OKCkgc3RyaW5nIHsKCWlmIGguZmVlZFBvbGljeSA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGAsImZlZWRQb2xpY3kiOnsidGFyZ2V0IjpgICsgcXVvdGVKU09OKEZlZWRQYXRoKSArIGAsInN1Y2Nlc3NvciI6YCArIHF1b3RlSlNPTihzdHJpbmcoaC5mZWVkUG9saWN5LlN1Y2Nlc3NvcigpKSkgKyBgLCJtb2RlcmF0b3JDYXRlZ29yeSI6ImNyaXRpY2FsIiwidW5wYXVzZUNhdGVnb3J5IjoiZmluYW5jaWFsIiwiZW1lcmdlbmN5UGF1c2UiOnRydWUsInJldHVyblN0YWdlc09ubHkiOnRydWUsImludmFsaWRhdGVzT3RoZXJQcm9wb3NhbHMiOnRydWV9YAp9CmZ1bmMgZmVlZFN0YXRlSlNPTihzIEZlZWRTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJvd25lciI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5Pd25lcikpICsgYCwicGVuZGluZ093bmVyIjpgICsgcXVvdGVKU09OKHN0cmluZyhzLlBlbmRpbmdPd25lcikpICsgYCwicGF1c2VkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHMuUGF1c2VkKSArIGAsIm1vZGVyYXRvckNvdW50IjpgICsgcXVvdGVKU09OKHN0cmNvbnYuSXRvYShzLk1vZGVyYXRvckNvdW50KSkgKyBgLCJvd25lck1vZGVyYXRvciI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChzLk93bmVyTW9kZXJhdG9yKSArIGAsImRhb01vZGVyYXRvciI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChzLkRBT01vZGVyYXRvcikgKyBgLCJzdWNjZXNzb3JNb2RlcmF0b3IiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5TdWNjZXNzb3JNb2RlcmF0b3IpICsgYCwic3ViamVjdE1vZGVyYXRvciI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChzLlN1YmplY3RNb2RlcmF0b3IpICsgYH1gCn0KZnVuYyBmZWVkQWN0aW9uSlNPTihhIEZlZWRBY3Rpb24sIHMgRmVlZFN0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGB7InR5cGUiOiJmZWVkIiwidGFyZ2V0IjpgICsgcXVvdGVKU09OKEZlZWRQYXRoKSArIGAsIm9wZXJhdGlvbiI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5LaW5kKCkpKSArIGAsInJlY2lwaWVudCI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5SZWNpcGllbnQoKSkpICsgYCwic3ViamVjdCI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5TdWJqZWN0KCkpKSArIGAsImJlZm9yZSI6YCArIGZlZWRTdGF0ZUpTT04ocykgKyBgfWAKfQoahCoKFGZlZWRiYWNrX2FjdGlvbnMuZ25vEuspcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgKAoJImNoYWluIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgopCgpjb25zdCBGZWVkYmFja1BhdGggPSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2ZlZWRiYWNrX3YyIgoKdHlwZSBGZWVkYmFja0FjdGlvbktpbmQgc3RyaW5nCgpjb25zdCAoCglGZWVkYmFja0FjY2VwdE93bmVyIEZlZWRiYWNrQWN0aW9uS2luZCA9ICJhY2NlcHQtb3duZXIiCglGZWVkYmFja1JldHVybk93bmVyIEZlZWRiYWNrQWN0aW9uS2luZCA9ICJyZXR1cm4tb3duZXIiCglGZWVkYmFja0Fib3J0UmV0dXJuIEZlZWRiYWNrQWN0aW9uS2luZCA9ICJhYm9ydC1yZXR1cm4iCglGZWVkYmFja0FkZE1lbWJlciBGZWVkYmFja0FjdGlvbktpbmQgPSAiYWRkLW1lbWJlciIKCUZlZWRiYWNrUmVtb3ZlTWVtYmVyIEZlZWRiYWNrQWN0aW9uS2luZCA9ICJyZW1vdmUtbWVtYmVyIgoJRmVlZGJhY2tTZXRSb2xlcyBGZWVkYmFja0FjdGlvbktpbmQgPSAic2V0LXJvbGVzIgoJRmVlZGJhY2tDcmVhdGVUZXh0IEZlZWRiYWNrQWN0aW9uS2luZCA9ICJjcmVhdGUtdGV4dC1jaGFubmVsIgoJRmVlZGJhY2tVbnBhdXNlIEZlZWRiYWNrQWN0aW9uS2luZCA9ICJ1bnBhdXNlIgopCgp0eXBlIEZlZWRiYWNrUG9saWN5IHN0cnVjdHsgZGFvLCBzdWNjZXNzb3IgYWRkcmVzcyB9CgpmdW5jIE5ld0ZlZWRiYWNrUG9saWN5KGRhbywgc3VjY2Vzc29yIGFkZHJlc3MpIEZlZWRiYWNrUG9saWN5IHsKCWlmICFkYW8uSXNWYWxpZCgpIHx8IGRhbyAhPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2RhbyIpIHsKCQlwYW5pYygiZmVlZGJhY2sgcG9saWN5IHJlcXVpcmVzIHRoZSBmb3VuZGluZyBEQU8gYWRkcmVzcyIpCgl9CglpZiAhc3VjY2Vzc29yLklzVmFsaWQoKSB8fCBzdWNjZXNzb3IgPT0gZGFvIHx8IHN1Y2Nlc3NvciA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhGZWVkYmFja1BhdGgpIHsKCQlwYW5pYygiZmVlZGJhY2sgcG9saWN5IHJlcXVpcmVzIGEgdmFsaWQgZGlzdGluY3Qgc3VjY2Vzc29yIikKCX0KCXJldHVybiBGZWVkYmFja1BvbGljeXtkYW86IGRhbywgc3VjY2Vzc29yOiBzdWNjZXNzb3J9Cn0KZnVuYyAocCBGZWVkYmFja1BvbGljeSkgREFPKCkgYWRkcmVzcyB7IHJldHVybiBwLmRhbyB9CmZ1bmMgKHAgRmVlZGJhY2tQb2xpY3kpIFN1Y2Nlc3NvcigpIGFkZHJlc3MgeyByZXR1cm4gcC5zdWNjZXNzb3IgfQoKdHlwZSBGZWVkYmFja0FjdGlvbiBzdHJ1Y3QgewoJa2luZCBGZWVkYmFja0FjdGlvbktpbmQKCXJlY2lwaWVudCwgc3ViamVjdCBhZGRyZXNzCglyb2xlcyBzdHJpbmcKCW5hbWUsIGRlc2NyaXB0aW9uIHN0cmluZwp9CmZ1bmMgKHAgRmVlZGJhY2tQb2xpY3kpIEFjY2VwdCgpIEZlZWRiYWNrQWN0aW9uIHsgcmV0dXJuIEZlZWRiYWNrQWN0aW9ue2tpbmQ6IEZlZWRiYWNrQWNjZXB0T3duZXJ9IH0KZnVuYyAocCBGZWVkYmFja1BvbGljeSkgUmV0dXJuKCkgRmVlZGJhY2tBY3Rpb24geyByZXR1cm4gRmVlZGJhY2tBY3Rpb257a2luZDogRmVlZGJhY2tSZXR1cm5Pd25lciwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0gfQpmdW5jIChwIEZlZWRiYWNrUG9saWN5KSBBYm9ydFJldHVybigpIEZlZWRiYWNrQWN0aW9uIHsgcmV0dXJuIEZlZWRiYWNrQWN0aW9ue2tpbmQ6IEZlZWRiYWNrQWJvcnRSZXR1cm4sIHJlY2lwaWVudDogcC5zdWNjZXNzb3J9IH0KZnVuYyAocCBGZWVkYmFja1BvbGljeSkgQWRkTWVtYmVyKHdobyBhZGRyZXNzLCByb2xlcyBzdHJpbmcpIEZlZWRiYWNrQWN0aW9uIHsgYTo9RmVlZGJhY2tBY3Rpb257a2luZDogRmVlZGJhY2tBZGRNZW1iZXIsIHN1YmplY3Q6d2hvLCByb2xlczpyb2xlc307IGEuQnl0ZXMoKTsgcmV0dXJuIGEgfQpmdW5jIChwIEZlZWRiYWNrUG9saWN5KSBSZW1vdmVNZW1iZXIod2hvIGFkZHJlc3MpIEZlZWRiYWNrQWN0aW9uIHsgYTo9RmVlZGJhY2tBY3Rpb257a2luZDogRmVlZGJhY2tSZW1vdmVNZW1iZXIsIHN1YmplY3Q6d2hvfTsgYS5CeXRlcygpOyByZXR1cm4gYSB9CmZ1bmMgKHAgRmVlZGJhY2tQb2xpY3kpIFNldFJvbGVzKHdobyBhZGRyZXNzLCByb2xlcyBzdHJpbmcpIEZlZWRiYWNrQWN0aW9uIHsgYTo9RmVlZGJhY2tBY3Rpb257a2luZDogRmVlZGJhY2tTZXRSb2xlcywgc3ViamVjdDp3aG8sIHJvbGVzOnJvbGVzfTsgYS5CeXRlcygpOyByZXR1cm4gYSB9CmZ1bmMgKHAgRmVlZGJhY2tQb2xpY3kpIENyZWF0ZVRleHQobmFtZSwgZGVzY3JpcHRpb24gc3RyaW5nKSBGZWVkYmFja0FjdGlvbiB7IGE6PUZlZWRiYWNrQWN0aW9ue2tpbmQ6IEZlZWRiYWNrQ3JlYXRlVGV4dCwgbmFtZTpuYW1lLCBkZXNjcmlwdGlvbjpkZXNjcmlwdGlvbn07IGEuQnl0ZXMoKTsgcmV0dXJuIGEgfQpmdW5jIEZlZWRiYWNrUmVzdW1lKCkgRmVlZGJhY2tBY3Rpb24geyByZXR1cm4gRmVlZGJhY2tBY3Rpb257a2luZDogRmVlZGJhY2tVbnBhdXNlfSB9CmZ1bmMgKGEgRmVlZGJhY2tBY3Rpb24pIEtpbmQoKSBGZWVkYmFja0FjdGlvbktpbmQgeyByZXR1cm4gYS5raW5kIH0KZnVuYyAoYSBGZWVkYmFja0FjdGlvbikgUmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiBhLnJlY2lwaWVudCB9CmZ1bmMgKGEgRmVlZGJhY2tBY3Rpb24pIFN1YmplY3QoKSBhZGRyZXNzIHsgcmV0dXJuIGEuc3ViamVjdCB9CmZ1bmMgKGEgRmVlZGJhY2tBY3Rpb24pIFJvbGVzKCkgc3RyaW5nIHsgcmV0dXJuIGEucm9sZXMgfQpmdW5jIChhIEZlZWRiYWNrQWN0aW9uKSBOYW1lKCkgc3RyaW5nIHsgcmV0dXJuIGEubmFtZSB9CmZ1bmMgKGEgRmVlZGJhY2tBY3Rpb24pIERlc2NyaXB0aW9uKCkgc3RyaW5nIHsgcmV0dXJuIGEuZGVzY3JpcHRpb24gfQoKZnVuYyB2YWxpZEZlZWRiYWNrTmFtZShuYW1lIHN0cmluZykgYm9vbCB7CglpZiBsZW4obmFtZSk8MSB8fCBsZW4obmFtZSk+NTAgeyByZXR1cm4gZmFsc2UgfQoJZm9yIF8sYzo9cmFuZ2UgbmFtZSB7IGlmICEoKGM+PSdhJyYmYzw9J3onKXx8KGM+PScwJyYmYzw9JzknKXx8Yz09Jy0nKSB7IHJldHVybiBmYWxzZSB9IH0KCXJldHVybiB0cnVlCn0KZnVuYyB2YWxpZEZlZWRiYWNrRGVzY3JpcHRpb24oZGVzY3JpcHRpb24gc3RyaW5nKSBib29sIHsKCWlmIGxlbihkZXNjcmlwdGlvbik8MSB8fCBsZW4oZGVzY3JpcHRpb24pPjIwMCB7IHJldHVybiBmYWxzZSB9Cglmb3IgXyxjOj1yYW5nZSBkZXNjcmlwdGlvbiB7IGlmIGM8MzIgfHwgYz09MTI3IHsgcmV0dXJuIGZhbHNlIH0gfQoJcmV0dXJuIHRydWUKfQoKLy8gT25seSB0aGUgZm91ciB0YXJnZXQgQUNMIHJvbGVzIGFyZSByZXByZXNlbnRhYmxlOyBldmVyeSByb2xlIGxpc3QgaGFzIGEKLy8gY2Fub25pY2FsIG9yZGVyLCBzbyBhIHZvdGVkIGNvbW1pdG1lbnQgY2Fubm90IGFsaWFzIGFub3RoZXIgcm9sZSBncmFudC4KZnVuYyBjYW5vbmljYWxGZWVkYmFja1JvbGVzKHJvbGVzIHN0cmluZykgYm9vbCB7CglpZiByb2xlcyA9PSAiIiB7IHJldHVybiBmYWxzZSB9CglwYXJ0czo9c3RyaW5ncy5TcGxpdChyb2xlcywgIiwiKQoJaWYgbGVuKHBhcnRzKT40IHsgcmV0dXJuIGZhbHNlIH0KCXByZXZpb3VzOj0tMQoJZm9yIF8scGFydDo9cmFuZ2UgcGFydHMgewoJCWluZGV4Oj0tMQoJCXN3aXRjaCBwYXJ0IHsgY2FzZSAiYWRtaW4iOiBpbmRleD0wOyBjYXNlICJkZXYiOiBpbmRleD0xOyBjYXNlICJvcHMiOiBpbmRleD0yOyBjYXNlICJtZW1iZXIiOiBpbmRleD0zIH0KCQlpZiBpbmRleDw9cHJldmlvdXMgeyByZXR1cm4gZmFsc2UgfQoJCXByZXZpb3VzPWluZGV4Cgl9CglyZXR1cm4gdHJ1ZQp9CmZ1bmMgKGEgRmVlZGJhY2tBY3Rpb24pIEJ5dGVzKCkgc3RyaW5nIHsKCWJhc2U6PSJmZWVkYmFjay92MXwiK0ZlZWRiYWNrUGF0aCsifCIrc3RyaW5nKGEua2luZCkKCXN3aXRjaCBhLmtpbmQgewoJY2FzZSBGZWVkYmFja0FjY2VwdE93bmVyLCBGZWVkYmFja1VucGF1c2U6CgkJaWYgYS5yZWNpcGllbnQhPSIiIHx8IGEuc3ViamVjdCE9IiIgfHwgYS5yb2xlcyE9IiIgfHwgYS5uYW1lIT0iIiB8fCBhLmRlc2NyaXB0aW9uIT0iIiB7IHBhbmljKCJtYWxmb3JtZWQgZmVlZGJhY2sgYWN0aW9uIikgfQoJCXJldHVybiBiYXNlCgljYXNlIEZlZWRiYWNrUmV0dXJuT3duZXIsIEZlZWRiYWNrQWJvcnRSZXR1cm46CgkJaWYgIWEucmVjaXBpZW50LklzVmFsaWQoKSB8fCBhLnN1YmplY3QhPSIiIHx8IGEucm9sZXMhPSIiIHx8IGEubmFtZSE9IiIgfHwgYS5kZXNjcmlwdGlvbiE9IiIgeyBwYW5pYygibWFsZm9ybWVkIGZlZWRiYWNrIHJldHVybiBhY3Rpb24iKSB9CgkJcmV0dXJuIGJhc2UrInwiK3N0cmluZyhhLnJlY2lwaWVudCkKCWNhc2UgRmVlZGJhY2tBZGRNZW1iZXIsIEZlZWRiYWNrU2V0Um9sZXM6CgkJaWYgIWEuc3ViamVjdC5Jc1ZhbGlkKCkgfHwgYS5yZWNpcGllbnQhPSIiIHx8IGEubmFtZSE9IiIgfHwgYS5kZXNjcmlwdGlvbiE9IiIgfHwgIWNhbm9uaWNhbEZlZWRiYWNrUm9sZXMoYS5yb2xlcykgeyBwYW5pYygiaW52YWxpZCBmZWVkYmFjayBtZW1iZXIgYWN0aW9uIikgfQoJCXJldHVybiBiYXNlKyJ8IitzdHJpbmcoYS5zdWJqZWN0KSsifCIrc3RyY29udi5JdG9hKGxlbihhLnJvbGVzKSkrIjoiK2Eucm9sZXMKCWNhc2UgRmVlZGJhY2tSZW1vdmVNZW1iZXI6CgkJaWYgIWEuc3ViamVjdC5Jc1ZhbGlkKCkgfHwgYS5yZWNpcGllbnQhPSIiIHx8IGEucm9sZXMhPSIiIHx8IGEubmFtZSE9IiIgfHwgYS5kZXNjcmlwdGlvbiE9IiIgeyBwYW5pYygiaW52YWxpZCBmZWVkYmFjayBtZW1iZXIgYWN0aW9uIikgfQoJCXJldHVybiBiYXNlKyJ8IitzdHJpbmcoYS5zdWJqZWN0KQoJY2FzZSBGZWVkYmFja0NyZWF0ZVRleHQ6CgkJaWYgYS5yZWNpcGllbnQhPSIiIHx8IGEuc3ViamVjdCE9IiIgfHwgYS5yb2xlcyE9IiIgfHwgIXZhbGlkRmVlZGJhY2tOYW1lKGEubmFtZSkgfHwgIXZhbGlkRmVlZGJhY2tEZXNjcmlwdGlvbihhLmRlc2NyaXB0aW9uKSB7IHBhbmljKCJpbnZhbGlkIGZlZWRiYWNrIHRleHQgY3JlYXRpb24iKSB9CgkJcmV0dXJuIGJhc2UrInwiK2EubmFtZSsifCIrc3RyY29udi5JdG9hKGxlbihhLmRlc2NyaXB0aW9uKSkrIjoiK2EuZGVzY3JpcHRpb24KCWRlZmF1bHQ6IHBhbmljKCJ1bnN1cHBvcnRlZCBmZWVkYmFjayBhY3Rpb24iKQoJfQp9CmZ1bmMgKGEgRmVlZGJhY2tBY3Rpb24pIENhdGVnb3J5KCkgbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNhdGVnb3J5IHsKCWEuQnl0ZXMoKQoJaWYgYS5raW5kPT1GZWVkYmFja1VucGF1c2UgeyByZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkZpbmFuY2lhbCB9CglyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNyaXRpY2FsCn0KGrYhChFmZWVkYmFja19ob3N0LmdubxKgIXBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgopCgp0eXBlIEZlZWRiYWNrU3RhdGUgc3RydWN0IHsKCU93bmVyLCBQZW5kaW5nT3duZXIgYWRkcmVzcwoJUGF1c2VkIGJvb2wKCU1lbWJlckNvdW50IGludAoJTWVtYmVyc2hpcFJldmlzaW9uIHVpbnQ2NAoJT3duZXJNZW1iZXIsIERBT01lbWJlciwgU3VjY2Vzc29yTWVtYmVyLCBTdWJqZWN0TWVtYmVyIGJvb2wKCU93bmVyUm9sZXMsIERBT1JvbGVzLCBTdWNjZXNzb3JSb2xlcywgU3ViamVjdFJvbGVzIHN0cmluZwoJQ2hhbm5lbENvdW50IGludAoJQ2hhbm5lbEV4aXN0cyBib29sCglDaGFubmVsRGVzY3JpcHRpb24sIENoYW5uZWxUeXBlLCBDaGFubmVsUmVhZFJvbGVzLCBDaGFubmVsV3JpdGVSb2xlcyBzdHJpbmcKfQp0eXBlIGZlZWRiYWNrUHJvcG9zYWwgc3RydWN0IHsgYWN0aW9uIEZlZWRiYWNrQWN0aW9uOyBiZWZvcmUgRmVlZGJhY2tTdGF0ZSB9CgpmdW5jIGZlZWRiYWNrQ29tbWl0bWVudChhIEZlZWRiYWNrQWN0aW9uLCBzIEZlZWRiYWNrU3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYS5CeXRlcygpKyJ8YmVmb3JlfCIrZmVlZGJhY2tTdGF0ZUpTT04ocykKfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZUZlZWRiYWNrKGEgRmVlZGJhY2tBY3Rpb24sIHMgRmVlZGJhY2tTdGF0ZSkgewoJaWYgaC5mZWVkYmFja1BvbGljeT09bmlsIHsgcGFuaWMoImZlZWRiYWNrIGFjdGlvbnMgYXJlIG5vdCBjb25maWd1cmVkIikgfQoJYS5CeXRlcygpCglwOj1oLmZlZWRiYWNrUG9saWN5CglpZiAhcy5Pd25lci5Jc1ZhbGlkKCkgfHwgKHMuUGVuZGluZ093bmVyIT0iIiAmJiAhcy5QZW5kaW5nT3duZXIuSXNWYWxpZCgpKSB8fCBzLk1lbWJlckNvdW50PDEgfHwgIXMuT3duZXJNZW1iZXIgfHwgcy5DaGFubmVsQ291bnQ8MCB8fCBzLkNoYW5uZWxDb3VudD4yMCB7CgkJcGFuaWMoImludmFsaWQgZmVlZGJhY2sgYXV0aG9yaXR5IHByZS1zdGF0ZSIpCgl9CglpZiBhLlN1YmplY3QoKT09IiIgJiYgKHMuU3ViamVjdE1lbWJlciB8fCBzLlN1YmplY3RSb2xlcyE9IiIpIHsgcGFuaWMoInVuZXhwZWN0ZWQgZmVlZGJhY2sgc3ViamVjdCBwcmUtc3RhdGUiKSB9CglpZiBhLk5hbWUoKT09IiIgJiYgKHMuQ2hhbm5lbEV4aXN0cyB8fCBzLkNoYW5uZWxEZXNjcmlwdGlvbiE9IiIgfHwgcy5DaGFubmVsVHlwZSE9IiIgfHwgcy5DaGFubmVsUmVhZFJvbGVzIT0iIiB8fCBzLkNoYW5uZWxXcml0ZVJvbGVzIT0iIikgeyBwYW5pYygidW5leHBlY3RlZCBmZWVkYmFjayBjcmVhdGlvbiBwcmUtc3RhdGUiKSB9CglpZiBhLktpbmQoKT09RmVlZGJhY2tBY2NlcHRPd25lciB7CgkJaWYgcy5Pd25lciE9cC5TdWNjZXNzb3IoKSB8fCBzLlBlbmRpbmdPd25lciE9cC5EQU8oKSB8fCBzLkRBT01lbWJlciB8fCAhcy5TdWNjZXNzb3JNZW1iZXIgfHwgcy5Pd25lclJvbGVzIT0iYWRtaW4iIHx8IHMuU3VjY2Vzc29yUm9sZXMhPSJhZG1pbiIgewoJCQlwYW5pYygicHVibGlzaGVyIGlzIG5vdCBwZW5kaW5nIGZlZWRiYWNrIGhhbmRvZmYgb3IgREFPIGFscmVhZHkgaGFzIG1lbWJlcnNoaXAiKQoJCX0KCQlyZXR1cm4KCX0KCWlmIHMuT3duZXIhPXAuREFPKCkgfHwgIXMuREFPTWVtYmVyIHx8IHMuREFPUm9sZXMhPXMuT3duZXJSb2xlcyB7IHBhbmljKCJEQU8gaXMgbm90IGZlZWRiYWNrIG93bmVyIikgfQoJaWYgYS5LaW5kKCk9PUZlZWRiYWNrQWJvcnRSZXR1cm4gewoJCWlmIGEuUmVjaXBpZW50KCkhPXAuU3VjY2Vzc29yKCkgfHwgcy5QZW5kaW5nT3duZXIhPXAuU3VjY2Vzc29yKCkgeyBwYW5pYygiZmVlZGJhY2sgcmV0dXJuIGRvZXMgbm90IG1hdGNoIHBvbGljeSIpIH0KCQlyZXR1cm4KCX0KCWlmIHMuUGVuZGluZ093bmVyIT0iIiB7IHBhbmljKCJmZWVkYmFjayBhdXRob3JpdHkgdHJhbnNmZXIgaXMgcGVuZGluZyIpIH0KCXN3aXRjaCBhLktpbmQoKSB7CgljYXNlIEZlZWRiYWNrUmV0dXJuT3duZXI6CgkJaWYgYS5SZWNpcGllbnQoKSE9cC5TdWNjZXNzb3IoKSB8fCBzLlN1Y2Nlc3Nvck1lbWJlciB7IHBhbmljKCJmZWVkYmFjayBzdWNjZXNzb3IgbWlzbWF0Y2ggb3IgcHJlZXhpc3RpbmcgbWVtYmVyc2hpcCIpIH0KCWNhc2UgRmVlZGJhY2tBZGRNZW1iZXIsIEZlZWRiYWNrUmVtb3ZlTWVtYmVyLCBGZWVkYmFja1NldFJvbGVzOgoJCWlmIGEuU3ViamVjdCgpPT1wLkRBTygpIHx8IGEuU3ViamVjdCgpPT1jaGFpbi5QYWNrYWdlQWRkcmVzcyhGZWVkYmFja1BhdGgpIHx8IChhLlN1YmplY3QoKT09cC5TdWNjZXNzb3IoKSAmJiBhLktpbmQoKSE9RmVlZGJhY2tSZW1vdmVNZW1iZXIpIHsKCQkJcGFuaWMoImZlZWRiYWNrIG1lbWJlciBhY3Rpb24gdGFyZ2V0cyBwcm90ZWN0ZWQgYXV0aG9yaXR5IikKCQl9CgkJaWYgYS5LaW5kKCk9PUZlZWRiYWNrQWRkTWVtYmVyICYmIHMuU3ViamVjdE1lbWJlciB7IHBhbmljKCJmZWVkYmFjayBtZW1iZXIgYWxyZWFkeSBleGlzdHMiKSB9CgkJaWYgYS5LaW5kKCkhPUZlZWRiYWNrQWRkTWVtYmVyICYmICFzLlN1YmplY3RNZW1iZXIgeyBwYW5pYygiZmVlZGJhY2sgbWVtYmVyIGRvZXMgbm90IGV4aXN0IikgfQoJCWlmIGEuS2luZCgpPT1GZWVkYmFja1NldFJvbGVzICYmIHMuU3ViamVjdFJvbGVzPT1hLlJvbGVzKCkgeyBwYW5pYygiZmVlZGJhY2sgcm9sZXMgYXJlIHVuY2hhbmdlZCIpIH0KCWNhc2UgRmVlZGJhY2tDcmVhdGVUZXh0OgoJCWlmIHMuQ2hhbm5lbENvdW50Pj0yMCB8fCBzLkNoYW5uZWxFeGlzdHMgeyBwYW5pYygiZmVlZGJhY2sgdGV4dCBjcmVhdGlvbiB1bmF2YWlsYWJsZSIpIH0KCWNhc2UgRmVlZGJhY2tVbnBhdXNlOgoJCWlmICFzLlBhdXNlZCB7IHBhbmljKCJmZWVkYmFjayB1bnBhdXNlIGlzIGEgbm8tb3AiKSB9CglkZWZhdWx0OiBwYW5pYygidW5zdXBwb3J0ZWQgZmVlZGJhY2sgYWN0aW9uIikKCX0KfQpmdW5jIChoICpIb3N0KSBQcm9wb3NlRmVlZGJhY2soYSBGZWVkYmFja0FjdGlvbiwgcyBGZWVkYmFja1N0YXRlLCBybG0gcmVhbG0pIHVpbnQ2NCB7Cgl3aG86PWFzc2VydENhbGxlcihoLHJsbSkKCWgudmFsaWRhdGVGZWVkYmFjayhhLHMpCglwOj0mcm9sZVByb3Bvc2Fse3Byb3Bvc2VyOndobyxmZWVkYmFjazomZmVlZGJhY2tQcm9wb3NhbHthY3Rpb246YSxiZWZvcmU6c319CglwLmJhbGxvdD1oLnBvbGljeS5OZXdQcm9wb3NhbChhLkNhdGVnb3J5KCksZmVlZGJhY2tDb21taXRtZW50KGEscykpCgloLmFkZFByb3Bvc2FsKHApCglyZXR1cm4gdWludDY0KGxlbihoLnByb3Bvc2FscykpCn0KZnVuYyAoaCAqSG9zdCkgaW52YWxpZGF0ZUZlZWRiYWNrUGVlcnMoY2F1c2Ugc3RyaW5nLCBpZCB1aW50NjQpIHsKCW1lbWJlcnM6PVtdbWVtYmFfd2VpZ2h0ZWRfcG9saWN5Lk1lbWJlcnt9Cglmb3IgXyxzZWF0Oj1yYW5nZSBoLnNlYXRzIHsgbWVtYmVycz1hcHBlbmQobWVtYmVycyxzZWF0Lk1lbWJlcikgfQoJaC5wb2xpY3kuUmVjb25maWd1cmUobWVtYmVycykKCWgucmVjb3JkSW52YWxpZGF0aW9uKGNhdXNlLCBpZCwgRmVlZGJhY2tQYXRoKQp9CmZ1bmMgKGggKkhvc3QpIENvbnN1bWVGZWVkYmFjayhpZCB1aW50NjQsIHMgRmVlZGJhY2tTdGF0ZSwgcmxtIHJlYWxtKSBGZWVkYmFja0FjdGlvbiB7Cglhc3NlcnRDYWxsZXIoaCxybG0pCglwOj1oLnByb3Bvc2FsKGlkKQoJaWYgcC5mZWVkYmFjaz09bmlsIHsgcGFuaWMoInByb3Bvc2FsIGlzIG5vdCBhIGZlZWRiYWNrIGFjdGlvbiIpIH0KCWgudmFsaWRhdGVGZWVkYmFjayhwLmZlZWRiYWNrLmFjdGlvbixzKQoJcC5iYWxsb3QuQ29uc3VtZShmZWVkYmFja0NvbW1pdG1lbnQocC5mZWVkYmFjay5hY3Rpb24scykpCgloLmludmFsaWRhdGVGZWVkYmFja1BlZXJzKEludmFsaWRhdGVkQnlFeGVjdXRpb24sIGlkKQoJcmV0dXJuIHAuZmVlZGJhY2suYWN0aW9uCn0KZnVuYyAoaCAqSG9zdCkgUHJlcGFyZUZlZWRiYWNrRW1lcmdlbmN5UGF1c2UocyBGZWVkYmFja1N0YXRlLCBybG0gcmVhbG0pIHsKCWFzc2VydENhbGxlcihoLHJsbSkKCWlmIGguZmVlZGJhY2tQb2xpY3k9PW5pbCB8fCBzLk93bmVyIT1oLmZlZWRiYWNrUG9saWN5LkRBTygpIHx8IHMuUGF1c2VkIHx8ICFzLk93bmVyTWVtYmVyIHx8ICFzLkRBT01lbWJlciB8fCBzLkRBT1JvbGVzIT1zLk93bmVyUm9sZXMgewoJCXBhbmljKCJmZWVkYmFjayBlbWVyZ2VuY3kgcGF1c2UgdW5hdmFpbGFibGUiKQoJfQoJaC5pbnZhbGlkYXRlRmVlZGJhY2tQZWVycyhJbnZhbGlkYXRlZEJ5UGF1c2UsIDApCn0KGpAPChJmZWVkYmFja19yZWFkcy5nbm8S+Q5wYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAic3RyY29udiIKCmZ1bmMgKGggKkhvc3QpIGZlZWRiYWNrQ29uZmlnSlNPTigpIHN0cmluZyB7CglpZiBoLmZlZWRiYWNrUG9saWN5PT1uaWwgeyByZXR1cm4gIiIgfQoJcmV0dXJuIGAsImZlZWRiYWNrUG9saWN5Ijp7InRhcmdldCI6YCtxdW90ZUpTT04oRmVlZGJhY2tQYXRoKStgLCJzdWNjZXNzb3IiOmArcXVvdGVKU09OKHN0cmluZyhoLmZlZWRiYWNrUG9saWN5LlN1Y2Nlc3NvcigpKSkrYCwibWVtYmVyQ2F0ZWdvcnkiOiJjcml0aWNhbCIsInVucGF1c2VDYXRlZ29yeSI6ImZpbmFuY2lhbCIsImVtZXJnZW5jeVBhdXNlIjp0cnVlLCJyZXR1cm5TdGFnZXNPbmx5Ijp0cnVlLCJpbnZhbGlkYXRlc090aGVyUHJvcG9zYWxzIjp0cnVlfWAKfQpmdW5jIGZlZWRiYWNrU3RhdGVKU09OKHMgRmVlZGJhY2tTdGF0ZSkgc3RyaW5nIHsKCXJldHVybiBgeyJvd25lciI6YCtxdW90ZUpTT04oc3RyaW5nKHMuT3duZXIpKStgLCJwZW5kaW5nT3duZXIiOmArcXVvdGVKU09OKHN0cmluZyhzLlBlbmRpbmdPd25lcikpK2AsInBhdXNlZCI6YCtzdHJjb252LkZvcm1hdEJvb2wocy5QYXVzZWQpK2AsIm1lbWJlckNvdW50IjpgK3F1b3RlSlNPTihzdHJjb252Lkl0b2Eocy5NZW1iZXJDb3VudCkpK2AsIm1lbWJlcnNoaXBSZXZpc2lvbiI6YCtxdW90ZUpTT04oc3RyY29udi5Gb3JtYXRVaW50KHMuTWVtYmVyc2hpcFJldmlzaW9uLDEwKSkrYCwib3duZXJNZW1iZXIiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuT3duZXJNZW1iZXIpK2AsImRhb01lbWJlciI6YCtzdHJjb252LkZvcm1hdEJvb2wocy5EQU9NZW1iZXIpK2AsInN1Y2Nlc3Nvck1lbWJlciI6YCtzdHJjb252LkZvcm1hdEJvb2wocy5TdWNjZXNzb3JNZW1iZXIpK2AsInN1YmplY3RNZW1iZXIiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuU3ViamVjdE1lbWJlcikrYCwib3duZXJSb2xlcyI6YCtxdW90ZUpTT04ocy5Pd25lclJvbGVzKStgLCJkYW9Sb2xlcyI6YCtxdW90ZUpTT04ocy5EQU9Sb2xlcykrYCwic3VjY2Vzc29yUm9sZXMiOmArcXVvdGVKU09OKHMuU3VjY2Vzc29yUm9sZXMpK2AsInN1YmplY3RSb2xlcyI6YCtxdW90ZUpTT04ocy5TdWJqZWN0Um9sZXMpK2AsImZlZWRiYWNrQ2hhbm5lbENvdW50IjpgK3F1b3RlSlNPTihzdHJjb252Lkl0b2Eocy5DaGFubmVsQ291bnQpKStgLCJmZWVkYmFja0NoYW5uZWxFeGlzdHMiOmArc3RyY29udi5Gb3JtYXRCb29sKHMuQ2hhbm5lbEV4aXN0cykrYCwiZmVlZGJhY2tDaGFubmVsRGVzY3JpcHRpb24iOmArcXVvdGVKU09OKHMuQ2hhbm5lbERlc2NyaXB0aW9uKStgLCJmZWVkYmFja0NoYW5uZWxUeXBlIjpgK3F1b3RlSlNPTihzLkNoYW5uZWxUeXBlKStgLCJmZWVkYmFja0NoYW5uZWxSZWFkUm9sZXMiOmArcXVvdGVKU09OKHMuQ2hhbm5lbFJlYWRSb2xlcykrYCwiZmVlZGJhY2tDaGFubmVsV3JpdGVSb2xlcyI6YCtxdW90ZUpTT04ocy5DaGFubmVsV3JpdGVSb2xlcykrYH1gCn0KZnVuYyBmZWVkYmFja0FjdGlvbkpTT04oYSBGZWVkYmFja0FjdGlvbiwgcyBGZWVkYmFja1N0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGB7InR5cGUiOiJmZWVkYmFjayIsInRhcmdldCI6YCtxdW90ZUpTT04oRmVlZGJhY2tQYXRoKStgLCJvcGVyYXRpb24iOmArcXVvdGVKU09OKHN0cmluZyhhLktpbmQoKSkpK2AsInJlY2lwaWVudCI6YCtxdW90ZUpTT04oc3RyaW5nKGEuUmVjaXBpZW50KCkpKStgLCJzdWJqZWN0IjpgK3F1b3RlSlNPTihzdHJpbmcoYS5TdWJqZWN0KCkpKStgLCJyb2xlcyI6YCtxdW90ZUpTT04oYS5Sb2xlcygpKStgLCJuYW1lIjpgK3F1b3RlSlNPTihhLk5hbWUoKSkrYCwiZGVzY3JpcHRpb24iOmArcXVvdGVKU09OKGEuRGVzY3JpcHRpb24oKSkrYCwiYmVmb3JlIjpgK2ZlZWRiYWNrU3RhdGVKU09OKHMpK2B9YAp9ChpNCgtnbm9tb2QudG9tbBI+bW9kdWxlID0gImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9ob3N0Igpnbm8gPSAiMC45IgoayXQKCGhvc3QuZ25vErx0Ly8gUGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0IGhvc3RzIHRoZSBmb3VuZGluZyBwb2xpY3kncyBnb3Zlcm5lZCByb2xlIGFjdGlvbnMuCi8vIFRoaXMgc291cmNlLW9ubHkgY29tcG9uZW50IGlzIG5vdCB0aGUgY3VycmVudCBtZW1iYV9kYW8gYW5kIGdyYW50cyBubyBleHRlcm5hbAovLyBhcHBsaWNhdGlvbiBhdXRob3JpdHkuIFRoZSBvd25pbmcgcmVhbG0gbXVzdCBrZWVwIGl0cyBIb3N0IHByaXZhdGUuCnBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgopCgp0eXBlIFJvbGUgc3RyaW5nCgpjb25zdCAoCglBZG1pbiAgIFJvbGUgPSAiYWRtaW4iCglGaW5hbmNlIFJvbGUgPSAiZmluYW5jZSIKKQoKLy8gU2VhdCBpcyBjb3BpZWQgYXQgY29uc3RydWN0aW9uLiBGb3VuZGVyL2NvcmUtZGV2ZWxvcGVyIHZvdGluZyBlbGlnaWJpbGl0eSBpcwovLyBpbmRlcGVuZGVudCBmcm9tIHRoZXNlIG9wZXJhdGlvbmFsIHJvbGUgbGFiZWxzOyBhbGwgbWVtYmVycyBtYXkgZXhlY3V0ZS4KdHlwZSBTZWF0IHN0cnVjdCB7CglNZW1iZXIgIG1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXIKCUFkbWluICAgYm9vbAoJRmluYW5jZSBib29sCn0KCnR5cGUgcm9sZVByb3Bvc2FsIHN0cnVjdCB7CglmZWVkYmFjayAgICAqZmVlZGJhY2tQcm9wb3NhbAoJY2hhbm5lbHMgICAgKmNoYW5uZWxzUHJvcG9zYWwKCWZlZWQgICAgICAgICpmZWVkUHJvcG9zYWwKCWJhZGdlcyAgICAgICpiYWRnZXNQcm9wb3NhbAoJZXNjcm93ICAgICAgKmVzY3Jvd1Byb3Bvc2FsCglhcHBzdG9yZSAgICAqYXBwc3RvcmVQcm9wb3NhbAoJYXJjYWRlICAgICAgKmFyY2FkZVByb3Bvc2FsCglxdWVzdCAgICAgICAqcXVlc3RQcm9wb3NhbAoJcmV2aWV3cyAgICAgKnJldmlld3NQcm9wb3NhbAoJbWFya2V0ICAgICAgKm1hcmtldFByb3Bvc2FsCglyZWNvdmVyeSAgICBib29sCglwZXJzb25JRCAgICBzdHJpbmcKCXJlcGxhY2VtZW50IGFkZHJlc3MKCXByb3Bvc2VyICAgIGFkZHJlc3MKCXRhcmdldCAgICAgIGFkZHJlc3MKCXJvbGUgICAgICAgIFJvbGUKCWdyYW50ICAgICAgIGJvb2wKCWJhbGxvdCAgICAgICptZW1iYV93ZWlnaHRlZF9wb2xpY3kuUHJvcG9zYWwKCS8vIHJvc3RlciBpbmRleGVzIEhvc3Qucm9zdGVyczogdGhlIGVsZWN0b3JhdGUgZnJvemVuIGF0IGNyZWF0aW9uLiBjaG9pY2VzCgkvLyBhbmQgdm90ZWRBdCBtaXJyb3IgZWFjaCBzZWF0J3MgY3VycmVudCBiYWxsb3QgYW5kIHRoZSBoZWlnaHQgaXQgd2FzIGNhc3Q7CgkvLyB0aGV5IGFyZSB3cml0dGVuIG9ubHkgYnkgSG9zdC5Wb3RlLCBhZnRlciB0aGUgcG9saWN5IGFjY2VwdGVkIHRoZSB2b3RlLgoJcm9zdGVyICBpbnQKCWNob2ljZXMgWzddbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LlZvdGUKCXZvdGVkQXQgWzddaW50NjQKCS8vIGVwb2NoIGlzIGxlbihIb3N0LmludmFsaWRhdGlvbnMpIGF0IGNyZWF0aW9uOiB0aGUgZmlyc3QgcmVjb25maWd1cmF0aW9uCgkvLyByZWNvcmRlZCBhZnRlciBpdCBpcyB0aGUgb25lIHRoYXQgaW52YWxpZGF0ZWQgdGhpcyBwcm9wb3NhbC4KCWVwb2NoIGludAp9CgovLyBJbnZhbGlkYXRpb24gY2F1c2VzIHJlY29yZGVkIG9uIGV2ZXJ5IHBvbGljeSByZWNvbmZpZ3VyYXRpb24uCmNvbnN0ICgKCUludmFsaWRhdGVkQnlFeGVjdXRpb24gPSAic3VwZXJzZWRlZC1leGVjdXRpb24iCglJbnZhbGlkYXRlZEJ5UGF1c2UgICAgID0gInBhdXNlIgopCgovLyBpbnZhbGlkYXRpb24gcmVjb3JkcyBvbmUgcG9saWN5IHJlY29uZmlndXJhdGlvbjogZXZlcnkgcHJvcG9zYWwgb3BlbiBhdCB0aGF0Ci8vIG1vbWVudCwgb3RoZXIgdGhhbiB0aGUgb25lIGV4ZWN1dGVkLCBzdG9wcGVkIGFjY2VwdGluZyB2b3RlcyBhbmQgZXhlY3V0aW9uLgp0eXBlIGludmFsaWRhdGlvbiBzdHJ1Y3QgewoJaGVpZ2h0ICAgaW50NjQKCWF0ICAgICAgIHRpbWUuVGltZQoJY2F1c2UgICAgc3RyaW5nCglwcm9wb3NhbCB1aW50NjQKCXRhcmdldCAgIHN0cmluZwp9Cgp0eXBlIEhvc3Qgc3RydWN0IHsKCWZlZWRiYWNrUG9saWN5ICpGZWVkYmFja1BvbGljeQoJY2hhbm5lbHNQb2xpY3kgKkNoYW5uZWxzUG9saWN5CglmZWVkUG9saWN5ICAgICAqRmVlZFBvbGljeQoJYmFkZ2VzUG9saWN5ICAgKkJhZGdlc1BvbGljeQoJZXNjcm93UG9saWN5ICAgKkVzY3Jvd1BvbGljeQoJYXBwc3RvcmVQb2xpY3kgKkFwcHN0b3JlUG9saWN5CglhcmNhZGVQb2xpY3kgICAqQXJjYWRlUG9saWN5CglxdWVzdFBvbGljeSAgICAqUXVlc3RQb2xpY3kKCXJldmlld3NQb2xpY3kgICpSZXZpZXdzUG9saWN5CgltYXJrZXRQb2xpY3kgICAqTWFya2V0UG9saWN5CglwYXRoICAgICAgICAgICBzdHJpbmcKCXNlYXRzICAgICAgICAgIFs3XVNlYXQKCXBvbGljeSAgICAgICAgICptZW1iYV93ZWlnaHRlZF9wb2xpY3kuUG9saWN5Cglwcm9wb3NhbHMgICAgICBbXSpyb2xlUHJvcG9zYWwKCS8vIHJvc3RlcnMgaG9sZHMgZXZlcnkgZGlzdGluY3QgZWxlY3RvcmF0ZSwgb2xkZXN0IGZpcnN0LiBBIG5ldyBlbnRyeSBpcwoJLy8gYXBwZW5kZWQgb25seSB3aGVuIGEgcmVjb3ZlcnkgY2hhbmdlcyBhIHNlYXQgYWRkcmVzcy4KCXJvc3RlcnMgW11bN11hZGRyZXNzCgkvLyBpbnZhbGlkYXRpb25zIG1pcnJvcnMgdGhlIHBvbGljeSBnZW5lcmF0aW9uOiBvbmUgcmVjb3JkIHBlciBSZWNvbmZpZ3VyZS4KCWludmFsaWRhdGlvbnMgW11pbnZhbGlkYXRpb24KfQoKLy8gTmV3IG11c3QgcnVuIGluc2lkZSB0aGUgb3duaW5nIHJlYWxtJ3MgaW5pdCB3aXRoIGl0cyBvd24gbGl2ZSByZWFsbSB2YWx1ZS4KLy8gTm8gcmVhbG0gdmFsdWUgaXMgcGVyc2lzdGVkOyBlYWNoIG11dGF0aW9uIHJlcXVpcmVzIGEgZnJlc2ggbGl2ZSBmcmFtZS4KZnVuYyBOZXcoc2VhdHMgW11TZWF0LCBybG0gcmVhbG0pICpIb3N0IHsKCWlmICFybG0uSXNDdXJyZW50KCkgfHwgIXN0cmluZ3MuSGFzUHJlZml4KHJsbS5Qa2dQYXRoKCksICJnbm8ubGFuZC9yLyIpIHsKCQlwYW5pYygiaG9zdCByZXF1aXJlcyBpdHMgb3duaW5nIGxpdmUgcmVhbG0iKQoJfQoJbWVtYmVycyA6PSBbXW1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7fQoJYWRtaW5zIDo9IDAKCWZvciBfLCBzZWF0IDo9IHJhbmdlIHNlYXRzIHsKCQltZW1iZXJzID0gYXBwZW5kKG1lbWJlcnMsIHNlYXQuTWVtYmVyKQoJCWlmIHNlYXQuQWRtaW4gewoJCQlhZG1pbnMrKwoJCX0KCX0KCXBvbGljeSA6PSBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuTmV3KG1lbWJlcnMpCglpZiBhZG1pbnMgPT0gMCB7CgkJcGFuaWMoImhvc3QgcmVxdWlyZXMgYW4gYWRtaW4iKQoJfQoJaCA6PSAmSG9zdHtwYXRoOiBybG0uUGtnUGF0aCgpLCBwb2xpY3k6IHBvbGljeX0KCWZvciBpLCBzZWF0IDo9IHJhbmdlIHNlYXRzIHsKCQloLnNlYXRzW2ldID0gc2VhdAoJfQoJaC5zbmFwc2hvdFJvc3RlcigpCglyZXR1cm4gaAp9CgpmdW5jIChoICpIb3N0KSBzbmFwc2hvdFJvc3RlcigpIHsKCXZhciByb3N0ZXIgWzddYWRkcmVzcwoJZm9yIGksIHNlYXQgOj0gcmFuZ2UgaC5zZWF0cyB7CgkJcm9zdGVyW2ldID0gc2VhdC5NZW1iZXIuQWRkcmVzcwoJfQoJaC5yb3N0ZXJzID0gYXBwZW5kKGgucm9zdGVycywgcm9zdGVyKQp9CgovLyBhZGRQcm9wb3NhbCBmcmVlemVzIHRoZSBjdXJyZW50IGVsZWN0b3JhdGUgb24gdGhlIHByb3Bvc2FsIGFuZCBzdG9yZXMgaXQuCi8vIEV2ZXJ5IFByb3Bvc2UqIHBhdGggZ29lcyB0aHJvdWdoIGhlcmUsIHNvIGJhbGxvdHMgYWx3YXlzIGhhdmUgYSBzbmFwc2hvdC4KZnVuYyAoaCAqSG9zdCkgYWRkUHJvcG9zYWwocCAqcm9sZVByb3Bvc2FsKSB7CglwLnJvc3RlciA9IGxlbihoLnJvc3RlcnMpIC0gMQoJcC5lcG9jaCA9IGxlbihoLmludmFsaWRhdGlvbnMpCgloLnByb3Bvc2FscyA9IGFwcGVuZChoLnByb3Bvc2FscywgcCkKfQoKLy8gcmVjb3JkSW52YWxpZGF0aW9uIG11c3QgZm9sbG93IGV2ZXJ5IHBvbGljeSBSZWNvbmZpZ3VyZS4gSXQgcmVjb3JkcyB3aHkgdGhlCi8vIG9wZW4gcHJvcG9zYWxzIHN0b3BwZWQ7IGl0IG5ldmVyIGRlY2lkZXMgd2hpY2ggb25lcyBzdG9wLgpmdW5jIChoICpIb3N0KSByZWNvcmRJbnZhbGlkYXRpb24oY2F1c2Ugc3RyaW5nLCBpZCB1aW50NjQsIHRhcmdldCBzdHJpbmcpIHsKCWguaW52YWxpZGF0aW9ucyA9IGFwcGVuZChoLmludmFsaWRhdGlvbnMsIGludmFsaWRhdGlvbntoZWlnaHQ6IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgYXQ6IHRpbWUuTm93KCksIGNhdXNlOiBjYXVzZSwgcHJvcG9zYWw6IGlkLCB0YXJnZXQ6IHRhcmdldH0pCn0KCi8vIGJhbGxvdHNRdWFsaWZpZWQgcmVjb21wdXRlcyB0aGUgcG9saWN5IHRocmVzaG9sZCBmcm9tIHRoZSBtaXJyb3JlZCBiYWxsb3RzLgovLyBCYWxsb3RzIGNhbm5vdCBjaGFuZ2UgYWZ0ZXIgYSBwcm9wb3NhbCBjbG9zZXMgb3IgaXMgaW52YWxpZGF0ZWQsIHNvIHRoaXMgaXMKLy8gdGhlIHF1YWxpZmljYXRpb24gdGhlIHByb3Bvc2FsIGhhZCBhdCB0aGF0IG1vbWVudC4KZnVuYyAoaCAqSG9zdCkgYmFsbG90c1F1YWxpZmllZChwICpyb2xlUHJvcG9zYWwsIGNhdGVnb3J5IG1lbWJhX3dlaWdodGVkX3BvbGljeS5DYXRlZ29yeSkgYm9vbCB7Cgl3ZWlnaHQsIHBlb3BsZSwgZGV2ZWxvcGVycyA6PSAwLCAwLCAwCglmb3IgaSwgdm90ZSA6PSByYW5nZSBwLmNob2ljZXMgewoJCWlmIHZvdGUgIT0gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LlllcyB7CgkJCWNvbnRpbnVlCgkJfQoJCXBlb3BsZSsrCgkJd2VpZ2h0KysKCQlpZiBoLnNlYXRzW2ldLk1lbWJlci5Gb3VuZGVyIHsKCQkJd2VpZ2h0KysKCQl9IGVsc2UgewoJCQlkZXZlbG9wZXJzKysKCQl9Cgl9Cglzd2l0Y2ggY2F0ZWdvcnkgewoJY2FzZSBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuUm91dGluZToKCQlyZXR1cm4gd2VpZ2h0ID49IDMgJiYgcGVvcGxlID49IDIKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkZpbmFuY2lhbDoKCQlyZXR1cm4gd2VpZ2h0ID49IDUgJiYgcGVvcGxlID49IDMKCWRlZmF1bHQ6CgkJcmV0dXJuIHdlaWdodCA+PSA2ICYmIHBlb3BsZSA+PSA0IHx8IGRldmVsb3BlcnMgPj0gNQoJfQp9CgpmdW5jIChoICpIb3N0KSBtZW1iZXJJbmRleCh3aG8gYWRkcmVzcykgaW50IHsKCWZvciBpLCBzZWF0IDo9IHJhbmdlIGguc2VhdHMgewoJCWlmIHNlYXQuTWVtYmVyLkFkZHJlc3MgPT0gd2hvIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglyZXR1cm4gLTEKfQoKLy8gUmVxdWlyZSBib3RoIHRoZSBvd25pbmcgcGF0aCBhbmQgaXRzIGN1cnJlbnRseSBleGVjdXRpbmcgZnJhbWUuIEEgY2FsbGVlCi8vIGhvbGRpbmcgYSBwcmV2aW91cyBEQU8gZnJhbWUgbWF5IG5vdCBkb25hdGUgaXQgYmFjayBmb3IgYXV0aGVudGljYXRpb24uCmZ1bmMgYXNzZXJ0Q2FsbGVyKGggKkhvc3QsIHJsbSByZWFsbSkgYWRkcmVzcyB7CglpZiBybG0uUGtnUGF0aCgpICE9IGgucGF0aCB8fCAhcmxtLklzQ3VycmVudCgpIHsKCQlwYW5pYygiaG9zdCByZWFsbSBtaXNtYXRjaCIpCgl9Cgl3aG8gOj0gcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiAhd2hvLklzVmFsaWQoKSB8fCBoLm1lbWJlckluZGV4KHdobykgPCAwIHsKCQlwYW5pYygiY2FsbGVyIGlzIG5vdCBhIG1lbWJlciIpCgl9CglyZXR1cm4gd2hvCn0KCmZ1bmMgKGggKkhvc3QpIEhhc1JvbGUod2hvIGFkZHJlc3MsIHJvbGUgUm9sZSkgYm9vbCB7CglpIDo9IGgubWVtYmVySW5kZXgod2hvKQoJaWYgaSA8IDAgewoJCXJldHVybiBmYWxzZQoJfQoJc3dpdGNoIHJvbGUgewoJY2FzZSBBZG1pbjoKCQlyZXR1cm4gaC5zZWF0c1tpXS5BZG1pbgoJY2FzZSBGaW5hbmNlOgoJCXJldHVybiBoLnNlYXRzW2ldLkZpbmFuY2UKCWRlZmF1bHQ6CgkJcmV0dXJuIGZhbHNlCgl9Cn0KCmZ1bmMgKGggKkhvc3QpIHZhbGlkYXRlUm9sZUNoYW5nZSh0YXJnZXQgYWRkcmVzcywgcm9sZSBSb2xlLCBncmFudCBib29sKSB7CglpZiBoLm1lbWJlckluZGV4KHRhcmdldCkgPCAwIHsKCQlwYW5pYygicm9sZSB0YXJnZXQgaXMgbm90IGEgbWVtYmVyIikKCX0KCWlmIHJvbGUgIT0gQWRtaW4gJiYgcm9sZSAhPSBGaW5hbmNlIHsKCQlwYW5pYygidW5zdXBwb3J0ZWQgcm9sZSIpCgl9CglpZiBoLkhhc1JvbGUodGFyZ2V0LCByb2xlKSA9PSBncmFudCB7CgkJcGFuaWMoInJvbGUgY2hhbmdlIGlzIGEgbm8tb3AiKQoJfQoJaWYgcm9sZSA9PSBBZG1pbiAmJiAhZ3JhbnQgewoJCWFkbWlucyA6PSAwCgkJZm9yIF8sIHNlYXQgOj0gcmFuZ2UgaC5zZWF0cyB7CgkJCWlmIHNlYXQuQWRtaW4gewoJCQkJYWRtaW5zKysKCQkJfQoJCX0KCQlpZiBhZG1pbnMgPD0gMSB7CgkJCXBhbmljKCJjYW5ub3QgcmVtb3ZlIGxhc3QgYWRtaW4iKQoJCX0KCX0KfQoKLy8gRXZlcnkgcm9sZSBjaGFuZ2UgaXMgY3JpdGljYWwuIFRoZSBwcm9wb3NlciBjYW5ub3Qgc2VsZWN0IGEgbG93ZXIgY2F0ZWdvcnksCi8vIGluamVjdCBhIGNhbGxiYWNrIG9yIHN1YnN0aXR1dGUgdGhlIHRhcmdldC9yb2xlL2dyYW50IGFmdGVyIHZvdGluZyBiZWdpbnMuCmZ1bmMgKGggKkhvc3QpIFByb3Bvc2VSb2xlKHRhcmdldCBhZGRyZXNzLCByb2xlIFJvbGUsIGdyYW50IGJvb2wsIHJsbSByZWFsbSkgdWludDY0IHsKCXdobyA6PSBhc3NlcnRDYWxsZXIoaCwgcmxtKQoJaC52YWxpZGF0ZVJvbGVDaGFuZ2UodGFyZ2V0LCByb2xlLCBncmFudCkKCXAgOj0gJnJvbGVQcm9wb3NhbHtwcm9wb3Nlcjogd2hvLCB0YXJnZXQ6IHRhcmdldCwgcm9sZTogcm9sZSwgZ3JhbnQ6IGdyYW50fQoJcC5iYWxsb3QgPSBoLnBvbGljeS5OZXdQcm9wb3NhbChtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ3JpdGljYWwsIGFjdGlvbkJ5dGVzKHApKQoJaC5hZGRQcm9wb3NhbChwKQoJcmV0dXJuIHVpbnQ2NChsZW4oaC5wcm9wb3NhbHMpKQp9CgovLyBSZWNvdmVyeSByZXBsYWNlcyBvbmUgcGVyc29uJ3Mga2V5LCBuZXZlciB0aGVpciBpZGVudGl0eSwgd2VpZ2h0IG9yIHJvbGVzLgpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZVJlY292ZXJ5KHBlcnNvbklEIHN0cmluZywgdGFyZ2V0LCByZXBsYWNlbWVudCBhZGRyZXNzKSB7CglpIDo9IGgubWVtYmVySW5kZXgodGFyZ2V0KQoJaWYgaSA8IDAgfHwgaC5zZWF0c1tpXS5NZW1iZXIuUGVyc29uSUQgIT0gcGVyc29uSUQgewoJCXBhbmljKCJyZWNvdmVyeSBzZWF0IGRvZXMgbm90IG1hdGNoIikKCX0KCWlmICFyZXBsYWNlbWVudC5Jc1ZhbGlkKCkgfHwgaC5tZW1iZXJJbmRleChyZXBsYWNlbWVudCkgPj0gMCB7CgkJcGFuaWMoInJlcGxhY2VtZW50IG11c3QgYmUgYSB2YWxpZCB1bnVzZWQgYWRkcmVzcyIpCgl9Cn0KCmZ1bmMgKGggKkhvc3QpIFByb3Bvc2VSZWNvdmVyeShwZXJzb25JRCBzdHJpbmcsIHRhcmdldCwgcmVwbGFjZW1lbnQgYWRkcmVzcywgcmxtIHJlYWxtKSB1aW50NjQgewoJd2hvIDo9IGFzc2VydENhbGxlcihoLCBybG0pCgloLnZhbGlkYXRlUmVjb3ZlcnkocGVyc29uSUQsIHRhcmdldCwgcmVwbGFjZW1lbnQpCglwIDo9ICZyb2xlUHJvcG9zYWx7cHJvcG9zZXI6IHdobywgcmVjb3Zlcnk6IHRydWUsIHBlcnNvbklEOiBwZXJzb25JRCwgdGFyZ2V0OiB0YXJnZXQsIHJlcGxhY2VtZW50OiByZXBsYWNlbWVudH0KCXAuYmFsbG90ID0gaC5wb2xpY3kuTmV3UHJvcG9zYWwobWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNyaXRpY2FsLCBhY3Rpb25CeXRlcyhwKSkKCWguYWRkUHJvcG9zYWwocCkKCXJldHVybiB1aW50NjQobGVuKGgucHJvcG9zYWxzKSkKfQoKZnVuYyBhY3Rpb25CeXRlcyhwICpyb2xlUHJvcG9zYWwpIHN0cmluZyB7CglpZiBwLnJlY292ZXJ5IHsKCQkvLyBMZW5ndGgtcHJlZml4IHRoZSB1bnJlc3RyaWN0ZWQgaHVtYW4gSUQgdG8gbWFrZSB0aGUgY29tbWl0bWVudCB1bmFtYmlndW91cy4KCQlyZXR1cm4gInJlY292ZXIvdjF8IiArIHN0cmNvbnYuSXRvYShsZW4ocC5wZXJzb25JRCkpICsgIjoiICsgcC5wZXJzb25JRCArICJ8IiArIHN0cmluZyhwLnRhcmdldCkgKyAifCIgKyBzdHJpbmcocC5yZXBsYWNlbWVudCkKCX0KCS8vIEFkZHJlc3MgYW5kIHJvbGUgZG9tYWlucyBhcmUgdmFsaWRhdGVkIGFuZCBjb250YWluIG5vIGRlbGltaXRlci4KCXJldHVybiAicm9sZS92MXwiICsgc3RyaW5nKHAudGFyZ2V0KSArICJ8IiArIHN0cmluZyhwLnJvbGUpICsgInwiICsgc3RyY29udi5Gb3JtYXRCb29sKHAuZ3JhbnQpCn0KCmZ1bmMgKGggKkhvc3QpIHByb3Bvc2FsKGlkIHVpbnQ2NCkgKnJvbGVQcm9wb3NhbCB7CglpZiBpZCA9PSAwIHx8IGlkID4gdWludDY0KGxlbihoLnByb3Bvc2FscykpIHsKCQlwYW5pYygicHJvcG9zYWwgbm90IGZvdW5kIikKCX0KCXJldHVybiBoLnByb3Bvc2Fsc1tpZC0xXQp9CgpmdW5jIChoICpIb3N0KSBWb3RlKGlkIHVpbnQ2NCwgdm90ZSBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuVm90ZSwgcmxtIHJlYWxtKSB7Cgl3aG8gOj0gYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCXAgOj0gaC5wcm9wb3NhbChpZCkKCXAuYmFsbG90LlZvdGUod2hvLCB2b3RlKQoJLy8gVGhlIHBvbGljeSBhY2NlcHRlZCB0aGUgYmFsbG90LCBzbyB0aGUgcHJvcG9zYWwgaXMgYWN0aXZlIGFuZCBpdHMgZnJvemVuCgkvLyBlbGVjdG9yYXRlIGlzIHRoZSBjdXJyZW50IHJvc3Rlci4gQSByZXBlYXRlZCBpZGVudGljYWwgYmFsbG90IGlzIGEgbm8tb3AKCS8vIGluIHRoZSBwb2xpY3kgYW5kIGtlZXBzIGl0cyBvcmlnaW5hbCBoZWlnaHQgaGVyZS4KCWkgOj0gcm9zdGVySW5kZXgoaC5yb3N0ZXJzW3Aucm9zdGVyXSwgd2hvKQoJaWYgaSA8IDAgewoJCXBhbmljKCJ2b3RlciBpcyBub3QgaW4gdGhlIHByb3Bvc2FsIGVsZWN0b3JhdGUiKQoJfQoJaWYgcC5jaG9pY2VzW2ldICE9IHZvdGUgewoJCXAuY2hvaWNlc1tpXSA9IHZvdGUKCQlwLnZvdGVkQXRbaV0gPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCX0KfQoKZnVuYyByb3N0ZXJJbmRleChyb3N0ZXIgWzddYWRkcmVzcywgd2hvIGFkZHJlc3MpIGludCB7Cglmb3IgaSwgYSA6PSByYW5nZSByb3N0ZXIgewoJCWlmIGEgPT0gd2hvIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglyZXR1cm4gLTEKfQoKZnVuYyAoaCAqSG9zdCkgRXhlY3V0ZShpZCB1aW50NjQsIHJsbSByZWFsbSkgewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCXAgOj0gaC5wcm9wb3NhbChpZCkKCWlmIHAuZmVlZGJhY2sgIT0gbmlsIHsKCQlwYW5pYygiZmVlZGJhY2sgYWN0aW9uIHJlcXVpcmVzIHRhcmdldCBhZGFwdGVyIikKCX0KCWlmIHAuY2hhbm5lbHMgIT0gbmlsIHsKCQlwYW5pYygiY2hhbm5lbHMgYWN0aW9uIHJlcXVpcmVzIHRhcmdldCBhZGFwdGVyIikKCX0KCWlmIHAuZmVlZCAhPSBuaWwgewoJCXBhbmljKCJmZWVkIGFjdGlvbiByZXF1aXJlcyB0YXJnZXQgYWRhcHRlciIpCgl9CglpZiBwLmJhZGdlcyAhPSBuaWwgewoJCXBhbmljKCJiYWRnZXMgYWN0aW9uIHJlcXVpcmVzIHRhcmdldCBhZGFwdGVyIikKCX0KCWlmIHAuZXNjcm93ICE9IG5pbCB7CgkJcGFuaWMoImVzY3JvdyBhY3Rpb24gcmVxdWlyZXMgdGFyZ2V0IGFkYXB0ZXIiKQoJfQoJaWYgcC5hcHBzdG9yZSAhPSBuaWwgewoJCXBhbmljKCJhcHBzdG9yZSBhY3Rpb24gcmVxdWlyZXMgdGFyZ2V0IGFkYXB0ZXIiKQoJfQoJaWYgcC5hcmNhZGUgIT0gbmlsIHsKCQlwYW5pYygiYXJjYWRlIGFjdGlvbiByZXF1aXJlcyB0YXJnZXQgYWRhcHRlciIpCgl9CglpZiBwLnF1ZXN0ICE9IG5pbCB7CgkJcGFuaWMoInF1ZXN0IGFjdGlvbiByZXF1aXJlcyB0YXJnZXQgYWRhcHRlciIpCgl9CglpZiBwLnJldmlld3MgIT0gbmlsIHsKCQlwYW5pYygicmV2aWV3cyBhY3Rpb24gcmVxdWlyZXMgdGFyZ2V0IGFkYXB0ZXIiKQoJfQoJaWYgcC5tYXJrZXQgIT0gbmlsIHsKCQlwYW5pYygibWFya2V0IGFjdGlvbiByZXF1aXJlcyB0YXJnZXQgYWRhcHRlciIpCgl9CglpZiBwLnJlY292ZXJ5IHsKCQloLnZhbGlkYXRlUmVjb3ZlcnkocC5wZXJzb25JRCwgcC50YXJnZXQsIHAucmVwbGFjZW1lbnQpCgl9IGVsc2UgewoJCWgudmFsaWRhdGVSb2xlQ2hhbmdlKHAudGFyZ2V0LCBwLnJvbGUsIHAuZ3JhbnQpCgl9CglwLmJhbGxvdC5Db25zdW1lKGFjdGlvbkJ5dGVzKHApKQoJaSA6PSBoLm1lbWJlckluZGV4KHAudGFyZ2V0KQoJaWYgcC5yZWNvdmVyeSB7CgkJaC5zZWF0c1tpXS5NZW1iZXIuQWRkcmVzcyA9IHAucmVwbGFjZW1lbnQKCQloLnNuYXBzaG90Um9zdGVyKCkKCX0gZWxzZSBpZiBwLnJvbGUgPT0gQWRtaW4gewoJCWguc2VhdHNbaV0uQWRtaW4gPSBwLmdyYW50Cgl9IGVsc2UgewoJCWguc2VhdHNbaV0uRmluYW5jZSA9IHAuZ3JhbnQKCX0KCS8vIEFueSBjaGFuZ2VkIGF1dGhvcml0eSBpbnZhbGlkYXRlcyBhbGwgb3V0c3RhbmRpbmcgYXV0aG9yaXphdGlvbnMuIFJvbGVzCgkvLyBkbyBub3QgYWx0ZXIgdGhlIGFwcHJvdmVkIHdlaWdodHMgb3IgdGhlIGluZGVwZW5kZW50IGRldmVsb3BlciByb3V0ZS4KCW1lbWJlcnMgOj0gW11tZW1iYV93ZWlnaHRlZF9wb2xpY3kuTWVtYmVye30KCWZvciBfLCBzZWF0IDo9IHJhbmdlIGguc2VhdHMgewoJCW1lbWJlcnMgPSBhcHBlbmQobWVtYmVycywgc2VhdC5NZW1iZXIpCgl9CgloLnBvbGljeS5SZWNvbmZpZ3VyZShtZW1iZXJzKQoJaC5yZWNvcmRJbnZhbGlkYXRpb24oSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQsICIiKQp9CgovLyBWaWV3cyBjb250YWluIGNvcGllZCB2YWx1ZXMgb25seSwgbmV2ZXIgcG9pbnRlcnMgdG8gcG9saWN5LCBiYWxsb3RzIG9yIHNlYXRzLgp0eXBlIFByb3Bvc2FsVmlldyBzdHJ1Y3QgewoJRmVlZGJhY2sgICAgICAgYm9vbAoJRmVlZGJhY2tBY3Rpb24gRmVlZGJhY2tBY3Rpb24KCUZlZWRiYWNrQmVmb3JlIEZlZWRiYWNrU3RhdGUKCUNoYW5uZWxzICAgICAgIGJvb2wKCUNoYW5uZWxzQWN0aW9uIENoYW5uZWxzQWN0aW9uCglDaGFubmVsc0JlZm9yZSBDaGFubmVsc1N0YXRlCglGZWVkICAgICAgICAgICBib29sCglGZWVkQWN0aW9uICAgICBGZWVkQWN0aW9uCglGZWVkQmVmb3JlICAgICBGZWVkU3RhdGUKCUJhZGdlcyAgICAgICAgIGJvb2wKCUJhZGdlc0FjdGlvbiAgIEJhZGdlc0FjdGlvbgoJQmFkZ2VzQmVmb3JlICAgQmFkZ2VzU3RhdGUKCUVzY3JvdyAgICAgICAgIGJvb2wKCUVzY3Jvd0FjdGlvbiAgIEVzY3Jvd0FjdGlvbgoJRXNjcm93QmVmb3JlICAgRXNjcm93U3RhdGUKCUFwcHN0b3JlICAgICAgIGJvb2wKCUFwcHN0b3JlQWN0aW9uIEFwcHN0b3JlQWN0aW9uCglBcHBzdG9yZUJlZm9yZSBBcHBzdG9yZVN0YXRlCglBcmNhZGUgICAgICAgICBib29sCglBcmNhZGVBY3Rpb24gICBBcmNhZGVBY3Rpb24KCUFyY2FkZUJlZm9yZSAgIEFyY2FkZVN0YXRlCglRdWVzdCAgICAgICAgICBib29sCglRdWVzdEFjdGlvbiAgICBRdWVzdEFjdGlvbgoJUXVlc3RCZWZvcmUgICAgUXVlc3RTdGF0ZQoJUmV2aWV3cyAgICAgICAgYm9vbAoJUmV2aWV3c0FjdGlvbiAgUmV2aWV3c0FjdGlvbgoJUmV2aWV3c0JlZm9yZSAgUmV2aWV3c1N0YXRlCglNYXJrZXQgICAgICAgICBib29sCglNYXJrZXRBY3Rpb24gICBNYXJrZXRBY3Rpb24KCU1hcmtldEJlZm9yZSAgIE1hcmtldFN0YXRlCglSZWNvdmVyeSAgICAgICBib29sCglQZXJzb25JRCAgICAgICBzdHJpbmcKCVJlcGxhY2VtZW50ICAgIGFkZHJlc3MKCUlEICAgICAgICAgICAgIHVpbnQ2NAoJUHJvcG9zZXIgICAgICAgYWRkcmVzcwoJVGFyZ2V0ICAgICAgICAgYWRkcmVzcwoJUm9sZSAgICAgICAgICAgUm9sZQoJR3JhbnQgICAgICAgICAgYm9vbAoJU3RhdGUgICAgICAgICAgbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LlN0YXRlCgkvLyBJbnZhbGlkYXRpb24gaXMgc2V0IG9ubHkgZm9yIGFuIElOVkFMSURBVEVEIHByb3Bvc2FsLiBBIHByb3Bvc2FsIHdob3NlCgkvLyB2b3RlIGhhZCBhbHJlYWR5IGNsb3NlZCB3aXRob3V0IHF1YWxpZnlpbmcgc3RheXMgRVhQSVJFRCBpbnN0ZWFkLgoJSW52YWxpZGF0ZWQgICAgICAgICAgYm9vbAoJSW52YWxpZGF0aW9uQ2F1c2UgICAgc3RyaW5nCglJbnZhbGlkYXRpb25IZWlnaHQgICBpbnQ2NAoJSW52YWxpZGF0aW9uUHJvcG9zYWwgdWludDY0CglJbnZhbGlkYXRpb25UYXJnZXQgICBzdHJpbmcKCUV4cGlyZWRCZWZvcmVJbnZhbGlkYXRpb24gYm9vbAp9CgpmdW5jIChoICpIb3N0KSBQcm9wb3NhbChpZCB1aW50NjQpIFByb3Bvc2FsVmlldyB7Cgl2IDo9IGgucHJvcG9zYWxWaWV3KGlkKQoJcCA6PSBoLnByb3Bvc2FsKGlkKQoJcyA6PSB2LlN0YXRlCglpZiBzLkludmFsaWRhdGVkICYmICFzLkNvbnN1bWVkICYmIHAuZXBvY2ggPCBsZW4oaC5pbnZhbGlkYXRpb25zKSB7CgkJcmVjIDo9IGguaW52YWxpZGF0aW9uc1twLmVwb2NoXQoJCWlmICFyZWMuYXQuQmVmb3JlKHMuVm90aW5nRGVhZGxpbmUpICYmICFoLmJhbGxvdHNRdWFsaWZpZWQocCwgcy5DYXRlZ29yeSkgewoJCQl2LkV4cGlyZWRCZWZvcmVJbnZhbGlkYXRpb24gPSB0cnVlCgkJfSBlbHNlIHsKCQkJdi5JbnZhbGlkYXRlZCA9IHRydWUKCQkJdi5JbnZhbGlkYXRpb25DYXVzZSA9IHJlYy5jYXVzZQoJCQl2LkludmFsaWRhdGlvbkhlaWdodCA9IHJlYy5oZWlnaHQKCQkJdi5JbnZhbGlkYXRpb25Qcm9wb3NhbCA9IHJlYy5wcm9wb3NhbAoJCQl2LkludmFsaWRhdGlvblRhcmdldCA9IHJlYy50YXJnZXQKCQl9Cgl9CglyZXR1cm4gdgp9CgpmdW5jIChoICpIb3N0KSBwcm9wb3NhbFZpZXcoaWQgdWludDY0KSBQcm9wb3NhbFZpZXcgewoJcCA6PSBoLnByb3Bvc2FsKGlkKQoJaWYgcC5mZWVkYmFjayAhPSBuaWwgewoJCXJldHVybiBQcm9wb3NhbFZpZXd7RmVlZGJhY2s6IHRydWUsIEZlZWRiYWNrQWN0aW9uOiBwLmZlZWRiYWNrLmFjdGlvbiwgRmVlZGJhY2tCZWZvcmU6IHAuZmVlZGJhY2suYmVmb3JlLCBJRDogaWQsIFByb3Bvc2VyOiBwLnByb3Bvc2VyLCBTdGF0ZTogcC5iYWxsb3QuU3RhdGUoKX0KCX0KCWlmIHAuY2hhbm5lbHMgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e0NoYW5uZWxzOiB0cnVlLCBDaGFubmVsc0FjdGlvbjogcC5jaGFubmVscy5hY3Rpb24sIENoYW5uZWxzQmVmb3JlOiBwLmNoYW5uZWxzLmJlZm9yZSwgSUQ6IGlkLCBQcm9wb3NlcjogcC5wcm9wb3NlciwgU3RhdGU6IHAuYmFsbG90LlN0YXRlKCl9Cgl9CglpZiBwLmZlZWQgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e0ZlZWQ6IHRydWUsIEZlZWRBY3Rpb246IHAuZmVlZC5hY3Rpb24sIEZlZWRCZWZvcmU6IHAuZmVlZC5iZWZvcmUsIElEOiBpZCwgUHJvcG9zZXI6IHAucHJvcG9zZXIsIFN0YXRlOiBwLmJhbGxvdC5TdGF0ZSgpfQoJfQoJaWYgcC5iYWRnZXMgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e0JhZGdlczogdHJ1ZSwgQmFkZ2VzQWN0aW9uOiBwLmJhZGdlcy5hY3Rpb24sIEJhZGdlc0JlZm9yZTogcC5iYWRnZXMuYmVmb3JlLCBJRDogaWQsIFByb3Bvc2VyOiBwLnByb3Bvc2VyLCBTdGF0ZTogcC5iYWxsb3QuU3RhdGUoKX0KCX0KCWlmIHAuZXNjcm93ICE9IG5pbCB7CgkJcmV0dXJuIFByb3Bvc2FsVmlld3tFc2Nyb3c6IHRydWUsIEVzY3Jvd0FjdGlvbjogcC5lc2Nyb3cuYWN0aW9uLCBFc2Nyb3dCZWZvcmU6IHAuZXNjcm93LmJlZm9yZSwgSUQ6IGlkLCBQcm9wb3NlcjogcC5wcm9wb3NlciwgU3RhdGU6IHAuYmFsbG90LlN0YXRlKCl9Cgl9CglpZiBwLmFwcHN0b3JlICE9IG5pbCB7CgkJcmV0dXJuIFByb3Bvc2FsVmlld3tBcHBzdG9yZTogdHJ1ZSwgQXBwc3RvcmVBY3Rpb246IHAuYXBwc3RvcmUuYWN0aW9uLCBBcHBzdG9yZUJlZm9yZTogcC5hcHBzdG9yZS5iZWZvcmUsIElEOiBpZCwgUHJvcG9zZXI6IHAucHJvcG9zZXIsIFN0YXRlOiBwLmJhbGxvdC5TdGF0ZSgpfQoJfQoJaWYgcC5hcmNhZGUgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e0FyY2FkZTogdHJ1ZSwgQXJjYWRlQWN0aW9uOiBwLmFyY2FkZS5hY3Rpb24sIEFyY2FkZUJlZm9yZTogcC5hcmNhZGUuYmVmb3JlLCBJRDogaWQsIFByb3Bvc2VyOiBwLnByb3Bvc2VyLCBTdGF0ZTogcC5iYWxsb3QuU3RhdGUoKX0KCX0KCWlmIHAucXVlc3QgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e1F1ZXN0OiB0cnVlLCBRdWVzdEFjdGlvbjogcC5xdWVzdC5hY3Rpb24sIFF1ZXN0QmVmb3JlOiBwLnF1ZXN0LmJlZm9yZSwgSUQ6IGlkLCBQcm9wb3NlcjogcC5wcm9wb3NlciwgU3RhdGU6IHAuYmFsbG90LlN0YXRlKCl9Cgl9CglpZiBwLnJldmlld3MgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e1Jldmlld3M6IHRydWUsIFJldmlld3NBY3Rpb246IHAucmV2aWV3cy5hY3Rpb24sIFJldmlld3NCZWZvcmU6IHAucmV2aWV3cy5iZWZvcmUsIElEOiBpZCwgUHJvcG9zZXI6IHAucHJvcG9zZXIsIFN0YXRlOiBwLmJhbGxvdC5TdGF0ZSgpfQoJfQoJaWYgcC5tYXJrZXQgIT0gbmlsIHsKCQlyZXR1cm4gUHJvcG9zYWxWaWV3e01hcmtldDogdHJ1ZSwgTWFya2V0QWN0aW9uOiBwLm1hcmtldC5hY3Rpb24sIE1hcmtldEJlZm9yZTogcC5tYXJrZXQuYmVmb3JlLCBJRDogaWQsIFByb3Bvc2VyOiBwLnByb3Bvc2VyLCBTdGF0ZTogcC5iYWxsb3QuU3RhdGUoKX0KCX0KCXJldHVybiBQcm9wb3NhbFZpZXd7UmVjb3Zlcnk6IHAucmVjb3ZlcnksIFBlcnNvbklEOiBwLnBlcnNvbklELCBSZXBsYWNlbWVudDogcC5yZXBsYWNlbWVudCwgSUQ6IGlkLCBQcm9wb3NlcjogcC5wcm9wb3NlciwgVGFyZ2V0OiBwLnRhcmdldCwgUm9sZTogcC5yb2xlLCBHcmFudDogcC5ncmFudCwgU3RhdGU6IHAuYmFsbG90LlN0YXRlKCl9Cn0KCmZ1bmMgKGggKkhvc3QpIE1lbWJlcnMoKSBbXVNlYXQgewoJb3V0IDo9IFtdU2VhdHt9Cglmb3IgXywgc2VhdCA6PSByYW5nZSBoLnNlYXRzIHsKCQlvdXQgPSBhcHBlbmQob3V0LCBzZWF0KQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIChoICpIb3N0KSBQcm9wb3NhbENvdW50KCkgdWludDY0IHsgcmV0dXJuIHVpbnQ2NChsZW4oaC5wcm9wb3NhbHMpKSB9ChqgJAoSbWFya2V0X2FjdGlvbnMuZ25vEokkcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImNoYWluIgoJImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCikKCi8vIE1hcmtldENvbmZpZ1BhdGggaXMgdGhlIHNvbGUgdGFyZ2V0IG9mIHRoaXMgc291cmNlLW9ubHkgdHlwZWQgYWN0aW9uIG1vZGVsLgovLyBUaGVzZSB2YWx1ZXMgZG8gbm90IGRpc3BhdGNoIGFuIGFjdGlvbiBvciBncmFudCB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhdXRob3JpdHkuCmNvbnN0IE1hcmtldENvbmZpZ1BhdGggPSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX21hcmtldF9jb25maWciCgp0eXBlIE1hcmtldExhbmUgc3RyaW5nCgpjb25zdCAoCglNYXJrZXRORlQgICAgIE1hcmtldExhbmUgPSAibmZ0IgoJTWFya2V0U2VydmljZSBNYXJrZXRMYW5lID0gInNlcnZpY2UiCglNYXJrZXRUb2tlbiAgIE1hcmtldExhbmUgPSAidG9rZW4iCikKCnR5cGUgTWFya2V0QWN0aW9uS2luZCBzdHJpbmcKCmNvbnN0ICgKCU1hcmtldEFjY2VwdEFkbWluICBNYXJrZXRBY3Rpb25LaW5kID0gImFjY2VwdC1hZG1pbiIKCU1hcmtldFNldEZlZSAgICAgICBNYXJrZXRBY3Rpb25LaW5kID0gInNldC1mZWUiCglNYXJrZXRTZXRUcmVhc3VyeSAgTWFya2V0QWN0aW9uS2luZCA9ICJzZXQtdHJlYXN1cnkiCglNYXJrZXRSZXR1cm5BZG1pbiAgTWFya2V0QWN0aW9uS2luZCA9ICJyZXR1cm4tYWRtaW4iCglNYXJrZXRBYm9ydFJldHVybiBNYXJrZXRBY3Rpb25LaW5kID0gImFib3J0LXJldHVybiIKKQoKLy8gTWFya2V0UG9saWN5IGNvbnRhaW5zIG9ubHkgYWRkcmVzc2VzIHNlcGFyYXRlbHkgYXBwcm92ZWQgZm9yIGEgZ2VuZXJhdGVkIERBTwovLyBjYW5kaWRhdGUuIFRoZSBnZW5lcmF0b3IgcmVxdWlyZXMgZXhwbGljaXQgaW5wdXRzIGFuZCBiaW5kcyBmaXhlZC10YXJnZXQKLy8gZGlzcGF0Y2guIE5vIGFkZHJlc3MgaGVyZSBpcyBpbmZlcnJlZCBmcm9tIGFuIG9sZCB0ZXN0bmV0IGxpdGVyYWwuCnR5cGUgTWFya2V0UG9saWN5IHN0cnVjdCB7CglkYW8gICAgICAgYWRkcmVzcwoJdHJlYXN1cnkgIGFkZHJlc3MKCXN1Y2Nlc3NvciBhZGRyZXNzCn0KCmZ1bmMgTmV3TWFya2V0UG9saWN5KGRhbywgdHJlYXN1cnksIHN1Y2Nlc3NvciBhZGRyZXNzKSBNYXJrZXRQb2xpY3kgewoJdGFyZ2V0IDo9IGNoYWluLlBhY2thZ2VBZGRyZXNzKE1hcmtldENvbmZpZ1BhdGgpCglpZiAhZGFvLklzVmFsaWQoKSB8fCBkYW8gIT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSB7CgkJcGFuaWMoIm1hcmtldCBwb2xpY3kgcmVxdWlyZXMgdGhlIGZvdW5kaW5nIERBTyBhZGRyZXNzIikKCX0KCWlmICF0cmVhc3VyeS5Jc1ZhbGlkKCkgfHwgdHJlYXN1cnkgPT0gdGFyZ2V0IHx8IHRyZWFzdXJ5ID09IGRhbyB7CgkJcGFuaWMoIm1hcmtldCBwb2xpY3kgcmVxdWlyZXMgYSB2YWxpZCBleHRlcm5hbCB0cmVhc3VyeSIpCgl9CglpZiAhc3VjY2Vzc29yLklzVmFsaWQoKSB8fCBzdWNjZXNzb3IgPT0gZGFvIHx8IHN1Y2Nlc3NvciA9PSB0YXJnZXQgewoJCXBhbmljKCJtYXJrZXQgcG9saWN5IHJlcXVpcmVzIGEgdmFsaWQgZGlzdGluY3Qgc3VjY2Vzc29yIikKCX0KCXJldHVybiBNYXJrZXRQb2xpY3l7ZGFvOiBkYW8sIHRyZWFzdXJ5OiB0cmVhc3VyeSwgc3VjY2Vzc29yOiBzdWNjZXNzb3J9Cn0KCmZ1bmMgKHAgTWFya2V0UG9saWN5KSBEQU8oKSBhZGRyZXNzICAgICAgIHsgcmV0dXJuIHAuZGFvIH0KZnVuYyAocCBNYXJrZXRQb2xpY3kpIFRyZWFzdXJ5KCkgYWRkcmVzcyAgeyByZXR1cm4gcC50cmVhc3VyeSB9CmZ1bmMgKHAgTWFya2V0UG9saWN5KSBTdWNjZXNzb3IoKSBhZGRyZXNzIHsgcmV0dXJuIHAuc3VjY2Vzc29yIH0KCi8vIE1hcmtldEFjdGlvbiBpcyBhIGNsb3NlZCB2YWx1ZSwgbm90IGEgY2FsbGJhY2ssIG1ldGhvZCBuYW1lIG9yIGZyZWUtZm9ybQovLyBwYXlsb2FkLiBJdHMgcHJpdmF0ZSBmaWVsZHMgYXJlIGZyb3plbiBpbnRvIHRoZSBjb21taXRtZW50IHJldHVybmVkIGJ5IEJ5dGVzLgp0eXBlIE1hcmtldEFjdGlvbiBzdHJ1Y3QgewoJa2luZCAgICAgIE1hcmtldEFjdGlvbktpbmQKCWxhbmUgICAgICBNYXJrZXRMYW5lCglicHMgICAgICAgaW50NjQKCXJlY2lwaWVudCBhZGRyZXNzCn0KCmZ1bmMgTWFya2V0QWNjZXB0KCkgTWFya2V0QWN0aW9uIHsgcmV0dXJuIE1hcmtldEFjdGlvbntraW5kOiBNYXJrZXRBY2NlcHRBZG1pbn0gfQoKZnVuYyBNYXJrZXRGZWUobGFuZSBNYXJrZXRMYW5lLCBicHMgaW50NjQpIE1hcmtldEFjdGlvbiB7CglpZiBsYW5lICE9IE1hcmtldE5GVCAmJiBsYW5lICE9IE1hcmtldFNlcnZpY2UgJiYgbGFuZSAhPSBNYXJrZXRUb2tlbiB7CgkJcGFuaWMoInVuc3VwcG9ydGVkIG1hcmtldCBmZWUgbGFuZSIpCgl9CglpZiBicHMgPCAwIHx8IGJwcyA+IDUwMCB7CgkJcGFuaWMoIm1hcmtldCBmZWUgb3V0IG9mIHJhbmdlIikKCX0KCXJldHVybiBNYXJrZXRBY3Rpb257a2luZDogTWFya2V0U2V0RmVlLCBsYW5lOiBsYW5lLCBicHM6IGJwc30KfQoKZnVuYyAocCBNYXJrZXRQb2xpY3kpIFNldFRyZWFzdXJ5KCkgTWFya2V0QWN0aW9uIHsKCXJldHVybiBNYXJrZXRBY3Rpb257a2luZDogTWFya2V0U2V0VHJlYXN1cnksIHJlY2lwaWVudDogcC50cmVhc3VyeX0KfQoKZnVuYyAocCBNYXJrZXRQb2xpY3kpIFJldHVybkFkbWluKCkgTWFya2V0QWN0aW9uIHsKCXJldHVybiBNYXJrZXRBY3Rpb257a2luZDogTWFya2V0UmV0dXJuQWRtaW4sIHJlY2lwaWVudDogcC5zdWNjZXNzb3J9Cn0KCmZ1bmMgKHAgTWFya2V0UG9saWN5KSBBYm9ydFJldHVybigpIE1hcmtldEFjdGlvbiB7CglyZXR1cm4gTWFya2V0QWN0aW9ue2tpbmQ6IE1hcmtldEFib3J0UmV0dXJuLCByZWNpcGllbnQ6IHAuc3VjY2Vzc29yfQp9CgpmdW5jIChhIE1hcmtldEFjdGlvbikgS2luZCgpIE1hcmtldEFjdGlvbktpbmQgeyByZXR1cm4gYS5raW5kIH0KZnVuYyAoYSBNYXJrZXRBY3Rpb24pIExhbmUoKSBNYXJrZXRMYW5lICAgICAgIHsgcmV0dXJuIGEubGFuZSB9CmZ1bmMgKGEgTWFya2V0QWN0aW9uKSBCUFMoKSBpbnQ2NCAgICAgICAgICAgICB7IHJldHVybiBhLmJwcyB9CmZ1bmMgKGEgTWFya2V0QWN0aW9uKSBSZWNpcGllbnQoKSBhZGRyZXNzICAgICB7IHJldHVybiBhLnJlY2lwaWVudCB9CgpmdW5jIChhIE1hcmtldEFjdGlvbikgQ2F0ZWdvcnkoKSBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ2F0ZWdvcnkgewoJLy8gUmVmdXNlIHplcm8tdmFsdWUgb3IgbWFsZm9ybWVkIGFjdGlvbnMgYmVmb3JlIHJldHVybmluZyBhbiBhdXRob3JpemF0aW9uCgkvLyBjYXRlZ29yeSwgaW5jbHVkaW5nIHZhbHVlcyBjcmVhdGVkIGZyb20gYSB6ZXJvLXZhbHVlIE1hcmtldFBvbGljeS4KCWEuQnl0ZXMoKQoJc3dpdGNoIGEua2luZCB7CgljYXNlIE1hcmtldFNldEZlZSwgTWFya2V0U2V0VHJlYXN1cnk6CgkJcmV0dXJuIG1lbWJhX3dlaWdodGVkX3BvbGljeS5GaW5hbmNpYWwKCWNhc2UgTWFya2V0QWNjZXB0QWRtaW4sIE1hcmtldFJldHVybkFkbWluLCBNYXJrZXRBYm9ydFJldHVybjoKCQlyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNyaXRpY2FsCglkZWZhdWx0OgoJCXBhbmljKCJ1bnN1cHBvcnRlZCBtYXJrZXQgYWN0aW9uIikKCX0KfQoKLy8gQnl0ZXMgY29tbWl0cyB0aGUgdGFyZ2V0IHBhdGgsIG9wZXJhdGlvbiwgY2F0ZWdvcnktcmVsZXZhbnQgYXJndW1lbnRzIGFuZAovLyByZWNpcGllbnQuIFRoZXJlIGFyZSBubyB1c2VyLXN1cHBsaWVkIGRlbGltaXRlcnMgaW4gdGhlc2UgY2xvc2VkIGRvbWFpbnMuCmZ1bmMgKGEgTWFya2V0QWN0aW9uKSBCeXRlcygpIHN0cmluZyB7CgliYXNlIDo9ICJtYXJrZXQtY29uZmlnL3YxfCIgKyBNYXJrZXRDb25maWdQYXRoICsgInwiICsgc3RyaW5nKGEua2luZCkKCXN3aXRjaCBhLmtpbmQgewoJY2FzZSBNYXJrZXRBY2NlcHRBZG1pbjoKCQlpZiBhLmxhbmUgIT0gIiIgfHwgYS5icHMgIT0gMCB8fCBhLnJlY2lwaWVudCAhPSAiIiB7CgkJCXBhbmljKCJtYWxmb3JtZWQgbWFya2V0IGFjY2VwdCBhY3Rpb24iKQoJCX0KCQlyZXR1cm4gYmFzZQoJY2FzZSBNYXJrZXRTZXRGZWU6CgkJaWYgKGEubGFuZSAhPSBNYXJrZXRORlQgJiYgYS5sYW5lICE9IE1hcmtldFNlcnZpY2UgJiYgYS5sYW5lICE9IE1hcmtldFRva2VuKSB8fCBhLmJwcyA8IDAgfHwgYS5icHMgPiA1MDAgfHwgYS5yZWNpcGllbnQgIT0gIiIgewoJCQlwYW5pYygibWFsZm9ybWVkIG1hcmtldCBmZWUgYWN0aW9uIikKCQl9CgkJcmV0dXJuIGJhc2UgKyAifCIgKyBzdHJpbmcoYS5sYW5lKSArICJ8IiArIHN0cmNvbnYuRm9ybWF0SW50KGEuYnBzLCAxMCkKCWNhc2UgTWFya2V0U2V0VHJlYXN1cnksIE1hcmtldFJldHVybkFkbWluLCBNYXJrZXRBYm9ydFJldHVybjoKCQlpZiBhLmxhbmUgIT0gIiIgfHwgYS5icHMgIT0gMCB8fCAhYS5yZWNpcGllbnQuSXNWYWxpZCgpIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCBtYXJrZXQgcmVjaXBpZW50IGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgbWFya2V0IGFjdGlvbiIpCgl9Cn0KGuMfCg9tYXJrZXRfaG9zdC5nbm8Szx9wYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9zYW1jcmV3L21lbWJhX3dlaWdodGVkX3BvbGljeSIKCSJzdHJjb252IgopCgovLyBNYXJrZXRTdGF0ZSBpcyBjb3BpZWQgZnJvbSB0aGUgZml4ZWQgdGFyZ2V0IGJ5IHRoZSBvd25pbmcgcmVhbG0gYWRhcHRlci4KLy8gQlBTIGlzIHJlYWQgb25seSBmb3IgYSBmZWUgYWN0aW9uOyBvdGhlciBhY3Rpb25zIGNvbW1pdCB6ZXJvIGluIHRoYXQgZmllbGQuCnR5cGUgTWFya2V0U3RhdGUgc3RydWN0IHsKCUFkbWluICAgICAgICBhZGRyZXNzCglQZW5kaW5nQWRtaW4gYWRkcmVzcwoJVHJlYXN1cnkgICAgIGFkZHJlc3MKCUJQUyAgICAgICAgICBpbnQ2NAp9Cgp0eXBlIG1hcmtldFByb3Bvc2FsIHN0cnVjdCB7CglhY3Rpb24gTWFya2V0QWN0aW9uCgliZWZvcmUgTWFya2V0U3RhdGUKfQoKLy8gTmV3V2l0aE1hcmtldCBiaW5kcyBpbW11dGFibGUgZGVzdGluYXRpb25zLiBLZWVwIHRoZSBIb3N0IHByaXZhdGU7IHRoZSByZWFsbQovLyBtdXN0IGV4cG9zZSBvbmx5IHRoZSByZXZpZXdlZCBmaXhlZC10YXJnZXQgYWRhcHRlciwgbmV2ZXIgQ29uc3VtZU1hcmtldC4KZnVuYyBOZXdXaXRoTWFya2V0KHNlYXRzIFtdU2VhdCwgcG9saWN5IE1hcmtldFBvbGljeSwgcmxtIHJlYWxtKSAqSG9zdCB7Cglwb2xpY3kgPSBOZXdNYXJrZXRQb2xpY3kocG9saWN5LkRBTygpLCBwb2xpY3kuVHJlYXN1cnkoKSwgcG9saWN5LlN1Y2Nlc3NvcigpKQoJaWYgcmxtLkFkZHJlc3MoKSAhPSBwb2xpY3kuREFPKCkgewoJCXBhbmljKCJtYXJrZXQgcG9saWN5IERBTyBkb2VzIG5vdCBvd24gdGhpcyBob3N0IikKCX0KCWggOj0gTmV3KHNlYXRzLCBybG0pCgloLm1hcmtldFBvbGljeSA9ICZwb2xpY3kKCXJldHVybiBoCn0KCmZ1bmMgbWFya2V0Q29tbWl0bWVudChhY3Rpb24gTWFya2V0QWN0aW9uLCBiZWZvcmUgTWFya2V0U3RhdGUpIHN0cmluZyB7CglpZiAhYmVmb3JlLkFkbWluLklzVmFsaWQoKSB8fCAhYmVmb3JlLlRyZWFzdXJ5LklzVmFsaWQoKSB8fCAoYmVmb3JlLlBlbmRpbmdBZG1pbiAhPSAiIiAmJiAhYmVmb3JlLlBlbmRpbmdBZG1pbi5Jc1ZhbGlkKCkpIHx8IGJlZm9yZS5CUFMgPCAwIHx8IGJlZm9yZS5CUFMgPiA1MDAgewoJCXBhbmljKCJpbnZhbGlkIG1hcmtldCBwcmUtc3RhdGUiKQoJfQoJaWYgYWN0aW9uLktpbmQoKSAhPSBNYXJrZXRTZXRGZWUgJiYgYmVmb3JlLkJQUyAhPSAwIHsKCQlwYW5pYygidW5leHBlY3RlZCBtYXJrZXQgZmVlIHByZS1zdGF0ZSIpCgl9CglyZXR1cm4gYWN0aW9uLkJ5dGVzKCkgKyAifGJlZm9yZXwiICsgc3RyaW5nKGJlZm9yZS5BZG1pbikgKyAifCIgKyBzdHJpbmcoYmVmb3JlLlBlbmRpbmdBZG1pbikgKyAifCIgKyBzdHJpbmcoYmVmb3JlLlRyZWFzdXJ5KSArICJ8IiArIHN0cmNvbnYuRm9ybWF0SW50KGJlZm9yZS5CUFMsIDEwKQp9CgpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZU1hcmtldChhY3Rpb24gTWFya2V0QWN0aW9uLCBiZWZvcmUgTWFya2V0U3RhdGUpIHsKCWlmIGgubWFya2V0UG9saWN5ID09IG5pbCB7CgkJcGFuaWMoIm1hcmtldCBhY3Rpb25zIGFyZSBub3QgY29uZmlndXJlZCIpCgl9CgltYXJrZXRDb21taXRtZW50KGFjdGlvbiwgYmVmb3JlKQoJcCA6PSBoLm1hcmtldFBvbGljeQoJaWYgYWN0aW9uLktpbmQoKSA9PSBNYXJrZXRBY2NlcHRBZG1pbiB7CgkJaWYgYmVmb3JlLkFkbWluID09IHAuREFPKCkgfHwgYmVmb3JlLlBlbmRpbmdBZG1pbiAhPSBwLkRBTygpIHsKCQkJcGFuaWMoIkRBTyBpcyBub3QgcGVuZGluZyBtYXJrZXQgYWRtaW4iKQoJCX0KCQlyZXR1cm4KCX0KCWlmIGJlZm9yZS5BZG1pbiAhPSBwLkRBTygpIHsKCQlwYW5pYygiREFPIGlzIG5vdCBtYXJrZXQgYWRtaW4iKQoJfQoJaWYgYWN0aW9uLktpbmQoKSA9PSBNYXJrZXRBYm9ydFJldHVybiB7CgkJaWYgYWN0aW9uLlJlY2lwaWVudCgpICE9IHAuU3VjY2Vzc29yKCkgfHwgYmVmb3JlLlBlbmRpbmdBZG1pbiAhPSBwLlN1Y2Nlc3NvcigpIHsKCQkJcGFuaWMoIm1hcmtldCByZXR1cm4gZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CgkJcmV0dXJuCgl9CglpZiBiZWZvcmUuUGVuZGluZ0FkbWluICE9ICIiIHsKCQlwYW5pYygibWFya2V0IGF1dGhvcml0eSB0cmFuc2ZlciBpcyBwZW5kaW5nIikKCX0KCXN3aXRjaCBhY3Rpb24uS2luZCgpIHsKCWNhc2UgTWFya2V0U2V0RmVlOgoJCWlmIGFjdGlvbi5CUFMoKSA9PSBiZWZvcmUuQlBTIHsKCQkJcGFuaWMoIm1hcmtldCBmZWUgY2hhbmdlIGlzIGEgbm8tb3AiKQoJCX0KCWNhc2UgTWFya2V0U2V0VHJlYXN1cnk6CgkJaWYgYWN0aW9uLlJlY2lwaWVudCgpICE9IHAuVHJlYXN1cnkoKSB7CgkJCXBhbmljKCJtYXJrZXQgdHJlYXN1cnkgZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CgkJaWYgYmVmb3JlLlRyZWFzdXJ5ID09IHAuVHJlYXN1cnkoKSB7CgkJCXBhbmljKCJtYXJrZXQgdHJlYXN1cnkgY2hhbmdlIGlzIGEgbm8tb3AiKQoJCX0KCWNhc2UgTWFya2V0UmV0dXJuQWRtaW46CgkJaWYgYWN0aW9uLlJlY2lwaWVudCgpICE9IHAuU3VjY2Vzc29yKCkgewoJCQlwYW5pYygibWFya2V0IHN1Y2Nlc3NvciBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCWRlZmF1bHQ6CgkJcGFuaWMoInVuc3VwcG9ydGVkIG1hcmtldCBhY3Rpb24iKQoJfQp9CgpmdW5jIChoICpIb3N0KSBQcm9wb3NlTWFya2V0KGFjdGlvbiBNYXJrZXRBY3Rpb24sIGJlZm9yZSBNYXJrZXRTdGF0ZSwgcmxtIHJlYWxtKSB1aW50NjQgewoJd2hvIDo9IGFzc2VydENhbGxlcihoLCBybG0pCgloLnZhbGlkYXRlTWFya2V0KGFjdGlvbiwgYmVmb3JlKQoJcCA6PSAmcm9sZVByb3Bvc2Fse3Byb3Bvc2VyOiB3aG8sIG1hcmtldDogJm1hcmtldFByb3Bvc2Fse2FjdGlvbjogYWN0aW9uLCBiZWZvcmU6IGJlZm9yZX19CglwLmJhbGxvdCA9IGgucG9saWN5Lk5ld1Byb3Bvc2FsKGFjdGlvbi5DYXRlZ29yeSgpLCBtYXJrZXRDb21taXRtZW50KGFjdGlvbiwgYmVmb3JlKSkKCWguYWRkUHJvcG9zYWwocCkKCXJldHVybiB1aW50NjQobGVuKGgucHJvcG9zYWxzKSkKfQoKLy8gQ29uc3VtZU1hcmtldCBpcyBmb3IgdGhlIG93bmluZyByZWFsbSdzIGZpeGVkIGFkYXB0ZXIgb25seS4gSXQgY2hlY2tzIHRoZQovLyBmcmVzaCB0YXJnZXQgc3RhdGUgYW5kIGNvbnN1bWVzIGF1dGhvcml6YXRpb24gQkVGT1JFIGNyb3NzaW5nLiBObyByZWNvdmVyeQovLyBpcyBwZXJtaXR0ZWQgaW4gdGhhdCBhZGFwdGVyOiBhIHRhcmdldCBwYW5pYyBtdXN0IGFib3J0IHRoZSB0cmFuc2FjdGlvbi4KZnVuYyAoaCAqSG9zdCkgQ29uc3VtZU1hcmtldChpZCB1aW50NjQsIGJlZm9yZSBNYXJrZXRTdGF0ZSwgcmxtIHJlYWxtKSBNYXJrZXRBY3Rpb24gewoJYXNzZXJ0Q2FsbGVyKGgsIHJsbSkKCXAgOj0gaC5wcm9wb3NhbChpZCkKCWlmIHAubWFya2V0ID09IG5pbCB7CgkJcGFuaWMoInByb3Bvc2FsIGlzIG5vdCBhIG1hcmtldCBhY3Rpb24iKQoJfQoJaC52YWxpZGF0ZU1hcmtldChwLm1hcmtldC5hY3Rpb24sIGJlZm9yZSkKCXAuYmFsbG90LkNvbnN1bWUobWFya2V0Q29tbWl0bWVudChwLm1hcmtldC5hY3Rpb24sIGJlZm9yZSkpCgkvLyBBIHN1Y2Nlc3NmdWwgYXBwbGljYXRpb24gYWN0aW9uIGludmFsaWRhdGVzIGFsbCBvdGhlciBhdXRob3JpemF0aW9ucy4KCS8vIEFuIG9sZCBhcHByb3ZhbCBjYW5ub3QgcmV2aXZlIGFmdGVyIGEgcmV0dXJuL3JlYWNjZXB0IG9yIGludGVydmVuaW5nIGZlZQoJLy8gY2hhbmdlLiBUaGUgcmVhbG0gbGV0cyBkaXNwYXRjaCBmYWlsdXJlIGFib3J0IHRoaXMgbXV0YXRpb24gdG9vLgoJbWVtYmVycyA6PSBbXW1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7fQoJZm9yIF8sIHNlYXQgOj0gcmFuZ2UgaC5zZWF0cyB7CgkJbWVtYmVycyA9IGFwcGVuZChtZW1iZXJzLCBzZWF0Lk1lbWJlcikKCX0KCWgucG9saWN5LlJlY29uZmlndXJlKG1lbWJlcnMpCgloLnJlY29yZEludmFsaWRhdGlvbihJbnZhbGlkYXRlZEJ5RXhlY3V0aW9uLCBpZCwgTWFya2V0Q29uZmlnUGF0aCkKCXJldHVybiBwLm1hcmtldC5hY3Rpb24KfQoahRYKEXF1ZXN0X2FjdGlvbnMuZ25vEu8VcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgKAoJImNoYWluIgoJImVuY29kaW5nL2hleCIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgopCgpjb25zdCBRdWVzdFBhdGggPSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX3F1ZXN0X2F0dGVzdGF0aW9uX3YxIgoKdHlwZSBRdWVzdEFjdGlvbktpbmQgc3RyaW5nCgpjb25zdCAoCglRdWVzdEFjY2VwdE93bmVyIFF1ZXN0QWN0aW9uS2luZCA9ICJhY2NlcHQtb3duZXIiCglRdWVzdFNldFNpZ25lciAgIFF1ZXN0QWN0aW9uS2luZCA9ICJzZXQtc2lnbmVyIgoJUXVlc3RSZXR1cm5Pd25lciBRdWVzdEFjdGlvbktpbmQgPSAicmV0dXJuLW93bmVyIgoJUXVlc3RBYm9ydFJldHVybiBRdWVzdEFjdGlvbktpbmQgPSAiYWJvcnQtcmV0dXJuIgopCgp0eXBlIFF1ZXN0UG9saWN5IHN0cnVjdHsgZGFvLCBzdWNjZXNzb3IgYWRkcmVzcyB9CgpmdW5jIE5ld1F1ZXN0UG9saWN5KGRhbywgc3VjY2Vzc29yIGFkZHJlc3MpIFF1ZXN0UG9saWN5IHsKCWlmICFkYW8uSXNWYWxpZCgpIHx8IGRhbyAhPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2RhbyIpIHsKCQlwYW5pYygicXVlc3QgcG9saWN5IHJlcXVpcmVzIHRoZSBmb3VuZGluZyBEQU8gYWRkcmVzcyIpCgl9CglpZiAhc3VjY2Vzc29yLklzVmFsaWQoKSB8fCBzdWNjZXNzb3IgPT0gZGFvIHx8IHN1Y2Nlc3NvciA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhRdWVzdFBhdGgpIHsKCQlwYW5pYygicXVlc3QgcG9saWN5IHJlcXVpcmVzIGEgdmFsaWQgZGlzdGluY3Qgc3VjY2Vzc29yIikKCX0KCXJldHVybiBRdWVzdFBvbGljeXtkYW86IGRhbywgc3VjY2Vzc29yOiBzdWNjZXNzb3J9Cn0KZnVuYyAocCBRdWVzdFBvbGljeSkgREFPKCkgYWRkcmVzcyAgICAgICB7IHJldHVybiBwLmRhbyB9CmZ1bmMgKHAgUXVlc3RQb2xpY3kpIFN1Y2Nlc3NvcigpIGFkZHJlc3MgeyByZXR1cm4gcC5zdWNjZXNzb3IgfQoKdHlwZSBRdWVzdEFjdGlvbiBzdHJ1Y3QgewoJa2luZCAgICAgIFF1ZXN0QWN0aW9uS2luZAoJa2V5ICAgICAgIHN0cmluZwoJcmVjaXBpZW50IGFkZHJlc3MKfQoKZnVuYyAocCBRdWVzdFBvbGljeSkgQWNjZXB0KCkgUXVlc3RBY3Rpb24geyByZXR1cm4gUXVlc3RBY3Rpb257a2luZDogUXVlc3RBY2NlcHRPd25lcn0gfQpmdW5jIChwIFF1ZXN0UG9saWN5KSBSZXR1cm4oKSBRdWVzdEFjdGlvbiB7CglyZXR1cm4gUXVlc3RBY3Rpb257a2luZDogUXVlc3RSZXR1cm5Pd25lciwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIFF1ZXN0UG9saWN5KSBBYm9ydFJldHVybigpIFF1ZXN0QWN0aW9uIHsKCXJldHVybiBRdWVzdEFjdGlvbntraW5kOiBRdWVzdEFib3J0UmV0dXJuLCByZWNpcGllbnQ6IHAuc3VjY2Vzc29yfQp9CmZ1bmMgUXVlc3RTaWduZXIoa2V5IHN0cmluZykgUXVlc3RBY3Rpb24gewoJYSA6PSBRdWVzdEFjdGlvbntraW5kOiBRdWVzdFNldFNpZ25lciwga2V5OiBrZXl9CglhLkJ5dGVzKCkKCXJldHVybiBhCn0KZnVuYyAoYSBRdWVzdEFjdGlvbikgS2luZCgpIFF1ZXN0QWN0aW9uS2luZCB7IHJldHVybiBhLmtpbmQgfQpmdW5jIChhIFF1ZXN0QWN0aW9uKSBLZXkoKSBzdHJpbmcgICAgICAgICAgIHsgcmV0dXJuIGEua2V5IH0KZnVuYyAoYSBRdWVzdEFjdGlvbikgUmVjaXBpZW50KCkgYWRkcmVzcyAgICB7IHJldHVybiBhLnJlY2lwaWVudCB9CmZ1bmMgY2Fub25pY2FsUXVlc3RLZXkoa2V5IHN0cmluZykgYm9vbCB7CglpZiBsZW4oa2V5KSAhPSA2NCB7CgkJcmV0dXJuIGZhbHNlCgl9CglkZWNvZGVkLCBlcnIgOj0gaGV4LkRlY29kZVN0cmluZyhrZXkpCglyZXR1cm4gZXJyID09IG5pbCAmJiBsZW4oZGVjb2RlZCkgPT0gMzIgJiYgaGV4LkVuY29kZVRvU3RyaW5nKGRlY29kZWQpID09IGtleQp9CmZ1bmMgKGEgUXVlc3RBY3Rpb24pIEJ5dGVzKCkgc3RyaW5nIHsKCWJhc2UgOj0gInF1ZXN0L3YxfCIgKyBRdWVzdFBhdGggKyAifCIgKyBzdHJpbmcoYS5raW5kKQoJc3dpdGNoIGEua2luZCB7CgljYXNlIFF1ZXN0QWNjZXB0T3duZXI6CgkJaWYgYS5rZXkgIT0gIiIgfHwgYS5yZWNpcGllbnQgIT0gIiIgewoJCQlwYW5pYygibWFsZm9ybWVkIHF1ZXN0IGFjY2VwdCBhY3Rpb24iKQoJCX0KCQlyZXR1cm4gYmFzZQoJY2FzZSBRdWVzdFNldFNpZ25lcjoKCQlpZiAhY2Fub25pY2FsUXVlc3RLZXkoYS5rZXkpIHx8IGEucmVjaXBpZW50ICE9ICIiIHsKCQkJcGFuaWMoInF1ZXN0IHNpZ25lciByZXF1aXJlcyBjYW5vbmljYWwgMzItYnl0ZSBoZXgiKQoJCX0KCQlyZXR1cm4gYmFzZSArICJ8IiArIGEua2V5CgljYXNlIFF1ZXN0UmV0dXJuT3duZXIsIFF1ZXN0QWJvcnRSZXR1cm46CgkJaWYgYS5rZXkgIT0gIiIgfHwgIWEucmVjaXBpZW50LklzVmFsaWQoKSB7CgkJCXBhbmljKCJtYWxmb3JtZWQgcXVlc3QgcmV0dXJuIGFjdGlvbiIpCgkJfQoJCXJldHVybiBiYXNlICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgcXVlc3QgYWN0aW9uIikKCX0KfQpmdW5jIChhIFF1ZXN0QWN0aW9uKSBDYXRlZ29yeSgpIG1lbWJhX3dlaWdodGVkX3BvbGljeS5DYXRlZ29yeSB7CglhLkJ5dGVzKCkKCS8vIFJlcGxhY2luZyB0aGUgdm91Y2hlci1pc3N1aW5nIGtleSB0cmFuc2ZlcnMgYXR0ZXN0YXRpb24gYXV0aG9yaXR5LgoJLy8gSXQgY2Fubm90IGJlIGRpc2d1aXNlZCBhcyBhIHJvdXRpbmUgY29udGVudCBjaGFuZ2UuCglyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNyaXRpY2FsCn0KGpMnCg5xdWVzdF9ob3N0LmdubxKAJ3BhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgoKLy8gQXBwbGljYXRpb25Qb2xpY2llcyBpcyBjb3BpZWQgYW5kIHZhbGlkYXRlZCBieSBjb25zdHJ1Y3Rpb24uIE5vIHBvbGljeSBjYW4KLy8gc3Vic2VxdWVudGx5IGJlIGF0dGFjaGVkIG9yIGNoYW5nZWQgb24gYW4gZXhpc3RpbmcgaG9zdC4KdHlwZSBBcHBsaWNhdGlvblBvbGljaWVzIHN0cnVjdCB7CglGZWVkYmFjayBGZWVkYmFja1BvbGljeQoJQ2hhbm5lbHMgQ2hhbm5lbHNQb2xpY3kKCUZlZWQgICAgIEZlZWRQb2xpY3kKCUJhZGdlcyAgIEJhZGdlc1BvbGljeQoJRXNjcm93ICAgRXNjcm93UG9saWN5CglBcHBzdG9yZSBBcHBzdG9yZVBvbGljeQoJQXJjYWRlICAgQXJjYWRlUG9saWN5CglNYXJrZXQgICBNYXJrZXRQb2xpY3kKCVJldmlld3MgIFJldmlld3NQb2xpY3kKCVF1ZXN0ICAgIFF1ZXN0UG9saWN5Cn0KCmZ1bmMgTmV3V2l0aEFwcGxpY2F0aW9ucyhzZWF0cyBbXVNlYXQsIHBvbGljaWVzIEFwcGxpY2F0aW9uUG9saWNpZXMsIHJsbSByZWFsbSkgKkhvc3QgewoJaCA6PSBOZXcoc2VhdHMsIHJsbSkKCWlmIHBvbGljaWVzLk1hcmtldCAhPSAoTWFya2V0UG9saWN5e30pIHsKCQloID0gTmV3V2l0aE1hcmtldChzZWF0cywgcG9saWNpZXMuTWFya2V0LCBybG0pCgl9CglpZiBwb2xpY2llcy5SZXZpZXdzICE9IChSZXZpZXdzUG9saWN5e30pIHsKCQloID0gYXR0YWNoUmV2aWV3cyhoLCBwb2xpY2llcy5SZXZpZXdzLCBybG0pCgl9CglpZiBwb2xpY2llcy5RdWVzdCAhPSAoUXVlc3RQb2xpY3l7fSkgewoJCXAgOj0gTmV3UXVlc3RQb2xpY3kocG9saWNpZXMuUXVlc3QuREFPKCksIHBvbGljaWVzLlF1ZXN0LlN1Y2Nlc3NvcigpKQoJCWlmIHJsbS5BZGRyZXNzKCkgIT0gcC5EQU8oKSB7CgkJCXBhbmljKCJxdWVzdCBwb2xpY3kgREFPIGRvZXMgbm90IG93biB0aGlzIGhvc3QiKQoJCX0KCQloLnF1ZXN0UG9saWN5ID0gJnAKCX0KCWlmIHBvbGljaWVzLkFyY2FkZSAhPSAoQXJjYWRlUG9saWN5e30pIHsKCQlwIDo9IE5ld0FyY2FkZVBvbGljeShwb2xpY2llcy5BcmNhZGUuREFPKCksIHBvbGljaWVzLkFyY2FkZS5TdWNjZXNzb3IoKSkKCQlpZiBybG0uQWRkcmVzcygpICE9IHAuREFPKCkgewoJCQlwYW5pYygiYXJjYWRlIHBvbGljeSBEQU8gZG9lcyBub3Qgb3duIHRoaXMgaG9zdCIpCgkJfQoJCWguYXJjYWRlUG9saWN5ID0gJnAKCX0KCWlmIHBvbGljaWVzLkFwcHN0b3JlICE9IChBcHBzdG9yZVBvbGljeXt9KSB7CgkJcCA6PSBOZXdBcHBzdG9yZVBvbGljeShwb2xpY2llcy5BcHBzdG9yZS5EQU8oKSwgcG9saWNpZXMuQXBwc3RvcmUuU3VjY2Vzc29yKCksIHBvbGljaWVzLkFwcHN0b3JlLlRyZWFzdXJ5KCkpCgkJaWYgcmxtLkFkZHJlc3MoKSAhPSBwLkRBTygpIHsKCQkJcGFuaWMoImFwcHN0b3JlIHBvbGljeSBEQU8gZG9lcyBub3Qgb3duIHRoaXMgaG9zdCIpCgkJfQoJCWguYXBwc3RvcmVQb2xpY3kgPSAmcAoJfQoJaWYgcG9saWNpZXMuRXNjcm93ICE9IChFc2Nyb3dQb2xpY3l7fSkgewoJCXAgOj0gTmV3RXNjcm93UG9saWN5KHBvbGljaWVzLkVzY3Jvdy5EQU8oKSwgcG9saWNpZXMuRXNjcm93LlN1Y2Nlc3NvcigpKQoJCWlmIHJsbS5BZGRyZXNzKCkgIT0gcC5EQU8oKSB7CgkJCXBhbmljKCJlc2Nyb3cgcG9saWN5IERBTyBkb2VzIG5vdCBvd24gdGhpcyBob3N0IikKCQl9CgkJaC5lc2Nyb3dQb2xpY3kgPSAmcAoJfQoJaWYgcG9saWNpZXMuQmFkZ2VzICE9IChCYWRnZXNQb2xpY3l7fSkgewoJCXAgOj0gTmV3QmFkZ2VzUG9saWN5KHBvbGljaWVzLkJhZGdlcy5EQU8oKSwgcG9saWNpZXMuQmFkZ2VzLlN1Y2Nlc3NvcigpKQoJCWlmIHJsbS5BZGRyZXNzKCkgIT0gcC5EQU8oKSB7CgkJCXBhbmljKCJiYWRnZXMgcG9saWN5IERBTyBkb2VzIG5vdCBvd24gdGhpcyBob3N0IikKCQl9CgkJaC5iYWRnZXNQb2xpY3kgPSAmcAoJfQoJaWYgcG9saWNpZXMuRmVlZCAhPSAoRmVlZFBvbGljeXt9KSB7CgkJcCA6PSBOZXdGZWVkUG9saWN5KHBvbGljaWVzLkZlZWQuREFPKCksIHBvbGljaWVzLkZlZWQuU3VjY2Vzc29yKCkpCgkJaWYgcmxtLkFkZHJlc3MoKSAhPSBwLkRBTygpIHsKCQkJcGFuaWMoImZlZWQgcG9saWN5IERBTyBkb2VzIG5vdCBvd24gdGhpcyBob3N0IikKCQl9CgkJaC5mZWVkUG9saWN5ID0gJnAKCX0KCWlmIHBvbGljaWVzLkNoYW5uZWxzICE9IChDaGFubmVsc1BvbGljeXt9KSB7CgkJcCA6PSBOZXdDaGFubmVsc1BvbGljeShwb2xpY2llcy5DaGFubmVscy5EQU8oKSwgcG9saWNpZXMuQ2hhbm5lbHMuU3VjY2Vzc29yKCkpCgkJaWYgcmxtLkFkZHJlc3MoKSAhPSBwLkRBTygpIHsKCQkJcGFuaWMoImNoYW5uZWxzIHBvbGljeSBEQU8gZG9lcyBub3Qgb3duIHRoaXMgaG9zdCIpCgkJfQoJCWguY2hhbm5lbHNQb2xpY3kgPSAmcAoJfQoJaWYgcG9saWNpZXMuRmVlZGJhY2sgIT0gKEZlZWRiYWNrUG9saWN5e30pIHsKCQlwIDo9IE5ld0ZlZWRiYWNrUG9saWN5KHBvbGljaWVzLkZlZWRiYWNrLkRBTygpLCBwb2xpY2llcy5GZWVkYmFjay5TdWNjZXNzb3IoKSkKCQlpZiBybG0uQWRkcmVzcygpICE9IHAuREFPKCkgewoJCQlwYW5pYygiZmVlZGJhY2sgcG9saWN5IERBTyBkb2VzIG5vdCBvd24gdGhpcyBob3N0IikKCQl9CgkJaC5mZWVkYmFja1BvbGljeSA9ICZwCgl9CglyZXR1cm4gaAp9Cgp0eXBlIFF1ZXN0U3RhdGUgc3RydWN0IHsKCU93bmVyLCBQZW5kaW5nT3duZXIgYWRkcmVzcwoJU2lnbmVyICAgICAgICAgICAgICBzdHJpbmcKfQp0eXBlIHF1ZXN0UHJvcG9zYWwgc3RydWN0IHsKCWFjdGlvbiBRdWVzdEFjdGlvbgoJYmVmb3JlIFF1ZXN0U3RhdGUKfQoKZnVuYyBxdWVzdENvbW1pdG1lbnQoYSBRdWVzdEFjdGlvbiwgYmVmb3JlIFF1ZXN0U3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYS5CeXRlcygpICsgInxiZWZvcmV8IiArIHF1ZXN0U3RhdGVKU09OKGJlZm9yZSkKfQpmdW5jIChoICpIb3N0KSB2YWxpZGF0ZVF1ZXN0KGEgUXVlc3RBY3Rpb24sIGJlZm9yZSBRdWVzdFN0YXRlKSB7CglpZiBoLnF1ZXN0UG9saWN5ID09IG5pbCB7CgkJcGFuaWMoInF1ZXN0IGFjdGlvbnMgYXJlIG5vdCBjb25maWd1cmVkIikKCX0KCWEuQnl0ZXMoKQoJcCA6PSBoLnF1ZXN0UG9saWN5CglpZiAhYmVmb3JlLk93bmVyLklzVmFsaWQoKSB8fCAoYmVmb3JlLlBlbmRpbmdPd25lciAhPSAiIiAmJiAhYmVmb3JlLlBlbmRpbmdPd25lci5Jc1ZhbGlkKCkpIHx8IChiZWZvcmUuU2lnbmVyICE9ICIiICYmICFjYW5vbmljYWxRdWVzdEtleShiZWZvcmUuU2lnbmVyKSkgewoJCXBhbmljKCJpbnZhbGlkIHF1ZXN0IHByZS1zdGF0ZSIpCgl9CglpZiBhLktpbmQoKSA9PSBRdWVzdEFjY2VwdE93bmVyIHsKCQlpZiBiZWZvcmUuT3duZXIgPT0gcC5EQU8oKSB8fCBiZWZvcmUuUGVuZGluZ093bmVyICE9IHAuREFPKCkgewoJCQlwYW5pYygiREFPIGlzIG5vdCBwZW5kaW5nIHF1ZXN0IG93bmVyIikKCQl9CgkJcmV0dXJuCgl9CglpZiBiZWZvcmUuT3duZXIgIT0gcC5EQU8oKSB7CgkJcGFuaWMoIkRBTyBpcyBub3QgcXVlc3Qgb3duZXIiKQoJfQoJaWYgYS5LaW5kKCkgPT0gUXVlc3RBYm9ydFJldHVybiB7CgkJaWYgYS5SZWNpcGllbnQoKSAhPSBwLlN1Y2Nlc3NvcigpIHx8IGJlZm9yZS5QZW5kaW5nT3duZXIgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJxdWVzdCByZXR1cm4gZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CgkJcmV0dXJuCgl9CglpZiBiZWZvcmUuUGVuZGluZ093bmVyICE9ICIiIHsKCQlwYW5pYygicXVlc3QgYXV0aG9yaXR5IHRyYW5zZmVyIGlzIHBlbmRpbmciKQoJfQoJc3dpdGNoIGEuS2luZCgpIHsKCWNhc2UgUXVlc3RTZXRTaWduZXI6CgkJaWYgYmVmb3JlLlNpZ25lciA9PSBhLktleSgpIHsKCQkJcGFuaWMoInF1ZXN0IHNpZ25lciBjaGFuZ2UgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBRdWVzdFJldHVybk93bmVyOgoJCWlmIGEuUmVjaXBpZW50KCkgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJxdWVzdCBzdWNjZXNzb3IgZG9lcyBub3QgbWF0Y2ggcG9saWN5IikKCQl9CglkZWZhdWx0OgoJCXBhbmljKCJ1bnN1cHBvcnRlZCBxdWVzdCBhY3Rpb24iKQoJfQp9CmZ1bmMgKGggKkhvc3QpIFByb3Bvc2VRdWVzdChhIFF1ZXN0QWN0aW9uLCBiZWZvcmUgUXVlc3RTdGF0ZSwgcmxtIHJlYWxtKSB1aW50NjQgewoJd2hvIDo9IGFzc2VydENhbGxlcihoLCBybG0pCgloLnZhbGlkYXRlUXVlc3QoYSwgYmVmb3JlKQoJcCA6PSAmcm9sZVByb3Bvc2Fse3Byb3Bvc2VyOiB3aG8sIHF1ZXN0OiAmcXVlc3RQcm9wb3NhbHthY3Rpb246IGEsIGJlZm9yZTogYmVmb3JlfX0KCXAuYmFsbG90ID0gaC5wb2xpY3kuTmV3UHJvcG9zYWwoYS5DYXRlZ29yeSgpLCBxdWVzdENvbW1pdG1lbnQoYSwgYmVmb3JlKSkKCWguYWRkUHJvcG9zYWwocCkKCXJldHVybiB1aW50NjQobGVuKGgucHJvcG9zYWxzKSkKfQpmdW5jIChoICpIb3N0KSBDb25zdW1lUXVlc3QoaWQgdWludDY0LCBiZWZvcmUgUXVlc3RTdGF0ZSwgcmxtIHJlYWxtKSBRdWVzdEFjdGlvbiB7Cglhc3NlcnRDYWxsZXIoaCwgcmxtKQoJcCA6PSBoLnByb3Bvc2FsKGlkKQoJaWYgcC5xdWVzdCA9PSBuaWwgewoJCXBhbmljKCJwcm9wb3NhbCBpcyBub3QgYSBxdWVzdCBhY3Rpb24iKQoJfQoJaC52YWxpZGF0ZVF1ZXN0KHAucXVlc3QuYWN0aW9uLCBiZWZvcmUpCglwLmJhbGxvdC5Db25zdW1lKHF1ZXN0Q29tbWl0bWVudChwLnF1ZXN0LmFjdGlvbiwgYmVmb3JlKSkKCW1lbWJlcnMgOj0gW11tZW1iYV93ZWlnaHRlZF9wb2xpY3kuTWVtYmVye30KCWZvciBfLCBzZWF0IDo9IHJhbmdlIGguc2VhdHMgewoJCW1lbWJlcnMgPSBhcHBlbmQobWVtYmVycywgc2VhdC5NZW1iZXIpCgl9CgloLnBvbGljeS5SZWNvbmZpZ3VyZShtZW1iZXJzKQoJaC5yZWNvcmRJbnZhbGlkYXRpb24oSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQsIFF1ZXN0UGF0aCkKCXJldHVybiBwLnF1ZXN0LmFjdGlvbgp9ChrKBgoPcXVlc3RfcmVhZHMuZ25vErYGcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgpmdW5jIChoICpIb3N0KSBxdWVzdENvbmZpZ0pTT04oKSBzdHJpbmcgewoJaWYgaC5xdWVzdFBvbGljeSA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGAsInF1ZXN0UG9saWN5Ijp7InRhcmdldCI6YCArIHF1b3RlSlNPTihRdWVzdFBhdGgpICsgYCwic3VjY2Vzc29yIjpgICsgcXVvdGVKU09OKHN0cmluZyhoLnF1ZXN0UG9saWN5LlN1Y2Nlc3NvcigpKSkgKyBgLCJzaWduZXJDYXRlZ29yeSI6ImNyaXRpY2FsIiwicmV0dXJuU3RhZ2VzT25seSI6dHJ1ZSwiaW52YWxpZGF0ZXNPdGhlclByb3Bvc2FscyI6dHJ1ZX1gCn0KZnVuYyBxdWVzdFN0YXRlSlNPTihzIFF1ZXN0U3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYHsib3duZXIiOmAgKyBxdW90ZUpTT04oc3RyaW5nKHMuT3duZXIpKSArIGAsInBlbmRpbmdPd25lciI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5QZW5kaW5nT3duZXIpKSArIGAsInNpZ25lciI6YCArIHF1b3RlSlNPTihzLlNpZ25lcikgKyBgfWAKfQpmdW5jIHF1ZXN0QWN0aW9uSlNPTihhIFF1ZXN0QWN0aW9uLCBzIFF1ZXN0U3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYHsidHlwZSI6InF1ZXN0IiwidGFyZ2V0IjpgICsgcXVvdGVKU09OKFF1ZXN0UGF0aCkgKyBgLCJvcGVyYXRpb24iOmAgKyBxdW90ZUpTT04oc3RyaW5nKGEuS2luZCgpKSkgKyBgLCJzaWduZXIiOmAgKyBxdW90ZUpTT04oYS5LZXkoKSkgKyBgLCJyZWNpcGllbnQiOmAgKyBxdW90ZUpTT04oc3RyaW5nKGEuUmVjaXBpZW50KCkpKSArIGAsImJlZm9yZSI6YCArIHF1ZXN0U3RhdGVKU09OKHMpICsgYH1gCn0KGptmCglyZWFkcy5nbm8SjWZwYWNrYWdlIG1lbWJhX3dlaWdodGVkX2hvc3QKCmltcG9ydCAoCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCikKCmNvbnN0IFJlYWRTY2hlbWEgPSAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92MiIKY29uc3QgTWF4UHJvcG9zYWxQYWdlID0gNTAKCmZ1bmMgKGggKkhvc3QpIHJlYWRTY2hlbWEoKSBzdHJpbmcgewoJaWYgaC5mZWVkYmFja1BvbGljeSAhPSBuaWwgewoJCXJldHVybiAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92MTIiCgl9CglpZiBoLmNoYW5uZWxzUG9saWN5ICE9IG5pbCB7CgkJcmV0dXJuICJtZW1iYS13ZWlnaHRlZC1ob3N0L3YxMSIKCX0KCWlmIGguZmVlZFBvbGljeSAhPSBuaWwgewoJCXJldHVybiAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92MTAiCgl9CglpZiBoLmJhZGdlc1BvbGljeSAhPSBuaWwgewoJCXJldHVybiAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92OSIKCX0KCWlmIGguZXNjcm93UG9saWN5ICE9IG5pbCB7CgkJcmV0dXJuICJtZW1iYS13ZWlnaHRlZC1ob3N0L3Y4IgoJfQoJaWYgaC5hcHBzdG9yZVBvbGljeSAhPSBuaWwgewoJCXJldHVybiAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92NyIKCX0KCWlmIGguYXJjYWRlUG9saWN5ICE9IG5pbCB7CgkJcmV0dXJuICJtZW1iYS13ZWlnaHRlZC1ob3N0L3Y2IgoJfQoJaWYgaC5xdWVzdFBvbGljeSAhPSBuaWwgewoJCXJldHVybiAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92NSIKCX0KCWlmIGgucmV2aWV3c1BvbGljeSAhPSBuaWwgewoJCXJldHVybiAibWVtYmEtd2VpZ2h0ZWQtaG9zdC92NCIKCX0KCWlmIGgubWFya2V0UG9saWN5ICE9IG5pbCB7CgkJcmV0dXJuICJtZW1iYS13ZWlnaHRlZC1ob3N0L3YzIgoJfQoJcmV0dXJuIFJlYWRTY2hlbWEKfQoKZnVuYyAoaCAqSG9zdCkgbWFya2V0Q29uZmlnSlNPTigpIHN0cmluZyB7CglpZiBoLm1hcmtldFBvbGljeSA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIGAsIm1hcmtldFBvbGljeSI6eyJ0YXJnZXQiOmAgKyBxdW90ZUpTT04oTWFya2V0Q29uZmlnUGF0aCkgKyBgLCJ0cmVhc3VyeSI6YCArIHF1b3RlSlNPTihzdHJpbmcoaC5tYXJrZXRQb2xpY3kuVHJlYXN1cnkoKSkpICsgYCwic3VjY2Vzc29yIjpgICsgcXVvdGVKU09OKHN0cmluZyhoLm1hcmtldFBvbGljeS5TdWNjZXNzb3IoKSkpICsgYCwiZmVlQ2F0ZWdvcnkiOiJmaW5hbmNpYWwiLCJ0cmVhc3VyeUNhdGVnb3J5IjoiZmluYW5jaWFsIiwicmV0dXJuU3RhZ2VzT25seSI6dHJ1ZSwiaW52YWxpZGF0ZXNPdGhlclByb3Bvc2FscyI6dHJ1ZX1gCn0KCi8vIEpTT04gc3RyaW5ncyB1c2UgSlNPTiBlc2NhcGVzLCBub3QgR28ncyBceE5OL1xhL1x2IGVzY2FwZXMuIEludmFsaWQgVVRGLTgKLy8gZGVjb2RlcyBhcyBVK0ZGRkQsIG1hdGNoaW5nIEpTT04ncyBVbmljb2RlIHN0cmluZyBkb21haW4uCmZ1bmMgcXVvdGVKU09OKHZhbHVlIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZUJ5dGUoJyInKQoJY29uc3QgaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiCglmb3IgXywgciA6PSByYW5nZSB2YWx1ZSB7CgkJc3dpdGNoIHIgewoJCWNhc2UgJyInOgoJCQliLldyaXRlU3RyaW5nKGBcImApCgkJY2FzZSAnXFwnOgoJCQliLldyaXRlU3RyaW5nKGBcXGApCgkJZGVmYXVsdDoKCQkJaWYgciA8IDB4MjAgewoJCQkJYi5Xcml0ZVN0cmluZyhgXHUwMGApCgkJCQliLldyaXRlQnl0ZShoZXhbYnl0ZShyKT4+NF0pCgkJCQliLldyaXRlQnl0ZShoZXhbYnl0ZShyKSYxNV0pCgkJCX0gZWxzZSB7CgkJCQliLldyaXRlUnVuZShyKQoJCQl9CgkJfQoJfQoJYi5Xcml0ZUJ5dGUoJyInKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyB0aW1lc3RhbXBKU09OKHZhbHVlIHRpbWUuVGltZSkgc3RyaW5nIHsKCWlmIHZhbHVlLklzWmVybygpIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gcXVvdGVKU09OKHZhbHVlLlVUQygpLkZvcm1hdCh0aW1lLlJGQzMzMzlOYW5vKSkKfQoKLy8gQ29uZmlnSlNPTiBkZXNjcmliZXMgb25seSBpbXBsZW1lbnRlZCBob3N0IGNhcGFiaWxpdGllcy4gRml4ZWQgZm91bmRpbmcKLy8gdGhyZXNob2xkcyBhcmUgbm90IGNvbmZpZ3VyYWJsZSB0aHJvdWdoIGEgcm9sZSBhY3Rpb24uIE9wZXJhdGlvbmFsIHJvbGUgbGFiZWxzCi8vIGhhdmUgbm8gYWRkaXRpb25hbCB2b3RlIG9yIGV4ZWN1dGlvbiBwcml2aWxlZ2UuCmZ1bmMgKGggKkhvc3QpIENvbmZpZ0pTT04oKSBzdHJpbmcgewoJcmV0dXJuIGB7InNjaGVtYSI6YCArIHF1b3RlSlNPTihoLnJlYWRTY2hlbWEoKSkgKyBgLCJraW5kIjoiY29uZmlnIiwicmVhbG1QYXRoIjpgICsgcXVvdGVKU09OKGgucGF0aCkgKyBgLCJyb3N0ZXJTaXplIjo3LCJ0b3RhbFBvaW50cyI6OCwiZm91bmRlcldlaWdodCI6MiwiZGV2ZWxvcGVyV2VpZ2h0IjoxLCJ2b3RpbmdQZXJpb2RTZWNvbmRzIjo2MDQ4MDAsInJvbGVDaGFuZ2VzIjp7ImNhdGVnb3J5IjoiY3JpdGljYWwiLCJ3ZWlnaHRlZFBvaW50cyI6Niwid2VpZ2h0ZWRQZW9wbGUiOjQsIndlaWdodGVkRGVsYXlTZWNvbmRzIjo4NjQwMCwiaW5kZXBlbmRlbnREZXZlbG9wZXJzIjo1LCJpbmRlcGVuZGVudERlbGF5U2Vjb25kcyI6MjU5MjAwfSwibXV0YWJsZVJvbGVzIjpbImFkbWluIiwiZmluYW5jZSJdLCJjYXBhYmlsaXRpZXMiOnsicm9sZVByb3Bvc2FscyI6dHJ1ZSwibWVtYmVyUmVwbGFjZW1lbnQiOnRydWUsIm1pZ3JhdGlvbiI6ZmFsc2UsInRyZWFzdXJ5RXhlY3V0aW9uIjpmYWxzZSwiYXBwbGljYXRpb25BY3Rpb25zIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGgubWFya2V0UG9saWN5ICE9IG5pbCB8fCBoLnJldmlld3NQb2xpY3kgIT0gbmlsIHx8IGgucXVlc3RQb2xpY3kgIT0gbmlsIHx8IGguYXJjYWRlUG9saWN5ICE9IG5pbCB8fCBoLmFwcHN0b3JlUG9saWN5ICE9IG5pbCB8fCBoLmVzY3Jvd1BvbGljeSAhPSBuaWwgfHwgaC5iYWRnZXNQb2xpY3kgIT0gbmlsIHx8IGguZmVlZFBvbGljeSAhPSBuaWwgfHwgaC5jaGFubmVsc1BvbGljeSAhPSBuaWwgfHwgaC5mZWVkYmFja1BvbGljeSAhPSBuaWwpICsgYH0sIm1heFByb3Bvc2FsUGFnZSI6NTBgICsgaC5tYXJrZXRDb25maWdKU09OKCkgKyBoLnJldmlld3NDb25maWdKU09OKCkgKyBoLnF1ZXN0Q29uZmlnSlNPTigpICsgaC5hcmNhZGVDb25maWdKU09OKCkgKyBoLmFwcHN0b3JlQ29uZmlnSlNPTigpICsgaC5lc2Nyb3dDb25maWdKU09OKCkgKyBoLmJhZGdlc0NvbmZpZ0pTT04oKSArIGguZmVlZENvbmZpZ0pTT04oKSArIGguY2hhbm5lbHNDb25maWdKU09OKCkgKyBoLmZlZWRiYWNrQ29uZmlnSlNPTigpICsgYH1gCn0KCmZ1bmMgKGggKkhvc3QpIE1lbWJlcnNKU09OKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyhgeyJzY2hlbWEiOmAgKyBxdW90ZUpTT04oaC5yZWFkU2NoZW1hKCkpICsgYCwia2luZCI6Im1lbWJlcnMiLCJtZW1iZXJzIjpbYCkKCWZvciBpLCBzZWF0IDo9IHJhbmdlIGguc2VhdHMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQl3ZWlnaHQgOj0gMQoJCWlmIHNlYXQuTWVtYmVyLkZvdW5kZXIgewoJCQl3ZWlnaHQgPSAyCgkJfQoJCWIuV3JpdGVTdHJpbmcoYHsicGVyc29uSWQiOmAgKyBxdW90ZUpTT04oc2VhdC5NZW1iZXIuUGVyc29uSUQpICsgYCwiYWRkcmVzcyI6YCArIHF1b3RlSlNPTihzdHJpbmcoc2VhdC5NZW1iZXIuQWRkcmVzcykpICsgYCwiZm91bmRlciI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChzZWF0Lk1lbWJlci5Gb3VuZGVyKSArIGAsIndlaWdodCI6YCArIHN0cmNvbnYuSXRvYSh3ZWlnaHQpICsgYCwiYWRtaW4iOmAgKyBzdHJjb252LkZvcm1hdEJvb2woc2VhdC5BZG1pbikgKyBgLCJmaW5hbmNlIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHNlYXQuRmluYW5jZSkgKyBgfWApCgl9CgliLldyaXRlU3RyaW5nKGBdfWApCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHN0YXR1cyhzIG1lbWJhX3dlaWdodGVkX3BvbGljeS5TdGF0ZSkgc3RyaW5nIHsKCS8vIFN1Y2Nlc3NmdWwgcm9sZSBleGVjdXRpb24gYWxzbyBhZHZhbmNlcyB0aGUgY29uZmlndXJhdGlvbiBnZW5lcmF0aW9uLgoJLy8gQ29uc3VtZWQgdGhlcmVmb3JlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBzdWJzZXF1ZW50IGludmFsaWRhdGlvbi4KCWlmIHMuQ29uc3VtZWQgewoJCXJldHVybiAiRVhFQ1VURUQiCgl9CglpZiBzLkludmFsaWRhdGVkIHsKCQlyZXR1cm4gIklOVkFMSURBVEVEIgoJfQoJaWYgcy5FeHBpcmVkIHsKCQlyZXR1cm4gIkVYUElSRUQiCgl9CglpZiBzLlJlYWR5IHsKCQlyZXR1cm4gIlJFQURZIgoJfQoJaWYgcy5RdWFsaWZpZWQgewoJCXJldHVybiAiVElNRUxPQ0tFRCIKCX0KCXJldHVybiAiVk9USU5HIgp9CgovLyB2aWV3U3RhdHVzIGtlZXBzIEVYUElSRUQgc3RpY2t5OiBhIHByb3Bvc2FsIHdob3NlIHZvdGluZyBjbG9zZWQgd2l0aG91dAovLyBxdWFsaWZ5aW5nIHJlcG9ydHMgRVhQSVJFRCBldmVuIGFmdGVyIGEgbGF0ZXIgcmVjb25maWd1cmF0aW9uLgpmdW5jIHZpZXdTdGF0dXModiBQcm9wb3NhbFZpZXcpIHN0cmluZyB7CglpZiAhdi5TdGF0ZS5Db25zdW1lZCAmJiB2LkV4cGlyZWRCZWZvcmVJbnZhbGlkYXRpb24gewoJCXJldHVybiAiRVhQSVJFRCIKCX0KCXJldHVybiBzdGF0dXModi5TdGF0ZSkKfQoKLy8gaW52YWxpZGF0aW9uSlNPTiBpcyBudWxsIHVubGVzcyB0aGUgc3RhdHVzIGlzIElOVkFMSURBVEVELiBjYXVzZSBpcwovLyAic3VwZXJzZWRlZC1leGVjdXRpb24iIChwcm9wb3NhbElkIGlzIHRoZSBleGVjdXRlZCBwcm9wb3NhbCkgb3IgInBhdXNlIgovLyAocHJvcG9zYWxJZCBpcyBudWxsKS4gdGFyZ2V0IGlzIHRoZSBhcHBsaWNhdGlvbiByZWFsbSwgb3IgbnVsbCBmb3IgYQovLyByb2xlIG9yIHJlY292ZXJ5IGV4ZWN1dGlvbi4KZnVuYyBpbnZhbGlkYXRpb25KU09OKHYgUHJvcG9zYWxWaWV3KSBzdHJpbmcgewoJaWYgIXYuSW52YWxpZGF0ZWQgewoJCXJldHVybiAibnVsbCIKCX0KCWlkLCB0YXJnZXQgOj0gIm51bGwiLCAibnVsbCIKCWlmIHYuSW52YWxpZGF0aW9uUHJvcG9zYWwgIT0gMCB7CgkJaWQgPSBxdW90ZUpTT04oc3RyY29udi5Gb3JtYXRVaW50KHYuSW52YWxpZGF0aW9uUHJvcG9zYWwsIDEwKSkKCX0KCWlmIHYuSW52YWxpZGF0aW9uVGFyZ2V0ICE9ICIiIHsKCQl0YXJnZXQgPSBxdW90ZUpTT04odi5JbnZhbGlkYXRpb25UYXJnZXQpCgl9CglyZXR1cm4gYHsiY2F1c2UiOmAgKyBxdW90ZUpTT04odi5JbnZhbGlkYXRpb25DYXVzZSkgKyBgLCJoZWlnaHQiOmAgKyBxdW90ZUpTT04oc3RyY29udi5Gb3JtYXRJbnQodi5JbnZhbGlkYXRpb25IZWlnaHQsIDEwKSkgKyBgLCJwcm9wb3NhbElkIjpgICsgaWQgKyBgLCJ0YXJnZXQiOmAgKyB0YXJnZXQgKyBgfWAKfQoKLy8gVGVybWluYWwgcG9saWN5IHN0YXRlcyBjbGVhciBjdXJyZW50IHRhbGxpZXM7IHRoZXkgYXJlIG5vdCBldmlkZW5jZSBvZiB6ZXJvCi8vIGhpc3RvcmljYWwgdm90ZXMuIERvIG5vdCBpbnZlbnQgYSByZWNlaXB0IHRoZSBob3N0IGRpZCBub3QgcmV0YWluLgpmdW5jIHRhbGx5SlNPTihuIGludCwgcyBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuU3RhdGUpIHN0cmluZyB7CglpZiBzLkNvbnN1bWVkIHx8IHMuSW52YWxpZGF0ZWQgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBzdHJjb252Lkl0b2EobikKfQoKZnVuYyBwcm9wb3NhbEFjdGlvbkpTT04odiBQcm9wb3NhbFZpZXcpIHN0cmluZyB7CglpZiB2LkZlZWRiYWNrIHsKCQlyZXR1cm4gZmVlZGJhY2tBY3Rpb25KU09OKHYuRmVlZGJhY2tBY3Rpb24sIHYuRmVlZGJhY2tCZWZvcmUpCgl9CglpZiB2LkNoYW5uZWxzIHsKCQlyZXR1cm4gY2hhbm5lbHNBY3Rpb25KU09OKHYuQ2hhbm5lbHNBY3Rpb24sIHYuQ2hhbm5lbHNCZWZvcmUpCgl9CglpZiB2LkZlZWQgewoJCXJldHVybiBmZWVkQWN0aW9uSlNPTih2LkZlZWRBY3Rpb24sIHYuRmVlZEJlZm9yZSkKCX0KCWlmIHYuQmFkZ2VzIHsKCQlyZXR1cm4gYmFkZ2VzQWN0aW9uSlNPTih2LkJhZGdlc0FjdGlvbiwgdi5CYWRnZXNCZWZvcmUpCgl9CglpZiB2LkVzY3JvdyB7CgkJcmV0dXJuIGVzY3Jvd0FjdGlvbkpTT04odi5Fc2Nyb3dBY3Rpb24sIHYuRXNjcm93QmVmb3JlKQoJfQoJaWYgdi5BcHBzdG9yZSB7CgkJcmV0dXJuIGFwcHN0b3JlQWN0aW9uSlNPTih2LkFwcHN0b3JlQWN0aW9uLCB2LkFwcHN0b3JlQmVmb3JlKQoJfQoJaWYgdi5BcmNhZGUgewoJCXJldHVybiBhcmNhZGVBY3Rpb25KU09OKHYuQXJjYWRlQWN0aW9uLCB2LkFyY2FkZUJlZm9yZSkKCX0KCWlmIHYuUXVlc3QgewoJCXJldHVybiBxdWVzdEFjdGlvbkpTT04odi5RdWVzdEFjdGlvbiwgdi5RdWVzdEJlZm9yZSkKCX0KCWlmIHYuUmV2aWV3cyB7CgkJcmV0dXJuIHJldmlld3NBY3Rpb25KU09OKHYuUmV2aWV3c0FjdGlvbiwgdi5SZXZpZXdzQmVmb3JlKQoJfQoJaWYgdi5NYXJrZXQgewoJCWEgOj0gdi5NYXJrZXRBY3Rpb24KCQliIDo9IHYuTWFya2V0QmVmb3JlCgkJcmV0dXJuIGB7InR5cGUiOiJtYXJrZXQtY29uZmlnIiwidGFyZ2V0IjpgICsgcXVvdGVKU09OKE1hcmtldENvbmZpZ1BhdGgpICsgYCwib3BlcmF0aW9uIjpgICsgcXVvdGVKU09OKHN0cmluZyhhLktpbmQoKSkpICsgYCwibGFuZSI6YCArIHF1b3RlSlNPTihzdHJpbmcoYS5MYW5lKCkpKSArIGAsImJwcyI6YCArIHF1b3RlSlNPTihzdHJjb252LkZvcm1hdEludChhLkJQUygpLCAxMCkpICsgYCwicmVjaXBpZW50IjpgICsgcXVvdGVKU09OKHN0cmluZyhhLlJlY2lwaWVudCgpKSkgKyBgLCJiZWZvcmUiOnsiYWRtaW4iOmAgKyBxdW90ZUpTT04oc3RyaW5nKGIuQWRtaW4pKSArIGAsInBlbmRpbmdBZG1pbiI6YCArIHF1b3RlSlNPTihzdHJpbmcoYi5QZW5kaW5nQWRtaW4pKSArIGAsInRyZWFzdXJ5IjpgICsgcXVvdGVKU09OKHN0cmluZyhiLlRyZWFzdXJ5KSkgKyBgLCJicHMiOmAgKyBxdW90ZUpTT04oc3RyY29udi5Gb3JtYXRJbnQoYi5CUFMsIDEwKSkgKyBgfX1gCgl9CglpZiB2LlJlY292ZXJ5IHsKCQlyZXR1cm4gYHsidHlwZSI6InJlY292ZXItbWVtYmVyIiwicGVyc29uSWQiOmAgKyBxdW90ZUpTT04odi5QZXJzb25JRCkgKyBgLCJvbGRBZGRyZXNzIjpgICsgcXVvdGVKU09OKHN0cmluZyh2LlRhcmdldCkpICsgYCwibmV3QWRkcmVzcyI6YCArIHF1b3RlSlNPTihzdHJpbmcodi5SZXBsYWNlbWVudCkpICsgYH1gCgl9CglyZXR1cm4gYHsidHlwZSI6InNldC1yb2xlIiwidGFyZ2V0IjpgICsgcXVvdGVKU09OKHN0cmluZyh2LlRhcmdldCkpICsgYCwicm9sZSI6YCArIHF1b3RlSlNPTihzdHJpbmcodi5Sb2xlKSkgKyBgLCJncmFudCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbCh2LkdyYW50KSArIGB9YAp9CgpmdW5jIHByb3Bvc2FsSlNPTih2IFByb3Bvc2FsVmlldykgc3RyaW5nIHsKCXMgOj0gdi5TdGF0ZQoJcmV0dXJuIGB7ImlkIjpgICsgcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0VWludCh2LklELCAxMCkpICsgYCwicHJvcG9zZXIiOmAgKyBxdW90ZUpTT04oc3RyaW5nKHYuUHJvcG9zZXIpKSArIGAsImFjdGlvbiI6YCArIHByb3Bvc2FsQWN0aW9uSlNPTih2KSArIGAsImNhdGVnb3J5IjpgICsgcXVvdGVKU09OKHN0cmluZyhzLkNhdGVnb3J5KSkgKyBgLCJzdGF0dXMiOmAgKyBxdW90ZUpTT04odmlld1N0YXR1cyh2KSkgKyBgLCJxdWFsaWZpZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5RdWFsaWZpZWQpICsgYCwicmVhZHkiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5SZWFkeSkgKyBgLCJ2b3RpbmdDbG9zZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocy5Wb3RpbmdDbG9zZWQpICsgYCwidGFsbGllc0F2YWlsYWJsZSI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbCghcy5Db25zdW1lZCAmJiAhcy5JbnZhbGlkYXRlZCkgKyBgLCJ3ZWlnaHRZZXMiOmAgKyB0YWxseUpTT04ocy5XZWlnaHRZZXMsIHMpICsgYCwicGVvcGxlWWVzIjpgICsgdGFsbHlKU09OKHMuUGVvcGxlWWVzLCBzKSArIGAsImRldmVsb3BlcnNZZXMiOmAgKyB0YWxseUpTT04ocy5EZXZlbG9wZXJzWWVzLCBzKSArIGAsImNyZWF0ZWRBdCI6YCArIHRpbWVzdGFtcEpTT04ocy5DcmVhdGVkQXQpICsgYCwidm90aW5nRGVhZGxpbmUiOmAgKyB0aW1lc3RhbXBKU09OKHMuVm90aW5nRGVhZGxpbmUpICsgYCwid2VpZ2h0ZWRBZnRlciI6YCArIHRpbWVzdGFtcEpTT04ocy5XZWlnaHRlZEFmdGVyKSArIGAsImRldmVsb3BlckFmdGVyIjpgICsgdGltZXN0YW1wSlNPTihzLkRldmVsb3BlckFmdGVyKSArIGAsImludmFsaWRhdGlvbiI6YCArIGludmFsaWRhdGlvbkpTT04odikgKyBgfWAKfQoKZnVuYyAoaCAqSG9zdCkgUHJvcG9zYWxKU09OKGlkIHVpbnQ2NCkgc3RyaW5nIHsKCXJldHVybiBgeyJzY2hlbWEiOmAgKyBxdW90ZUpTT04oaC5yZWFkU2NoZW1hKCkpICsgYCwia2luZCI6InByb3Bvc2FsIiwicHJvcG9zYWwiOmAgKyBwcm9wb3NhbEpTT04oaC5Qcm9wb3NhbChpZCkpICsgYH1gCn0KCi8vIFByb3Bvc2Fsc0pTT04gdXNlcyBhbiBleGNsdXNpdmUgZGVzY2VuZGluZyBJRCBjdXJzb3IuIGJlZm9yZT0wIG1lYW5zIG5ld2VzdDsKLy8gYSByZXR1cm5lZCBuZXh0QmVmb3JlIHJlbWFpbnMgc3RhYmxlIHdoZW4gbmV3ZXIgcHJvcG9zYWxzIGFyZSBhcHBlbmRlZC4KLy8gSURzL2N1cnNvcnMvY291bnRzIGFyZSBkZWNpbWFsIHN0cmluZ3Mgc28gdWludDY0IHZhbHVlcyBuZXZlciBsb3NlIHByZWNpc2lvbgovLyBpbiBhIEphdmFTY3JpcHQgY2xpZW50LiBBIG51bGwgY3Vyc29yIGVuZHMgcGFnaW5hdGlvbiwgbm90IGFuIGVtcHR5IHBhZ2UgZ3Vlc3MuCmZ1bmMgKGggKkhvc3QpIFByb3Bvc2Fsc0pTT04oYmVmb3JlIHVpbnQ2NCwgbGltaXQgaW50KSBzdHJpbmcgewoJaWYgbGltaXQgPCAxIHx8IGxpbWl0ID4gTWF4UHJvcG9zYWxQYWdlIHsKCQlwYW5pYygiaW52YWxpZCBwcm9wb3NhbCBwYWdlIHNpemUiKQoJfQoJY291bnQgOj0gaC5Qcm9wb3NhbENvdW50KCkKCWlmIGJlZm9yZSA+IGNvdW50IHsKCQlwYW5pYygiaW52YWxpZCBwcm9wb3NhbCBjdXJzb3IiKQoJfQoJaWQgOj0gY291bnQKCWlmIGJlZm9yZSA+IDAgewoJCWlkID0gYmVmb3JlIC0gMQoJfQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGB7InNjaGVtYSI6YCArIHF1b3RlSlNPTihoLnJlYWRTY2hlbWEoKSkgKyBgLCJraW5kIjoicHJvcG9zYWxzIiwidG90YWwiOmAgKyBxdW90ZUpTT04oc3RyY29udi5Gb3JtYXRVaW50KGNvdW50LCAxMCkpICsgYCwicHJvcG9zYWxzIjpbYCkKCW4gOj0gMAoJbGFzdCA6PSB1aW50NjQoMCkKCWZvciBpZCA+IDAgJiYgbiA8IGxpbWl0IHsKCQlpZiBuID4gMCB7CgkJCWIuV3JpdGVCeXRlKCcsJykKCQl9CgkJYi5Xcml0ZVN0cmluZyhwcm9wb3NhbEpTT04oaC5Qcm9wb3NhbChpZCkpKQoJCWxhc3QgPSBpZAoJCWlkLS0KCQluKysKCX0KCWIuV3JpdGVTdHJpbmcoYF0sIm5leHRCZWZvcmUiOmApCglpZiBpZCA+IDAgewoJCWIuV3JpdGVTdHJpbmcocXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0VWludChsYXN0LCAxMCkpKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCJudWxsIikKCX0KCWIuV3JpdGVCeXRlKCd9JykKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIEJhbGxvdCByZWFkcy4gUGVuZGluZyBwYWdlcyBob2xkIGF0IG1vc3QgTWF4UGVuZGluZ1BhZ2UgcHJvcG9zYWxzLCBhbmQgb25lCi8vIGNhbGwgZXhhbWluZXMgYXQgbW9zdCBNYXhQZW5kaW5nU2NhbiBwcm9wb3NhbHMgYmVmb3JlIGhhbmRpbmcgYmFjayBhIGN1cnNvci4KY29uc3QgTWF4UGVuZGluZ1BhZ2UgPSA1MApjb25zdCBNYXhQZW5kaW5nU2NhbiA9IDIwMAoKLy8gcGFyc2VEZWNpbWFsSUQgYWNjZXB0cyBvbmx5IGNhbm9uaWNhbCB1bnNpZ25lZCBkZWNpbWFsIHN0cmluZ3MsIHRoZSBzYW1lCi8vIGZvcm0gZXZlcnkgcmVhZCBlbWl0cywgc28gb25lIElEIGhhcyBleGFjdGx5IG9uZSBzcGVsbGluZy4KZnVuYyBwYXJzZURlY2ltYWxJRCh2YWx1ZSwgd2hhdCBzdHJpbmcpIHVpbnQ2NCB7CgluLCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQodmFsdWUsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgfHwgc3RyY29udi5Gb3JtYXRVaW50KG4sIDEwKSAhPSB2YWx1ZSB7CgkJcGFuaWMoImludmFsaWQgIiArIHdoYXQpCgl9CglyZXR1cm4gbgp9CgpmdW5jIGJhbGxvdENob2ljZUpTT04odiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuVm90ZSkgc3RyaW5nIHsKCWlmIHYgPT0gIiIgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBxdW90ZUpTT04oc3RyaW5nKHYpKQp9CgovLyBCYWxsb3RKU09OIHJlcG9ydHMgb25lIGFkZHJlc3MncyBiYWxsb3Qgb24gb25lIHByb3Bvc2FsLiBFbGlnaWJpbGl0eSBpcyB0aGUKLy8gZWxlY3RvcmF0ZSBmcm96ZW4gd2hlbiB0aGUgcHJvcG9zYWwgd2FzIGNyZWF0ZWQsIHNvIGEgcmVjb3ZlcmVkIGtleSBrZWVwcwovLyBpdHMgYmFsbG90IG9uIG9sZGVyIHByb3Bvc2FscyBhbmQgaGFzIG5vbmUgb24gbmV3ZXIgb25lcy4gY2hvaWNlIGlzICJ5ZXMiLAovLyAibm8iIG9yICJhYnN0YWluIiAodGhlIGhvc3QncyB0aHJlZSBiYWxsb3QgdmFsdWVzKSwgb3IgbnVsbCB3aXRoIGEgbnVsbAovLyB2b3RlZEF0SGVpZ2h0IHdoZW4gdGhlIGFkZHJlc3MgaGFzIG5vdCB2b3RlZC4gQmFsbG90cyBzdGF5IHJlYWRhYmxlIGFmdGVyIGEKLy8gcHJvcG9zYWwgaXMgZXhlY3V0ZWQsIGludmFsaWRhdGVkIG9yIGV4cGlyZWQ7IHRhbGxpZXMgZG8gbm90LgpmdW5jIChoICpIb3N0KSBCYWxsb3RKU09OKHByb3Bvc2FsSUQgc3RyaW5nLCB2b3RlciBhZGRyZXNzKSBzdHJpbmcgewoJaWQgOj0gcGFyc2VEZWNpbWFsSUQocHJvcG9zYWxJRCwgInByb3Bvc2FsIGlkIikKCXAgOj0gaC5wcm9wb3NhbChpZCkKCWkgOj0gcm9zdGVySW5kZXgoaC5yb3N0ZXJzW3Aucm9zdGVyXSwgdm90ZXIpCgljaG9pY2UsIGhlaWdodCA6PSAibnVsbCIsICJudWxsIgoJaWYgaSA+PSAwICYmIHAuY2hvaWNlc1tpXSAhPSAiIiB7CgkJY2hvaWNlID0gYmFsbG90Q2hvaWNlSlNPTihwLmNob2ljZXNbaV0pCgkJaGVpZ2h0ID0gcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0SW50KHAudm90ZWRBdFtpXSwgMTApKQoJfQoJcmV0dXJuIGB7InNjaGVtYSI6YCArIHF1b3RlSlNPTihoLnJlYWRTY2hlbWEoKSkgKyBgLCJwcm9wb3NhbElkIjpgICsgcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApKSArIGAsInZvdGVyIjpgICsgcXVvdGVKU09OKHN0cmluZyh2b3RlcikpICsgYCwiZWxpZ2libGUiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woaSA+PSAwKSArIGAsImNob2ljZSI6YCArIGNob2ljZSArIGAsInZvdGVkQXRIZWlnaHQiOmAgKyBoZWlnaHQgKyBgfWAKfQoKLy8gUGVuZGluZ1ZvdGVzSlNPTiBsaXN0cywgbmV3ZXN0IGZpcnN0LCB0aGUgcHJvcG9zYWxzIHRoYXQgYXJlIHN0aWxsIG9wZW4gZm9yCi8vIHZvdGluZyB3aGVyZSB2b3RlciBpcyBpbiB0aGUgZnJvemVuIGVsZWN0b3JhdGUgYW5kIGhhcyBub3Qgdm90ZWQuIGJlZm9yZSBpcwovLyBhbiBleGNsdXNpdmUgZGVjaW1hbCBjdXJzb3IgKCIiIG9yICIwIiBmb3IgbmV3ZXN0KTsgbGltaXQgaXMgY2xhbXBlZCB0bwovLyAxLi5NYXhQZW5kaW5nUGFnZS4gRXhlY3V0aW5nIGFueSBhY3Rpb24gaW52YWxpZGF0ZXMgZXZlcnkgb2xkZXIgb3BlbgovLyBwcm9wb3NhbCwgYW5kIGRlYWRsaW5lcyBmb2xsb3cgY3JlYXRpb24gb3JkZXIsIHNvIHRoZSBzY2FuIHN0b3BzIGF0IHRoZSBmaXJzdAovLyBwcm9wb3NhbCB0aGF0IG5vIGxvbmdlciBhY2NlcHRzIHZvdGVzOiBub3RoaW5nIG9sZGVyIGNhbiBiZSBwZW5kaW5nLiBUaGUKLy8gc2NhbiBhbHNvIHN0b3BzIGFmdGVyIE1heFBlbmRpbmdTY2FuIHByb3Bvc2FsczsgbmV4dCB0aGVuIHJlc3VtZXMgaXQuIG5leHQKLy8gaXMgbnVsbCB3aGVuIG5vdGhpbmcgb2xkZXIgY2FuIGJlIHBlbmRpbmcuCmZ1bmMgKGggKkhvc3QpIFBlbmRpbmdWb3Rlc0pTT04odm90ZXIgYWRkcmVzcywgYmVmb3JlIHN0cmluZywgbGltaXQgaW50KSBzdHJpbmcgewoJaWYgbGltaXQgPCAxIHsKCQlsaW1pdCA9IDEKCX0KCWlmIGxpbWl0ID4gTWF4UGVuZGluZ1BhZ2UgewoJCWxpbWl0ID0gTWF4UGVuZGluZ1BhZ2UKCX0KCWNvdW50IDo9IGguUHJvcG9zYWxDb3VudCgpCglpZCA6PSBjb3VudAoJaWYgYmVmb3JlICE9ICIiICYmIGJlZm9yZSAhPSAiMCIgewoJCWN1cnNvciA6PSBwYXJzZURlY2ltYWxJRChiZWZvcmUsICJwcm9wb3NhbCBjdXJzb3IiKQoJCWlmIGN1cnNvciA+IGNvdW50IHsKCQkJcGFuaWMoImludmFsaWQgcHJvcG9zYWwgY3Vyc29yIikKCQl9CgkJaWQgPSBjdXJzb3IgLSAxCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYHsic2NoZW1hIjpgICsgcXVvdGVKU09OKGgucmVhZFNjaGVtYSgpKSArIGAsInZvdGVyIjpgICsgcXVvdGVKU09OKHN0cmluZyh2b3RlcikpICsgYCwiaXRlbXMiOltgKQoJbiwgc2Nhbm5lZCwgY2xvc2VkIDo9IDAsIDAsIGZhbHNlCglmb3IgaWQgPiAwICYmIG4gPCBsaW1pdCAmJiBzY2FubmVkIDwgTWF4UGVuZGluZ1NjYW4gewoJCXAgOj0gaC5wcm9wb3NhbHNbaWQtMV0KCQlzIDo9IHAuYmFsbG90LlN0YXRlKCkKCQlpZiBzLkNvbnN1bWVkIHx8IHMuSW52YWxpZGF0ZWQgfHwgcy5Wb3RpbmdDbG9zZWQgewoJCQljbG9zZWQgPSB0cnVlCgkJCWJyZWFrCgkJfQoJCXNjYW5uZWQrKwoJCWkgOj0gcm9zdGVySW5kZXgoaC5yb3N0ZXJzW3Aucm9zdGVyXSwgdm90ZXIpCgkJaWYgaSA+PSAwICYmIHAuY2hvaWNlc1tpXSA9PSAiIiB7CgkJCWlmIG4gPiAwIHsKCQkJCWIuV3JpdGVCeXRlKCcsJykKCQkJfQoJCQliLldyaXRlU3RyaW5nKHByb3Bvc2FsSlNPTihoLlByb3Bvc2FsKGlkKSkpCgkJCW4rKwoJCX0KCQlpZC0tCgl9CgliLldyaXRlU3RyaW5nKGBdLCJuZXh0IjpgKQoJaWYgY2xvc2VkIHx8IGlkID09IDAgewoJCWIuV3JpdGVTdHJpbmcoIm51bGwiKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKHF1b3RlSlNPTihzdHJjb252LkZvcm1hdFVpbnQoaWQrMSwgMTApKSkKCX0KCWIuV3JpdGVCeXRlKCd9JykKCXJldHVybiBiLlN0cmluZygpCn0KGrkdChNyZXZpZXdzX2FjdGlvbnMuZ25vEqEdcGFja2FnZSBtZW1iYV93ZWlnaHRlZF9ob3N0CgppbXBvcnQgKAoJImNoYWluIgoJImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9wb2xpY3kiCgkic3RyY29udiIKKQoKY29uc3QgUmV2aWV3c1YxUGF0aCA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcmV2aWV3c192MSIKY29uc3QgUmV2aWV3c1YyUGF0aCA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcmV2aWV3c192MiIKCnR5cGUgUmV2aWV3c1BvbGljeSBzdHJ1Y3QgewoJZGFvICAgICAgIGFkZHJlc3MKCXRhcmdldCAgICBzdHJpbmcKCXN1Y2Nlc3NvciBhZGRyZXNzCn0KCmZ1bmMgTmV3UmV2aWV3c1BvbGljeShkYW8gYWRkcmVzcywgdGFyZ2V0IHN0cmluZywgc3VjY2Vzc29yIGFkZHJlc3MpIFJldmlld3NQb2xpY3kgewoJaWYgZGFvICE9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvIikgewoJCXBhbmljKCJyZXZpZXdzIHBvbGljeSByZXF1aXJlcyB0aGUgZm91bmRpbmcgREFPIGFkZHJlc3MiKQoJfQoJaWYgdGFyZ2V0ICE9IFJldmlld3NWMVBhdGggJiYgdGFyZ2V0ICE9IFJldmlld3NWMlBhdGggewoJCXBhbmljKCJ1bnN1cHBvcnRlZCByZXZpZXdzIHRhcmdldCIpCgl9CglpZiAhc3VjY2Vzc29yLklzVmFsaWQoKSB8fCBzdWNjZXNzb3IgPT0gZGFvIHx8IHN1Y2Nlc3NvciA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyh0YXJnZXQpIHsKCQlwYW5pYygicmV2aWV3cyBwb2xpY3kgcmVxdWlyZXMgYSB2YWxpZCBkaXN0aW5jdCBzdWNjZXNzb3IiKQoJfQoJcmV0dXJuIFJldmlld3NQb2xpY3l7ZGFvOiBkYW8sIHRhcmdldDogdGFyZ2V0LCBzdWNjZXNzb3I6IHN1Y2Nlc3Nvcn0KfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIERBTygpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gcC5kYW8gfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIFRhcmdldCgpIHN0cmluZyAgICAgeyByZXR1cm4gcC50YXJnZXQgfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIFN1Y2Nlc3NvcigpIGFkZHJlc3MgeyByZXR1cm4gcC5zdWNjZXNzb3IgfQoKdHlwZSBSZXZpZXdzQWN0aW9uS2luZCBzdHJpbmcKCmNvbnN0ICgKCVJldmlld3NBY2NlcHRNb2RlcmF0b3IgUmV2aWV3c0FjdGlvbktpbmQgPSAiYWNjZXB0LW1vZGVyYXRvciIKCVJldmlld3NSZXR1cm5Nb2RlcmF0b3IgUmV2aWV3c0FjdGlvbktpbmQgPSAicmV0dXJuLW1vZGVyYXRvciIKCVJldmlld3NBYm9ydFJldHVybiAgICAgUmV2aWV3c0FjdGlvbktpbmQgPSAiYWJvcnQtcmV0dXJuIgoJUmV2aWV3c0hpZGVSZXZpZXcgICAgICBSZXZpZXdzQWN0aW9uS2luZCA9ICJoaWRlLXJldmlldyIKCVJldmlld3NIaWRlQ29tbWVudCAgICAgUmV2aWV3c0FjdGlvbktpbmQgPSAiaGlkZS1jb21tZW50IgoJUmV2aWV3c1VuaGlkZSAgICAgICAgICBSZXZpZXdzQWN0aW9uS2luZCA9ICJ1bmhpZGUiCikKCnR5cGUgUmV2aWV3c0FjdGlvbiBzdHJ1Y3QgewoJa2luZCAgICAgIFJldmlld3NBY3Rpb25LaW5kCgl0YXJnZXQgICAgc3RyaW5nCglpZCAgICAgICAgdWludDY0CglyZWNpcGllbnQgYWRkcmVzcwp9CgpmdW5jIChwIFJldmlld3NQb2xpY3kpIEFjY2VwdCgpIFJldmlld3NBY3Rpb24gewoJcmV0dXJuIFJldmlld3NBY3Rpb257a2luZDogUmV2aWV3c0FjY2VwdE1vZGVyYXRvciwgdGFyZ2V0OiBwLnRhcmdldH0KfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIFJldHVybigpIFJldmlld3NBY3Rpb24gewoJcmV0dXJuIFJldmlld3NBY3Rpb257a2luZDogUmV2aWV3c1JldHVybk1vZGVyYXRvciwgdGFyZ2V0OiBwLnRhcmdldCwgcmVjaXBpZW50OiBwLnN1Y2Nlc3Nvcn0KfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIEFib3J0UmV0dXJuKCkgUmV2aWV3c0FjdGlvbiB7CglyZXR1cm4gUmV2aWV3c0FjdGlvbntraW5kOiBSZXZpZXdzQWJvcnRSZXR1cm4sIHRhcmdldDogcC50YXJnZXQsIHJlY2lwaWVudDogcC5zdWNjZXNzb3J9Cn0KZnVuYyAocCBSZXZpZXdzUG9saWN5KSBIaWRlUmV2aWV3KGlkIHVpbnQ2NCkgUmV2aWV3c0FjdGlvbiB7CglyZXR1cm4gcC5pdGVtQWN0aW9uKFJldmlld3NIaWRlUmV2aWV3LCBpZCkKfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIEhpZGVDb21tZW50KGlkIHVpbnQ2NCkgUmV2aWV3c0FjdGlvbiB7CglyZXR1cm4gcC5pdGVtQWN0aW9uKFJldmlld3NIaWRlQ29tbWVudCwgaWQpCn0KZnVuYyAocCBSZXZpZXdzUG9saWN5KSBVbmhpZGUoaWQgdWludDY0KSBSZXZpZXdzQWN0aW9uIHsgcmV0dXJuIHAuaXRlbUFjdGlvbihSZXZpZXdzVW5oaWRlLCBpZCkgfQpmdW5jIChwIFJldmlld3NQb2xpY3kpIGl0ZW1BY3Rpb24oa2luZCBSZXZpZXdzQWN0aW9uS2luZCwgaWQgdWludDY0KSBSZXZpZXdzQWN0aW9uIHsKCWlmIGlkID09IDAgewoJCXBhbmljKCJyZXZpZXdzIGl0ZW0gSUQgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CglyZXR1cm4gUmV2aWV3c0FjdGlvbntraW5kOiBraW5kLCB0YXJnZXQ6IHAudGFyZ2V0LCBpZDogaWR9Cn0KZnVuYyAoYSBSZXZpZXdzQWN0aW9uKSBLaW5kKCkgUmV2aWV3c0FjdGlvbktpbmQgeyByZXR1cm4gYS5raW5kIH0KZnVuYyAoYSBSZXZpZXdzQWN0aW9uKSBUYXJnZXQoKSBzdHJpbmcgICAgICAgICAgeyByZXR1cm4gYS50YXJnZXQgfQpmdW5jIChhIFJldmlld3NBY3Rpb24pIElEKCkgdWludDY0ICAgICAgICAgICAgICB7IHJldHVybiBhLmlkIH0KZnVuYyAoYSBSZXZpZXdzQWN0aW9uKSBSZWNpcGllbnQoKSBhZGRyZXNzICAgICAgeyByZXR1cm4gYS5yZWNpcGllbnQgfQpmdW5jIChhIFJldmlld3NBY3Rpb24pIENhdGVnb3J5KCkgbWVtYmFfd2VpZ2h0ZWRfcG9saWN5LkNhdGVnb3J5IHsKCWEuQnl0ZXMoKQoJc3dpdGNoIGEua2luZCB7CgljYXNlIFJldmlld3NIaWRlUmV2aWV3LCBSZXZpZXdzSGlkZUNvbW1lbnQsIFJldmlld3NVbmhpZGU6CgkJcmV0dXJuIG1lbWJhX3dlaWdodGVkX3BvbGljeS5Sb3V0aW5lCglkZWZhdWx0OgoJCXJldHVybiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuQ3JpdGljYWwKCX0KfQpmdW5jIChhIFJldmlld3NBY3Rpb24pIEJ5dGVzKCkgc3RyaW5nIHsKCWlmIGEudGFyZ2V0ICE9IFJldmlld3NWMVBhdGggJiYgYS50YXJnZXQgIT0gUmV2aWV3c1YyUGF0aCB7CgkJcGFuaWMoInVuc3VwcG9ydGVkIHJldmlld3MgdGFyZ2V0IikKCX0KCXN3aXRjaCBhLmtpbmQgewoJY2FzZSBSZXZpZXdzQWNjZXB0TW9kZXJhdG9yOgoJCWlmIGEuaWQgIT0gMCB8fCBhLnJlY2lwaWVudCAhPSAiIiB7CgkJCXBhbmljKCJtYWxmb3JtZWQgcmV2aWV3cyBhdXRob3JpdHkgYWN0aW9uIikKCQl9CgljYXNlIFJldmlld3NSZXR1cm5Nb2RlcmF0b3IsIFJldmlld3NBYm9ydFJldHVybjoKCQlpZiBhLmlkICE9IDAgfHwgIWEucmVjaXBpZW50LklzVmFsaWQoKSB7CgkJCXBhbmljKCJtYWxmb3JtZWQgcmV2aWV3cyBhdXRob3JpdHkgYWN0aW9uIikKCQl9CgljYXNlIFJldmlld3NIaWRlUmV2aWV3LCBSZXZpZXdzSGlkZUNvbW1lbnQsIFJldmlld3NVbmhpZGU6CgkJaWYgYS5pZCA9PSAwIHx8IGEucmVjaXBpZW50ICE9ICIiIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCByZXZpZXdzIGl0ZW0gYWN0aW9uIikKCQl9CglkZWZhdWx0OgoJCXBhbmljKCJ1bnN1cHBvcnRlZCByZXZpZXdzIGFjdGlvbiIpCgl9CglyZXR1cm4gInJldmlld3MvdjF8IiArIGEudGFyZ2V0ICsgInwiICsgc3RyaW5nKGEua2luZCkgKyAifCIgKyBzdHJjb252LkZvcm1hdFVpbnQoYS5pZCwgMTApICsgInwiICsgc3RyaW5nKGEucmVjaXBpZW50KQp9ChqWJgoQcmV2aWV3c19ob3N0LmdubxKBJnBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgoKLy8gUmV2aWV3c0l0ZW0gY29udGFpbnMgY29waWVkIG1vZGVyYXRpb24tcmVsZXZhbnQgc3RhdGUgb25seS4gT3JkaW5hcnkgcmVhY3Rpb25zCi8vIGRvIG5vdCBpbnZhbGlkYXRlIG1vZGVyYXRpb247IGNvbnRlbnQgZWRpdHMsIGRlbGV0aW9uIGFuZCB2aXNpYmlsaXR5IGRvLgp0eXBlIFJldmlld3NJdGVtIHN0cnVjdCB7CglJRCAgICAgICAgdWludDY0CglSZXZpZXcgICAgYm9vbAoJUGFyZW50SUQgIHVpbnQ2NAoJU3ViamVjdCAgIHN0cmluZwoJQXV0aG9yICAgIGFkZHJlc3MKCVJhdGluZyAgICBpbnQKCUJvZHlIYXNoICBzdHJpbmcKCUNyZWF0ZWRBdCBpbnQ2NAoJRWRpdGVkQXQgIGludDY0CglIaWRkZW4gICAgYm9vbAoJRGVsZXRlZCAgIGJvb2wKCUZsYWdnZWQgICBib29sCn0KdHlwZSBSZXZpZXdzU3RhdGUgc3RydWN0IHsKCU1vZGVyYXRvciAgICAgICAgYWRkcmVzcwoJUGVuZGluZ01vZGVyYXRvciBhZGRyZXNzCglJdGVtICAgICAgICAgICAgIFJldmlld3NJdGVtCn0KdHlwZSByZXZpZXdzUHJvcG9zYWwgc3RydWN0IHsKCWFjdGlvbiBSZXZpZXdzQWN0aW9uCgliZWZvcmUgUmV2aWV3c1N0YXRlCn0KCmZ1bmMgYXR0YWNoUmV2aWV3cyhoICpIb3N0LCBwb2xpY3kgUmV2aWV3c1BvbGljeSwgcmxtIHJlYWxtKSAqSG9zdCB7Cglwb2xpY3kgPSBOZXdSZXZpZXdzUG9saWN5KHBvbGljeS5EQU8oKSwgcG9saWN5LlRhcmdldCgpLCBwb2xpY3kuU3VjY2Vzc29yKCkpCglpZiBybG0uQWRkcmVzcygpICE9IHBvbGljeS5EQU8oKSB7CgkJcGFuaWMoInJldmlld3MgcG9saWN5IERBTyBkb2VzIG5vdCBvd24gdGhpcyBob3N0IikKCX0KCWgucmV2aWV3c1BvbGljeSA9ICZwb2xpY3kKCXJldHVybiBoCn0KZnVuYyBOZXdXaXRoUmV2aWV3cyhzZWF0cyBbXVNlYXQsIHBvbGljeSBSZXZpZXdzUG9saWN5LCBybG0gcmVhbG0pICpIb3N0IHsKCXJldHVybiBhdHRhY2hSZXZpZXdzKE5ldyhzZWF0cywgcmxtKSwgcG9saWN5LCBybG0pCn0KZnVuYyBOZXdXaXRoTWFya2V0QW5kUmV2aWV3cyhzZWF0cyBbXVNlYXQsIG1hcmtldCBNYXJrZXRQb2xpY3ksIHJldmlld3MgUmV2aWV3c1BvbGljeSwgcmxtIHJlYWxtKSAqSG9zdCB7CglyZXR1cm4gYXR0YWNoUmV2aWV3cyhOZXdXaXRoTWFya2V0KHNlYXRzLCBtYXJrZXQsIHJsbSksIHJldmlld3MsIHJsbSkKfQpmdW5jIHJldmlld3NDb21taXRtZW50KGFjdGlvbiBSZXZpZXdzQWN0aW9uLCBiZWZvcmUgUmV2aWV3c1N0YXRlKSBzdHJpbmcgewoJcmV0dXJuIGFjdGlvbi5CeXRlcygpICsgInxiZWZvcmV8IiArIHJldmlld3NTdGF0ZUpTT04oYmVmb3JlKQp9CmZ1bmMgKGggKkhvc3QpIHZhbGlkYXRlUmV2aWV3cyhhIFJldmlld3NBY3Rpb24sIGJlZm9yZSBSZXZpZXdzU3RhdGUpIHsKCWlmIGgucmV2aWV3c1BvbGljeSA9PSBuaWwgewoJCXBhbmljKCJyZXZpZXdzIGFjdGlvbnMgYXJlIG5vdCBjb25maWd1cmVkIikKCX0KCWEuQnl0ZXMoKQoJcCA6PSBoLnJldmlld3NQb2xpY3kKCWlmIGEuVGFyZ2V0KCkgIT0gcC5UYXJnZXQoKSB7CgkJcGFuaWMoInJldmlld3MgdGFyZ2V0IGRvZXMgbm90IG1hdGNoIHBvbGljeSIpCgl9CglpZiAhYmVmb3JlLk1vZGVyYXRvci5Jc1ZhbGlkKCkgfHwgKGJlZm9yZS5QZW5kaW5nTW9kZXJhdG9yICE9ICIiICYmICFiZWZvcmUuUGVuZGluZ01vZGVyYXRvci5Jc1ZhbGlkKCkpIHsKCQlwYW5pYygiaW52YWxpZCByZXZpZXdzIGF1dGhvcml0eSBwcmUtc3RhdGUiKQoJfQoJaWYgYS5JRCgpID09IDAgJiYgYmVmb3JlLkl0ZW0gIT0gKFJldmlld3NJdGVte30pIHsKCQlwYW5pYygidW5leHBlY3RlZCByZXZpZXdzIGl0ZW0gcHJlLXN0YXRlIikKCX0KCWlmIGEuS2luZCgpID09IFJldmlld3NBY2NlcHRNb2RlcmF0b3IgewoJCWlmIGJlZm9yZS5Nb2RlcmF0b3IgPT0gcC5EQU8oKSB8fCBiZWZvcmUuUGVuZGluZ01vZGVyYXRvciAhPSBwLkRBTygpIHsKCQkJcGFuaWMoIkRBTyBpcyBub3QgcGVuZGluZyByZXZpZXdzIG1vZGVyYXRvciIpCgkJfQoJCXJldHVybgoJfQoJaWYgYmVmb3JlLk1vZGVyYXRvciAhPSBwLkRBTygpIHsKCQlwYW5pYygiREFPIGlzIG5vdCByZXZpZXdzIG1vZGVyYXRvciIpCgl9CglpZiBhLktpbmQoKSA9PSBSZXZpZXdzQWJvcnRSZXR1cm4gewoJCWlmIGEuUmVjaXBpZW50KCkgIT0gcC5TdWNjZXNzb3IoKSB8fCBiZWZvcmUuUGVuZGluZ01vZGVyYXRvciAhPSBwLlN1Y2Nlc3NvcigpIHsKCQkJcGFuaWMoInJldmlld3MgcmV0dXJuIGRvZXMgbm90IG1hdGNoIHBvbGljeSIpCgkJfQoJCXJldHVybgoJfQoJaWYgYmVmb3JlLlBlbmRpbmdNb2RlcmF0b3IgIT0gIiIgewoJCXBhbmljKCJyZXZpZXdzIGF1dGhvcml0eSB0cmFuc2ZlciBpcyBwZW5kaW5nIikKCX0KCWlmIGEuS2luZCgpID09IFJldmlld3NSZXR1cm5Nb2RlcmF0b3IgewoJCWlmIGEuUmVjaXBpZW50KCkgIT0gcC5TdWNjZXNzb3IoKSB7CgkJCXBhbmljKCJyZXZpZXdzIHN1Y2Nlc3NvciBkb2VzIG5vdCBtYXRjaCBwb2xpY3kiKQoJCX0KCQlyZXR1cm4KCX0KCWl0ZW0gOj0gYmVmb3JlLkl0ZW0KCWlmIGl0ZW0uSUQgIT0gYS5JRCgpIHx8IGl0ZW0uSUQgPT0gMCB7CgkJcGFuaWMoInJldmlld3MgaXRlbSBub3QgZm91bmQiKQoJfQoJLy8gTGVnYWN5IHYxIHJldGFpbnMgZmxhZ2dlZC1pbmRleCBlbnRyaWVzIGFmdGVyIGRlbGV0aW9uLiBVbmhpZGUgbWF5CgkvLyBjbGVhciBvbmx5IHN1Y2ggYSBmbGFnZ2VkIHRvbWJzdG9uZTsgdGhlIGFkYXB0ZXIgcHJlc2VydmVzIERlbGV0ZWQuCglpZiBpdGVtLkRlbGV0ZWQgJiYgIShhLktpbmQoKSA9PSBSZXZpZXdzVW5oaWRlICYmIGl0ZW0uRmxhZ2dlZCkgewoJCXBhbmljKCJyZXZpZXdzIGl0ZW0gaXMgZGVsZXRlZCIpCgl9CglpZiAhaXRlbS5BdXRob3IuSXNWYWxpZCgpIHx8IGxlbihpdGVtLkJvZHlIYXNoKSAhPSA2NCB7CgkJcGFuaWMoImludmFsaWQgcmV2aWV3cyBpdGVtIHByZS1zdGF0ZSIpCgl9CglpZiBpdGVtLlJldmlldyB7CgkJaWYgaXRlbS5QYXJlbnRJRCAhPSAwIHx8IGl0ZW0uU3ViamVjdCA9PSAiIiB8fCBpdGVtLlJhdGluZyA8IDEgfHwgaXRlbS5SYXRpbmcgPiA1IHsKCQkJcGFuaWMoImludmFsaWQgcmV2aWV3IHByZS1zdGF0ZSIpCgkJfQoJfSBlbHNlIGlmIGl0ZW0uUGFyZW50SUQgPT0gMCB8fCBpdGVtLlN1YmplY3QgIT0gIiIgfHwgaXRlbS5SYXRpbmcgIT0gMCB7CgkJcGFuaWMoImludmFsaWQgY29tbWVudCBwcmUtc3RhdGUiKQoJfQoJc3dpdGNoIGEuS2luZCgpIHsKCWNhc2UgUmV2aWV3c0hpZGVSZXZpZXc6CgkJaWYgIWl0ZW0uUmV2aWV3IHsKCQkJcGFuaWMoInJldmlld3MgaXRlbSBpcyBub3QgYSByZXZpZXciKQoJCX0KCQlpZiBpdGVtLkhpZGRlbiB7CgkJCXBhbmljKCJyZXZpZXdzIGhpZGUgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBSZXZpZXdzSGlkZUNvbW1lbnQ6CgkJaWYgaXRlbS5SZXZpZXcgewoJCQlwYW5pYygicmV2aWV3cyBpdGVtIGlzIG5vdCBhIGNvbW1lbnQiKQoJCX0KCQlpZiBpdGVtLkhpZGRlbiB7CgkJCXBhbmljKCJyZXZpZXdzIGhpZGUgaXMgYSBuby1vcCIpCgkJfQoJY2FzZSBSZXZpZXdzVW5oaWRlOgoJCWlmICFpdGVtLkhpZGRlbiAmJiAhaXRlbS5GbGFnZ2VkIHsKCQkJcGFuaWMoInJldmlld3MgdW5oaWRlIGlzIGEgbm8tb3AiKQoJCX0KCWRlZmF1bHQ6CgkJcGFuaWMoInVuc3VwcG9ydGVkIHJldmlld3MgYWN0aW9uIikKCX0KfQpmdW5jIChoICpIb3N0KSBQcm9wb3NlUmV2aWV3cyhhY3Rpb24gUmV2aWV3c0FjdGlvbiwgYmVmb3JlIFJldmlld3NTdGF0ZSwgcmxtIHJlYWxtKSB1aW50NjQgewoJd2hvIDo9IGFzc2VydENhbGxlcihoLCBybG0pCgloLnZhbGlkYXRlUmV2aWV3cyhhY3Rpb24sIGJlZm9yZSkKCXAgOj0gJnJvbGVQcm9wb3NhbHtwcm9wb3Nlcjogd2hvLCByZXZpZXdzOiAmcmV2aWV3c1Byb3Bvc2Fse2FjdGlvbjogYWN0aW9uLCBiZWZvcmU6IGJlZm9yZX19CglwLmJhbGxvdCA9IGgucG9saWN5Lk5ld1Byb3Bvc2FsKGFjdGlvbi5DYXRlZ29yeSgpLCByZXZpZXdzQ29tbWl0bWVudChhY3Rpb24sIGJlZm9yZSkpCgloLmFkZFByb3Bvc2FsKHApCglyZXR1cm4gdWludDY0KGxlbihoLnByb3Bvc2FscykpCn0KCi8vIE9ubHkgdGhlIG93bmluZyByZWFsbSdzIGZpeGVkIGFkYXB0ZXIgbWF5IHVzZSB0aGlzLiBLZWVwIEhvc3QgcHJpdmF0ZSBhbmQKLy8gbGV0IHRhcmdldCBwYW5pY3MvcG9zdGNvbmRpdGlvbiBmYWlsdXJlcyBhYm9ydCB0aGUgZW50aXJlIHRyYW5zYWN0aW9uLgpmdW5jIChoICpIb3N0KSBDb25zdW1lUmV2aWV3cyhpZCB1aW50NjQsIGJlZm9yZSBSZXZpZXdzU3RhdGUsIHJsbSByZWFsbSkgUmV2aWV3c0FjdGlvbiB7Cglhc3NlcnRDYWxsZXIoaCwgcmxtKQoJcCA6PSBoLnByb3Bvc2FsKGlkKQoJaWYgcC5yZXZpZXdzID09IG5pbCB7CgkJcGFuaWMoInByb3Bvc2FsIGlzIG5vdCBhIHJldmlld3MgYWN0aW9uIikKCX0KCWgudmFsaWRhdGVSZXZpZXdzKHAucmV2aWV3cy5hY3Rpb24sIGJlZm9yZSkKCXAuYmFsbG90LkNvbnN1bWUocmV2aWV3c0NvbW1pdG1lbnQocC5yZXZpZXdzLmFjdGlvbiwgYmVmb3JlKSkKCW1lbWJlcnMgOj0gW11tZW1iYV93ZWlnaHRlZF9wb2xpY3kuTWVtYmVye30KCWZvciBfLCBzZWF0IDo9IHJhbmdlIGguc2VhdHMgewoJCW1lbWJlcnMgPSBhcHBlbmQobWVtYmVycywgc2VhdC5NZW1iZXIpCgl9CgloLnBvbGljeS5SZWNvbmZpZ3VyZShtZW1iZXJzKQoJaC5yZWNvcmRJbnZhbGlkYXRpb24oSW52YWxpZGF0ZWRCeUV4ZWN1dGlvbiwgaWQsIGgucmV2aWV3c1BvbGljeS5UYXJnZXQoKSkKCXJldHVybiBwLnJldmlld3MuYWN0aW9uCn0KGtcMChFyZXZpZXdzX3JlYWRzLmdubxLBDHBhY2thZ2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdAoKaW1wb3J0ICJzdHJjb252IgoKZnVuYyAoaCAqSG9zdCkgcmV2aWV3c0NvbmZpZ0pTT04oKSBzdHJpbmcgewoJaWYgaC5yZXZpZXdzUG9saWN5ID09IG5pbCB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gYCwicmV2aWV3c1BvbGljeSI6eyJ0YXJnZXQiOmAgKyBxdW90ZUpTT04oaC5yZXZpZXdzUG9saWN5LlRhcmdldCgpKSArIGAsInN1Y2Nlc3NvciI6YCArIHF1b3RlSlNPTihzdHJpbmcoaC5yZXZpZXdzUG9saWN5LlN1Y2Nlc3NvcigpKSkgKyBgLCJtb2RlcmF0aW9uQ2F0ZWdvcnkiOiJyb3V0aW5lIiwicmV0dXJuU3RhZ2VzT25seSI6dHJ1ZSwiaW52YWxpZGF0ZXNPdGhlclByb3Bvc2FscyI6dHJ1ZX1gCn0KZnVuYyByZXZpZXdzSXRlbUpTT04oaSBSZXZpZXdzSXRlbSkgc3RyaW5nIHsKCXJldHVybiBgeyJpZCI6YCArIHF1b3RlSlNPTihzdHJjb252LkZvcm1hdFVpbnQoaS5JRCwgMTApKSArIGAsInJldmlldyI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChpLlJldmlldykgKyBgLCJwYXJlbnRJZCI6YCArIHF1b3RlSlNPTihzdHJjb252LkZvcm1hdFVpbnQoaS5QYXJlbnRJRCwgMTApKSArIGAsInN1YmplY3QiOmAgKyBxdW90ZUpTT04oaS5TdWJqZWN0KSArIGAsImF1dGhvciI6YCArIHF1b3RlSlNPTihzdHJpbmcoaS5BdXRob3IpKSArIGAsInJhdGluZyI6YCArIHF1b3RlSlNPTihzdHJjb252Lkl0b2EoaS5SYXRpbmcpKSArIGAsImJvZHlIYXNoIjpgICsgcXVvdGVKU09OKGkuQm9keUhhc2gpICsgYCwiY3JlYXRlZEF0SGVpZ2h0IjpgICsgcXVvdGVKU09OKHN0cmNvbnYuRm9ybWF0SW50KGkuQ3JlYXRlZEF0LCAxMCkpICsgYCwiZWRpdGVkQXRIZWlnaHQiOmAgKyBxdW90ZUpTT04oc3RyY29udi5Gb3JtYXRJbnQoaS5FZGl0ZWRBdCwgMTApKSArIGAsImhpZGRlbiI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChpLkhpZGRlbikgKyBgLCJkZWxldGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGkuRGVsZXRlZCkgKyBgLCJmbGFnZ2VkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGkuRmxhZ2dlZCkgKyBgfWAKfQpmdW5jIHJldmlld3NTdGF0ZUpTT04ocyBSZXZpZXdzU3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYHsibW9kZXJhdG9yIjpgICsgcXVvdGVKU09OKHN0cmluZyhzLk1vZGVyYXRvcikpICsgYCwicGVuZGluZ01vZGVyYXRvciI6YCArIHF1b3RlSlNPTihzdHJpbmcocy5QZW5kaW5nTW9kZXJhdG9yKSkgKyBgLCJpdGVtIjpgICsgcmV2aWV3c0l0ZW1KU09OKHMuSXRlbSkgKyBgfWAKfQpmdW5jIHJldmlld3NBY3Rpb25KU09OKGEgUmV2aWV3c0FjdGlvbiwgcyBSZXZpZXdzU3RhdGUpIHN0cmluZyB7CglyZXR1cm4gYHsidHlwZSI6InJldmlld3MiLCJ0YXJnZXQiOmAgKyBxdW90ZUpTT04oYS5UYXJnZXQoKSkgKyBgLCJvcGVyYXRpb24iOmAgKyBxdW90ZUpTT04oc3RyaW5nKGEuS2luZCgpKSkgKyBgLCJpZCI6YCArIHF1b3RlSlNPTihzdHJjb252LkZvcm1hdFVpbnQoYS5JRCgpLCAxMCkpICsgYCwicmVjaXBpZW50IjpgICsgcXVvdGVKU09OKHN0cmluZyhhLlJlY2lwaWVudCgpKSkgKyBgLCJiZWZvcmUiOmAgKyByZXZpZXdzU3RhdGVKU09OKHMpICsgYH1gCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0yNTAwMDAwMHVnbm90EhMIgMq17gESCzUwMDAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQKqI9YfTAFB6l3cGU0XBUUKYxPqI27ZBbhACjcxiFlFKVXP5UmlmjMcoHmil2uXDi2vpVUMvYosKagpWNxoTuYsSQDAuZV/CY4npYEmZ5dL5/Sz6fgvooQHs61n6BYbxPqZaMxFCP1kL2ePOWPE7Y48aoqmvxmZY+5oV+T5Loufa6L8aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data