{ "name": "ResourceProbe", "structs": {}, "methods": [ { "name": "configure", "args": [ { "type": "address", "name": "subject" }, { "type": "uint64", "name": "asset" }, { "type": "uint64", "name": "app" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Point the probes at an account, an asset and an app.", "events": [], "recommendations": {} }, { "name": "opt_in_to_asset", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Hold the asset, so a transfer probe fails on availability alone.", "events": [], "recommendations": {} }, { "name": "probe_payment", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Inner payment to an address named nowhere in the call.", "events": [], "recommendations": {} }, { "name": "probe_asset_transfer", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Inner asset transfer to that same address.", "events": [], "recommendations": {} }, { "name": "probe_read_balance", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Read another account's ALGO balance.", "events": [], "recommendations": {} }, { "name": "probe_read_holding", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Read another account's holding of an asset.", "events": [], "recommendations": {} }, { "name": "report_budget", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record the opcode budget available to this call.\nCalled directly it reports what any app call gets; called through an Arcron upkeep it reports what a *target* gets, which is the number an integrator actually has to design against.", "events": [], "recommendations": {} }, { "name": "absorb", "args": [ { "type": "uint64", "name": "number" }, { "type": "string", "name": "text" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "A hook with arguments of its own \u2014 the shape Arcron cannot call.\nArcron stores one blob and sends it as one app arg, and an ARC-4 method with arguments needs the selector and each argument in an app arg of its own. So this method is unreachable through an upkeep today. `scripts/spike_multiarg.py` uses it to measure what a multi-arg call shape would cost, and records both arguments so that a call which loses one is distinguishable from a call that works.", "events": [], "recommendations": {} }, { "name": "report_caller", "args": [], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record who the target sees as its caller.\nDecides whether a target can pay the keeper itself: an Arcron-executed call arrives as an inner transaction, and an inner transaction's sender is the app that submitted it. Measured rather than assumed, because a whole class of design depends on it.", "events": [], "recommendations": {} }, { "name": "configure_reentry", "args": [ { "type": "uint64", "name": "keeper_app" }, { "type": "uint64", "name": "upkeep_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Point `reenter` at a keeper app and one of its upkeeps.", "events": [], "recommendations": {} }, { "name": "reenter", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Call the keeper's `execute` back, from inside its own execution.\nArcron writes an upkeep's state before submitting the inner call, so a re-entrant execution has to satisfy the schedule afresh. Whether that is enough to stop one \u2014 and who a nested execution pays, given the sender it sees is this app rather than the keeper \u2014 is measured in `scripts/spike_reentrancy.py` rather than argued about.\nRe-enters once and only once: unconditional recursion would just hit the AVM's depth limit and tell us nothing.", "events": [], "recommendations": {} }, { "name": "report_group", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record the group this call arrived in, as the target sees it.\nArcron puts no constraint on the group its `execute` is submitted in, so a keeper is free to bracket the call it is paid to make with transactions of its own. Whether the target can *tell* is the whole question: if it can see the outer group it can defend itself, and if it cannot then the defence has to be in the target's own state. Recorded rather than asserted, because both answers are possible depending on how the call arrived, and the answer is the measurement.", "events": [], "recommendations": {} }, { "name": "exhaust_budget", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Spend more opcode budget than any keeper could have brought.\nA target that costs more than it is worth is the cheapest way to attack a keeper, if failing costs the keeper anything.", "events": [], "recommendations": {} }, { "name": "refuse", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Reject every call, the way a target with a bug or a grudge would.", "events": [], "recommendations": {} }, { "name": "set_gap", "args": [ { "type": "uint64", "name": "gap" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set how long `guarded` locks itself for after a call.", "events": [], "recommendations": {} }, { "name": "guarded", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Refuse a second call inside `gap` rounds.\nNot an exotic target: an oracle that rejects a stale update, a rebalancer that runs once an epoch, a claim that pays once a period. Anything whose call is conditional on state a third party can move. This is the shape that lets somebody manufacture the lateness Arcron's fee escalation pays for, which `scripts/spike_hostile_target.py` measures.", "events": [], "recommendations": {} }, { "name": "probe_app_call", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Call a third app that no argument names.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Reaches for an account, an asset and an app that no argument names.", "networks": {}, "state": { "schema": { "global": { "ints": 9, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "subject": { "keyType": "AVMString", "valueType": "address", "key": "c3ViamVjdA==" }, "subject_asset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3ViamVjdF9hc3NldA==" }, "subject_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3ViamVjdF9hcHA=" }, "probes_run": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHJvYmVzX3J1bg==" }, "last_reading": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF9yZWFkaW5n" }, "last_number": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF9udW1iZXI=" }, "last_text": { "keyType": "AVMString", "valueType": "AVMString", "key": "bGFzdF90ZXh0" }, "last_caller": { "keyType": "AVMString", "valueType": "address", "key": "bGFzdF9jYWxsZXI=" }, "keeper_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "a2VlcGVyX2FwcA==" }, "keeper_upkeep": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "a2VlcGVyX3Vwa2VlcA==" }, "gap": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2Fw" }, "next_allowed": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmV4dF9hbGxvd2Vk" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 497 ], "errorMessage": "account funded" }, { "pc": [ 533 ], "errorMessage": "account opted into asset" }, { "pc": [ 837 ], "errorMessage": "check self.gap exists" }, { "pc": [ 721 ], "errorMessage": "check self.keeper_app exists" }, { "pc": [ 726 ], "errorMessage": "check self.keeper_upkeep exists" }, { "pc": [ 513, 549, 573, 632 ], "errorMessage": "check self.last_reading exists" }, { "pc": [ 828, 856 ], "errorMessage": "check self.next_allowed exists" }, { "pc": [ 435, 477, 504, 540, 564, 623, 648, 693, 708, 754, 765, 846, 894 ], "errorMessage": "check self.probes_run exists" }, { "pc": [ 419, 458, 494, 529 ], "errorMessage": "check self.subject exists" }, { "pc": [ 869 ], "errorMessage": "check self.subject_app exists" }, { "pc": [ 395, 454, 525 ], "errorMessage": "check self.subject_asset exists" }, { "pc": [ 595 ], "errorMessage": "invalid array length header" }, { "pc": [ 603 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 356 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 364, 373, 588, 668, 677, 814 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 340 ], "errorMessage": "this target refuses" }, { "pc": [ 830 ], "errorMessage": "too soon" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAicHJvYmVzX3J1biIgMHgxNTFmN2M3NSAibGFzdF9yZWFkaW5nIiAic3ViamVjdCIgInN1YmplY3RfYXNzZXQiICJuZXh0X2FsbG93ZWQiICJzdWJqZWN0X2FwcCIgImtlZXBlcl9hcHAiICJrZWVwZXJfdXBrZWVwIiAiZ2FwIiAibGFzdF9udW1iZXIiICJsYXN0X3RleHQiICJsYXN0X2NhbGxlciIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTozNS0zOAogICAgLy8gIyBUaGUgcmVzb3VyY2VzIHRvIHJlYWNoIGZvciwgZml4ZWQgYXQgY29uZmlndXJhdGlvbiB0aW1lIHNvIHRoYXQgYQogICAgLy8gIyBwcm9iZSBjYWxsIGNhcnJpZXMgbm90aGluZyBidXQgaXRzIG93biBzZWxlY3RvciDigJQgZXhhY3RseSB0aGUgc2hhcGUKICAgIC8vICMgQXJjcm9uIGNhbiBzZW5kLgogICAgLy8gc2VsZi5zdWJqZWN0ID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpKQogICAgYnl0ZWNfMyAvLyAic3ViamVjdCIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTozOQogICAgLy8gc2VsZi5zdWJqZWN0X2Fzc2V0ID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgNCAvLyAic3ViamVjdF9hc3NldCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBzZWxmLnN1YmplY3RfYXBwID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgNiAvLyAic3ViamVjdF9hcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBFdmlkZW5jZSBhIHByb2JlIHJhbiwgZm9yIHRoZSBjYXNlcyB3aGVyZSBzdWNjZXNzIGlzIHNpbGVudC4KICAgIC8vIHNlbGYucHJvYmVzX3J1biA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5sYXN0X3JlYWRpbmcgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18yIC8vICJsYXN0X3JlYWRpbmciCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo0NC00NgogICAgLy8gIyBXaGF0IGBhYnNvcmJgIHdhcyBoYW5kZWQsIHNvIGEgbXVsdGktYXJnIGNhbGwgY2FuIGJlIGNoZWNrZWQgZm9yCiAgICAvLyAjIGhhdmluZyBkZWxpdmVyZWQgZXZlcnkgYXJndW1lbnQgcmF0aGVyIHRoYW4gbWVyZWx5IHN1Y2NlZWRpbmcuCiAgICAvLyBzZWxmLmxhc3RfbnVtYmVyID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgMTAgLy8gImxhc3RfbnVtYmVyIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYubGFzdF90ZXh0ID0gR2xvYmFsU3RhdGUoU3RyaW5nKCIiKSkKICAgIGJ5dGVjIDExIC8vICJsYXN0X3RleHQiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6NDgtNTAKICAgIC8vICMgV2hvIHRoZSB0YXJnZXQgc2VlcyBhcyBpdHMgY2FsbGVyLCB3aGljaCBpcyBub3Qgd2hvIHNlbnQgdGhlCiAgICAvLyAjIHRyYW5zYWN0aW9uIG9uY2UgQXJjcm9uIGlzIGluIHRoZSBtaWRkbGUuCiAgICAvLyBzZWxmLmxhc3RfY2FsbGVyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpKQogICAgYnl0ZWMgMTIgLy8gImxhc3RfY2FsbGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjUxLTUyCiAgICAvLyAjIEEga2VlcGVyIGFwcCBhbmQgb25lIG9mIGl0cyB1cGtlZXBzLCBmb3IgdGhlIHJlLWVudHJhbmN5IHByb2JlLgogICAgLy8gc2VsZi5rZWVwZXJfYXBwID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgNyAvLyAia2VlcGVyX2FwcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmtlZXBlcl91cGtlZXAgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA4IC8vICJrZWVwZXJfdXBrZWVwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6NTQtNTYKICAgIC8vICMgYGd1YXJkZWRgIHJlZnVzZXMgYSBzZWNvbmQgY2FsbCBpbnNpZGUgdGhpcyBtYW55IHJvdW5kcywgYW5kIHJlY29yZHMKICAgIC8vICMgdGhlIHJvdW5kIGl0IHdpbGwgbmV4dCBhY2NlcHQgb25lLgogICAgLy8gc2VsZi5nYXAgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA5IC8vICJnYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo1NwogICAgLy8gc2VsZi5uZXh0X2FsbG93ZWQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA1IC8vICJuZXh0X2FsbG93ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBjbGFzcyBSZXNvdXJjZVByb2JlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODg2MDU0MDMgMHg0NWM3MTQxOSAweDQ2NDYyMWIxIDB4MjFjYmQ3NDYgMHhjZDJkNjY3MCAweGZhMTcxYTRmIDB4ZGMxOTdmNmMgMHhjYjc4MmE0OCAweGRkMjA0YWE5IDB4NzE4ZDkwNDAgMHhiNTZiNGEwZCAweGMyODU4ZWNmIDB4ODMyNmZlYWUgMHgwMmMwZTQ2YyAweDc5ODU1ZTAxIDB4ZGYxNTVmNDkgMHhlZGExZGE0NyAvLyBtZXRob2QgImNvbmZpZ3VyZShhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0X2luX3RvX2Fzc2V0KCl2b2lkIiwgbWV0aG9kICJwcm9iZV9wYXltZW50KCl1aW50NjQiLCBtZXRob2QgInByb2JlX2Fzc2V0X3RyYW5zZmVyKCl1aW50NjQiLCBtZXRob2QgInByb2JlX3JlYWRfYmFsYW5jZSgpdWludDY0IiwgbWV0aG9kICJwcm9iZV9yZWFkX2hvbGRpbmcoKXVpbnQ2NCIsIG1ldGhvZCAicmVwb3J0X2J1ZGdldCgpdWludDY0IiwgbWV0aG9kICJhYnNvcmIodWludDY0LHN0cmluZyl1aW50NjQiLCBtZXRob2QgInJlcG9ydF9jYWxsZXIoKWFkZHJlc3MiLCBtZXRob2QgImNvbmZpZ3VyZV9yZWVudHJ5KHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVlbnRlcigpdWludDY0IiwgbWV0aG9kICJyZXBvcnRfZ3JvdXAoKXVpbnQ2NCIsIG1ldGhvZCAiZXhoYXVzdF9idWRnZXQoKXVpbnQ2NCIsIG1ldGhvZCAicmVmdXNlKCl2b2lkIiwgbWV0aG9kICJzZXRfZ2FwKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJndWFyZGVkKCl1aW50NjQiLCBtZXRob2QgInByb2JlX2FwcF9jYWxsKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb25maWd1cmUgb3B0X2luX3RvX2Fzc2V0IHByb2JlX3BheW1lbnQgcHJvYmVfYXNzZXRfdHJhbnNmZXIgcHJvYmVfcmVhZF9iYWxhbmNlIHByb2JlX3JlYWRfaG9sZGluZyByZXBvcnRfYnVkZ2V0IGFic29yYiByZXBvcnRfY2FsbGVyIGNvbmZpZ3VyZV9yZWVudHJ5IHJlZW50ZXIgcmVwb3J0X2dyb3VwIGV4aGF1c3RfYnVkZ2V0IG1haW5fcmVmdXNlX3JvdXRlQDE5IHNldF9nYXAgZ3VhcmRlZCBwcm9iZV9hcHBfY2FsbAogICAgZXJyCgptYWluX3JlZnVzZV9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyMTkKICAgIC8vIGFzc2VydCBGYWxzZSwgInRoaXMgdGFyZ2V0IHJlZnVzZXMiCiAgICBlcnIgLy8gdGhpcyB0YXJnZXQgcmVmdXNlcwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUuY29uZmlndXJlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29uZmlndXJlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBzZWxmLnN1YmplY3QudmFsdWUgPSBzdWJqZWN0Lm5hdGl2ZQogICAgYnl0ZWNfMyAvLyAic3ViamVjdCIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5zdWJqZWN0X2Fzc2V0LnZhbHVlID0gYXNzZXQKICAgIGJ5dGVjIDQgLy8gInN1YmplY3RfYXNzZXQiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6NjYKICAgIC8vIHNlbGYuc3ViamVjdF9hcHAudmFsdWUgPSBhcHAKICAgIGJ5dGVjIDYgLy8gInN1YmplY3RfYXBwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo1OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUub3B0X2luX3RvX2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjcxLTc1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnN1YmplY3RfYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo3MgogICAgLy8geGZlcl9hc3NldD1zZWxmLnN1YmplY3RfYXNzZXQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic3ViamVjdF9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdWJqZWN0X2Fzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjcxLTc1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnN1YmplY3RfYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6NjgKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNvdXJjZV9wcm9iZS5jb250cmFjdC5SZXNvdXJjZVByb2JlLnByb2JlX3BheW1lbnRbcm91dGluZ10oKSAtPiB2b2lkOgpwcm9iZV9wYXltZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBpdHhuLlBheW1lbnQocmVjZWl2ZXI9c2VsZi5zdWJqZWN0LnZhbHVlLCBhbW91bnQ9MCkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdWJqZWN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1YmplY3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo4MQogICAgLy8gc2VsZi5wcm9iZXNfcnVuLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwcm9iZXNfcnVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByb2Jlc19ydW4gZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmVzb3VyY2VfcHJvYmUuY29udHJhY3QuUmVzb3VyY2VQcm9iZS5wcm9iZV9hc3NldF90cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByb2JlX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5Ojg3LTkxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnN1YmplY3RfYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5zdWJqZWN0LnZhbHVlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc3ViamVjdF9hc3NldC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJzdWJqZWN0X2Fzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1YmplY3RfYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYuc3ViamVjdC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdWJqZWN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1YmplY3QgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6OTAKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo4NwogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo4Ny05MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zdWJqZWN0X2Fzc2V0LnZhbHVlLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYuc3ViamVjdC52YWx1ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYucHJvYmVzX3J1bi52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9iZXNfcnVuIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUucHJvYmVfcmVhZF9iYWxhbmNlW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvYmVfcmVhZF9iYWxhbmNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBzZWxmLmxhc3RfcmVhZGluZy52YWx1ZSA9IHNlbGYuc3ViamVjdC52YWx1ZS5iYWxhbmNlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3ViamVjdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdWJqZWN0IGV4aXN0cwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGJ5dGVjXzIgLy8gImxhc3RfcmVhZGluZyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6OTkKICAgIC8vIHNlbGYucHJvYmVzX3J1bi52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9iZXNfcnVuIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gcmV0dXJuIHNlbGYubGFzdF9yZWFkaW5nLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibGFzdF9yZWFkaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhc3RfcmVhZGluZyBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weTo5NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUucHJvYmVfcmVhZF9ob2xkaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvYmVfcmVhZF9ob2xkaW5nOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXQgPSBBc3NldChzZWxmLnN1YmplY3RfYXNzZXQudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAic3ViamVjdF9hc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdWJqZWN0X2Fzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gc2VsZi5sYXN0X3JlYWRpbmcudmFsdWUgPSBhc3NldC5iYWxhbmNlKHNlbGYuc3ViamVjdC52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdWJqZWN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1YmplY3QgZXhpc3RzCiAgICBzd2FwCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIGJ5dGVjXzIgLy8gImxhc3RfcmVhZGluZyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTA3CiAgICAvLyBzZWxmLnByb2Jlc19ydW4udmFsdWUgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvYmVzX3J1biBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18wIC8vICJwcm9iZXNfcnVuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMDgKICAgIC8vIHJldHVybiBzZWxmLmxhc3RfcmVhZGluZy52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxhc3RfcmVhZGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYXN0X3JlYWRpbmcgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTAyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmVzb3VyY2VfcHJvYmUuY29udHJhY3QuUmVzb3VyY2VQcm9iZS5yZXBvcnRfYnVkZ2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVwb3J0X2J1ZGdldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMTgKICAgIC8vIHNlbGYubGFzdF9yZWFkaW5nLnZhbHVlID0gR2xvYmFsLm9wY29kZV9idWRnZXQoKQogICAgYnl0ZWNfMiAvLyAibGFzdF9yZWFkaW5nIgogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMTkKICAgIC8vIHNlbGYucHJvYmVzX3J1bi52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9iZXNfcnVuIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIHNlbGYubGFzdF9yZWFkaW5nLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibGFzdF9yZWFkaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhc3RfcmVhZGluZyBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNvdXJjZV9wcm9iZS5jb250cmFjdC5SZXNvdXJjZVByb2JlLmFic29yYltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFic29yYjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMzMtMTM1CiAgICAvLyAjIFJlYWQgdGhlIGJ1ZGdldCBmaXJzdCwgc28gdGhpcyBpcyBjb21wYXJhYmxlIHdpdGggYHJlcG9ydF9idWRnZXRgOgogICAgLy8gIyBib3RoIHJlcG9ydCB3aGF0IHRoZSB0YXJnZXQgd2FzIGhhbmRlZCwgbm90IHdoYXQgaXQgaGFzIGxlZnQuCiAgICAvLyBzZWxmLmxhc3RfcmVhZGluZy52YWx1ZSA9IEdsb2JhbC5vcGNvZGVfYnVkZ2V0KCkKICAgIGJ5dGVjXzIgLy8gImxhc3RfcmVhZGluZyIKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmxhc3RfbnVtYmVyLnZhbHVlID0gbnVtYmVyCiAgICBieXRlYyAxMCAvLyAibGFzdF9udW1iZXIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmxhc3RfdGV4dC52YWx1ZSA9IHRleHQubmF0aXZlCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMTEgLy8gImxhc3RfdGV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTM4CiAgICAvLyBzZWxmLnByb2Jlc19ydW4udmFsdWUgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvYmVzX3J1biBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18wIC8vICJwcm9iZXNfcnVuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLmxhc3RfcmVhZGluZy52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxhc3RfcmVhZGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYXN0X3JlYWRpbmcgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmVzb3VyY2VfcHJvYmUuY29udHJhY3QuUmVzb3VyY2VQcm9iZS5yZXBvcnRfY2FsbGVyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVwb3J0X2NhbGxlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxNTAKICAgIC8vIHNlbGYubGFzdF9jYWxsZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlYyAxMiAvLyAibGFzdF9jYWxsZXIiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gc2VsZi5wcm9iZXNfcnVuLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwcm9iZXNfcnVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByb2Jlc19ydW4gZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNvdXJjZV9wcm9iZS5jb250cmFjdC5SZXNvdXJjZVByb2JlLmNvbmZpZ3VyZV9yZWVudHJ5W3JvdXRpbmddKCkgLT4gdm9pZDoKY29uZmlndXJlX3JlZW50cnk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxNTcKICAgIC8vIHNlbGYua2VlcGVyX2FwcC52YWx1ZSA9IGtlZXBlcl9hcHAKICAgIGJ5dGVjIDcgLy8gImtlZXBlcl9hcHAiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmtlZXBlcl91cGtlZXAudmFsdWUgPSB1cGtlZXBfaWQKICAgIGJ5dGVjIDggLy8gImtlZXBlcl91cGtlZXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUucmVlbnRlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlZW50ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTczCiAgICAvLyBzZWxmLnByb2Jlc19ydW4udmFsdWUgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvYmVzX3J1biBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18wIC8vICJwcm9iZXNfcnVuIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTc0CiAgICAvLyBpZiBzZWxmLnByb2Jlc19ydW4udmFsdWUgPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHJlZW50ZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTc1CiAgICAvLyByZXR1cm4gc2VsZi5wcm9iZXNfcnVuLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9iZXNfcnVuIGV4aXN0cwoKcmVlbnRlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yZXNvdXJjZV9wcm9iZS5jb250cmFjdC5SZXNvdXJjZVByb2JlLnJlZW50ZXJANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxNjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVlbnRlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTc2LTE4MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPUFwcGxpY2F0aW9uKHNlbGYua2VlcGVyX2FwcC52YWx1ZSksCiAgICAvLyAgICAgYXBwX2FyZ3M9KAogICAgLy8gICAgICAgICBhcmM0LmFyYzRfc2lnbmF0dXJlKCJleGVjdXRlKHVpbnQ2NCl1aW50NjQiKSwKICAgIC8vICAgICAgICAgb3AuaXRvYihzZWxmLmtlZXBlcl91cGtlZXAudmFsdWUpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTc3CiAgICAvLyBhcHBfaWQ9QXBwbGljYXRpb24oc2VsZi5rZWVwZXJfYXBwLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJrZWVwZXJfYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmtlZXBlcl9hcHAgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTgwCiAgICAvLyBvcC5pdG9iKHNlbGYua2VlcGVyX3Vwa2VlcC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAia2VlcGVyX3Vwa2VlcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5rZWVwZXJfdXBrZWVwIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICBpbnRjXzAgLy8gTm9PcAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxNzkKICAgIC8vIGFyYzQuYXJjNF9zaWduYXR1cmUoImV4ZWN1dGUodWludDY0KXVpbnQ2NCIpLAogICAgcHVzaGJ5dGVzIDB4NWI0OWNjNWMgLy8gbWV0aG9kICJleGVjdXRlKHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTc2LTE4MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPUFwcGxpY2F0aW9uKHNlbGYua2VlcGVyX2FwcC52YWx1ZSksCiAgICAvLyAgICAgYXBwX2FyZ3M9KAogICAgLy8gICAgICAgICBhcmM0LmFyYzRfc2lnbmF0dXJlKCJleGVjdXRlKHVpbnQ2NCl1aW50NjQiKSwKICAgIC8vICAgICAgICAgb3AuaXRvYihzZWxmLmtlZXBlcl91cGtlZXAudmFsdWUpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gcmV0dXJuIHNlbGYucHJvYmVzX3J1bi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvYmVzX3J1biBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxNjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgYiByZWVudGVyX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUucmVlbnRlckA1CgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUucmVwb3J0X2dyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVwb3J0X2dyb3VwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gc2VsZi5sYXN0X3JlYWRpbmcudmFsdWUgPSBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgYnl0ZWNfMiAvLyAibGFzdF9yZWFkaW5nIgogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToxOTkKICAgIC8vIHNlbGYucHJvYmVzX3J1bi52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9iZXNfcnVuIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5ncm91cF9zaXplCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmVzb3VyY2VfcHJvYmUuY29udHJhY3QuUmVzb3VyY2VQcm9iZS5leGhhdXN0X2J1ZGdldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmV4aGF1c3RfYnVkZ2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjEwCiAgICAvLyBpID0gVUludDY0KDApCiAgICBkdXAKCmV4aGF1c3RfYnVkZ2V0X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gd2hpbGUgaSA8IDVfMDAwOgogICAgZHVwCiAgICBwdXNoaW50IDUwMDAKICAgIDwKICAgIGJ6IGV4aGF1c3RfYnVkZ2V0X2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyMTIKICAgIC8vIHRvdGFsICs9IG9wLnNoYTI1NihvcC5pdG9iKGkpKS5sZW5ndGgKICAgIHN3YXAKICAgIGludGNfMyAvLyAzMgogICAgKwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gaSArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYiBleGhhdXN0X2J1ZGdldF93aGlsZV90b3BAMgoKZXhoYXVzdF9idWRnZXRfYWZ0ZXJfd2hpbGVANDoKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUuc2V0X2dhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9nYXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYuZ2FwLnZhbHVlID0gZ2FwCiAgICBieXRlYyA5IC8vICJnYXAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc291cmNlX3Byb2JlLmNvbnRyYWN0LlJlc291cmNlUHJvYmUuZ3VhcmRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cmd1YXJkZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjM3CiAgICAvLyBhc3NlcnQgR2xvYmFsLnJvdW5kID49IHNlbGYubmV4dF9hbGxvd2VkLnZhbHVlLCAidG9vIHNvb24iCiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJuZXh0X2FsbG93ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmV4dF9hbGxvd2VkIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyB0b28gc29vbgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gc2VsZi5uZXh0X2FsbG93ZWQudmFsdWUgPSBHbG9iYWwucm91bmQgKyBzZWxmLmdhcC52YWx1ZQogICAgZ2xvYmFsIFJvdW5kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZ2FwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhcCBleGlzdHMKICAgICsKICAgIGJ5dGVjIDUgLy8gIm5leHRfYWxsb3dlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjM5CiAgICAvLyBzZWxmLnByb2Jlc19ydW4udmFsdWUgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvYmVzX3J1biBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18wIC8vICJwcm9iZXNfcnVuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyNDAKICAgIC8vIHJldHVybiBzZWxmLm5leHRfYWxsb3dlZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm5leHRfYWxsb3dlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X2FsbG93ZWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmVzb3VyY2VfcHJvYmUuY29udHJhY3QuUmVzb3VyY2VQcm9iZS5wcm9iZV9hcHBfY2FsbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnByb2JlX2FwcF9jYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjI0NS0yNDkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1BcHBsaWNhdGlvbihzZWxmLnN1YmplY3RfYXBwLnZhbHVlKSwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidGljaygpdWludDY0IiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyNDYKICAgIC8vIGFwcF9pZD1BcHBsaWNhdGlvbihzZWxmLnN1YmplY3RfYXBwLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzdWJqZWN0X2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdWJqZWN0X2FwcCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyNDgKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgaW50Y18wIC8vIE5vT3AKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjQ3CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgidGljaygpdWludDY0IiksKSwKICAgIHB1c2hieXRlcyAweDRkNGQ1ZjBiIC8vIG1ldGhvZCAidGljaygpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc291cmNlX3Byb2JlL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzb3VyY2VfcHJvYmUvY29udHJhY3QucHk6MjQ1LTI0OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPUFwcGxpY2F0aW9uKHNlbGYuc3ViamVjdF9hcHAudmFsdWUpLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJ0aWNrKCl1aW50NjQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyNTAKICAgIC8vIHNlbGYucHJvYmVzX3J1bi52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicHJvYmVzX3J1biIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9iZXNfcnVuIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gInByb2Jlc19ydW4iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNvdXJjZV9wcm9iZS9jb250cmFjdC5weToyNDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEIICYNCnByb2Jlc19ydW4EFR98dQxsYXN0X3JlYWRpbmcHc3ViamVjdA1zdWJqZWN0X2Fzc2V0DG5leHRfYWxsb3dlZAtzdWJqZWN0X2FwcAprZWVwZXJfYXBwDWtlZXBlcl91cGtlZXADZ2FwC2xhc3RfbnVtYmVyCWxhc3RfdGV4dAtsYXN0X2NhbGxlcjEYQAAwKzIDZycEImcnBiJnKCJnKiJnJwoiZycLgABnJwwyA2cnByJnJwgiZycJImcnBSJnMRtBAIcxGRREMRhEghEEiGBUAwRFxxQZBEZGIbEEIcvXRgTNLWZwBPoXGk8E3Bl/bATLeCpIBN0gSqkEcY2QQAS1a0oNBMKFjs8Egyb+rgQCwORsBHmFXgEE3xVfSQTtodpHNhoAjhEACgAzAEwAbgCYALYA2gDyAS0BQgFfAaMBuQABAdQB4wINAAAxGRQxGBQQQzYaAUkVJRJENhoCSRUkEkQXNhoDSRUkEkQXK08DZycETwJnJwZMZyNDsSInBGVEMgoishKyFLIRgQSyECKyAbMjQ7EiK2VEIrIIsgcjshAisgGzIihlRCMIKEsBZxYpTFCwI0OxIicEZUQiK2VEIrISshSyEYEEshAisgGzIihlRCMIKEsBZxYpTFCwI0MiK2VEcwBEKkxnIihlRCMIKExnIiplRBYpTFCwI0MiJwRlRCIrZURMcABEKkxnIihlRCMIKExnIiplRBYpTFCwI0MqMgxnIihlRCMIKExnIiplRBYpTFCwI0M2GgFJFSQSRBc2GgJJIlmBAghLARUSRCoyDGcnCk8CZ1cCACcLTGciKGVEIwgoTGciKmVEFilMULAjQycMMQBnIihlRCMIKExnKTEAULAjQzYaAUkVJBJEFzYaAkkVJBJEFycHTwJnJwhMZyNDIihlRCMIKEsBZyMNQQALIihlRBYpTFCwI0OxIicHZUQiJwhlRBYishmABFtJzFyyGrIashiBBrIQIrIBsyIoZURC/88qMgRnIihlRCMIKExnMgQWKUxQsCNDIklJgYgnDEEACUwlCEwjCEL/70gWKUxQsCNDNhoBSRUkEkQXJwlMZyNDMgYiJwVlRA9EMgYiJwllRAgnBUxnIihlRCMIKExnIicFZUQWKUxQsCNDsSInBmVEIrIZgARNTV8LshqyGIEGshAisgGzIihlRCMIKEsBZxYpTFCwI0M=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }