{ "name": "EscrowContract", "structs": { "MediatorData": [ { "name": "address", "type": "address" }, { "name": "bond_amount", "type": "uint64" }, { "name": "is_bonded", "type": "uint64" }, { "name": "did_hash", "type": "byte[32]" } ] }, "methods": [ { "name": "deploy", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "create_bounty", "args": [ { "type": "byte[]", "name": "bounty_id" }, { "type": "uint64", "name": "escrow_amount" }, { "type": "uint64", "name": "is_hitm" }, { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "review_days" }, { "type": "address", "name": "mediator" }, { "type": "address", "name": "treasury" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_bounty", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submit_work", "args": [ { "type": "byte[]", "name": "proof_url" }, { "type": "byte[]", "name": "proof_data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "approve_work", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "reject_work", "args": [ { "type": "byte[]", "name": "reason" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submit_dispute", "args": [ { "type": "byte[]", "name": "reason" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "resolve_dispute", "args": [ { "type": "byte[]", "name": "resolution" }, { "type": "byte[]", "name": "mediator_signature" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "auto_resolve_creator_win", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "timeout_dispute", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "auto_release", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_abandoned", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "expire_claim", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "github_verify", "args": [ { "type": "byte[]", "name": "pr_url" }, { "type": "byte[]", "name": "test_hash" }, { "type": "byte[]", "name": "oidc_token" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "set_github_status", "args": [ { "type": "byte[]", "name": "status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "get_bounty_info", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "delete_bounty", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": { "payout_type": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cGF5b3V0X3R5cGU=" }, "is_hitm": { "keyType": "AVMString", "valueType": "uint64", "key": "aXNfaGl0bQ==" }, "review_deadline": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV2aWV3X2RlYWRsaW5l" }, "rejection_count": { "keyType": "AVMString", "valueType": "uint64", "key": "cmVqZWN0aW9uX2NvdW50" }, "escrow_amount": { "keyType": "AVMString", "valueType": "uint64", "key": "ZXNjcm93X2Ftb3VudA==" }, "asset_id": { "keyType": "AVMString", "valueType": "uint64", "key": "YXNzZXRfaWQ=" }, "creator_address": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcl9hZGRyZXNz" }, "agent_address": { "keyType": "AVMString", "valueType": "address", "key": "YWdlbnRfYWRkcmVzcw==" }, "proof_url": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cHJvb2ZfdXJs" }, "proof_data": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cHJvb2ZfZGF0YQ==" }, "bounty_id": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Ym91bnR5X2lk" }, "dispute_reason": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "ZGlzcHV0ZV9yZWFzb24=" }, "dispute_initiator": { "keyType": "AVMString", "valueType": "address", "key": "ZGlzcHV0ZV9pbml0aWF0b3I=" }, "claim_deadline": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2xhaW1fZGVhZGxpbmU=" }, "claim_timestamp": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2xhaW1fdGltZXN0YW1w" }, "github_status": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Z2l0aHViX3N0YXR1cw==" }, "dispute_timestamp": { "keyType": "AVMString", "valueType": "uint64", "key": "ZGlzcHV0ZV90aW1lc3RhbXA=" }, "review_days": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV2aWV3X2RheXM=" }, "state_box": { "keyType": "AVMString", "valueType": "uint64", "key": "c3RhdGU=" }, "mediator_data": { "keyType": "AVMString", "valueType": "MediatorData", "key": "bWVkaWF0b3JfZGF0YQ==" }, "treasury_address": { "keyType": "AVMString", "valueType": "address", "key": "dHJlYXN1cnlfYWRkcmVzcw==" }, "oidc_token": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "b2lkY190b2tlbg==" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 487 ], "errorMessage": "Bounty already claimed" }, { "pc": [ 272 ], "errorMessage": "Bounty already initialized" }, { "pc": [ 481 ], "errorMessage": "Cannot claim your own bounty" }, { "pc": [ 2062 ], "errorMessage": "Claim deadline not yet reached" }, { "pc": [ 510 ], "errorMessage": "Claiming agent must opt-in to the asset first" }, { "pc": [ 2512 ], "errorMessage": "Contract is not opted into the asset" }, { "pc": [ 1683 ], "errorMessage": "Dispute timeout not yet reached" }, { "pc": [ 2522 ], "errorMessage": "Failed to read contract balance" }, { "pc": [ 2516 ], "errorMessage": "Insufficient asset balance" }, { "pc": [ 2526 ], "errorMessage": "Insufficient contract balance" }, { "pc": [ 1399 ], "errorMessage": "Invalid mediator signature" }, { "pc": [ 745 ], "errorMessage": "Invalid state for submit_work" }, { "pc": [ 638, 764 ], "errorMessage": "Only claiming agent can submit work" }, { "pc": [ 928 ], "errorMessage": "Only creator can approve work" }, { "pc": [ 2448 ], "errorMessage": "Only creator can delete application" }, { "pc": [ 1082 ], "errorMessage": "Only creator can reject work" }, { "pc": [ 636, 2431 ], "errorMessage": "check self.agent_address exists" }, { "pc": [ 2088, 2272, 2415 ], "errorMessage": "check self.bounty_id exists" }, { "pc": [ 2057 ], "errorMessage": "check self.claim_deadline exists" }, { "pc": [ 479, 926, 1080, 1183, 1496, 1609, 1776, 1962, 2001, 2426, 2446, 2463 ], "errorMessage": "check self.creator_address exists" }, { "pc": [ 1561, 1673 ], "errorMessage": "check self.dispute_timestamp exists" }, { "pc": [ 932, 1403, 1589, 1687, 1860, 1968, 2420 ], "errorMessage": "check self.escrow_amount exists" }, { "pc": [ 1001, 1386, 1763 ], "errorMessage": "check self.mediator_data exists" }, { "pc": [ 2436 ], "errorMessage": "check self.rejection_count exists" }, { "pc": [ 1851 ], "errorMessage": "check self.review_deadline exists" }, { "pc": [ 471, 623, 917, 1071, 1162, 1335, 1552, 1664, 1830, 1938, 2049, 2211, 2408 ], "errorMessage": "check self.state_box exists" }, { "pc": [ 990, 1752 ], "errorMessage": "check self.treasury_address exists" }, { "pc": [ 168, 580, 596, 1044, 1135, 1290, 1307, 2152, 2168, 2184, 2284 ], "errorMessage": "invalid array length header" }, { "pc": [ 175, 587, 603, 1051, 1142, 1297, 1314, 2159, 2175, 2191, 2291 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 241, 252 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 188, 201, 214, 227 ], "errorMessage": "invalid number of bytes for arc4.uint64" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA2IDg2NDAwIFRNUExfQ0xBSU1fVElNRU9VVCBUTVBMX0RJU1BVVEVfVElNRU9VVAogICAgYnl0ZWNibG9jayAic3RhdGUiICJwYXlvdXRfdHlwZSIgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICJjcmVhdG9yX2FkZHJlc3MiICJlc2Nyb3dfYW1vdW50IiAiYXNzZXRfaWQiICJyZWplY3Rpb25fY291bnQiICJhZ2VudF9hZGRyZXNzIiAicHJvb2ZfdXJsIiAicHJvb2ZfZGF0YSIgImJvdW50eV9pZCIgIm1lZGlhdG9yX2RhdGEiICJpc19oaXRtIiAiZ2l0aHViX3N0YXR1cyIgInRyZWFzdXJ5X2FkZHJlc3MiICJyZXZpZXdfZGF5cyIgInJldmlld19kZWFkbGluZSIgMHg1MDQxNTk0ZjU1NTQgImRpc3B1dGVfdGltZXN0YW1wIiAweDUyNDU0NjU1NGU0NCAweDcwNjU2ZTY0Njk2ZTY3ICJjbGFpbV9kZWFkbGluZSIgImRpc3B1dGVfcmVhc29uIiAib2lkY190b2tlbiIKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDFmZjBkN2QyIC8vIG1ldGhvZCAiZGVsZXRlX2JvdW50eSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZGVsZXRlX2JvdW50eV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjMKICAgIHB1c2hieXRlc3MgMHgyODJmMTc3MCAweDRiYzg2N2E2IDB4MjUwOTkzN2MgMHg0MGMzMDY3ZiAweDc3OWVjNjNlIDB4ZTA1YmM5MzUgMHhiNzQwMjE1MiAweGZlNmNlMTAyIDB4OTU1ZmNjODEgMHhhYWUwNGIyYyAweDg0ZjBhZTI3IDB4OGI3NmIyNmMgMHhkYTc5MTcwNCAweDExN2VmNGQ5IDB4N2Y1ODljYzIgLy8gbWV0aG9kICJjcmVhdGVfYm91bnR5KGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImNsYWltX2JvdW50eSgpdm9pZCIsIG1ldGhvZCAic3VibWl0X3dvcmsoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhcHByb3ZlX3dvcmsoKXZvaWQiLCBtZXRob2QgInJlamVjdF93b3JrKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzdWJtaXRfZGlzcHV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAicmVzb2x2ZV9kaXNwdXRlKGJ5dGVbXSxieXRlW10pdm9pZCIsIG1ldGhvZCAiYXV0b19yZXNvbHZlX2NyZWF0b3Jfd2luKCl2b2lkIiwgbWV0aG9kICJ0aW1lb3V0X2Rpc3B1dGUoKXZvaWQiLCBtZXRob2QgImF1dG9fcmVsZWFzZSgpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYWJhbmRvbmVkKCl2b2lkIiwgbWV0aG9kICJleHBpcmVfY2xhaW0oKXZvaWQiLCBtZXRob2QgImdpdGh1Yl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0X2dpdGh1Yl9zdGF0dXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgImdldF9ib3VudHlfaW5mbygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZV9ib3VudHkgY2xhaW1fYm91bnR5IHN1Ym1pdF93b3JrIGFwcHJvdmVfd29yayByZWplY3Rfd29yayBzdWJtaXRfZGlzcHV0ZSByZXNvbHZlX2Rpc3B1dGUgYXV0b19yZXNvbHZlX2NyZWF0b3Jfd2luIHRpbWVvdXRfZGlzcHV0ZSBhdXRvX3JlbGVhc2UgY2xhaW1fYWJhbmRvbmVkIGV4cGlyZV9jbGFpbSBnaXRodWJfdmVyaWZ5IHNldF9naXRodWJfc3RhdHVzIGdldF9ib3VudHlfaW5mbwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDIzOgogICAgLy8gZXNjcm93LnB5OjQ2CiAgICAvLyBjbGFzcyBFc2Nyb3dDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NzM5YjA4ODkgLy8gbWV0aG9kICJkZXBsb3koKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2RlcGxveV9yb3V0ZUAyNAogICAgZXJyCgptYWluX2RlcGxveV9yb3V0ZUAyNDoKICAgIC8vIGVzY3Jvdy5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9kZWxldGVfYm91bnR5X3JvdXRlQDQ6CiAgICAvLyBlc2Nyb3cucHk6NTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBkZWxldGVfYm91bnR5CgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmNyZWF0ZV9ib3VudHlbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVfYm91bnR5OgogICAgLy8gZXNjcm93LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBjb3ZlciA1CiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciA1CiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gZXNjcm93LnB5OjE0NwogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjE0OAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MTQ5CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjE1MS0xNTIKICAgIC8vICMgU0VDVVJJVFkgRklYOiBQcmV2ZW50IHJlLWluaXRpYWxpemF0aW9uCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuc3RhdGVfYm94Lm1heWJlKCkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBlc2Nyb3cucHk6MTUzCiAgICAvLyBhc3NlcnQgbm90IGV4aXN0cywgIkJvdW50eSBhbHJlYWR5IGluaXRpYWxpemVkIgogICAgIQogICAgYXNzZXJ0IC8vIEJvdW50eSBhbHJlYWR5IGluaXRpYWxpemVkCiAgICAvLyBlc2Nyb3cucHk6MTU1LTE1NgogICAgLy8gIyBWYWxpZGF0ZSBpbnB1dHMKICAgIC8vIGFzc2VydCBib3VudHlfaWQubGVuZ3RoIDw9IDY0CiAgICB1bmNvdmVyIDMKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjE1NwogICAgLy8gYXNzZXJ0IGVzY3Jvd19hbW91bnQgPiAwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjE1OAogICAgLy8gYXNzZXJ0IGlzX2hpdG0gPD0gMQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxNjEtMTYyCiAgICAvLyAjIE9QVC1JTiBBU0E6IElmIGFzc2V0X2lkID4gMCwgdGhlIGFwcCBhY2NvdW50IG11c3Qgb3B0LWluIHRvIGl0IGZpcnN0LgogICAgLy8gaWYgYXNzZXRfaWQgPiAwOgogICAgYnogY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIGVzY3Jvdy5weToxNjMtMTY4CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gZXNjcm93LnB5OjE2NQogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBlc2Nyb3cucHk6MTY2CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gZXNjcm93LnB5OjE2MwogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBlc2Nyb3cucHk6MTY3CiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gZXNjcm93LnB5OjE2My0xNjgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBlc2Nyb3cucHk6MTcwLTE3MQogICAgLy8gIyBJbml0aWFsaXplIHN0YXRlCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChPUEVOKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjE3My0xNzkKICAgIC8vICMgSW5pdGlhbGl6ZSBtZWRpYXRvciBkYXRhIGluc2lkZSBhIHNpbmdsZSBib3gKICAgIC8vIHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZSA9IE1lZGlhdG9yRGF0YSgKICAgIC8vICAgICBhZGRyZXNzPWFyYzQuQWRkcmVzcyhtZWRpYXRvciksCiAgICAvLyAgICAgYm9uZF9hbW91bnQ9YXJjNC5VSW50NjQoMCksICAjIFdpbGwgYmUgcG9wdWxhdGVkIHdoZW4gYm9uZGVkCiAgICAvLyAgICAgaXNfYm9uZGVkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGRpZF9oYXNoPWFyYzQuU3RhdGljQXJyYXlbYXJjNC5CeXRlLCB0eXBpbmcuTGl0ZXJhbFszMl1dLmZyb21fYnl0ZXMoQnl0ZXMoYiJceDAwIiAqIDMyKSkKICAgIC8vICkKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGNvbmNhdAogICAgLy8gZXNjcm93LnB5OjE3My0xNzQKICAgIC8vICMgSW5pdGlhbGl6ZSBtZWRpYXRvciBkYXRhIGluc2lkZSBhIHNpbmdsZSBib3gKICAgIC8vIHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZSA9IE1lZGlhdG9yRGF0YSgKICAgIGJ5dGVjIDExIC8vICJtZWRpYXRvcl9kYXRhIgogICAgLy8gZXNjcm93LnB5OjE3My0xNzkKICAgIC8vICMgSW5pdGlhbGl6ZSBtZWRpYXRvciBkYXRhIGluc2lkZSBhIHNpbmdsZSBib3gKICAgIC8vIHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZSA9IE1lZGlhdG9yRGF0YSgKICAgIC8vICAgICBhZGRyZXNzPWFyYzQuQWRkcmVzcyhtZWRpYXRvciksCiAgICAvLyAgICAgYm9uZF9hbW91bnQ9YXJjNC5VSW50NjQoMCksICAjIFdpbGwgYmUgcG9wdWxhdGVkIHdoZW4gYm9uZGVkCiAgICAvLyAgICAgaXNfYm9uZGVkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGRpZF9oYXNoPWFyYzQuU3RhdGljQXJyYXlbYXJjNC5CeXRlLCB0eXBpbmcuTGl0ZXJhbFszMl1dLmZyb21fYnl0ZXMoQnl0ZXMoYiJceDAwIiAqIDMyKSkKICAgIC8vICkKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToxODAKICAgIC8vIHNlbGYudHJlYXN1cnlfYWRkcmVzcy52YWx1ZSA9IHRyZWFzdXJ5CiAgICBieXRlYyAxNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MTgxCiAgICAvLyBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUgPSBlc2Nyb3dfYW1vdW50CiAgICBkaWcgNQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAiZXNjcm93X2Ftb3VudCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToxODIKICAgIC8vIHNlbGYuYm91bnR5X2lkLnZhbHVlID0gYm91bnR5X2lkCiAgICBieXRlYyAxMCAvLyAiYm91bnR5X2lkIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMCAvLyAiYm91bnR5X2lkIgogICAgZGlnIDcKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToxODMKICAgIC8vIHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgdHhuIFNlbmRlcgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjE4NQogICAgLy8gaWYgaXNfaGl0bSA+IDA6CiAgICBkaWcgNAogICAgYnogY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIGVzY3Jvdy5weToxODYKICAgIC8vIHNlbGYuaXNfaGl0bS52YWx1ZSA9IGlzX2hpdG0KICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlYyAxMiAvLyAiaXNfaGl0bSIKICAgIHN3YXAKICAgIGJveF9wdXQKCmNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gZXNjcm93LnB5OjE4NwogICAgLy8gaWYgYXNzZXRfaWQgPiAwOgogICAgZGlnIDMKICAgIGJ6IGNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBlc2Nyb3cucHk6MTg4CiAgICAvLyBzZWxmLmFzc2V0X2lkLnZhbHVlID0gYXNzZXRfaWQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJhc3NldF9pZCIKICAgIHN3YXAKICAgIGJveF9wdXQKCmNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gZXNjcm93LnB5OjE4OQogICAgLy8gaWYgcmV2aWV3X2RheXMgPiAwOgogICAgZGlnIDIKICAgIGJ6IGNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gZXNjcm93LnB5OjE5MAogICAgLy8gc2VsZi5yZXZpZXdfZGF5cy52YWx1ZSA9IHJldmlld19kYXlzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWMgMTUgLy8gInJldmlld19kYXlzIgogICAgc3dhcAogICAgYm94X3B1dAoKY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gZXNjcm93LnB5OjE5MgogICAgLy8gbG9nKEJ5dGVzKGIiYm91bnR5X2NyZWF0ZWQiKSkKICAgIHB1c2hieXRlcyAweDYyNmY3NTZlNzQ3OTVmNjM3MjY1NjE3NDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjE5MwogICAgLy8gbG9nKGJvdW50eV9pZCkKICAgIGRpZyA2CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5jbGFpbV9ib3VudHlbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9ib3VudHk6CiAgICAvLyBlc2Nyb3cucHk6MTk3CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MTk4CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxOTkKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjAxCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0ZV9ib3gudmFsdWUgPT0gT1BFTgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyMDIKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyICE9IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCAiQ2Fubm90IGNsYWltIHlvdXIgb3duIGJvdW50eSIKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgICE9CiAgICBhc3NlcnQgLy8gQ2Fubm90IGNsYWltIHlvdXIgb3duIGJvdW50eQogICAgLy8gZXNjcm93LnB5OjIwMwogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCkgPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKSwgIkJvdW50eSBhbHJlYWR5IGNsYWltZWQiCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQgLy8gQm91bnR5IGFscmVhZHkgY2xhaW1lZAogICAgLy8gZXNjcm93LnB5OjcyCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNSAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzMKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgLy8gZXNjcm93LnB5OjIwNwogICAgLy8gaWYgYXNzZXRfaWQgPiAwOgogICAgYnogY2xhaW1fYm91bnR5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gZXNjcm93LnB5OjIwOAogICAgLy8gYmFsYW5jZSwgZXhpc3RzID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2JhbGFuY2UoVHhuLnNlbmRlciwgYXNzZXRfaWQpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIGVzY3Jvdy5weToyMDkKICAgIC8vIGFzc2VydCBleGlzdHMsICJDbGFpbWluZyBhZ2VudCBtdXN0IG9wdC1pbiB0byB0aGUgYXNzZXQgZmlyc3QiCiAgICBhc3NlcnQgLy8gQ2xhaW1pbmcgYWdlbnQgbXVzdCBvcHQtaW4gdG8gdGhlIGFzc2V0IGZpcnN0CgpjbGFpbV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gZXNjcm93LnB5OjIxMQogICAgLy8gc2VsZi5hZ2VudF9hZGRyZXNzLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNyAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIHR4biBTZW5kZXIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToyMTIKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMQUlNRUQpCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjE2CiAgICAvLyBzZWxmLmNsYWltX2RlYWRsaW5lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBjbGFpbV90aW1lb3V0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBlc2Nyb3cucHk6MjE0LTIxNQogICAgLy8gIyBTZXQgY2xhaW0gZGVhZGxpbmUKICAgIC8vIGNsYWltX3RpbWVvdXQgPSBUZW1wbGF0ZVZhcltVSW50NjRdKCJDTEFJTV9USU1FT1VUIikKICAgIGludGMgNSAvLyBUTVBMX0NMQUlNX1RJTUVPVVQKICAgIC8vIGVzY3Jvdy5weToyMTYKICAgIC8vIHNlbGYuY2xhaW1fZGVhZGxpbmUudmFsdWUgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGNsYWltX3RpbWVvdXQKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDIxIC8vICJjbGFpbV9kZWFkbGluZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToyMTcKICAgIC8vIHNlbGYuY2xhaW1fdGltZXN0YW1wLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAiY2xhaW1fdGltZXN0YW1wIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjIxOQogICAgLy8gbG9nKEJ5dGVzKGIiYm91bnR5X2NsYWltZWQiKSkKICAgIHB1c2hieXRlcyAweDYyNmY3NTZlNzQ3OTVmNjM2YzYxNjk2ZDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnN1Ym1pdF93b3JrW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VibWl0X3dvcms6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBlc2Nyb3cucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gZXNjcm93LnB5OjIyMwogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIyNAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjI1CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIyNwogICAgLy8gY3VycmVudCA9IHNlbGYuc3RhdGVfYm94LnZhbHVlCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gZXNjcm93LnB5OjIyOQogICAgLy8gaWYgY3VycmVudCA9PSBDTEFJTUVEOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBzdWJtaXRfd29ya19lbHNlX2JvZHlANgogICAgLy8gZXNjcm93LnB5OjIzMAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hZ2VudF9hZGRyZXNzLnZhbHVlLCAiT25seSBjbGFpbWluZyBhZ2VudCBjYW4gc3VibWl0IHdvcmsiCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA3IC8vICJhZ2VudF9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWdlbnRfYWRkcmVzcyBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjbGFpbWluZyBhZ2VudCBjYW4gc3VibWl0IHdvcmsKICAgIC8vIGVzY3Jvdy5weToyMzEKICAgIC8vIGFzc2VydCBwcm9vZl91cmwubGVuZ3RoID4gMAogICAgZGlnIDIKICAgIGR1cAogICAgbGVuCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIzMgogICAgLy8gYXNzZXJ0IHByb29mX3VybC5sZW5ndGggPD0gTUFYX1VSTF9CWVRFUwogICAgcHVzaGludCA1MTIKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyMzMKICAgIC8vIGFzc2VydCBwcm9vZl9kYXRhLmxlbmd0aCA+IDAKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyMzQKICAgIC8vIGFzc2VydCBwcm9vZl9kYXRhLmxlbmd0aCA8PSBNQVhfUFJPT0ZfQllURVMKICAgIHB1c2hpbnQgMjA0OAogICAgPD0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIzNgogICAgLy8gc2VsZi5wcm9vZl91cmwudmFsdWUgPSBwcm9vZl91cmwKICAgIGJ5dGVjIDggLy8gInByb29mX3VybCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgOCAvLyAicHJvb2ZfdXJsIgogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjM3CiAgICAvLyBzZWxmLnByb29mX2RhdGEudmFsdWUgPSBwcm9vZl9kYXRhCiAgICBieXRlYyA5IC8vICJwcm9vZl9kYXRhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA5IC8vICJwcm9vZl9kYXRhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjIzOAogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoU1VCTUlUVEVEKQogICAgaW50Y18yIC8vIDIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjI0MC0yNDEKICAgIC8vICMgSElUTTogU2V0IHJldmlldyBkZWFkbGluZSBpZiBlbmFibGVkCiAgICAvLyBpc19oaXRtX3ZhbCwgaGl0bV9leGlzdHMgPSBzZWxmLmlzX2hpdG0ubWF5YmUoKQogICAgYnl0ZWMgMTIgLy8gImlzX2hpdG0iCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBidXJ5IDUKICAgIC8vIGVzY3Jvdy5weToyNDIKICAgIC8vIGlmIGhpdG1fZXhpc3RzIGFuZCBpc19oaXRtX3ZhbCA9PSAxOgogICAgYnogc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUA1CiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGVzY3Jvdy5weToyNDMKICAgIC8vIHJldmlld19kYXlzX3ZhbCwgZGF5c19leGlzdHMgPSBzZWxmLnJldmlld19kYXlzLm1heWJlKCkKICAgIGJ5dGVjIDE1IC8vICJyZXZpZXdfZGF5cyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weToyNDQKICAgIC8vIGRheXMgPSByZXZpZXdfZGF5c192YWwgaWYgZGF5c19leGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjI0NQogICAgLy8gc2VsZi5yZXZpZXdfZGVhZGxpbmUudmFsdWUgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGRheXMgKiA4NjQwMAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgaW50YyA0IC8vIDg2NDAwCiAgICAqCiAgICArCiAgICBpdG9iCiAgICBieXRlYyAxNiAvLyAicmV2aWV3X2RlYWRsaW5lIgogICAgc3dhcAogICAgYm94X3B1dAoKc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gZXNjcm93LnB5OjI0NwogICAgLy8gbG9nKEJ5dGVzKGIid29ya19zdWJtaXR0ZWQiKSkKICAgIHB1c2hieXRlcyAweDc3NmY3MjZiNWY3Mzc1NjI2ZDY5NzQ3NDY1NjQKICAgIGxvZwoKc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIGVzY3Jvdy5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc3VibWl0X3dvcmtfZWxzZV9ib2R5QDY6CiAgICAvLyBlc2Nyb3cucHk6MjQ5CiAgICAvLyBlbGlmIGN1cnJlbnQgPT0gUkVKRUNURUQ6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHN0YXRlIGZvciBzdWJtaXRfd29yawogICAgLy8gZXNjcm93LnB5OjI1MAogICAgLy8gYWdlbnRfdmFsLCBhZ2VudF9leGlzdHMgPSBzZWxmLmFnZW50X2FkZHJlc3MubWF5YmUoKQogICAgYnl0ZWMgNyAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgLy8gZXNjcm93LnB5OjI1MQogICAgLy8gYXNzZXJ0IGFnZW50X2V4aXN0cyBhbmQgVHhuLnNlbmRlciA9PSBhZ2VudF92YWwsICJPbmx5IGNsYWltaW5nIGFnZW50IGNhbiBzdWJtaXQgd29yayIKICAgIGJ6IHN1Ym1pdF93b3JrX2Jvb2xfZmFsc2VAMTAKICAgIHR4biBTZW5kZXIKICAgIGRpZyA1CiAgICA9PQogICAgYnogc3VibWl0X3dvcmtfYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCnN1Ym1pdF93b3JrX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBlc2Nyb3cucHk6MjUxCiAgICAvLyBhc3NlcnQgYWdlbnRfZXhpc3RzIGFuZCBUeG4uc2VuZGVyID09IGFnZW50X3ZhbCwgIk9ubHkgY2xhaW1pbmcgYWdlbnQgY2FuIHN1Ym1pdCB3b3JrIgogICAgYXNzZXJ0IC8vIE9ubHkgY2xhaW1pbmcgYWdlbnQgY2FuIHN1Ym1pdCB3b3JrCiAgICAvLyBlc2Nyb3cucHk6MjUzCiAgICAvLyByZWpfdmFsLCByZWpfZXhpc3RzID0gc2VsZi5yZWplY3Rpb25fY291bnQubWF5YmUoKQogICAgYnl0ZWMgNiAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjI1NAogICAgLy8gcmVqZWN0aW9ucyA9IHJlal92YWwgaWYgcmVqX2V4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6MjU1CiAgICAvLyBhc3NlcnQgcmVqZWN0aW9ucyA8IE1BWF9SRUpFQ1RJT05TCiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjU3CiAgICAvLyBhc3NlcnQgcHJvb2ZfdXJsLmxlbmd0aCA+IDAKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNTgKICAgIC8vIGFzc2VydCBwcm9vZl91cmwubGVuZ3RoIDw9IE1BWF9VUkxfQllURVMKICAgIHB1c2hpbnQgNTEyCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjU5CiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPiAwCiAgICBkaWcgMwogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjYwCiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPD0gTUFYX1BST09GX0JZVEVTCiAgICBwdXNoaW50IDIwNDgKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNjIKICAgIC8vIHNlbGYucHJvb2ZfdXJsLnZhbHVlID0gcHJvb2ZfdXJsCiAgICBieXRlYyA4IC8vICJwcm9vZl91cmwiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDggLy8gInByb29mX3VybCIKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjI2MwogICAgLy8gc2VsZi5wcm9vZl9kYXRhLnZhbHVlID0gcHJvb2ZfZGF0YQogICAgYnl0ZWMgOSAvLyAicHJvb2ZfZGF0YSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgOSAvLyAicHJvb2ZfZGF0YSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToyNjQKICAgIC8vIHNlbGYucmVqZWN0aW9uX2NvdW50LnZhbHVlID0gcmVqZWN0aW9ucyArIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA2IC8vICJyZWplY3Rpb25fY291bnQiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjY1CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChTVUJNSVRURUQpCiAgICBpbnRjXzIgLy8gMgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjY3LTI2OAogICAgLy8gIyBISVRNOiBSZXNldCByZXZpZXcgZGVhZGxpbmUgb24gcmV2aXNpb24gaWYgZW5hYmxlZAogICAgLy8gaXNfaGl0bV92YWwsIGhpdG1fZXhpc3RzID0gc2VsZi5pc19oaXRtLm1heWJlKCkKICAgIGJ5dGVjIDEyIC8vICJpc19oaXRtIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgYnVyeSA1CiAgICAvLyBlc2Nyb3cucHk6MjY5CiAgICAvLyBpZiBoaXRtX2V4aXN0cyBhbmQgaXNfaGl0bV92YWwgPT0gMToKICAgIGJ6IHN1Ym1pdF93b3JrX2FmdGVyX2lmX2Vsc2VAMTQKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IHN1Ym1pdF93b3JrX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIGVzY3Jvdy5weToyNzAKICAgIC8vIHJldmlld19kYXlzX3ZhbCwgZGF5c19leGlzdHMgPSBzZWxmLnJldmlld19kYXlzLm1heWJlKCkKICAgIGJ5dGVjIDE1IC8vICJyZXZpZXdfZGF5cyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weToyNzEKICAgIC8vIGRheXMgPSByZXZpZXdfZGF5c192YWwgaWYgZGF5c19leGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjI3MgogICAgLy8gc2VsZi5yZXZpZXdfZGVhZGxpbmUudmFsdWUgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGRheXMgKiA4NjQwMAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgaW50YyA0IC8vIDg2NDAwCiAgICAqCiAgICArCiAgICBpdG9iCiAgICBieXRlYyAxNiAvLyAicmV2aWV3X2RlYWRsaW5lIgogICAgc3dhcAogICAgYm94X3B1dAoKc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIGVzY3Jvdy5weToyNzQKICAgIC8vIGxvZyhCeXRlcyhiIndvcmtfcmV2aXNlX3N1Ym1pdHRlZCIpKQogICAgcHVzaGJ5dGVzIDB4Nzc2ZjcyNmI1ZjcyNjU3NjY5NzM2NTVmNzM3NTYyNmQ2OTc0NzQ2NTY0CiAgICBsb2cKICAgIGIgc3VibWl0X3dvcmtfYWZ0ZXJfaWZfZWxzZUAxNwoKc3VibWl0X3dvcmtfYm9vbF9mYWxzZUAxMDoKICAgIGludGNfMCAvLyAwCiAgICBiIHN1Ym1pdF93b3JrX2Jvb2xfbWVyZ2VAMTEKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuYXBwcm92ZV93b3JrW3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwcm92ZV93b3JrOgogICAgLy8gZXNjcm93LnB5OjI4MQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI4MgogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjgzCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI4NQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI4NgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsICJPbmx5IGNyZWF0b3IgY2FuIGFwcHJvdmUgd29yayIKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjcmVhdG9yIGNhbiBhcHByb3ZlIHdvcmsKICAgIC8vIGVzY3Jvdy5weToyODgKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDQgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjcyCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNSAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzMKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weToyOTAKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjI5MgogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFBBWU9VVCkKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDE3IC8vIDB4NTA0MTU5NGY1NTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjkzCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjI5NS0yOTYKICAgIC8vICMgMiUgdHJlYXN1cnksIDAuMjUlIG1lZGlhdG9yLCByZW1haW5kZXIgdG8gd29ya2VyCiAgICAvLyBmZWVfdHJlYXN1cnkgPSBlc2Nyb3dfYW1vdW50ICogMiAvLyAxMDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weToyOTcKICAgIC8vIGZlZV9tZWRpYXRvciA9IGVzY3Jvd19hbW91bnQgKiAyNSAvLyAxMDAwMAogICAgZGlnIDIKICAgIHB1c2hpbnQgMjUKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weToyOTgKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBlc2Nyb3dfYW1vdW50IC0gZmVlX3RyZWFzdXJ5IC0gZmVlX21lZGlhdG9yCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICAtCiAgICBkaWcgMQogICAgLQogICAgLy8gZXNjcm93LnB5OjMwMAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlLCBmZWVfdHJlYXN1cnksIGFzc2V0X2lkKQogICAgYnl0ZWMgMTQgLy8gInRyZWFzdXJ5X2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmVhc3VyeV9hZGRyZXNzIGV4aXN0cwogICAgdW5jb3ZlciAzCiAgICBkaWcgNAogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTozMDEKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KEFjY291bnQoc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlLmFkZHJlc3MuYnl0ZXMpLCBmZWVfbWVkaWF0b3IsIGFzc2V0X2lkKQogICAgYnl0ZWMgMTEgLy8gIm1lZGlhdG9yX2RhdGEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZWRpYXRvcl9kYXRhIGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjMwMgogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgcmVtYWluaW5nX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjMwNAogICAgLy8gbG9nKEJ5dGVzKGIid29ya19hcHByb3ZlZCIpKQogICAgcHVzaGJ5dGVzIDB4Nzc2ZjcyNmI1ZjYxNzA3MDcyNmY3NjY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnJlamVjdF93b3JrW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVqZWN0X3dvcms6CiAgICAvLyBlc2Nyb3cucHk6MzA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBlc2Nyb3cucHk6MzA4CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzA5CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozMTAKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzEyCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0ZV9ib3gudmFsdWUgPT0gU1VCTUlUVEVECiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzEzCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgIk9ubHkgY3JlYXRvciBjYW4gcmVqZWN0IHdvcmsiCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gcmVqZWN0IHdvcmsKICAgIC8vIGVzY3Jvdy5weTo4OAogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLnJlamVjdGlvbl9jb3VudC5tYXliZSgpCiAgICBieXRlYyA2IC8vICJyZWplY3Rpb25fY291bnQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODkKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTozMTQKICAgIC8vIGFzc2VydCBzZWxmLl9nZXRfcmVqZWN0aW9uX2NvdW50KCkgPCBNQVhfUkVKRUNUSU9OUwogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMxNgogICAgLy8gc2VsZi5yZWplY3Rpb25fY291bnQudmFsdWUgPSBzZWxmLl9nZXRfcmVqZWN0aW9uX2NvdW50KCkgKyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgYnl0ZWMgNiAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMxNwogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoUkVKRUNURUQpCiAgICBwdXNoaW50IDMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMxOQogICAgLy8gbG9nKEJ5dGVzKGIid29ya19yZWplY3RlZCIpKQogICAgcHVzaGJ5dGVzIDB4Nzc2ZjcyNmI1ZjcyNjU2YTY1NjM3NDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjMyMAogICAgLy8gbG9nKHJlYXNvbikKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjMwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnN1Ym1pdF9kaXNwdXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VibWl0X2Rpc3B1dGU6CiAgICAvLyBlc2Nyb3cucHk6MzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBlc2Nyb3cucHk6MzI0CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzI1CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozMjYKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzI4CiAgICAvLyBzdGF0ZSA9IHNlbGYuc3RhdGVfYm94LnZhbHVlCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gZXNjcm93LnB5OjMyOQogICAgLy8gYXNzZXJ0IHN0YXRlID09IFNVQk1JVFRFRCBvciBzdGF0ZSA9PSBSRUpFQ1RFRAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBibnogc3VibWl0X2Rpc3B1dGVfYm9vbF90cnVlQDMKICAgIGR1cAogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogc3VibWl0X2Rpc3B1dGVfYm9vbF9mYWxzZUA0CgpzdWJtaXRfZGlzcHV0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpzdWJtaXRfZGlzcHV0ZV9ib29sX21lcmdlQDU6CiAgICAvLyBlc2Nyb3cucHk6MzI5CiAgICAvLyBhc3NlcnQgc3RhdGUgPT0gU1VCTUlUVEVEIG9yIHN0YXRlID09IFJFSkVDVEVECiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozMzAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGJueiBzdWJtaXRfZGlzcHV0ZV9ib29sX3RydWVANwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgID09CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9ib29sX2ZhbHNlQDgKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIGVzY3Jvdy5weTozMzAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzMxCiAgICAvLyBhc3NlcnQgcmVhc29uLmxlbmd0aCA+IDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozMzIKICAgIC8vIGFzc2VydCByZWFzb24ubGVuZ3RoIDw9IE1BWF9ESVNQVVRFX1JFQVNPTl9CWVRFUwogICAgcHVzaGludCAyNTYKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozMzQKICAgIC8vIHNlbGYuZGlzcHV0ZV9yZWFzb24udmFsdWUgPSByZWFzb24KICAgIGJ5dGVjIDIyIC8vICJkaXNwdXRlX3JlYXNvbiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjIgLy8gImRpc3B1dGVfcmVhc29uIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMzNQogICAgLy8gc2VsZi5kaXNwdXRlX2luaXRpYXRvci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIHB1c2hieXRlcyAiZGlzcHV0ZV9pbml0aWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzM2CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChESVNQVVRFRCkKICAgIHB1c2hpbnQgNAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzM3CiAgICAvLyBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGJ5dGVjIDE4IC8vICJkaXNwdXRlX3RpbWVzdGFtcCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozMzkKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfc3VibWl0dGVkIikpCiAgICBwdXNoYnl0ZXMgMHg2NDY5NzM3MDc1NzQ2NTVmNzM3NTYyNmQ2OTc0NzQ2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTozMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc3VibWl0X2Rpc3B1dGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgc3VibWl0X2Rpc3B1dGVfYm9vbF9tZXJnZUA5CgpzdWJtaXRfZGlzcHV0ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdWJtaXRfZGlzcHV0ZV9ib29sX21lcmdlQDUKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QucmVzb2x2ZV9kaXNwdXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVzb2x2ZV9kaXNwdXRlOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBlc2Nyb3cucHk6MzQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBlc2Nyb3cucHk6MzQzCiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzQ0CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNDUKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzQ3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0ZV9ib3gudmFsdWUgPT0gRElTUFVURUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzQ4CiAgICAvLyBhc3NlcnQgcmVzb2x1dGlvbiA9PSBCeXRlcyhiImFnZW50X3dpbiIpIG9yIHJlc29sdXRpb24gPT0gQnl0ZXMoYiJjcmVhdG9yX3dpbiIpCiAgICBwdXNoYnl0ZXMgMHg2MTY3NjU2ZTc0NWY3NzY5NmUKICAgID09CiAgICBkdXAKICAgIGJueiByZXNvbHZlX2Rpc3B1dGVfYm9vbF90cnVlQDMKICAgIGRpZyAyCiAgICBwdXNoYnl0ZXMgMHg2MzcyNjU2MTc0NmY3MjVmNzc2OTZlCiAgICA9PQogICAgYnogcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfZmFsc2VANAoKcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCnJlc29sdmVfZGlzcHV0ZV9ib29sX21lcmdlQDU6CiAgICAvLyBlc2Nyb3cucHk6MzQ4CiAgICAvLyBhc3NlcnQgcmVzb2x1dGlvbiA9PSBCeXRlcyhiImFnZW50X3dpbiIpIG9yIHJlc29sdXRpb24gPT0gQnl0ZXMoYiJjcmVhdG9yX3dpbiIpCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNDkKICAgIC8vIGFzc2VydCBtZWRpYXRvcl9zaWduYXR1cmUubGVuZ3RoID4gMAogICAgZGlnIDEKICAgIGR1cAogICAgbGVuCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNTEtMzUyCiAgICAvLyAjIENyeXB0b2dyYXBoaWNhbGx5IHZlcmlmeSBtZWRpYXRvciBzaWduYXR1cmUKICAgIC8vIG1lZGlhdG9yX2FkZHIgPSBzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcwogICAgYnl0ZWMgMTEgLy8gIm1lZGlhdG9yX2RhdGEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZWRpYXRvcl9kYXRhIGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBlc2Nyb3cucHk6MzUzCiAgICAvLyBtZXNzYWdlID0gb3AuaXRvYihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCkgKyByZXNvbHV0aW9uCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGl0b2IKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIC8vIGVzY3Jvdy5weTozNTQKICAgIC8vIGFzc2VydCBvcC5lZDI1NTE5dmVyaWZ5KG1lc3NhZ2UsIG1lZGlhdG9yX3NpZ25hdHVyZSwgbWVkaWF0b3JfYWRkciksICJJbnZhbGlkIG1lZGlhdG9yIHNpZ25hdHVyZSIKICAgIGNvdmVyIDIKICAgIGVkMjU1MTl2ZXJpZnkKICAgIGFzc2VydCAvLyBJbnZhbGlkIG1lZGlhdG9yIHNpZ25hdHVyZQogICAgLy8gZXNjcm93LnB5OjM1NgogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNCAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weTo3MgogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDUgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjczCiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gZXNjcm93LnB5OjM1OAogICAgLy8gc2VsZi5fdmVyaWZ5X2VzY3Jvd19iYWxhbmNlKGFzc2V0X2lkLCBlc2Nyb3dfYW1vdW50KQogICAgc3dhcAogICAgY2FsbHN1YiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6MzYwCiAgICAvLyBpZiByZXNvbHV0aW9uID09IEJ5dGVzKGIiYWdlbnRfd2luIik6CiAgICBkaWcgMQogICAgYnogcmVzb2x2ZV9kaXNwdXRlX2Vsc2VfYm9keUA3CiAgICAvLyBlc2Nyb3cucHk6MzYxCiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoUEFZT1VUKQogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMTcgLy8gMHg1MDQxNTk0ZjU1NTQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozNjIKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzYzCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCkKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICBzd2FwCiAgICBkaWcgNQogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTozNjQKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfcmVzb2x2ZWRfYWdlbnRfd2luIikpCiAgICBwdXNoYnl0ZXMgMHg2NDY5NzM3MDc1NzQ2NTVmNzI2NTczNmY2Yzc2NjU2NDVmNjE2NzY1NmU3NDVmNzc2OTZlCiAgICBsb2cKCnJlc29sdmVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBlc2Nyb3cucHk6MzQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJlc29sdmVfZGlzcHV0ZV9lbHNlX2JvZHlANzoKICAgIC8vIGVzY3Jvdy5weTozNjYKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhSRUZVTkQpCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAxOSAvLyAweDUyNDU0NjU1NGU0NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjM2NwogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozNjgKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBlc2Nyb3dfYW1vdW50LCBhc3NldF9pZCkKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIHN3YXAKICAgIGRpZyA1CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjM2OQogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV9yZXNvbHZlZF9jcmVhdG9yX3dpbiIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYzNzI2NTYxNzQ2ZjcyNWY3NzY5NmUKICAgIGxvZwogICAgYiByZXNvbHZlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA4CgpyZXNvbHZlX2Rpc3B1dGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfbWVyZ2VANQoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5hdXRvX3Jlc29sdmVfY3JlYXRvcl93aW5bcm91dGluZ10oKSAtPiB2b2lkOgphdXRvX3Jlc29sdmVfY3JlYXRvcl93aW46CiAgICAvLyBlc2Nyb3cucHk6MzczCiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6Mzc0CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNzYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNzgKICAgIC8vIGNyZWF0ZWRfdHMgPSBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlCiAgICBieXRlYyAxOCAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3RpbWVzdGFtcCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTozODAKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGNyZWF0ZWRfdHMgKyB0aW1lb3V0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAvLyBlc2Nyb3cucHk6Mzc5CiAgICAvLyB0aW1lb3V0ID0gVUludDY0KDE0ICogMjQgKiA2MCAqIDYwKSAgIyAxNCBkYXlzCiAgICBwdXNoaW50IDEyMDk2MDAKICAgIC8vIGVzY3Jvdy5weTozODAKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGNyZWF0ZWRfdHMgKyB0aW1lb3V0CiAgICArCiAgICA+CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozODIKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhSRUZVTkQpCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAxOSAvLyAweDUyNDU0NjU1NGU0NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjM4MwogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozODUKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDQgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjcyCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNSAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzMKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTozODcKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjM4OQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTozOTEKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfYXV0b19yZXNvbHZlZF9jcmVhdG9yX3dpbiIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1ZjYxNzU3NDZmNWY3MjY1NzM2ZjZjNzY2NTY0NWY2MzcyNjU2MTc0NmY3MjVmNzc2OTZlCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTozNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC50aW1lb3V0X2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgp0aW1lb3V0X2Rpc3B1dGU6CiAgICAvLyBlc2Nyb3cucHk6Mzk1CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6Mzk2CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozOTgKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0MDAKICAgIC8vIGRpc3B1dGVfdHMgPSBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlCiAgICBieXRlYyAxOCAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3RpbWVzdGFtcCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo0MDEKICAgIC8vIGRpc3B1dGVfdGltZW91dCA9IFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkRJU1BVVEVfVElNRU9VVCIpCiAgICBpbnRjIDYgLy8gVE1QTF9ESVNQVVRFX1RJTUVPVVQKICAgIC8vIGVzY3Jvdy5weTo0MDIKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGRpc3B1dGVfdHMgKyBkaXNwdXRlX3RpbWVvdXQsICJEaXNwdXRlIHRpbWVvdXQgbm90IHlldCByZWFjaGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgY292ZXIgMgogICAgKwogICAgPgogICAgYXNzZXJ0IC8vIERpc3B1dGUgdGltZW91dCBub3QgeWV0IHJlYWNoZWQKICAgIC8vIGVzY3Jvdy5weTo0MDQKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDQgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjcyCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNSAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzMKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo0MDYKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjQwOC00MDkKICAgIC8vICMgMiUgdHJlYXN1cnksIDAuMjUlIG1lZGlhdG9yLCByZW1haW5kZXIgc3BsaXQKICAgIC8vIGZlZV90cmVhc3VyeSA9IGVzY3Jvd19hbW91bnQgKiAyIC8vIDEwMAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDEwMAogICAgLwogICAgLy8gZXNjcm93LnB5OjQxMAogICAgLy8gZmVlX21lZGlhdG9yID0gZXNjcm93X2Ftb3VudCAqIDI1IC8vIDEwMDAwCiAgICBkaWcgMgogICAgcHVzaGludCAyNQogICAgKgogICAgcHVzaGludCAxMDAwMAogICAgLwogICAgLy8gZXNjcm93LnB5OjQxMQogICAgLy8gcmVtYWluaW5nX2Ftb3VudCA9IGVzY3Jvd19hbW91bnQgLSBmZWVfdHJlYXN1cnkgLSBmZWVfbWVkaWF0b3IKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIC0KICAgIGRpZyAxCiAgICAtCiAgICAvLyBlc2Nyb3cucHk6NDEyCiAgICAvLyBoYWxmX2Ftb3VudCA9IHJlbWFpbmluZ19hbW91bnQgLy8gMgogICAgaW50Y18yIC8vIDIKICAgIC8KICAgIC8vIGVzY3Jvdy5weTo0MTQKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhTUExJVCkKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIHB1c2hieXRlcyAweDUzNTA0YzQ5NTQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0MTUKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDE3CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLnRyZWFzdXJ5X2FkZHJlc3MudmFsdWUsIGZlZV90cmVhc3VyeSwgYXNzZXRfaWQpCiAgICBieXRlYyAxNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjQxOAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksIGZlZV9tZWRpYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyAxMSAvLyAibWVkaWF0b3JfZGF0YSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1lZGlhdG9yX2RhdGEgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIHVuY292ZXIgMgogICAgZGlnIDMKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NDE5CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgaGFsZl9hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgZGlnIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjQyMAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSwgaGFsZl9hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo0MjIKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfdGltZW91dF9zcGxpdCIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1Zjc0Njk2ZDY1NmY3NTc0NWY3MzcwNmM2OTc0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5hdXRvX3JlbGVhc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphdXRvX3JlbGVhc2U6CiAgICAvLyBlc2Nyb3cucHk6NDI2CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NDI3CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0MjkKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBTVUJNSVRURUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3NgogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmlzX2hpdG0ubWF5YmUoKQogICAgYnl0ZWMgMTIgLy8gImlzX2hpdG0iCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzcKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo0MzAKICAgIC8vIGFzc2VydCBzZWxmLl9nZXRfaXNfaGl0bSgpID09IDEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NDMyCiAgICAvLyBkZWFkbGluZSA9IHNlbGYucmV2aWV3X2RlYWRsaW5lLnZhbHVlCiAgICBieXRlYyAxNiAvLyAicmV2aWV3X2RlYWRsaW5lIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmV2aWV3X2RlYWRsaW5lIGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjQzMwogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IGRlYWRsaW5lCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NDM1CiAgICAvLyBlc2Nyb3dfYW1vdW50ID0gc2VsZi5lc2Nyb3dfYW1vdW50LnZhbHVlCiAgICBieXRlYyA0IC8vICJlc2Nyb3dfYW1vdW50IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Ftb3VudCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo3MgogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDUgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjczCiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6NDM3CiAgICAvLyBzZWxmLl92ZXJpZnlfZXNjcm93X2JhbGFuY2UoYXNzZXRfaWQsIGVzY3Jvd19hbW91bnQpCiAgICBkdXAKICAgIGRpZyAyCiAgICBjYWxsc3ViIF92ZXJpZnlfZXNjcm93X2JhbGFuY2UKICAgIC8vIGVzY3Jvdy5weTo0MzkKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhQQVlPVVQpCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAxNyAvLyAweDUwNDE1OTRmNTU1NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQ0MAogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0NDIKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCksIGVzY3Jvd19hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NDQ0CiAgICAvLyBsb2coQnl0ZXMoYiJhdXRvX3JlbGVhc2VkX2hpdG0iKSkKICAgIHB1c2hieXRlcyAweDYxNzU3NDZmNWY3MjY1NmM2NTYxNzM2NTY0NWY2ODY5NzQ2ZAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NDI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuY2xhaW1fYWJhbmRvbmVkW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fYWJhbmRvbmVkOgogICAgLy8gZXNjcm93LnB5OjQ0OAogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ0OQogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NDUwCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ1MgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFJFSkVDVEVECiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojg4CiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYucmVqZWN0aW9uX2NvdW50Lm1heWJlKCkKICAgIGJ5dGVjIDYgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4OQogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjQ1MwogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9yZWplY3Rpb25fY291bnQoKSA+PSBNQVhfUkVKRUNUSU9OUwogICAgcHVzaGludCAzCiAgICA+PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NDU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ1NgogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNCAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NzIKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5hc3NldF9pZC5tYXliZSgpCiAgICBieXRlYyA1IC8vICJhc3NldF9pZCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo3MwogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjQ1OAogICAgLy8gc2VsZi5fdmVyaWZ5X2VzY3Jvd19iYWxhbmNlKGFzc2V0X2lkLCBlc2Nyb3dfYW1vdW50KQogICAgZHVwCiAgICBkaWcgMgogICAgY2FsbHN1YiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6NDYwCiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoUkVGVU5EKQogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMTkgLy8gMHg1MjQ1NDY1NTRlNDQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0NjEKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDYzCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgZXNjcm93X2Ftb3VudCwgYXNzZXRfaWQpCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjQ2NQogICAgLy8gbG9nKEJ5dGVzKGIiYWJhbmRvbmVkX3JlZnVuZGVkX2NyZWF0b3IiKSkKICAgIHB1c2hieXRlcyAweDYxNjI2MTZlNjQ2ZjZlNjU2NDVmNzI2NTY2NzU2ZTY0NjU2NDVmNjM3MjY1NjE3NDZmNzIKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQ0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmV4cGlyZV9jbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmV4cGlyZV9jbGFpbToKICAgIC8vIGVzY3Jvdy5weTo0NjkKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0NzAKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ3MgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IENMQUlNRUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0NzQKICAgIC8vIGNsYWltX2RlYWRsaW5lID0gc2VsZi5jbGFpbV9kZWFkbGluZS52YWx1ZQogICAgYnl0ZWMgMjEgLy8gImNsYWltX2RlYWRsaW5lIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhaW1fZGVhZGxpbmUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NDc1CiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBjbGFpbV9kZWFkbGluZSwgIkNsYWltIGRlYWRsaW5lIG5vdCB5ZXQgcmVhY2hlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDwKICAgIGFzc2VydCAvLyBDbGFpbSBkZWFkbGluZSBub3QgeWV0IHJlYWNoZWQKICAgIC8vIGVzY3Jvdy5weTo0NzctNDc4CiAgICAvLyAjIFJlY29yZCBjbGFpbSBleHBpcnkKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMQUlNX0VYUElSRUQpCiAgICBwdXNoaW50IDcKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQ3OQogICAgLy8gbG9nKEJ5dGVzKGIiY2xhaW1fZXhwaXJlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjM2YzYxNjk2ZDVmNjU3ODcwNjk3MjY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQ4MAogICAgLy8gbG9nKHNlbGYuYm91bnR5X2lkLnZhbHVlKQogICAgYnl0ZWMgMTAgLy8gImJvdW50eV9pZCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvdW50eV9pZCBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQ4MQogICAgLy8gbG9nKHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCkuYnl0ZXMpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NDgyCiAgICAvLyBsb2coQnl0ZXMoYiJrYXJtYV9wZW5hbHR5XzIwIikpCiAgICBwdXNoYnl0ZXMgMHg2YjYxNzI2ZDYxNWY3MDY1NmU2MTZjNzQ3OTVmMzIzMAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NDg0LTQ4NQogICAgLy8gIyBTRUNVUklUWSBGSVg6IFJldmVydCBhZ2VudCBhZGRyZXNzIHRvIHplcm8gYWRkcmVzcyBzbyBzb21lb25lIGVsc2UgY2FuIGNsYWltCiAgICAvLyBzZWxmLmFnZW50X2FkZHJlc3MudmFsdWUgPSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICBieXRlYyA3IC8vICJhZ2VudF9hZGRyZXNzIgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0ODctNDg4CiAgICAvLyAjIFJldmVydCB0byBPUEVOIHNvIG90aGVycyBjYW4gY2xhaW0KICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KE9QRU4pCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQ4OQogICAgLy8gc2VsZi5yZWplY3Rpb25fY291bnQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0OTEKICAgIC8vIGxvZyhCeXRlcyhiImJvdW50eV9yZW9wZW5lZCIpKQogICAgcHVzaGJ5dGVzIDB4NjI2Zjc1NmU3NDc5NWY3MjY1NmY3MDY1NmU2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5naXRodWJfdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2l0aHViX3ZlcmlmeToKICAgIC8vIGVzY3Jvdy5weTo0OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gZXNjcm93LnB5OjQ5NQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ5NgogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NDk3CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQ5OQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjUwMS01MDIKICAgIC8vICMgU3RvcmUgR2l0SHViIHZlcmlmaWNhdGlvbiBkYXRhCiAgICAvLyBzZWxmLnByb29mX3VybC52YWx1ZSA9IHByX3VybAogICAgYnl0ZWMgOCAvLyAicHJvb2ZfdXJsIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA4IC8vICJwcm9vZl91cmwiCiAgICB1bmNvdmVyIDMKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1MDMKICAgIC8vIHNlbGYuZ2l0aHViX3N0YXR1cy52YWx1ZSA9IEJ5dGVzKGIicGVuZGluZyIpCiAgICBieXRlYyAxMyAvLyAiZ2l0aHViX3N0YXR1cyIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTMgLy8gImdpdGh1Yl9zdGF0dXMiCiAgICBieXRlYyAyMCAvLyAweDcwNjU2ZTY0Njk2ZTY3CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTA1LTUwNgogICAgLy8gIyBTdG9yZSB0ZXN0IGhhc2ggaW4gcHJvb2ZfZGF0YQogICAgLy8gc2VsZi5wcm9vZl9kYXRhLnZhbHVlID0gdGVzdF9oYXNoCiAgICBieXRlYyA5IC8vICJwcm9vZl9kYXRhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA5IC8vICJwcm9vZl9kYXRhIgogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTA4LTUwOQogICAgLy8gIyBTdG9yZSBPSURDIHRva2VuCiAgICAvLyBzZWxmLm9pZGNfdG9rZW4udmFsdWUgPSBvaWRjX3Rva2VuCiAgICBieXRlYyAyMyAvLyAib2lkY190b2tlbiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjMgLy8gIm9pZGNfdG9rZW4iCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTExCiAgICAvLyBsb2coQnl0ZXMoYiJnaXRodWJfdmVyaWZpZWQiKSkKICAgIHB1c2hieXRlcyAweDY3Njk3NDY4NzU2MjVmNzY2NTcyNjk2NjY5NjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NTEyCiAgICAvLyBsb2coc2VsZi5ib3VudHlfaWQudmFsdWUpCiAgICBieXRlYyAxMCAvLyAiYm91bnR5X2lkIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm91bnR5X2lkIGV4aXN0cwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NTEzCiAgICAvLyBsb2coQnl0ZXMoYiJwZW5kaW5nIikpCiAgICBieXRlYyAyMCAvLyAweDcwNjU2ZTY0Njk2ZTY3CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5zZXRfZ2l0aHViX3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9naXRodWJfc3RhdHVzOgogICAgLy8gZXNjcm93LnB5OjUxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICAvLyBlc2Nyb3cucHk6NTE3CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTE4CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1MTkKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTIxCiAgICAvLyBhc3NlcnQgc3RhdHVzID09IEJ5dGVzKGIicGFzcyIpIG9yIHN0YXR1cyA9PSBCeXRlcyhiImZhaWwiKSBvciBzdGF0dXMgPT0gQnl0ZXMoYiJwZW5kaW5nIikKICAgIHB1c2hieXRlcyAweDcwNjE3MzczCiAgICA9PQogICAgYm56IHNldF9naXRodWJfc3RhdHVzX2Jvb2xfdHJ1ZUA0CiAgICBkdXAKICAgIHB1c2hieXRlcyAweDY2NjE2OTZjCiAgICA9PQogICAgYm56IHNldF9naXRodWJfc3RhdHVzX2Jvb2xfdHJ1ZUA0CiAgICBkdXAKICAgIGJ5dGVjIDIwIC8vIDB4NzA2NTZlNjQ2OTZlNjcKICAgID09CiAgICBieiBzZXRfZ2l0aHViX3N0YXR1c19ib29sX2ZhbHNlQDUKCnNldF9naXRodWJfc3RhdHVzX2Jvb2xfdHJ1ZUA0OgogICAgaW50Y18xIC8vIDEKCnNldF9naXRodWJfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIGVzY3Jvdy5weTo1MjEKICAgIC8vIGFzc2VydCBzdGF0dXMgPT0gQnl0ZXMoYiJwYXNzIikgb3Igc3RhdHVzID09IEJ5dGVzKGIiZmFpbCIpIG9yIHN0YXR1cyA9PSBCeXRlcyhiInBlbmRpbmciKQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTIzCiAgICAvLyBzZWxmLmdpdGh1Yl9zdGF0dXMudmFsdWUgPSBzdGF0dXMKICAgIGJ5dGVjIDEzIC8vICJnaXRodWJfc3RhdHVzIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMyAvLyAiZ2l0aHViX3N0YXR1cyIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1MjUKICAgIC8vIGxvZyhCeXRlcyhiImdpdGh1Yl9zdGF0dXNfdXBkYXRlZCIpKQogICAgcHVzaGJ5dGVzIDB4Njc2OTc0Njg3NTYyNWY3Mzc0NjE3NDc1NzM1Zjc1NzA2NDYxNzQ2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo1MjYKICAgIC8vIGxvZyhzdGF0dXMpCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo1MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmdldF9ib3VudHlfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9ib3VudHlfaW5mbzoKICAgIC8vIGVzY3Jvdy5weTo1MzAKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1MzEKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjUzMwogICAgLy8gbG9nKEJ5dGVzKGIiYm91bnR5X2luZm8iKSkKICAgIHB1c2hieXRlcyAweDYyNmY3NTZlNzQ3OTVmNjk2ZTY2NmYKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjUzNAogICAgLy8gbG9nKG9wLml0b2Ioc2VsZi5zdGF0ZV9ib3gudmFsdWUpKQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpdG9iCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo1MzUKICAgIC8vIGxvZyhzZWxmLmJvdW50eV9pZC52YWx1ZSkKICAgIGJ5dGVjIDEwIC8vICJib3VudHlfaWQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3VudHlfaWQgZXhpc3RzCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo1MzYKICAgIC8vIGxvZyhvcC5pdG9iKHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZSkpCiAgICBieXRlYyA0IC8vICJlc2Nyb3dfYW1vdW50IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Ftb3VudCBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjUzNwogICAgLy8gbG9nKHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLmJ5dGVzKQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NTM4CiAgICAvLyBsb2coc2VsZi5hZ2VudF9hZGRyZXNzLnZhbHVlLmJ5dGVzKQogICAgYnl0ZWMgNyAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFnZW50X2FkZHJlc3MgZXhpc3RzCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo1MzkKICAgIC8vIGxvZyhvcC5pdG9iKHNlbGYucmVqZWN0aW9uX2NvdW50LnZhbHVlKSkKICAgIGJ5dGVjIDYgLy8gInJlamVjdGlvbl9jb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlamVjdGlvbl9jb3VudCBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjUyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmRlbGV0ZV9ib3VudHlbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVfYm91bnR5OgogICAgLy8gZXNjcm93LnB5OjU0MwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsICJPbmx5IGNyZWF0b3IgY2FuIGRlbGV0ZSBhcHBsaWNhdGlvbiIKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjcmVhdG9yIGNhbiBkZWxldGUgYXBwbGljYXRpb24KICAgIC8vIGVzY3Jvdy5weTo1NDUtNTQ2CiAgICAvLyAjIFN3ZWVwIGFsbCByZW1haW5pbmcgQUxHTyBhbmQgY2xvc2Ugb3V0IHRoZSBjb250cmFjdCBhY2NvdW50CiAgICAvLyBhcHBfYmFsYW5jZSwgZXhpc3RzID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2JhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIGVzY3Jvdy5weTo1NDcKICAgIC8vIGlmIGV4aXN0cyBhbmQgYXBwX2JhbGFuY2UgPiAwOgogICAgYnogZGVsZXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDUKICAgIGR1cAogICAgYnogZGVsZXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGVzY3Jvdy5weTo1NDgtNTUzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9c2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICAgICBjbG9zZV9yZW1haW5kZXJfdG89c2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGVzY3Jvdy5weTo1NDkKICAgIC8vIHJlY2VpdmVyPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLAogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIGVzY3Jvdy5weTo1NTAKICAgIC8vIGFtb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGVzY3Jvdy5weTo1NDgKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGVzY3Jvdy5weTo1NTEKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBlc2Nyb3cucHk6NTQ4LTU1MwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgY2xvc2VfcmVtYWluZGVyX3RvPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKZGVsZXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBlc2Nyb3cucHk6NTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0Ll9nZXRfYWdlbnRfYWRkcmVzcygpIC0+IGJ5dGVzOgpfZ2V0X2FnZW50X2FkZHJlc3M6CiAgICAvLyBlc2Nyb3cucHk6ODMKICAgIC8vIGRlZiBfZ2V0X2FnZW50X2FkZHJlc3Moc2VsZikgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXNjcm93LnB5Ojg0CiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYWdlbnRfYWRkcmVzcy5tYXliZSgpCiAgICBieXRlYyA3IC8vICJhZ2VudF9hZGRyZXNzIgogICAgYm94X2dldAogICAgLy8gZXNjcm93LnB5Ojg1CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIGJ6IF9nZXRfYWdlbnRfYWRkcmVzc190ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAwCgpfZ2V0X2FnZW50X2FkZHJlc3NfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gZXNjcm93LnB5Ojg1CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHN3YXAKICAgIHJldHN1YgoKX2dldF9hZ2VudF9hZGRyZXNzX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIGVzY3Jvdy5weTo4NQogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYiBfZ2V0X2FnZW50X2FkZHJlc3NfdGVybmFyeV9tZXJnZUAzCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0Ll92ZXJpZnlfZXNjcm93X2JhbGFuY2UoYXNzZXRfaWQ6IHVpbnQ2NCwgZXNjcm93X2Ftb3VudDogdWludDY0KSAtPiB2b2lkOgpfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlOgogICAgLy8gZXNjcm93LnB5OjEwNQogICAgLy8gZGVmIF92ZXJpZnlfZXNjcm93X2JhbGFuY2Uoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCwgZXNjcm93X2Ftb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBlc2Nyb3cucHk6MTA2CiAgICAvLyBpZiBhc3NldF9pZCA+IDA6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IF92ZXJpZnlfZXNjcm93X2JhbGFuY2VfZWxzZV9ib2R5QDIKICAgIC8vIGVzY3Jvdy5weToxMDgKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsIGFzc2V0X2lkCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gZXNjcm93LnB5OjEwNy0xMDkKICAgIC8vIGJhbGFuY2UsIGV4aXN0cyA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsIGFzc2V0X2lkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjExMAogICAgLy8gYXNzZXJ0IGV4aXN0cywgIkNvbnRyYWN0IGlzIG5vdCBvcHRlZCBpbnRvIHRoZSBhc3NldCIKICAgIGFzc2VydCAvLyBDb250cmFjdCBpcyBub3Qgb3B0ZWQgaW50byB0aGUgYXNzZXQKICAgIC8vIGVzY3Jvdy5weToxMTEKICAgIC8vIGFzc2VydCBiYWxhbmNlID49IGVzY3Jvd19hbW91bnQsICJJbnN1ZmZpY2llbnQgYXNzZXQgYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgYXNzZXQgYmFsYW5jZQogICAgcmV0c3ViCgpfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlX2Vsc2VfYm9keUAyOgogICAgLy8gZXNjcm93LnB5OjExMwogICAgLy8gYXBwX2JhbGFuY2UsIGV4aXN0cyA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6MTE0CiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiRmFpbGVkIHRvIHJlYWQgY29udHJhY3QgYmFsYW5jZSIKICAgIGFzc2VydCAvLyBGYWlsZWQgdG8gcmVhZCBjb250cmFjdCBiYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6MTE1CiAgICAvLyBhc3NlcnQgYXBwX2JhbGFuY2UgPj0gZXNjcm93X2Ftb3VudCwgIkluc3VmZmljaWVudCBjb250cmFjdCBiYWxhbmNlIgogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBjb250cmFjdCBiYWxhbmNlCiAgICByZXRzdWIKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuX3NlbmRfcGF5b3V0KHJlY2VpdmVyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIGFzc2V0X2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9zZW5kX3BheW91dDoKICAgIC8vIGVzY3Jvdy5weToxMTcKICAgIC8vIGRlZiBfc2VuZF9wYXlvdXQoc2VsZiwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogVUludDY0LCBhc3NldF9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBlc2Nyb3cucHk6MTE4CiAgICAvLyBpZiBhc3NldF9pZCA9PSAwOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX3NlbmRfcGF5b3V0X2Vsc2VfYm9keUAzCiAgICAvLyBlc2Nyb3cucHk6MTE5LTEyMwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGVzY3Jvdy5weToxMTkKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGVzY3Jvdy5weToxMjIKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBlc2Nyb3cucHk6MTE5LTEyMwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgpfc2VuZF9wYXlvdXRfZWxzZV9ib2R5QDM6CiAgICAvLyBlc2Nyb3cucHk6MTI1LTEzMAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGVzY3Jvdy5weToxMjUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gZXNjcm93LnB5OjEyOQogICAgLy8gZmVlPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGVzY3Jvdy5weToxMjUtMTMwCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "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", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 1 } }, "events": [], "templateVariables": { "CLAIM_TIMEOUT": { "type": "AVMUint64" }, "DISPUTE_TIMEOUT": { "type": "AVMUint64" } } }