Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
17554817E5D721FEC5A9F1F9741B0216F5FA1169568A684E3739F6814EB6F6A6
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
91,143,400
Requested gas limit
GAS USED
45,571,730
Gas consumed
FEE
91144ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1ftls0ctrrj0y96sr9dq906j7gdqhg9exgcvaey
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CuDzAQoML3ZtLm1fYWRkcGtnEs7zAQooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRKg8wEKBHVzZXISHGduby5sYW5kL3IvYWtrYWRpYS9iZXRhL3VzZXIaywcKCmNvbmZpZy5nbm8SvAdwYWNrYWdlIHVzZXIKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKKQoKY29uc3QgKAoJU2V0TGlzdExpbWl0RXZlbnQgPSAiU2V0TGlzdExpbWl0IgoJU2V0RnJvemVuRXZlbnQgICAgPSAiU2V0RnJvemVuIgopCgp2YXIgKAoJbGlzdExpbWl0IGludCA9IDEwMCAvLyBNYXggaXRlbXMgcGVyIGxpc3QgcXVlcnkKCWlzRnJvemVuICAgICAgPSB0cnVlCikKCmZ1bmMgU2V0TGlzdExpbWl0KGN1ciByZWFsbSwgbGltaXQgaW50KSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJaWYgbGltaXQgPCAxIHsKCQlwYW5pYygibGltaXQgbXVzdCBiZSBhdCBsZWFzdCAxIikKCX0KCglvbGRMaW1pdCA6PSBsaXN0TGltaXQKCWxpc3RMaW1pdCA9IGxpbWl0CgoJY2hhaW4uRW1pdCgKCQlTZXRMaXN0TGltaXRFdmVudCwKCQkib2xkTGltaXQiLCBzdHJjb252Lkl0b2Eob2xkTGltaXQpLAoJCSJuZXdMaW1pdCIsIHN0cmNvbnYuSXRvYShsaW1pdCksCgkpCn0KCmZ1bmMgR2V0TGlzdExpbWl0KCkgaW50IHsKCXJldHVybiBsaXN0TGltaXQKfQoKLy8gU2V0RnJvemVuIGNvbnRyb2xzIGRpcmVjdCB1c2VyIGNyZWF0aW9uIGFuZCBkZWxldGlvbiBvbmx5LgpmdW5jIFNldEZyb3plbihjdXIgcmVhbG0sIGZyb3plbiBib29sKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJb2xkRnJvemVuIDo9IGlzRnJvemVuCglpc0Zyb3plbiA9IGZyb3plbgoJY2hhaW4uRW1pdCgKCQlTZXRGcm96ZW5FdmVudCwKCQkib2xkRnJvemVuIiwgc3RyY29udi5Gb3JtYXRCb29sKG9sZEZyb3plbiksCgkJIm5ld0Zyb3plbiIsIHN0cmNvbnYuRm9ybWF0Qm9vbChmcm96ZW4pLAoJKQp9ChpCCgtnbm9tb2QudG9tbBIzbW9kdWxlID0gImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL3VzZXIiCmdubyA9ICIwLjkiGuEfCgpyZW5kZXIuZ25vEtIfcGFja2FnZSB1c2VyCgppbXBvcnQgKAoJIm5ldC91cmwiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2plcm9uaW1vYWxiaS9wYWdlci92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKKQoKLy8gUmVuZGVyIGhhbmRsZXMgUkVTVGZ1bCByb3V0aW5nIGFuZCByZXR1cm5zIE1hcmtkb3duIHJlc3BvbnNlcy4KZnVuYyBSZW5kZXIoaVVybCBzdHJpbmcpIHN0cmluZyB7Cglhc3NlcnRSZW5kZXJVUkxMZW4oaVVybCkKCXUsIGVyciA6PSB1cmwuUGFyc2UoaVVybCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiNDA0XG4iCgl9CgoJcXVlcnkgOj0gdS5RdWVyeSgpCgoJc3dpdGNoIHUuUGF0aCB7CgljYXNlICIiOgoJCXJldHVybiByZW5kZXJIb21lKCkKCWNhc2UgInVzZXJzIjoKCQlyZXR1cm4gcmVuZGVyVXNlcnNMaXN0KGlVcmwpCgljYXNlICJ1c2VyIjoKCQlhZGRyIDo9IGFkZHJlc3MocXVlcnkuR2V0KCJhZGRyZXNzIikpCgkJcmV0dXJuIHJlbmRlclVzZXIoaVVybCwgYWRkcikKCWRlZmF1bHQ6CgkJcmV0dXJuIHJlbmRlckVycm9yKCJOb3QgZm91bmQiKQoJfQp9CgpmdW5jIHJlbmRlckhvbWUoKSBzdHJpbmcgewoJb3V0cHV0IDo9IGAjIEFLS0FESUEgVXNlcgoKIyMgSW50cm9kdWN0aW9uCgpVc2VyIHJlYWxtIHN0b3JlcyBhZGRyZXNzLWtleWVkIHByb2ZpbGVzIGZvciBBS0tBRElBLgoKLSAqKmNyZWF0ZWRfYXQqKjogcmVjb3JkZWQgd2hlbiB0aGUgdXNlciBpcyBjcmVhdGVkCi0gKipwcm9wZXJ0aWVzKio6IGFkbWluLW1hbmFnZWQga2V5L3ZhbHVlIGF0dHJpYnV0ZXMKCiMjIFN0YXRzCgpgCglvdXRwdXQgKz0gIiogKipUb3RhbCBVc2VycyoqOiAiICsgc3RyY29udi5JdG9hKEdldFRvdGFsVXNlclNpemUoKSkgKyAiXG4iCglvdXRwdXQgKz0gYAojIyBRdWljayBMaW5rcwoKKiBbQnJvd3NlIFVzZXJzXSguL3VzZXI6dXNlcnMpCgojIyBVc2VyIExvb2t1cAoKPGduby1mb3JtIHBhdGg9InVzZXIiPgogIDxnbm8taW5wdXQgbmFtZT0iYWRkcmVzcyIgcGxhY2Vob2xkZXI9IkVudGVyIHRoZSBhZGRyZXNzIiAvPgo8L2duby1mb3JtPgpgCglyZXR1cm4gb3V0cHV0Cn0KCmZ1bmMgcmVuZGVyVXNlcnNMaXN0KGlVcmwgc3RyaW5nKSBzdHJpbmcgewoJb3V0cHV0IDo9ICIjIFVzZXJzXG5cbiIKCW91dHB1dCArPSAiW+KGkCBIb21lXSguL3VzZXI6KVxuXG4iCgoJdG90YWxVc2VycyA6PSBHZXRUb3RhbFVzZXJTaXplKCkKCWlmIHRvdGFsVXNlcnMgPT0gMCB7CgkJb3V0cHV0ICs9ICIqTm8gdXNlcnMgcmVnaXN0ZXJlZCB5ZXQuKlxuIgoJCXJldHVybiBvdXRwdXQKCX0KCglwYWdlcywgZXJyIDo9IHBhZ2VyLk5ldyhpVXJsLCB0b3RhbFVzZXJzLCBwYWdlci5XaXRoUGFnZVNpemUoMjApKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIHJlbmRlckVycm9yKCJJbnZhbGlkIHBhZ2UiKQoJfQoKCWN1cnJlbnRQYWdlIDo9IHBhZ2VzLlBhZ2UoKQoJYWRkclN0cnMgOj0gTGlzdFVzZXJzKGN1cnJlbnRQYWdlLCBwYWdlcy5QYWdlU2l6ZSgpKQoJZm9yIF8sIGFkZHJTdHIgOj0gcmFuZ2UgYWRkclN0cnMgewoJCW5pY2tuYW1lIDo9ICIiCgkJbGlzdGVkIDo9IExpc3RVc2Vyc0J5QWRkcmVzc2VzKGFkZHJlc3MoYWRkclN0cikpCgkJaWYgbGVuKGxpc3RlZCkgPiAwIHsKCQkJbmlja25hbWUgPSBsaXN0ZWRbMF1bIm5pY2tuYW1lIl0KCQl9CgkJaWYgbmlja25hbWUgIT0gIiIgewoJCQlvdXRwdXQgKz0gIiogWyIgKyBlc2NhcGVNYXJrZG93bihuaWNrbmFtZSkgKyAiICgiICsgYWRkclN0ciArICIpXSguL3VzZXI6dXNlcj9hZGRyZXNzPSIgKyBhZGRyU3RyICsgIiZwYWdlPSIgKyBzdHJjb252Lkl0b2EoY3VycmVudFBhZ2UpICsgIilcbiIKCQl9IGVsc2UgewoJCQlvdXRwdXQgKz0gIiogWyIgKyBhZGRyU3RyICsgIl0oLi91c2VyOnVzZXI/YWRkcmVzcz0iICsgYWRkclN0ciArICImcGFnZT0iICsgc3RyY29udi5JdG9hKGN1cnJlbnRQYWdlKSArICIpXG4iCgkJfQoJfQoKCWlmIHBhZ2VzLkhhc1BhZ2VzKCkgewoJCW91dHB1dCArPSAiXG4iICsgcGFnZXIuUGlja2VyKHBhZ2VzKQoJfQoKCXJldHVybiBvdXRwdXQKfQoKZnVuYyByZW5kZXJVc2VyKGlVcmwgc3RyaW5nLCBhZGRyIGFkZHJlc3MpIHN0cmluZyB7CglpZiAhYWRkci5Jc1ZhbGlkKCkgewoJCXJldHVybiByZW5kZXJFcnJvcigiSW52YWxpZCBhZGRyZXNzIikKCX0KCgl1LCBfIDo9IHVybC5QYXJzZShpVXJsKQoJcGFnZSA6PSBub3JtYWxpemVSZW5kZXJQYWdlKHUuUXVlcnkoKS5HZXQoInBhZ2UiKSkKCglhZGRyU3RyIDo9IGFkZHIuU3RyaW5nKCkKCWlmICFIYXNVc2VyKGFkZHIpIHsKCQlyZXR1cm4gcmVuZGVyRXJyb3IoIlVzZXIgbm90IGZvdW5kIikKCX0KCgl1c2VycyA6PSBMaXN0VXNlcnNCeUFkZHJlc3NlcyhhZGRyKQoKCW91dHB1dCA6PSAiIyBVc2VyIERldGFpbFxuXG4iCglpZiBwYWdlICE9ICIiIHsKCQlvdXRwdXQgKz0gIlvihpAgQmFjayB0byBMaXN0XSguL3VzZXI6dXNlcnM/cGFnZT0iICsgcGFnZSArICIpXG5cbiIKCX0gZWxzZSB7CgkJb3V0cHV0ICs9ICJb4oaQIEhvbWVdKC4vdXNlcjopXG5cbiIKCX0KCW91dHB1dCArPSAiKiAqKkFkZHJlc3MqKjogIiArIGFkZHJTdHIgKyAiIFtbVmlldyBvbiBFeHBsb3Jlcl0oIiArIGFkbWluLkdldEV4cGxvcmVyVVJMKCkgKyAiL20vZXhwbG9yZXIvcGxheWVyP2FkZHJlc3M9IiArIGFkZHJTdHIgKyAiKV1cblxuIgoKCWlmIGxlbih1c2VycykgPiAwIHsKCQlvdXRwdXQgKz0gIiMjIFByb3BlcnRpZXNcblxuIgoJCWZvciBrLCB2IDo9IHJhbmdlIHVzZXJzWzBdIHsKCQkJaWYgayA9PSAiYWRkcmVzcyIgewoJCQkJY29udGludWUKCQkJfQoJCQlvdXRwdXQgKz0gIiogKioiICsgZXNjYXBlTWFya2Rvd24oaykgKyAiKio6ICIgKyBlc2NhcGVNYXJrZG93bih2KSArICJcbiIKCQl9Cgl9CgoJcmV0dXJuIG91dHB1dAp9CgpmdW5jIG5vcm1hbGl6ZVJlbmRlclBhZ2UocmF3UGFnZSBzdHJpbmcpIHN0cmluZyB7CglpZiByYXdQYWdlID09ICIiIHsKCQlyZXR1cm4gIiIKCX0KCXBhZ2UsIGVyciA6PSBzdHJjb252LkF0b2kocmF3UGFnZSkKCWlmIGVyciAhPSBuaWwgfHwgcGFnZSA8IDEgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHN0cmNvbnYuSXRvYShwYWdlKQp9CgpmdW5jIHJlbmRlckVycm9yKG1lc3NhZ2Ugc3RyaW5nKSBzdHJpbmcgewoJb3V0cHV0IDo9ICIjIEVycm9yXG5cbiIKCW91dHB1dCArPSAiPiAiICsgbWVzc2FnZSArICJcblxuIgoJb3V0cHV0ICs9ICJb4oaQIEJhY2sgdG8gSG9tZV0oLi91c2VyOilcbiIKCXJldHVybiBvdXRwdXQKfQoKZnVuYyBlc2NhcGVNYXJrZG93bihzIHN0cmluZykgc3RyaW5nIHsKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIlxcIiwgIlxcXFwiKQoJcyA9IHN0cmluZ3MuUmVwbGFjZUFsbChzLCAiXG4iLCAiXFxuIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgImAiLCAiXFxgIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIioiLCAiXFwqIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIl8iLCAiXFxfIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgInsiLCAiXFx7IikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIn0iLCAiXFx9IikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIlsiLCAiXFxbIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIl0iLCAiXFxdIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIigiLCAiXFwoIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIikiLCAiXFwpIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIiMiLCAiXFwjIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIisiLCAiXFwrIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIi0iLCAiXFwtIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIi4iLCAiXFwuIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIiEiLCAiXFwhIikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgInwiLCAiXFx8IikKCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIj4iLCAiXFw+IikKCXJldHVybiBzCn0KGskaCg9yZW5kZXJfdGVzdC5nbm8StRpwYWNrYWdlIHVzZXIKCmltcG9ydCAoCgkibmV0L3VybCIKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKZnVuYyBUZXN0UmVuZGVyRXNjYXBlc01hcmtkb3duU2Vuc2l0aXZlVXNlclZhbHVlcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCgluaWNrbmFtZSA6PSAiTiBbeF0oeSkgKipiKioiCglpbnRybyA6PSAiKipib2xkKiogW2xpbmtdKGh0dHBzOi8vZXhhbXBsZS5pbnZhbGlkKVxuIyBoZWFkaW5nIgoKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJQWRtaW5VcGRhdGVVc2VyKGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyLCAibmlja25hbWUsaW50cm9kdWN0aW9uIiwgdXJsLlBhdGhFc2NhcGUobmlja25hbWUpKyIsIit1cmwuUGF0aEVzY2FwZShpbnRybykpCgoJZGV0YWlsIDo9IFJlbmRlcigidXNlcj9hZGRyZXNzPSIgKyByZWd1bGFyVXNlci5TdHJpbmcoKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGRldGFpbCwgYE4gXFt4XF1cKHlcKSBcKlwqYlwqXCpgKSwgIm5pY2tuYW1lIHNob3VsZCBiZSBlc2NhcGVkIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGRldGFpbCwgYFwqXCpib2xkXCpcKiBcW2xpbmtcXVwoaHR0cHM6Ly9leGFtcGxlXC5pbnZhbGlkXClcblwjIGhlYWRpbmdgKSwgInByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBlc2NhcGVkIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhkZXRhaWwsICJbbGlua10oaHR0cHM6Ly9leGFtcGxlLmludmFsaWQpIiksICJwcm9wZXJ0eSBsaW5rIHN5bnRheCBzaG91bGQgbm90IHJlbWFpbiByYXciKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGRldGFpbCwgIlxuIyBoZWFkaW5nIiksICJwcm9wZXJ0eSBuZXdsaW5lIGhlYWRpbmcgc2hvdWxkIG5vdCByZW1haW4gcmF3IikKCglsaXN0IDo9IFJlbmRlcigidXNlcnMiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMobGlzdCwgYE4gXFt4XF1cKHlcKSBcKlwqYlwqXCpgKSwgImxpc3Qgbmlja25hbWUgc2hvdWxkIGJlIGVzY2FwZWQiKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGxpc3QsICJbcHJvZmlsZV0ocHJvZmlsZS1wYWdlKSIpLCAibGlzdCBuaWNrbmFtZSBsaW5rIHN5bnRheCBzaG91bGQgbm90IHJlbWFpbiByYXciKQp9CgpmdW5jIFRlc3RSZW5kZXJFcnJvcnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgoJaW52YWxpZCA6PSBSZW5kZXIoInVzZXI/YWRkcmVzcz1pbnZhbGlkLWFkZHJlc3MiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW52YWxpZCwgIkludmFsaWQgYWRkcmVzcyIpLCAicmVuZGVyIG91dHB1dCBzaG91bGQgY29udGFpbiBleHBlY3RlZCBlcnJvciIpCgoJbWlzc2luZyA6PSBSZW5kZXIoInVzZXI/YWRkcmVzcz0iICsgcmVndWxhclVzZXIuU3RyaW5nKCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhtaXNzaW5nLCAiVXNlciBub3QgZm91bmQiKSwgIm1pc3NpbmcgdXNlciBzaG91bGQgcmVuZGVyIG5vdCBmb3VuZCIpCgoJdW5rbm93biA6PSBSZW5kZXIoIm5pY2tuYW1lP25pY2tuYW1lPWFsaWNlIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHVua25vd24sICJOb3QgZm91bmQiKSwgInJlbW92ZWQgbmlja25hbWUgcm91dGUgc2hvdWxkIDQwNCIpCn0KCmZ1bmMgVGVzdFJlbmRlclVzZXJTYW5pdGl6ZXNQYWdlTGluayhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoKCXZhbGlkIDo9IFJlbmRlcigidXNlcj9hZGRyZXNzPSIgKyByZWd1bGFyVXNlci5TdHJpbmcoKSArICImcGFnZT0wMiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyh2YWxpZCwgIlvihpAgQmFjayB0byBMaXN0XSguL3VzZXI6dXNlcnM/cGFnZT0yKSIpLCAidmFsaWQgcGFnZSBzaG91bGQgYmUgbm9ybWFsaXplZCIpCgoJaW5qZWN0ZWQgOj0gUmVuZGVyKCJ1c2VyP2FkZHJlc3M9IiArIHJlZ3VsYXJVc2VyLlN0cmluZygpICsgIiZwYWdlPTElMjklNUQlMjhodHRwcyUzQSUyRiUyRmV4YW1wbGUuaW52YWxpZCUyOSIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5qZWN0ZWQsICJleGFtcGxlLmludmFsaWQiKSwgImludmFsaWQgcGFnZSBzaG91bGQgbm90IGJlIHJlZmxlY3RlZCIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5qZWN0ZWQsICJ1c2Vycz9wYWdlPSIpLCAiaW52YWxpZCBwYWdlIHNob3VsZCBub3QgcmVuZGVyIGEgcGFnZSBiYWNrIGxpbmsiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5qZWN0ZWQsICJb4oaQIEhvbWVdKC4vdXNlcjopIiksICJpbnZhbGlkIHBhZ2Ugc2hvdWxkIGZhbGwgYmFjayB0byBob21lIGxpbmsiKQp9CgpmdW5jIFRlc3RSZW5kZXJSZWplY3RzT3ZlcnNpemVkVVJMKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInVybCBleGNlZWRzIG1heCBydW5lcyIsIGZ1bmMoKSB7CgkJUmVuZGVyKHN0cmluZ3MuUmVwZWF0KCJhIiwgcmVuZGVyVVJMTWF4UnVuZXMrMSkpCgl9KQoJUmVuZGVyKHN0cmluZ3MuUmVwZWF0KCJhIiwgcmVuZGVyVVJMTWF4UnVuZXMpKQp9CgpmdW5jIFRlc3RSZW5kZXJIb21lVXNlc1JlbGF0aXZlQnJvd3NlVXNlcnNMaW5rKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cFVzZXJUZXN0cyhjcm9zcyhjdXIpLCB0KQoKCW91dHB1dCA6PSBSZW5kZXIoIiIpCgoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0cHV0LCAiKiBbQnJvd3NlIFVzZXJzXSguL3VzZXI6dXNlcnMpIiksICJzaG91bGQgdXNlIHBhY2thZ2UtcmVsYXRpdmUgdXNlcnMgbGluayIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0cHV0LCAiKiBbQnJvd3NlIFVzZXJzXSh1c2VycykiKSwgInNob3VsZCBub3QgdXNlIHBhdGgtcmVsYXRpdmUgdXNlcnMgbGluayIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0cHV0LCAiKiBbQnJvd3NlIFVzZXJzXSgvci9ha2thZGlhL3VzZXI6dXNlcnMpIiksICJzaG91bGQgbm90IHVzZSBhYnNvbHV0ZSB1c2VycyBsaW5rIikKfQoarSgKCHVzZXIuZ25vEqAocGFja2FnZSB1c2VyCgppbXBvcnQgKAoJImNoYWluIgoJIm5ldC91cmwiCgkic3RyY29udiIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgpjb25zdCAoCglDcmVhdGVVc2VyRXZlbnQgPSAiQ3JlYXRlVXNlciIKCVVwZGF0ZVVzZXJFdmVudCA9ICJVcGRhdGVVc2VyIgoJRGVsZXRlVXNlckV2ZW50ID0gIkRlbGV0ZVVzZXIiCgoJY3JlYXRlZEF0S2V5ID0gImNyZWF0ZWRfYXQiCikKCi8vIHVzZXJzIGlzIGFkZHJlc3Mgc3RyaW5nIC0+IG1hcFtzdHJpbmddc3RyaW5nLgovLyBUaGUgemVybyB2YWx1ZSBpcyBhbiBlbXB0eSBCUFRyZWUgd2l0aCBmYW5vdXQgMzIuCnZhciB1c2VycyBicHRyZWUuQlBUcmVlCgpmdW5jIEhhc1VzZXIoYWRkciBhZGRyZXNzKSBib29sIHsKCWFzc2VydElzVmFsaWRBZGRyZXNzKGFkZHIpCglyZXR1cm4gdXNlcnMuSGFzKGFkZHIuU3RyaW5nKCkpCn0KCmZ1bmMgQ3JlYXRlVXNlcihjdXIgcmVhbG0pIHsKCWFkZHIgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0VXNlckNhbGxlcigwLCBjdXIpCglpZiBpc0Zyb3plbiB7CgkJcGFuaWMoInVzZXIgc2VsZi1zZXJ2aWNlIGlzIGZyb3plbiIpCgl9CglhZGRyU3RyIDo9IGFkZHIuU3RyaW5nKCkKCWlmIHVzZXJzLkhhcyhhZGRyU3RyKSB7CgkJcGFuaWMoInVzZXIgYWxyZWFkeSBleGlzdHM6ICIgKyBhZGRyU3RyKQoJfQoJdXNlcnMuU2V0KGFkZHJTdHIsIG1hcFtzdHJpbmddc3RyaW5newoJCWNyZWF0ZWRBdEtleTogc3RyY29udi5Gb3JtYXRJbnQodGltZS5Ob3coKS5Vbml4KCksIDEwKSwKCX0pCgljaGFpbi5FbWl0KENyZWF0ZVVzZXJFdmVudCwgImFkZHJlc3MiLCBhZGRyU3RyKQp9CgovLyBBZG1pbkNyZWF0ZVVzZXIgaXMgaWRlbXBvdGVudCBzbyBhbiBvcGVyYXRvciBjYW4gc2FmZWx5IHJldHJ5IHJlZ2lzdHJhdGlvbi4KZnVuYyBBZG1pbkNyZWF0ZVVzZXIoY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MpIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbk9yT3BlcmF0b3IoMCwgY3VyLCBhZG1pbi5Jc0FkbWluLCBhZG1pbi5Jc09wZXJhdG9yKQoJYXNzZXJ0SXNWYWxpZEFkZHJlc3MoYWRkcikKCWFkZHJTdHIgOj0gYWRkci5TdHJpbmcoKQoJaWYgdXNlcnMuSGFzKGFkZHJTdHIpIHsKCQlyZXR1cm4KCX0KCXVzZXJzLlNldChhZGRyU3RyLCBtYXBbc3RyaW5nXXN0cmluZ3sKCQljcmVhdGVkQXRLZXk6IHN0cmNvbnYuRm9ybWF0SW50KHRpbWUuTm93KCkuVW5peCgpLCAxMCksCgl9KQoJY2hhaW4uRW1pdChDcmVhdGVVc2VyRXZlbnQsICJhZGRyZXNzIiwgYWRkclN0cikKfQoKZnVuYyBEZWxldGVVc2VyKGN1ciByZWFsbSkgewoJYWRkciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRVc2VyQ2FsbGVyKDAsIGN1cikKCWlmIGlzRnJvemVuIHsKCQlwYW5pYygidXNlciBzZWxmLXNlcnZpY2UgaXMgZnJvemVuIikKCX0KCWRlbGV0ZVVzZXIoYWRkcikKfQoKZnVuYyBBZG1pbkRlbGV0ZVVzZXIoY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MpIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIGFkbWluLklzQWRtaW4pCglhc3NlcnRJc1ZhbGlkQWRkcmVzcyhhZGRyKQoJZGVsZXRlVXNlcihhZGRyKQp9CgovLyBEZWxldGVBbGwgcmVtb3ZlcyByZWdpc3RyYXRpb25zIHdoaWxlIHByZXNlcnZpbmcgZnJlZXplIGFuZCBsaXN0IHNldHRpbmdzLgpmdW5jIERlbGV0ZUFsbChjdXIgcmVhbG0pIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0SXNBZG1pbigwLCBjdXIsIGFkbWluLklzQWRtaW4pCgl1c2VycyA9IGJwdHJlZS5CUFRyZWV7fQp9CgpmdW5jIEFkbWluVXBkYXRlVXNlcihjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcywgcHJvcEtleXMsIHByb3BWYWx1ZXMgc3RyaW5nKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJYXNzZXJ0SXNWYWxpZEFkZHJlc3MoYWRkcikKCWFkZHJTdHIgOj0gYWRkci5TdHJpbmcoKQoJY3VycmVudCA6PSB1c2Vycy5HZXQoYWRkclN0cikKCWlmIGN1cnJlbnQgPT0gbmlsIHsKCQlwYW5pYygidXNlciBub3QgZm91bmQ6ICIgKyBhZGRyU3RyKQoJfQoJcHJvcHMgOj0gY29weVN0cmluZ01hcChjdXJyZW50LihtYXBbc3RyaW5nXXN0cmluZykpCgl1cGRhdGVzIDo9IHBhcnNlUHJvcGVydGllc0NTVihwcm9wS2V5cywgcHJvcFZhbHVlcykKCWZvciBrZXksIHZhbHVlIDo9IHJhbmdlIHVwZGF0ZXMgewoJCXByb3BzW2tleV0gPSB2YWx1ZQoJfQoJdXNlcnMuU2V0KGFkZHJTdHIsIHByb3BzKQoJY2hhaW4uRW1pdChVcGRhdGVVc2VyRXZlbnQsICJhZGRyZXNzIiwgYWRkclN0cikKfQoKZnVuYyBHZXRUb3RhbFVzZXJTaXplKCkgaW50IHsKCXJldHVybiB1c2Vycy5TaXplKCkKfQoKZnVuYyBMaXN0VXNlcnMocGFnZSwgY291bnQgaW50KSBbXXN0cmluZyB7Cglhc3NlcnRMaXN0UGFnZUNvdW50KHBhZ2UsIGNvdW50KQoJcmVzdWx0IDo9IFtdc3RyaW5ne30KCW9mZnNldCA6PSAocGFnZSAtIDEpICogY291bnQKCXVzZXJzLkl0ZXJhdGVCeU9mZnNldChvZmZzZXQsIGNvdW50LCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsKCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBrZXkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIHJlc3VsdAp9CgpmdW5jIExpc3RVc2Vyc0J5QWRkcmVzc2VzKGFkZHJzIC4uLmFkZHJlc3MpIFtdbWFwW3N0cmluZ11zdHJpbmcgewoJYXNzZXJ0TGlzdExpbWl0KCJhZGRycyIsIGxlbihhZGRycykpCglyZXN1bHQgOj0gW11tYXBbc3RyaW5nXXN0cmluZ3t9Cglmb3IgXywgYWRkciA6PSByYW5nZSBhZGRycyB7CgkJYXNzZXJ0SXNWYWxpZEFkZHJlc3MoYWRkcikKCQlhZGRyU3RyIDo9IGFkZHIuU3RyaW5nKCkKCQljdXJyZW50IDo9IHVzZXJzLkdldChhZGRyU3RyKQoJCWlmIGN1cnJlbnQgPT0gbmlsIHsKCQkJY29udGludWUKCQl9CgkJcHJvcHMgOj0gY29weVN0cmluZ01hcChjdXJyZW50LihtYXBbc3RyaW5nXXN0cmluZykpCgkJcHJvcHNbImFkZHJlc3MiXSA9IGFkZHJTdHIKCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBwcm9wcykKCX0KCXJldHVybiByZXN1bHQKfQoKZnVuYyBkZWxldGVVc2VyKGFkZHIgYWRkcmVzcykgewoJYWRkclN0ciA6PSBhZGRyLlN0cmluZygpCglpZiBfLCByZW1vdmVkIDo9IHVzZXJzLlJlbW92ZShhZGRyU3RyKTsgIXJlbW92ZWQgewoJCXBhbmljKCJ1c2VyIG5vdCBmb3VuZDogIiArIGFkZHJTdHIpCgl9CgljaGFpbi5FbWl0KERlbGV0ZVVzZXJFdmVudCwgImFkZHJlc3MiLCBhZGRyU3RyKQp9CgpmdW5jIGNvcHlTdHJpbmdNYXAoc291cmNlIG1hcFtzdHJpbmddc3RyaW5nKSBtYXBbc3RyaW5nXXN0cmluZyB7CglyZXN1bHQgOj0gbWFwW3N0cmluZ11zdHJpbmd7fQoJZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2Ugc291cmNlIHsKCQlyZXN1bHRba2V5XSA9IHZhbHVlCgl9CglyZXR1cm4gcmVzdWx0Cn0KCi8vIHBhcnNlUHJvcGVydGllc0NTViBhY2NlcHRzIGNvbW1hLXNlcGFyYXRlZCBrZXlzIGFuZCBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzLgovLyBFYWNoIHZhbHVlIG11c3QgYmUgVVJMLWVuY29kZWQgc28gY29tbWFzIGFuZCBvdGhlciBzZXBhcmF0b3JzIGNhbiBiZSBjYXJyaWVkCi8vIHNhZmVseTsgdGhpcyBwYXJzZXIgVVJMLWRlY29kZXMgdmFsdWVzIGJlZm9yZSByZXR1cm5pbmcgdGhlIG1hcC4KZnVuYyBwYXJzZVByb3BlcnRpZXNDU1Yoa2V5cywgdmFsdWVzIHN0cmluZykgbWFwW3N0cmluZ11zdHJpbmcgewoJaWYga2V5cyA9PSAiIiB7CgkJcGFuaWMoInByb3BlcnRpZXMga2V5cyBtdXN0IGJlIG5vdCBlbXB0eSIpCgl9CgoJcmVzdWx0IDo9IG1hcFtzdHJpbmddc3RyaW5ne30KCWtleVN0YXJ0LCB2YWxTdGFydCA6PSAwLCAwCglrZXlJZHgsIHZhbElkeCA6PSAwLCAwCglmb3IgewoJCWZvciBrZXlJZHggPCBsZW4oa2V5cykgJiYga2V5c1trZXlJZHhdICE9ICcsJyB7CgkJCWtleUlkeCsrCgkJfQoJCWZvciB2YWxJZHggPCBsZW4odmFsdWVzKSAmJiB2YWx1ZXNbdmFsSWR4XSAhPSAnLCcgewoJCQl2YWxJZHgrKwoJCX0KCgkJa2V5IDo9IGtleXNba2V5U3RhcnQ6a2V5SWR4XQoJCWlmIGtleSA9PSAiIiB7CgkJCXBhbmljKCJwcm9wZXJ0aWVzIGtleSBtdXN0IGJlIG5vdCBlbXB0eSIpCgkJfQoJCWlmIF8sIGZvdW5kIDo9IHJlc3VsdFtrZXldOyBmb3VuZCB7CgkJCXBhbmljKCJwcm9wZXJ0aWVzIGtleSBkdXBsaWNhdGVkOiAiICsga2V5KQoJCX0KCgkJdmFsdWUsIGVyciA6PSB1cmwuUGF0aFVuZXNjYXBlKHZhbHVlc1t2YWxTdGFydDp2YWxJZHhdKQoJCWlmIGVyciAhPSBuaWwgewoJCQlwYW5pYygicHJvcGVydGllcyB2YWx1ZSBVUkwgZGVjb2RlIGZhaWxlZDogIiArIGtleSkKCQl9CgkJcmVzdWx0W2tleV0gPSB2YWx1ZQoKCQlrZXlFbmQgOj0ga2V5SWR4ID49IGxlbihrZXlzKQoJCXZhbEVuZCA6PSB2YWxJZHggPj0gbGVuKHZhbHVlcykKCQlpZiBrZXlFbmQgIT0gdmFsRW5kIHsKCQkJcGFuaWMoInByb3BlcnRpZXMga2V5cyBhbmQgdmFsdWVzIGNvdW50IG1pc21hdGNoIikKCQl9CgkJaWYga2V5RW5kIHsKCQkJYnJlYWsKCQl9CgoJCWtleUlkeCsrCgkJdmFsSWR4KysKCQlrZXlTdGFydCA9IGtleUlkeAoJCXZhbFN0YXJ0ID0gdmFsSWR4Cgl9CgoJcmV0dXJuIHJlc3VsdAp9CgpmdW5jIGFzc2VydElzVmFsaWRBZGRyZXNzKGFkZHIgYWRkcmVzcykgewoJaWYgIWFkZHIuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBhZGRyZXNzOiAiICsgYWRkci5TdHJpbmcoKSkKCX0KfQoKZnVuYyBhc3NlcnRMaXN0TGltaXQoZmllbGQgc3RyaW5nLCBjb3VudCBpbnQpIHsKCWlmIGNvdW50ID4gbGlzdExpbWl0IHsKCQlwYW5pYyhmaWVsZCArICIgZXhjZWVkcyBsaXN0TGltaXQgKG1heDogIiArIHN0cmNvbnYuSXRvYShsaXN0TGltaXQpICsgIikiKQoJfQp9CgpmdW5jIGFzc2VydExpc3RQYWdlQ291bnQocGFnZSBpbnQsIGNvdW50IGludCkgewoJaWYgcGFnZSA8IDEgewoJCXBhbmljKCJwYWdlIG11c3QgYmUgYXQgbGVhc3QgMSIpCgl9CglpZiBjb3VudCA8IDEgewoJCXBhbmljKCJjb3VudCBtdXN0IGJlIGF0IGxlYXN0IDEiKQoJfQoJYXNzZXJ0TGlzdExpbWl0KCJjb3VudCIsIGNvdW50KQp9ChqBhgEKDXVzZXJfdGVzdC5nbm8S7oUBcGFja2FnZSB1c2VyCgppbXBvcnQgKAoJInRlc3RpbmciCgkidGltZSIKCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgp2YXIgKAoJdGVzdEFkbWluICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInRlc3RBZG1pbiIpCglyZWd1bGFyVXNlciA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygicmVndWxhclVzZXIiKQoJYmFkVXNlciAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJhZFVzZXIiKQoJYW5vdGhlclVzZXIgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImFub3RoZXJVc2VyIikKCXNldHVwRG9uZSAgID0gZmFsc2UKKQoKZnVuYyBzZXR1cFVzZXJUZXN0cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdC5IZWxwZXIoKQoJdXNlcnMgPSBicHRyZWUuQlBUcmVle30KCWxpc3RMaW1pdCA9IDEwMAoJaXNGcm96ZW4gPSB0cnVlCgoJaWYgc2V0dXBEb25lIHsKCQlyZXR1cm4KCX0KCW9yaWdpbmFsQWRtaW4gOj0gYWRtaW4uR2V0QWRtaW4oKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIob3JpZ2luYWxBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3JpZ2luYWxBZG1pbikpCglhZG1pbi5UcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRlc3RBZG1pbikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglhZG1pbi5BY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJc2V0dXBEb25lID0gdHJ1ZQp9CgpmdW5jIGNyZWF0ZVVzZXJGb3JUZXN0KGN1ciByZWFsbSwgYWRkciBhZGRyZXNzKSB7Cgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglBZG1pbkNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSwgYWRkcikKfQoKZnVuYyBUZXN0UGFyc2VQcm9wZXJ0aWVzQ1NWKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cglwcm9wcyA6PSBwYXJzZVByb3BlcnRpZXNDU1YoIm5pY2tuYW1lLGludHJvZHVjdGlvbiIsICJBbGljZSxoZWxsbyUyQyUyMHdvcmxkIikKCXVhc3NlcnQuRXF1YWwodCwgIkFsaWNlIiwgcHJvcHNbIm5pY2tuYW1lIl0pCgl1YXNzZXJ0LkVxdWFsKHQsICJoZWxsbywgd29ybGQiLCBwcm9wc1siaW50cm9kdWN0aW9uIl0pCgoJcHJvcHMgPSBwYXJzZVByb3BlcnRpZXNDU1YoIm5pY2tuYW1lLGludHJvZHVjdGlvbiIsICJBbGljZSwiKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgcHJvcHNbImludHJvZHVjdGlvbiJdKQoKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAicHJvcGVydGllcyBrZXlzIG11c3QgYmUgbm90IGVtcHR5IiwgZnVuYygpIHsKCQlwYXJzZVByb3BlcnRpZXNDU1YoIiIsICIiKQoJfSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAicHJvcGVydGllcyBrZXkgZHVwbGljYXRlZDogbmlja25hbWUiLCBmdW5jKCkgewoJCXBhcnNlUHJvcGVydGllc0NTVigibmlja25hbWUsbmlja25hbWUiLCAiQWxpY2UsQm9iIikKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInByb3BlcnRpZXMga2V5cyBhbmQgdmFsdWVzIGNvdW50IG1pc21hdGNoIiwgZnVuYygpIHsKCQlwYXJzZVByb3BlcnRpZXNDU1YoIm5pY2tuYW1lLGludHJvZHVjdGlvbiIsICJBbGljZSIpCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJwcm9wZXJ0aWVzIHZhbHVlIFVSTCBkZWNvZGUgZmFpbGVkOiBpbnRyb2R1Y3Rpb24iLCBmdW5jKCkgewoJCXBhcnNlUHJvcGVydGllc0NTVigibmlja25hbWUsaW50cm9kdWN0aW9uIiwgIkFsaWNlLCV6eiIpCgl9KQp9CgpmdW5jIFRlc3RDcmVhdGVVc2VyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cFVzZXJUZXN0cyhjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZhbHNlKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocmVndWxhclVzZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHJlZ3VsYXJVc2VyKSkKCUNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSkKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNVc2VyKHJlZ3VsYXJVc2VyKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzVXNlcih0ZXN0QWRtaW4pKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRUb3RhbFVzZXJTaXplKCkpCgljcmVhdGVkQXQgOj0gTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIpWzBdW2NyZWF0ZWRBdEtleV0KCXVhc3NlcnQuVHJ1ZSh0LCBjcmVhdGVkQXQgIT0gIiIpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVzZXIgYWxyZWFkeSBleGlzdHM6ICIrcmVndWxhclVzZXIuU3RyaW5nKCksIGZ1bmMoKSB7CgkJQ3JlYXRlVXNlcihjcm9zcyhjdXIpKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgY3JlYXRlZEF0LCBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF1bY3JlYXRlZEF0S2V5XSkKCS8vIE9wZXJhdG9yIGRlbGl2ZXJ5IGFmdGVyIHNlbGYtcmVnaXN0cmF0aW9uIHJlbWFpbnMgYSBzYWZlIG5vLW9wLgoJY3JlYXRlVXNlckZvclRlc3QoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldFRvdGFsVXNlclNpemUoKSkKCXVhc3NlcnQuRXF1YWwodCwgY3JlYXRlZEF0LCBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF1bY3JlYXRlZEF0S2V5XSkKfQoKZnVuYyBUZXN0Q3JlYXRlVXNlclJlamVjdHNDb2RlUmVhbG0oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgZmFsc2UpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihyZWd1bGFyVXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL3VzZXJfcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY29udHJhY3QgY2FsbHMgbm90IGFsbG93ZWQ6IGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHVzZXIiLCBmdW5jKCkgewoJCUNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIEdldFRvdGFsVXNlclNpemUoKSkKfQoKZnVuYyBUZXN0QWRtaW5DcmVhdGVVc2VyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cFVzZXJUZXN0cyhjcm9zcyhjdXIpLCB0KQoKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJdWFzc2VydC5UcnVlKHQsIEhhc1VzZXIocmVndWxhclVzZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRUb3RhbFVzZXJTaXplKCkpCgl1c2Vyc0J5QWRkciA6PSBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcikKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGVuKHVzZXJzQnlBZGRyKSkKCXVhc3NlcnQuRXF1YWwodCwgcmVndWxhclVzZXIuU3RyaW5nKCksIHVzZXJzQnlBZGRyWzBdWyJhZGRyZXNzIl0pCgl1YXNzZXJ0LlRydWUodCwgdXNlcnNCeUFkZHJbMF1bY3JlYXRlZEF0S2V5XSAhPSAiIikKCgljcmVhdGVkQXQgOj0gdXNlcnNCeUFkZHJbMF1bY3JlYXRlZEF0S2V5XQoJY3R4IDo9IHRlc3RpbmcuR2V0Q29udGV4dCgpCgljdHguVGltZSA9IGN0eC5UaW1lLkFkZCh0aW1lLkhvdXIpCgl0ZXN0aW5nLlNldENvbnRleHQoY3R4KQoJY3JlYXRlVXNlckZvclRlc3QoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldFRvdGFsVXNlclNpemUoKSkKCXVhc3NlcnQuRXF1YWwodCwgY3JlYXRlZEF0LCBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF1bY3JlYXRlZEF0S2V5XSkKfQoKZnVuYyBUZXN0QWRtaW5DcmVhdGVVc2VyT3BlcmF0b3IoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglhZG1pbi5TZXRPcGVyYXRvcihjcm9zcyhjdXIpLCBhbm90aGVyVXNlcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFub3RoZXJVc2VyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbm90aGVyVXNlcikpCglBZG1pbkNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIpCgl1YXNzZXJ0LlRydWUodCwgSGFzVXNlcihyZWd1bGFyVXNlcikpCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc1VzZXIoYW5vdGhlclVzZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRUb3RhbFVzZXJTaXplKCkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglhZG1pbi5VbnNldE9wZXJhdG9yKGNyb3NzKGN1ciksIGFub3RoZXJVc2VyKQp9CgpmdW5jIFRlc3RBZG1pbkNyZWF0ZVVzZXJSZWplY3RzVW5hdXRob3JpemVkQW5kSW52YWxpZEFkZHJlc3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgljcmVhdGVVc2VyRm9yVGVzdChjcm9zcyhjdXIpLCByZWd1bGFyVXNlcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHJlZ3VsYXJVc2VyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShyZWd1bGFyVXNlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJQWRtaW5DcmVhdGVVc2VyKGNyb3NzKGN1ciksIGFub3RoZXJVc2VyKQoJfSkKCS8vIEF1dGhvcml6YXRpb24gbXVzdCBydW4gZXZlbiB3aGVuIHRoZSB0YXJnZXQgYWxyZWFkeSBleGlzdHMuCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJQWRtaW5DcmVhdGVVc2VyKGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJfSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL3VzZXJfcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gb3Igb3BlcmF0b3IgYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlBZG1pbkNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSwgYW5vdGhlclVzZXIpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGFkZHJlc3M6ICIrYWRkcmVzcygiIikuU3RyaW5nKCksIGZ1bmMoKSB7CgkJQWRtaW5DcmVhdGVVc2VyKGNyb3NzKGN1ciksIGFkZHJlc3MoIiIpKQoJfSkKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNVc2VyKHJlZ3VsYXJVc2VyKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzVXNlcihhbm90aGVyVXNlcikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldFRvdGFsVXNlclNpemUoKSkKfQoKZnVuYyBUZXN0RGVsZXRlVXNlcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCVNldEZyb3plbihjcm9zcyhjdXIpLCBmYWxzZSkKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHJlZ3VsYXJVc2VyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShyZWd1bGFyVXNlcikpCglEZWxldGVVc2VyKGNyb3NzKGN1cikpCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc1VzZXIocmVndWxhclVzZXIpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBHZXRUb3RhbFVzZXJTaXplKCkpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIG5vdCBmb3VuZDogIityZWd1bGFyVXNlci5TdHJpbmcoKSwgZnVuYygpIHsKCQlEZWxldGVVc2VyKGNyb3NzKGN1cikpCgl9KQp9CgpmdW5jIFRlc3RBZG1pbkRlbGV0ZVVzZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgljcmVhdGVVc2VyRm9yVGVzdChjcm9zcyhjdXIpLCByZWd1bGFyVXNlcikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihyZWd1bGFyVXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocmVndWxhclVzZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCUFkbWluRGVsZXRlVXNlcihjcm9zcyhjdXIpLCByZWd1bGFyVXNlcikKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJQWRtaW5EZWxldGVVc2VyKGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJdWFzc2VydC5GYWxzZSh0LCBIYXNVc2VyKHJlZ3VsYXJVc2VyKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVzZXIgbm90IGZvdW5kOiAiK3JlZ3VsYXJVc2VyLlN0cmluZygpLCBmdW5jKCkgewoJCUFkbWluRGVsZXRlVXNlcihjcm9zcyhjdXIpLCByZWd1bGFyVXNlcikKCX0pCn0KCmZ1bmMgVGVzdEFkbWluVXBkYXRlVXNlcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJY3JlYXRlZEF0IDo9IExpc3RVc2Vyc0J5QWRkcmVzc2VzKHJlZ3VsYXJVc2VyKVswXVtjcmVhdGVkQXRLZXldCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJQWRtaW5VcGRhdGVVc2VyKGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyLCAibmlja25hbWUsaW50cm9kdWN0aW9uIiwgIkFsaWNlLGhlbGxvJTJDJTIwd29ybGQiKQoJbGlzdGVkIDo9IExpc3RVc2Vyc0J5QWRkcmVzc2VzKHJlZ3VsYXJVc2VyKVswXQoJdWFzc2VydC5FcXVhbCh0LCAiQWxpY2UiLCBsaXN0ZWRbIm5pY2tuYW1lIl0pCgl1YXNzZXJ0LkVxdWFsKHQsICJoZWxsbywgd29ybGQiLCBsaXN0ZWRbImludHJvZHVjdGlvbiJdKQoJdWFzc2VydC5FcXVhbCh0LCBjcmVhdGVkQXQsIGxpc3RlZFtjcmVhdGVkQXRLZXldKQoKCUFkbWluVXBkYXRlVXNlcihjcm9zcyhjdXIpLCByZWd1bGFyVXNlciwgY3JlYXRlZEF0S2V5LCAiMSIpCgl1YXNzZXJ0LkVxdWFsKHQsICIxIiwgTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIpWzBdW2NyZWF0ZWRBdEtleV0pCgl1YXNzZXJ0LkVxdWFsKHQsICJBbGljZSIsIExpc3RVc2Vyc0J5QWRkcmVzc2VzKHJlZ3VsYXJVc2VyKVswXVsibmlja25hbWUiXSkKfQoKZnVuYyBUZXN0QWRtaW5VcGRhdGVVc2VyUmVqZWN0c01pc3NpbmdBbmRVbmF1dGhvcml6ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIG5vdCBmb3VuZDogIityZWd1bGFyVXNlci5TdHJpbmcoKSwgZnVuYygpIHsKCQlBZG1pblVwZGF0ZVVzZXIoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIsICJuaWNrbmFtZSIsICJBbGljZSIpCgl9KQoKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocmVndWxhclVzZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHJlZ3VsYXJVc2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlBZG1pblVwZGF0ZVVzZXIoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIsICJuaWNrbmFtZSIsICJBbGljZSIpCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL3VzZXJfYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlBZG1pblVwZGF0ZVVzZXIoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIsICJuaWNrbmFtZSIsICJBbGljZSIpCgl9KQp9CgpmdW5jIFRlc3RMaXN0VXNlcnNBZGRyZXNzT3JkZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgljcmVhdGVVc2VyRm9yVGVzdChjcm9zcyhjdXIpLCByZWd1bGFyVXNlcikKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIGFub3RoZXJVc2VyKQoKCWxpc3RlZCA6PSBMaXN0VXNlcnMoMSwgMTApCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihsaXN0ZWQpKQoJaWYgcmVndWxhclVzZXIuU3RyaW5nKCkgPCBhbm90aGVyVXNlci5TdHJpbmcoKSB7CgkJdWFzc2VydC5FcXVhbCh0LCByZWd1bGFyVXNlci5TdHJpbmcoKSwgbGlzdGVkWzBdKQoJCXVhc3NlcnQuRXF1YWwodCwgYW5vdGhlclVzZXIuU3RyaW5nKCksIGxpc3RlZFsxXSkKCX0gZWxzZSB7CgkJdWFzc2VydC5FcXVhbCh0LCBhbm90aGVyVXNlci5TdHJpbmcoKSwgbGlzdGVkWzBdKQoJCXVhc3NlcnQuRXF1YWwodCwgcmVndWxhclVzZXIuU3RyaW5nKCksIGxpc3RlZFsxXSkKCX0KCglmaXJzdFBhZ2UgOj0gTGlzdFVzZXJzKDEsIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGxlbihmaXJzdFBhZ2UpKQoJdWFzc2VydC5FcXVhbCh0LCBsaXN0ZWRbMF0sIGZpcnN0UGFnZVswXSkKCXNlY29uZFBhZ2UgOj0gTGlzdFVzZXJzKDIsIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIGxpc3RlZFsxXSwgc2Vjb25kUGFnZVswXSkKfQoKZnVuYyBUZXN0TGlzdFVzZXJzQnlBZGRyZXNzZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgljcmVhdGVVc2VyRm9yVGVzdChjcm9zcyhjdXIpLCByZWd1bGFyVXNlcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCUFkbWluVXBkYXRlVXNlcihjcm9zcyhjdXIpLCByZWd1bGFyVXNlciwgIm5pY2tuYW1lIiwgIkFsaWNlIikKCglsaXN0ZWQgOj0gTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIsIGJhZFVzZXIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGxlbihsaXN0ZWQpKQoJdWFzc2VydC5FcXVhbCh0LCAiQWxpY2UiLCBsaXN0ZWRbMF1bIm5pY2tuYW1lIl0pCglsaXN0ZWRbMF1bIm5pY2tuYW1lIl0gPSAibXV0YXRlZCIKCWFnYWluIDo9IExpc3RVc2Vyc0J5QWRkcmVzc2VzKHJlZ3VsYXJVc2VyKQoJdWFzc2VydC5FcXVhbCh0LCAiQWxpY2UiLCBhZ2FpblswXVsibmlja25hbWUiXSkKfQoKZnVuYyBUZXN0TGlzdElucHV0VmFsaWRhdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAicGFnZSBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCUxpc3RVc2VycygwLCAxKQoJfSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY291bnQgbXVzdCBiZSBhdCBsZWFzdCAxIiwgZnVuYygpIHsKCQlMaXN0VXNlcnMoMSwgMCkKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvdW50IGV4Y2VlZHMgbGlzdExpbWl0IChtYXg6IDEwMCkiLCBmdW5jKCkgewoJCUxpc3RVc2VycygxLCAxMDEpCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGFkZHJlc3M6ICIrYWRkcmVzcygiIikuU3RyaW5nKCksIGZ1bmMoKSB7CgkJSGFzVXNlcihhZGRyZXNzKCIiKSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIDEwMCwgR2V0TGlzdExpbWl0KCkpCn0KCmZ1bmMgVGVzdFNldExpc3RMaW1pdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgNTApCgl1YXNzZXJ0LkVxdWFsKHQsIDUwLCBHZXRMaXN0TGltaXQoKSkKCglTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgMSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRkcnMgZXhjZWVkcyBsaXN0TGltaXQgKG1heDogMSkiLCBmdW5jKCkgewoJCUxpc3RVc2Vyc0J5QWRkcmVzc2VzKHJlZ3VsYXJVc2VyLCBiYWRVc2VyKQoJfSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY291bnQgZXhjZWVkcyBsaXN0TGltaXQgKG1heDogMSkiLCBmdW5jKCkgewoJCUxpc3RVc2VycygxLCAyKQoJfSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImxpbWl0IG11c3QgYmUgYXQgbGVhc3QgMSIsIGZ1bmMoKSB7CgkJU2V0TGlzdExpbWl0KGNyb3NzKGN1ciksIDApCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJsaW1pdCBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCAtMSkKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocmVndWxhclVzZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHJlZ3VsYXJVc2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgNTApCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL3VzZXJfYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgNTApCgl9KQp9CgpmdW5jIFRlc3RTZWxmU2VydmljZUZyb3plbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdWFzc2VydC5UcnVlKHQsIGlzRnJvemVuKQoJc2V0dXBVc2VyVGVzdHMoY3Jvc3MoY3VyKSwgdCkKCWNyZWF0ZVVzZXJGb3JUZXN0KGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJQWRtaW5VcGRhdGVVc2VyKGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyLCAibmlja25hbWUiLCAiQWxpY2UiKQoJYmVmb3JlIDo9IExpc3RVc2Vyc0J5QWRkcmVzc2VzKHJlZ3VsYXJVc2VyKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFub3RoZXJVc2VyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbm90aGVyVXNlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVzZXIgc2VsZi1zZXJ2aWNlIGlzIGZyb3plbiIsIGZ1bmMoKSB7CgkJQ3JlYXRlVXNlcihjcm9zcyhjdXIpKQoJfSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzVXNlcihhbm90aGVyVXNlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihyZWd1bGFyVXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocmVndWxhclVzZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIHNlbGYtc2VydmljZSBpcyBmcm96ZW4iLCBmdW5jKCkgewoJCURlbGV0ZVVzZXIoY3Jvc3MoY3VyKSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIGJlZm9yZVswXVtjcmVhdGVkQXRLZXldLCBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF1bY3JlYXRlZEF0S2V5XSkKCXVhc3NlcnQuRXF1YWwodCwgIkFsaWNlIiwgTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIpWzBdWyJuaWNrbmFtZSJdKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRUb3RhbFVzZXJTaXplKCkpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZhbHNlKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYW5vdGhlclVzZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFub3RoZXJVc2VyKSkKCUNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSkKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNVc2VyKGFub3RoZXJVc2VyKSkKCURlbGV0ZVVzZXIoY3Jvc3MoY3VyKSkKCXVhc3NlcnQuRmFsc2UodCwgSGFzVXNlcihhbm90aGVyVXNlcikpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJU2V0RnJvemVuKGNyb3NzKGN1ciksIHRydWUpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhbm90aGVyVXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYW5vdGhlclVzZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIHNlbGYtc2VydmljZSBpcyBmcm96ZW4iLCBmdW5jKCkgewoJCUNyZWF0ZVVzZXIoY3Jvc3MoY3VyKSkKCX0pCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihyZWd1bGFyVXNlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocmVndWxhclVzZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIHNlbGYtc2VydmljZSBpcyBmcm96ZW4iLCBmdW5jKCkgewoJCURlbGV0ZVVzZXIoY3Jvc3MoY3VyKSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIGJlZm9yZVswXVtjcmVhdGVkQXRLZXldLCBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF1bY3JlYXRlZEF0S2V5XSkKCXVhc3NlcnQuRXF1YWwodCwgIkFsaWNlIiwgTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIpWzBdWyJuaWNrbmFtZSJdKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRUb3RhbFVzZXJTaXplKCkpCn0KCmZ1bmMgVGVzdFNldEZyb3plblJlamVjdHNVbmF1dGhvcml6ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglhZG1pbi5TZXRPcGVyYXRvcihjcm9zcyhjdXIpLCBhbm90aGVyVXNlcikKCglmb3IgXywgZnJvemVuIDo9IHJhbmdlIFtdYm9vbHt0cnVlLCBmYWxzZX0gewoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZyb3plbikKCQlmb3IgXywgY2FsbGVyIDo9IHJhbmdlIFtdYWRkcmVzc3tyZWd1bGFyVXNlciwgYW5vdGhlclVzZXJ9IHsKCQkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY2FsbGVyKQoJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNhbGxlcikpCgkJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQkJCVNldEZyb3plbihjcm9zcyhjdXIpLCAhZnJvemVuKQoJCQl9KQoJCQl1YXNzZXJ0LkVxdWFsKHQsIGZyb3plbiwgaXNGcm96ZW4pCgkJfQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS91c2VyX2FkbWluX3JlbGF5IikpCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCQlTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgIWZyb3plbikKCQl9KQoJCXVhc3NlcnQuRXF1YWwodCwgZnJvemVuLCBpc0Zyb3plbikKCX0KCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCWFkbWluLlVuc2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgYW5vdGhlclVzZXIpCglTZXRGcm96ZW4oY3Jvc3MoY3VyKSwgdHJ1ZSkKfQoKZnVuYyBUZXN0RGVsZXRlQWxsKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cglmb3IgXywgZnJvemVuIDo9IHJhbmdlIFtdYm9vbHt0cnVlLCBmYWxzZX0gewoJCXNldHVwVXNlclRlc3RzKGNyb3NzKGN1ciksIHQpCgkJY3JlYXRlVXNlckZvclRlc3QoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIpCgkJY3JlYXRlVXNlckZvclRlc3QoY3Jvc3MoY3VyKSwgYW5vdGhlclVzZXIpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCQlBZG1pblVwZGF0ZVVzZXIoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIsICJuaWNrbmFtZSIsICJBbGljZSIpCgkJU2V0TGlzdExpbWl0KGNyb3NzKGN1ciksIDcpCgkJU2V0RnJvemVuKGNyb3NzKGN1ciksIGZyb3plbikKCgkJRGVsZXRlQWxsKGNyb3NzKGN1cikpCgkJdWFzc2VydC5FcXVhbCh0LCAwLCBHZXRUb3RhbFVzZXJTaXplKCkpCgkJdWFzc2VydC5GYWxzZSh0LCBIYXNVc2VyKHJlZ3VsYXJVc2VyKSkKCQl1YXNzZXJ0LkZhbHNlKHQsIEhhc1VzZXIoYW5vdGhlclVzZXIpKQoJCXVhc3NlcnQuRXF1YWwodCwgMCwgbGVuKExpc3RVc2VycygxLCA3KSkpCgkJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIsIGFub3RoZXJVc2VyKSkpCgkJdWFzc2VydC5FcXVhbCh0LCA3LCBHZXRMaXN0TGltaXQoKSkKCQl1YXNzZXJ0LkVxdWFsKHQsIGZyb3plbiwgaXNGcm96ZW4pCgkJLy8gRW1wdHkgcmVzZXRzIGFyZSBzYWZlLCBhbmQgcmUtcmVnaXN0cmF0aW9uIG11c3Qgbm90IHJlc3RvcmUgb2xkIHByb3BlcnRpZXMuCgkJRGVsZXRlQWxsKGNyb3NzKGN1cikpCgkJQWRtaW5DcmVhdGVVc2VyKGNyb3NzKGN1ciksIHJlZ3VsYXJVc2VyKQoJCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0VG90YWxVc2VyU2l6ZSgpKQoJCXVhc3NlcnQuVHJ1ZSh0LCBIYXNVc2VyKHJlZ3VsYXJVc2VyKSkKCQlwcm9wcyA6PSBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF0KCQl1YXNzZXJ0LkVxdWFsKHQsICIiLCBwcm9wc1sibmlja25hbWUiXSkKCQl1YXNzZXJ0LlRydWUodCwgcHJvcHNbY3JlYXRlZEF0S2V5XSAhPSAiIikKCX0KfQoKZnVuYyBUZXN0RGVsZXRlQWxsQXV0aG9yaXR5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cFVzZXJUZXN0cyhjcm9zcyhjdXIpLCB0KQoJY3JlYXRlVXNlckZvclRlc3QoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglBZG1pblVwZGF0ZVVzZXIoY3Jvc3MoY3VyKSwgcmVndWxhclVzZXIsICJuaWNrbmFtZSIsICJBbGljZSIpCglhZG1pbi5TZXRPcGVyYXRvcihjcm9zcyhjdXIpLCBhbm90aGVyVXNlcikKCWZvciBfLCBjYWxsZXIgOj0gcmFuZ2UgW11hZGRyZXNze3JlZ3VsYXJVc2VyLCBhbm90aGVyVXNlcn0gewoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGNhbGxlcikKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNhbGxlcikpCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCQlEZWxldGVBbGwoY3Jvc3MoY3VyKSkKCQl9KQoJCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0VG90YWxVc2VyU2l6ZSgpKQoJCXVhc3NlcnQuRXF1YWwodCwgIkFsaWNlIiwgTGlzdFVzZXJzQnlBZGRyZXNzZXMocmVndWxhclVzZXIpWzBdWyJuaWNrbmFtZSJdKQoJfQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvdXNlcl9hZG1pbl9yZWxheSIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCURlbGV0ZUFsbChjcm9zcyhjdXIpKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0VG90YWxVc2VyU2l6ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCAiQWxpY2UiLCBMaXN0VXNlcnNCeUFkZHJlc3NlcyhyZWd1bGFyVXNlcilbMF1bIm5pY2tuYW1lIl0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCglhZG1pbi5VbnNldE9wZXJhdG9yKGNyb3NzKGN1ciksIGFub3RoZXJVc2VyKQp9ChreAQoOdmFsaWRhdGlvbi5nbm8SywFwYWNrYWdlIHVzZXIKCmltcG9ydCAidW5pY29kZS91dGY4IgoKY29uc3QgcmVuZGVyVVJMTWF4UnVuZXMgPSAxMDI0CgpmdW5jIGFzc2VydFJlbmRlclVSTExlbih2YWx1ZSBzdHJpbmcpIHsKCWlmIHV0ZjguUnVuZUNvdW50SW5TdHJpbmcodmFsdWUpID4gcmVuZGVyVVJMTWF4UnVuZXMgewoJCXBhbmljKCJ1cmwgZXhjZWVkcyBtYXggcnVuZXMiKQoJfQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCNDz9VYSCjkxMTQ0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECLUUtr6vIOzviOGbyUc1h+4x9Ac78WI57H+Na8gUVG8MSQGzlCZ+jNFh1AVfJ/K+HCn6RiqRJqUoo49Nn27bdvH/OZGBAKy17MKU/J2YNwFdalIYrHYXJMMW0/KdtHCApAQoaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=