{ "name": "ResponsiveDonation", "structs": { "ConditionalClauseStruct": [ { "name": "clause_id", "type": "uint64" }, { "name": "event_id", "type": "uint64" }, { "name": "payout_amount", "type": "uint64" }, { "name": "recipient_yes", "type": "address" }, { "name": "recipient_no", "type": "address" }, { "name": "donor_address", "type": "address" }, { "name": "executed", "type": "bool" } ], "EventStruct": [ { "name": "event_id", "type": "uint64" }, { "name": "event_string", "type": "string" }, { "name": "pending", "type": "bool" }, { "name": "resolution", "type": "bool" }, { "name": "oracle_address", "type": "address" } ] }, "methods": [ { "name": "create_event", "args": [ { "type": "string", "name": "event_string", "desc": "Description of the event (e.g., \"Hurricane hits Miami\")" }, { "type": "address", "name": "oracle_address", "desc": "Address authorized to resolve this event" } ], "returns": { "type": "uint64", "desc": "The event ID of the created event (uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a new event that can be used for conditional donations.", "events": [], "recommendations": {} }, { "name": "instantaneous_payout", "args": [ { "type": "address", "name": "recipient_address", "desc": "Address to receive the donation (charity/recipient)" }, { "type": "pay", "name": "payment", "desc": "The payment transaction (must be grouped with the app call)" } ], "returns": { "type": "bool", "desc": "True if the donation is successful" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Process an immediate donation with instant payout to recipient.\nPerfect for direct charitable giving with immediate impact.", "events": [], "recommendations": {} }, { "name": "create_conditional_donation", "args": [ { "type": "uint64", "name": "event_id", "desc": "The event this donation depends on" }, { "type": "address", "name": "recipient_yes", "desc": "Address to receive funds if event resolves to true" }, { "type": "address", "name": "recipient_no", "desc": "Address to receive funds if event resolves to false (often donor)" }, { "type": "pay", "name": "payment", "desc": "The payment transaction (funds held in escrow)" } ], "returns": { "type": "uint64", "desc": "The clause ID of the created conditional donation" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a conditional donation that will pay out based on event resolution.\nExample: \"Donate $1000 to Red Cross IF hurricane hits Miami, otherwise return to me\"", "events": [], "recommendations": {} }, { "name": "mixed_donation", "args": [ { "type": "address", "name": "instant_recipient", "desc": "Address to receive instant donation (use zero address if no instant donation)" }, { "type": "uint64", "name": "instant_amount", "desc": "Amount for instant donation (use 0 if no instant donation)" }, { "type": "uint64", "name": "event_id", "desc": "Event ID for conditional donation" }, { "type": "address", "name": "recipient_yes", "desc": "Address to receive funds if event resolves to true" }, { "type": "address", "name": "recipient_no", "desc": "Address to receive funds if event resolves to false" }, { "type": "pay", "name": "payment", "desc": "The payment transaction covering both donations" } ], "returns": { "type": "uint64", "desc": "The clause ID for the conditional donation created" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create both instantaneous and conditional donations in a single transaction.\nSimplified version that handles one conditional donation to keep it simple.", "events": [], "recommendations": {} }, { "name": "resolve_event", "args": [ { "type": "uint64", "name": "event_id", "desc": "The event to resolve" }, { "type": "bool", "name": "resolution", "desc": "The outcome of the event (true/false)" } ], "returns": { "type": "bool", "desc": "True if the event is successfully resolved" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Resolve an event outcome. Can only be called by the authorized oracle.", "events": [], "recommendations": {} }, { "name": "execute_conditional_clause", "args": [ { "type": "uint64", "name": "clause_id", "desc": "The clause to execute" } ], "returns": { "type": "bool", "desc": "True if the clause is successfully executed" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute a conditional clause after its associated event has been resolved.\nCan be called by anyone to trigger payouts.", "events": [], "recommendations": {} }, { "name": "execute_clauses_for_event", "args": [ { "type": "uint64", "name": "event_id", "desc": "The event whose clauses should be executed" } ], "returns": { "type": "uint64", "desc": "Number of clauses executed" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute all unexecuted conditional clauses for a resolved event.\nThis is more gas-efficient than executing clauses one by one.", "events": [], "recommendations": {} }, { "name": "get_event_info", "args": [ { "type": "uint64", "name": "event_id", "desc": "The event ID to query" } ], "returns": { "type": "(uint64,string,bool,bool,address)", "struct": "EventStruct", "desc": "The EventStruct containing the event's information" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get information about an event.", "events": [], "recommendations": {} }, { "name": "get_clause_info", "args": [ { "type": "uint64", "name": "clause_id", "desc": "The clause ID to query" } ], "returns": { "type": "(uint64,uint64,uint64,address,address,address,bool)", "struct": "ConditionalClauseStruct", "desc": "The ConditionalClauseStruct containing the clause's information" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get information about a conditional clause.", "events": [], "recommendations": {} }, { "name": "get_pending_events", "args": [], "returns": { "type": "uint64[]", "desc": "Array of pending event IDs (empty for now - placeholder for interface)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get all pending event IDs. Oracle can use this to know which events to monitor.\nNote: This is a simplified version - in production you'd want pagination for large numbers of events.", "events": [], "recommendations": {} }, { "name": "get_clauses_for_event", "args": [ { "type": "uint64", "name": "event_id", "desc": "The event to get clauses for" } ], "returns": { "type": "uint64[]", "desc": "Array of clause IDs that depend on this event" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get all clause IDs that depend on a specific event.\nOracle can call this when resolving an event to get all clauses to execute.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n ResponsiveDonation Contract - MVP Version\n \n A smart contract enabling conditional charitable donations based on real-world events.\n Perfect for disaster relief, climate action, and cause-based giving.\n \n Core Features:\n 1. \ud83d\udcb0 Instantaneous Donations - Direct donations with immediate payout\n 2. \ud83c\udfaf Conditional Donations - \"Donate $1000 to Red Cross IF hurricane hits Miami\"\n 3. \ud83d\udd2e Oracle Resolution - Trusted oracles resolve event outcomes\n 4. \ud83d\ude80 Mixed Donations - Combine instant + conditional in one transaction\n 5. \ud83d\udcca Query Interface - Discover events and clauses\n \n Use Cases:\n - Climate disaster relief (donate if hurricane/wildfire occurs)\n - Charity matching (donate if fundraising goal is met)\n - Sports betting for good (donate to charity if team wins)\n - Political action (donate if legislation passes)\n ", "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "listed_events": { "keyType": "uint64", "valueType": "EventStruct", "prefix": "ZXZlbnRz" }, "conditional_clauses": { "keyType": "uint64", "valueType": "ConditionalClauseStruct", "prefix": "Y2xhdXNlcw==" }, "event_clauses": { "keyType": "uint64", "valueType": "uint64[]", "prefix": "ZXZlbnRfY2xhdXNlcw==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 948 ], "errorMessage": "Associated event does not exist" }, { "pc": [ 918, 1260 ], "errorMessage": "Clause does not exist" }, { "pc": [ 937 ], "errorMessage": "Clause has already been executed" }, { "pc": [ 702 ], "errorMessage": "Conditional amount must be greater than 0" }, { "pc": [ 531, 737, 865, 1037, 1245 ], "errorMessage": "Event does not exist" }, { "pc": [ 543, 749, 879 ], "errorMessage": "Event has already been resolved" }, { "pc": [ 962, 1054 ], "errorMessage": "Event has not been resolved yet" }, { "pc": [ 884, 938, 977, 1014, 1113, 1169, 1223 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ 503 ], "errorMessage": "Minimum donation is 1000 microAlgos (0.001 ALGO)" }, { "pc": [ 153, 172, 190, 209, 228, 247, 271, 298, 339, 374, 408 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 888 ], "errorMessage": "Only authorized oracle can resolve event" }, { "pc": [ 497, 565, 687 ], "errorMessage": "Payment amount must be greater than 0" }, { "pc": [ 709 ], "errorMessage": "Payment amount must equal sum of donations" }, { "pc": [ 483, 551, 673 ], "errorMessage": "Payment must be sent to contract" }, { "pc": [ 491, 559, 681 ], "errorMessage": "Payment sender must match transaction sender" }, { "pc": [ 435 ], "errorMessage": "can only call when creating" }, { "pc": [ 156, 175, 193, 212, 231, 250, 274, 301, 342, 377, 411 ], "errorMessage": "can only call when not creating" }, { "pc": [ 924, 1139, 1262 ], "errorMessage": "check self.conditional_clauses entry exists" }, { "pc": [ 624, 811, 1081, 1282 ], "errorMessage": "check self.event_clauses entry exists" }, { "pc": [ 533, 739, 868, 950, 1043, 1247 ], "errorMessage": "check self.listed_events entry exists" }, { "pc": [ 326, 361, 390 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucmVzcG9uc2l2ZV9kb25hdGlvbi5jb250cmFjdC5SZXNwb25zaXZlRG9uYXRpb24uX19hbGdvcHlfZW50cnlwb2ludF93aXRoX2luaXQoKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDgwIDgxIDk2MAogICAgYnl0ZWNibG9jayAweDAwIDB4MTUxZjdjNzUgImV2ZW50cyIgImNsYXVzZXMiICJldmVudF9jbGF1c2VzIiAweDAwMDEgMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gY2xhc3MgUmVzcG9uc2l2ZURvbmF0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg5NjNlOTJlZiAweDg0OGRiZTUyIDB4MTIwNmQ4ZmQgMHhhNmZlZDM0NCAweDJkYjY5OTQ2IDB4YjVhMTY3Y2EgMHgxNTNhNTI1YyAweGI4NGUxNWQ2IDB4NzY1ZTBmM2YgMHhjODlkZDkwMiAweDJjMWQ2ZDE3IC8vIG1ldGhvZCAiY3JlYXRlX2V2ZW50KHN0cmluZyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiaW5zdGFudGFuZW91c19wYXlvdXQoYWRkcmVzcyxwYXkpYm9vbCIsIG1ldGhvZCAiY3JlYXRlX2NvbmRpdGlvbmFsX2RvbmF0aW9uKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MscGF5KXVpbnQ2NCIsIG1ldGhvZCAibWl4ZWRfZG9uYXRpb24oYWRkcmVzcyx1aW50NjQsdWludDY0LGFkZHJlc3MsYWRkcmVzcyxwYXkpdWludDY0IiwgbWV0aG9kICJyZXNvbHZlX2V2ZW50KHVpbnQ2NCxib29sKWJvb2wiLCBtZXRob2QgImV4ZWN1dGVfY29uZGl0aW9uYWxfY2xhdXNlKHVpbnQ2NClib29sIiwgbWV0aG9kICJleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9ldmVudF9pbmZvKHVpbnQ2NCkodWludDY0LHN0cmluZyxib29sLGJvb2wsYWRkcmVzcykiLCBtZXRob2QgImdldF9jbGF1c2VfaW5mbyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGJvb2wpIiwgbWV0aG9kICJnZXRfcGVuZGluZ19ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfY2xhdXNlc19mb3JfZXZlbnQodWludDY0KXVpbnQ2NFtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jcmVhdGVfZXZlbnRfcm91dGVANSBtYWluX2luc3RhbnRhbmVvdXNfcGF5b3V0X3JvdXRlQDYgbWFpbl9jcmVhdGVfY29uZGl0aW9uYWxfZG9uYXRpb25fcm91dGVANyBtYWluX21peGVkX2RvbmF0aW9uX3JvdXRlQDggbWFpbl9yZXNvbHZlX2V2ZW50X3JvdXRlQDkgbWFpbl9leGVjdXRlX2NvbmRpdGlvbmFsX2NsYXVzZV9yb3V0ZUAxMCBtYWluX2V4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfcm91dGVAMTEgbWFpbl9nZXRfZXZlbnRfaW5mb19yb3V0ZUAxMiBtYWluX2dldF9jbGF1c2VfaW5mb19yb3V0ZUAxMyBtYWluX2dldF9wZW5kaW5nX2V2ZW50c19yb3V0ZUAxNCBtYWluX2dldF9jbGF1c2VzX2Zvcl9ldmVudF9yb3V0ZUAxNQoKbWFpbl9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NjEKICAgIC8vIGNsYXNzIFJlc3BvbnNpdmVEb25hdGlvbihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfY2xhdXNlc19mb3JfZXZlbnRfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0OTQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NjEKICAgIC8vIGNsYXNzIFJlc3BvbnNpdmVEb25hdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDk0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9jbGF1c2VzX2Zvcl9ldmVudAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGVuZGluZ19ldmVudHNfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0NzYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwCiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NsYXVzZV9pbmZvX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDU5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBjbGFzcyBSZXNwb25zaXZlRG9uYXRpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQ1OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfY2xhdXNlX2luZm8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2V2ZW50X2luZm9fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0NDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NjEKICAgIC8vIGNsYXNzIFJlc3BvbnNpdmVEb25hdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDQyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9ldmVudF9pbmZvCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2V4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozODMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gY2xhc3MgUmVzcG9uc2l2ZURvbmF0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozODMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2V4ZWN1dGVfY29uZGl0aW9uYWxfY2xhdXNlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzM0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NjEKICAgIC8vIGNsYXNzIFJlc3BvbnNpdmVEb25hdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzM0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZXhlY3V0ZV9jb25kaXRpb25hbF9jbGF1c2UKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jlc29sdmVfZXZlbnRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBjbGFzcyBSZXNwb25zaXZlRG9uYXRpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlc29sdmVfZXZlbnQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX21peGVkX2RvbmF0aW9uX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gY2xhc3MgUmVzcG9uc2l2ZURvbmF0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIG1peGVkX2RvbmF0aW9uCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9jb25kaXRpb25hbF9kb25hdGlvbl9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NjEKICAgIC8vIGNsYXNzIFJlc3BvbnNpdmVEb25hdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjcmVhdGVfY29uZGl0aW9uYWxfZG9uYXRpb24KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5faW5zdGFudGFuZW91c19wYXlvdXRfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBjbGFzcyBSZXNwb25zaXZlRG9uYXRpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTM0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgaW5zdGFudGFuZW91c19wYXlvdXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9ldmVudF9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NjEKICAgIC8vIGNsYXNzIFJlc3BvbnNpdmVEb25hdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY3JlYXRlX2V2ZW50CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBjbGFzcyBSZXNwb25zaXZlRG9uYXRpb24oQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTgKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc3BvbnNpdmVfZG9uYXRpb24uY29udHJhY3QuUmVzcG9uc2l2ZURvbmF0aW9uLmNyZWF0ZV9ldmVudChldmVudF9zdHJpbmc6IGJ5dGVzLCBvcmFjbGVfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpjcmVhdGVfZXZlbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxMDQtMTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjcmVhdGVfZXZlbnQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBldmVudF9zdHJpbmc6IGFyYzQuU3RyaW5nLAogICAgLy8gICAgIG9yYWNsZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgVXNlIHRpbWVzdGFtcCBhcyB1bmlxdWUgZXZlbnQgSUQKICAgIC8vIGV2ZW50X2lkID0gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxMjMtMTMwCiAgICAvLyAjIENyZWF0ZSBhbmQgc3RvcmUgdGhlIGV2ZW50IHN0cnVjdAogICAgLy8gc2VsZi5saXN0ZWRfZXZlbnRzW2V2ZW50X2lkXSA9IEV2ZW50U3RydWN0KAogICAgLy8gICAgIGV2ZW50X2lkPWV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3N0cmluZz1ldmVudF9zdHJpbmcsCiAgICAvLyAgICAgcGVuZGluZz1hcmM0LkJvb2woVHJ1ZSksCiAgICAvLyAgICAgcmVzb2x1dGlvbj1hcmM0LkJvb2woRmFsc2UpLCAgIyBEZWZhdWx0IHJlc29sdXRpb24sIG5vdCBtZWFuaW5nZnVsIHVudGlsIHBlbmRpbmc9ZmFsc2UKICAgIC8vICAgICBvcmFjbGVfYWRkcmVzcz1vcmFjbGVfYWRkcmVzcwogICAgLy8gKQogICAgZHVwCiAgICBwdXNoYnl0ZXMgMHgwMDJiCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gcGVuZGluZz1hcmM0LkJvb2woVHJ1ZSksCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTIzLTEzMAogICAgLy8gIyBDcmVhdGUgYW5kIHN0b3JlIHRoZSBldmVudCBzdHJ1Y3QKICAgIC8vIHNlbGYubGlzdGVkX2V2ZW50c1tldmVudF9pZF0gPSBFdmVudFN0cnVjdCgKICAgIC8vICAgICBldmVudF9pZD1ldmVudF9pZCwKICAgIC8vICAgICBldmVudF9zdHJpbmc9ZXZlbnRfc3RyaW5nLAogICAgLy8gICAgIHBlbmRpbmc9YXJjNC5Cb29sKFRydWUpLAogICAgLy8gICAgIHJlc29sdXRpb249YXJjNC5Cb29sKEZhbHNlKSwgICMgRGVmYXVsdCByZXNvbHV0aW9uLCBub3QgbWVhbmluZ2Z1bCB1bnRpbCBwZW5kaW5nPWZhbHNlCiAgICAvLyAgICAgb3JhY2xlX2FkZHJlc3M9b3JhY2xlX2FkZHJlc3MKICAgIC8vICkKICAgIGNvbmNhdAogICAgaW50Y18zIC8vIDgxCiAgICBpbnRjXzAgLy8gMAogICAgc2V0Yml0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjEyMy0xMjQKICAgIC8vICMgQ3JlYXRlIGFuZCBzdG9yZSB0aGUgZXZlbnQgc3RydWN0CiAgICAvLyBzZWxmLmxpc3RlZF9ldmVudHNbZXZlbnRfaWRdID0gRXZlbnRTdHJ1Y3QoCiAgICBieXRlY18yIC8vICJldmVudHMiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxMjMtMTMwCiAgICAvLyAjIENyZWF0ZSBhbmQgc3RvcmUgdGhlIGV2ZW50IHN0cnVjdAogICAgLy8gc2VsZi5saXN0ZWRfZXZlbnRzW2V2ZW50X2lkXSA9IEV2ZW50U3RydWN0KAogICAgLy8gICAgIGV2ZW50X2lkPWV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3N0cmluZz1ldmVudF9zdHJpbmcsCiAgICAvLyAgICAgcGVuZGluZz1hcmM0LkJvb2woVHJ1ZSksCiAgICAvLyAgICAgcmVzb2x1dGlvbj1hcmM0LkJvb2woRmFsc2UpLCAgIyBEZWZhdWx0IHJlc29sdXRpb24sIG5vdCBtZWFuaW5nZnVsIHVudGlsIHBlbmRpbmc9ZmFsc2UKICAgIC8vICAgICBvcmFjbGVfYWRkcmVzcz1vcmFjbGVfYWRkcmVzcwogICAgLy8gKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gcmV0dXJuIGV2ZW50X2lkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucmVzcG9uc2l2ZV9kb25hdGlvbi5jb250cmFjdC5SZXNwb25zaXZlRG9uYXRpb24uaW5zdGFudGFuZW91c19wYXlvdXQocmVjaXBpZW50X2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKaW5zdGFudGFuZW91c19wYXlvdXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxMzQtMTM5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBpbnN0YW50YW5lb3VzX3BheW91dCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHJlY2lwaWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24KICAgIC8vICkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTUxLTE1MgogICAgLy8gIyBWYWxpZGF0ZSB0aGUgcGF5bWVudCB0cmFuc2FjdGlvbgogICAgLy8gYXNzZXJ0IHBheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIlBheW1lbnQgbXVzdCBiZSBzZW50IHRvIGNvbnRyYWN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHNlbnQgdG8gY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IHBheW1lbnQuc2VuZGVyID09IFR4bi5zZW5kZXIsICJQYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggdHJhbnNhY3Rpb24gc2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBwYXltZW50LmFtb3VudCA+IDAsICJQYXltZW50IGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIFBheW1lbnQgYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gYXNzZXJ0IHBheW1lbnQuYW1vdW50ID49IDEwMDAsICJNaW5pbXVtIGRvbmF0aW9uIGlzIDEwMDAgbWljcm9BbGdvcyAoMC4wMDEgQUxHTykiCiAgICBkdXAKICAgIHB1c2hpbnQgMTAwMCAvLyAxMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIE1pbmltdW0gZG9uYXRpb24gaXMgMTAwMCBtaWNyb0FsZ29zICgwLjAwMSBBTEdPKQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTU3LTE2MgogICAgLy8gIyBJbW1lZGlhdGVseSB0cmFuc2ZlciB0aGUgZnVuZHMgdG8gdGhlIHJlY2lwaWVudAogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50LmFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1yZWNpcGllbnRfYWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyAjIEltbWVkaWF0ZWx5IHRyYW5zZmVyIHRoZSBmdW5kcyB0byB0aGUgcmVjaXBpZW50CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNjEKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNTctMTYyCiAgICAvLyAjIEltbWVkaWF0ZWx5IHRyYW5zZmVyIHRoZSBmdW5kcyB0byB0aGUgcmVjaXBpZW50CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PXBheW1lbnQuYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2lwaWVudF9hZGRyZXNzLm5hdGl2ZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNjQKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc3BvbnNpdmVfZG9uYXRpb24uY29udHJhY3QuUmVzcG9uc2l2ZURvbmF0aW9uLmNyZWF0ZV9jb25kaXRpb25hbF9kb25hdGlvbihldmVudF9pZDogYnl0ZXMsIHJlY2lwaWVudF95ZXM6IGJ5dGVzLCByZWNpcGllbnRfbm86IGJ5dGVzLCBwYXltZW50OiB1aW50NjQpIC0+IGJ5dGVzOgpjcmVhdGVfY29uZGl0aW9uYWxfZG9uYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxNjYtMTczCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjcmVhdGVfY29uZGl0aW9uYWxfZG9uYXRpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBldmVudF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcmVjaXBpZW50X3llczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2lwaWVudF9ubzogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxODctMTg4CiAgICAvLyAjIEVuc3VyZSB0aGUgZXZlbnQgZXhpc3RzIGFuZCBpcyBzdGlsbCBwZW5kaW5nCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgaW4gc2VsZi5saXN0ZWRfZXZlbnRzLCAiRXZlbnQgZG9lcyBub3QgZXhpc3QiCiAgICBieXRlY18yIC8vICJldmVudHMiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBFdmVudCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTg5CiAgICAvLyBldmVudF9zdHJ1Y3QgPSBzZWxmLmxpc3RlZF9ldmVudHNbZXZlbnRfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGlzdGVkX2V2ZW50cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gYXNzZXJ0IGV2ZW50X3N0cnVjdC5wZW5kaW5nLm5hdGl2ZSwgIkV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQiCiAgICBpbnRjXzIgLy8gODAKICAgIGdldGJpdAogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGFzc2VydCAvLyBFdmVudCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToxOTItMTkzCiAgICAvLyAjIFZhbGlkYXRlIHRoZSBwYXltZW50IHRyYW5zYWN0aW9uCiAgICAvLyBhc3NlcnQgcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiUGF5bWVudCBtdXN0IGJlIHNlbnQgdG8gY29udHJhY3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgc2VudCB0byBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTk0CiAgICAvLyBhc3NlcnQgcGF5bWVudC5zZW5kZXIgPT0gVHhuLnNlbmRlciwgIlBheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggdHJhbnNhY3Rpb24gc2VuZGVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gYXNzZXJ0IHBheW1lbnQuYW1vdW50ID4gMCwgIlBheW1lbnQgYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gUGF5bWVudCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBVc2UgdGltZXN0YW1wICsgaGFzaCBvZiBzZW5kZXIgZm9yIHVuaXF1ZSBjbGF1c2UgSUQgdG8gYXZvaWQgY29sbGlzaW9ucwogICAgLy8gc2VuZGVyX2hhc2ggPSBvcC5zaGEyNTYoVHhuLnNlbmRlci5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MTk5CiAgICAvLyBjbGF1c2VfaWQgPSBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIG9wLmJ0b2koc2VuZGVyX2hhc2hbOjhdKSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIHN1YnN0cmluZyAwIDgKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMDUKICAgIC8vIHBheW91dF9hbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudC5hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjA4CiAgICAvLyBkb25vcl9hZGRyZXNzPWFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjIwMS0yMTAKICAgIC8vICMgQ3JlYXRlIGFuZCBzdG9yZSB0aGUgY29uZGl0aW9uYWwgY2xhdXNlCiAgICAvLyBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXNbY2xhdXNlX2lkXSA9IENvbmRpdGlvbmFsQ2xhdXNlU3RydWN0KAogICAgLy8gICAgIGNsYXVzZV9pZD1jbGF1c2VfaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZXZlbnRfaWQsCiAgICAvLyAgICAgcGF5b3V0X2Ftb3VudD1hcmM0LlVJbnQ2NChwYXltZW50LmFtb3VudCksCiAgICAvLyAgICAgcmVjaXBpZW50X3llcz1yZWNpcGllbnRfeWVzLAogICAgLy8gICAgIHJlY2lwaWVudF9ubz1yZWNpcGllbnRfbm8sCiAgICAvLyAgICAgZG9ub3JfYWRkcmVzcz1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgZXhlY3V0ZWQ9YXJjNC5Cb29sKEZhbHNlKQogICAgLy8gKQogICAgZGlnIDIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gZXhlY3V0ZWQ9YXJjNC5Cb29sKEZhbHNlKQogICAgYnl0ZWNfMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMDEtMjEwCiAgICAvLyAjIENyZWF0ZSBhbmQgc3RvcmUgdGhlIGNvbmRpdGlvbmFsIGNsYXVzZQogICAgLy8gc2VsZi5jb25kaXRpb25hbF9jbGF1c2VzW2NsYXVzZV9pZF0gPSBDb25kaXRpb25hbENsYXVzZVN0cnVjdCgKICAgIC8vICAgICBjbGF1c2VfaWQ9Y2xhdXNlX2lkLAogICAgLy8gICAgIGV2ZW50X2lkPWV2ZW50X2lkLAogICAgLy8gICAgIHBheW91dF9hbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudC5hbW91bnQpLAogICAgLy8gICAgIHJlY2lwaWVudF95ZXM9cmVjaXBpZW50X3llcywKICAgIC8vICAgICByZWNpcGllbnRfbm89cmVjaXBpZW50X25vLAogICAgLy8gICAgIGRvbm9yX2FkZHJlc3M9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGV4ZWN1dGVkPWFyYzQuQm9vbChGYWxzZSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjAxLTIwMgogICAgLy8gIyBDcmVhdGUgYW5kIHN0b3JlIHRoZSBjb25kaXRpb25hbCBjbGF1c2UKICAgIC8vIHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlc1tjbGF1c2VfaWRdID0gQ29uZGl0aW9uYWxDbGF1c2VTdHJ1Y3QoCiAgICBieXRlY18zIC8vICJjbGF1c2VzIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjIwMS0yMTAKICAgIC8vICMgQ3JlYXRlIGFuZCBzdG9yZSB0aGUgY29uZGl0aW9uYWwgY2xhdXNlCiAgICAvLyBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXNbY2xhdXNlX2lkXSA9IENvbmRpdGlvbmFsQ2xhdXNlU3RydWN0KAogICAgLy8gICAgIGNsYXVzZV9pZD1jbGF1c2VfaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZXZlbnRfaWQsCiAgICAvLyAgICAgcGF5b3V0X2Ftb3VudD1hcmM0LlVJbnQ2NChwYXltZW50LmFtb3VudCksCiAgICAvLyAgICAgcmVjaXBpZW50X3llcz1yZWNpcGllbnRfeWVzLAogICAgLy8gICAgIHJlY2lwaWVudF9ubz1yZWNpcGllbnRfbm8sCiAgICAvLyAgICAgZG9ub3JfYWRkcmVzcz1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgZXhlY3V0ZWQ9YXJjNC5Cb29sKEZhbHNlKQogICAgLy8gKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjEyLTIxMwogICAgLy8gIyBBZGQgY2xhdXNlIHRvIGV2ZW50IGluZGV4IGZvciBlZmZpY2llbnQgbG9va3VwCiAgICAvLyBpZiBldmVudF9pZCBpbiBzZWxmLmV2ZW50X2NsYXVzZXM6CiAgICBieXRlYyA0IC8vICJldmVudF9jbGF1c2VzIgogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBjcmVhdGVfY29uZGl0aW9uYWxfZG9uYXRpb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gZXhpc3RpbmdfY2xhdXNlcyA9IHNlbGYuZXZlbnRfY2xhdXNlc1tldmVudF9pZF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jbGF1c2VzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZ19jbGF1c2VzLmFwcGVuZChjbGF1c2VfaWQpCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMTYKICAgIC8vIHNlbGYuZXZlbnRfY2xhdXNlc1tldmVudF9pZF0gPSBleGlzdGluZ19jbGF1c2VzLmNvcHkoKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjIyCiAgICAvLyByZXR1cm4gY2xhdXNlX2lkCiAgICByZXRzdWIKCmNyZWF0ZV9jb25kaXRpb25hbF9kb25hdGlvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjIxOC0yMTkKICAgIC8vICMgQ3JlYXRlIG5ldyBhcnJheSB3aXRoIHRoaXMgY2xhdXNlCiAgICAvLyBuZXdfY2xhdXNlX2FycmF5ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKGNsYXVzZV9pZCkKICAgIGJ5dGVjIDUgLy8gMHgwMDAxCiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuZXZlbnRfY2xhdXNlc1tldmVudF9pZF0gPSBuZXdfY2xhdXNlX2FycmF5LmNvcHkoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMjIKICAgIC8vIHJldHVybiBjbGF1c2VfaWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNwb25zaXZlX2RvbmF0aW9uLmNvbnRyYWN0LlJlc3BvbnNpdmVEb25hdGlvbi5taXhlZF9kb25hdGlvbihpbnN0YW50X3JlY2lwaWVudDogYnl0ZXMsIGluc3RhbnRfYW1vdW50OiBieXRlcywgZXZlbnRfaWQ6IGJ5dGVzLCByZWNpcGllbnRfeWVzOiBieXRlcywgcmVjaXBpZW50X25vOiBieXRlcywgcGF5bWVudDogdWludDY0KSAtPiBieXRlczoKbWl4ZWRfZG9uYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyMjQtMjMzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBtaXhlZF9kb25hdGlvbigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGluc3RhbnRfcmVjaXBpZW50OiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgaW5zdGFudF9hbW91bnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGV2ZW50X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByZWNpcGllbnRfeWVzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcmVjaXBpZW50X25vOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24KICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byA2IDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI0OS0yNTAKICAgIC8vICMgVmFsaWRhdGUgdGhlIHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXltZW50LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJQYXltZW50IG11c3QgYmUgc2VudCB0byBjb250cmFjdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSBzZW50IHRvIGNvbnRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNTEKICAgIC8vIGFzc2VydCBwYXltZW50LnNlbmRlciA9PSBUeG4uc2VuZGVyLCAiUGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjUyCiAgICAvLyBhc3NlcnQgcGF5bWVudC5hbW91bnQgPiAwLCAiUGF5bWVudCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBQYXltZW50IGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyAjIENhbGN1bGF0ZSB0b3RhbCByZXF1aXJlZCBhbW91bnQKICAgIC8vIGNvbmRpdGlvbmFsX2Ftb3VudCA9IGFyYzQuVUludDY0KHBheW1lbnQuYW1vdW50IC0gaW5zdGFudF9hbW91bnQubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cDIKICAgIC0KICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjU2CiAgICAvLyBhc3NlcnQgY29uZGl0aW9uYWxfYW1vdW50Lm5hdGl2ZSA+IDAsICJDb25kaXRpb25hbCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENvbmRpdGlvbmFsIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNTgKICAgIC8vIHRvdGFsX3JlcXVpcmVkID0gaW5zdGFudF9hbW91bnQubmF0aXZlICsgY29uZGl0aW9uYWxfYW1vdW50Lm5hdGl2ZQogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYXNzZXJ0IHBheW1lbnQuYW1vdW50ID09IHRvdGFsX3JlcXVpcmVkLCAiUGF5bWVudCBhbW91bnQgbXVzdCBlcXVhbCBzdW0gb2YgZG9uYXRpb25zIgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgYW1vdW50IG11c3QgZXF1YWwgc3VtIG9mIGRvbmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjYxLTI2MgogICAgLy8gIyBQcm9jZXNzIGluc3RhbnQgZG9uYXRpb24gaWYgc3BlY2lmaWVkCiAgICAvLyBpZiBpbnN0YW50X2Ftb3VudC5uYXRpdmUgPiAwOgogICAgYnogbWl4ZWRfZG9uYXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNjMtMjY3CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWluc3RhbnRfYW1vdW50Lm5hdGl2ZSwKICAgIC8vICAgICByZWNlaXZlcj1pbnN0YW50X3JlY2lwaWVudC5uYXRpdmUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjYzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNjYKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNjMtMjY3CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWluc3RhbnRfYW1vdW50Lm5hdGl2ZSwKICAgIC8vICAgICByZWNlaXZlcj1pbnN0YW50X3JlY2lwaWVudC5uYXRpdmUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKbWl4ZWRfZG9uYXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBWYWxpZGF0ZSBldmVudCBleGlzdHMgYW5kIGlzIHBlbmRpbmcgZm9yIGNvbmRpdGlvbmFsIGRvbmF0aW9uCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgaW4gc2VsZi5saXN0ZWRfZXZlbnRzLCAiRXZlbnQgZG9lcyBub3QgZXhpc3QiCiAgICBieXRlY18yIC8vICJldmVudHMiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBFdmVudCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjcxCiAgICAvLyBldmVudF9zdHJ1Y3QgPSBzZWxmLmxpc3RlZF9ldmVudHNbZXZlbnRfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGlzdGVkX2V2ZW50cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXNzZXJ0IGV2ZW50X3N0cnVjdC5wZW5kaW5nLm5hdGl2ZSwgIkV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQiCiAgICBpbnRjXzIgLy8gODAKICAgIGdldGJpdAogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGFzc2VydCAvLyBFdmVudCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIENyZWF0ZSBjb25kaXRpb25hbCBjbGF1c2Ugd2l0aCB1bmlxdWUgSUQKICAgIC8vIHNlbmRlcl9oYXNoID0gb3Auc2hhMjU2KFR4bi5zZW5kZXIuYnl0ZXMpCiAgICB0eG4gU2VuZGVyCiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gY2xhdXNlX2lkID0gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBvcC5idG9pKHNlbmRlcl9oYXNoWzo4XSkgKyAxKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgc3Vic3RyaW5nIDAgOAogICAgYnRvaQogICAgKwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyODQKICAgIC8vIGRvbm9yX2FkZHJlc3M9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6Mjc4LTI4NgogICAgLy8gc2VsZi5jb25kaXRpb25hbF9jbGF1c2VzW2NsYXVzZV9pZF0gPSBDb25kaXRpb25hbENsYXVzZVN0cnVjdCgKICAgIC8vICAgICBjbGF1c2VfaWQ9Y2xhdXNlX2lkLAogICAgLy8gICAgIGV2ZW50X2lkPWV2ZW50X2lkLAogICAgLy8gICAgIHBheW91dF9hbW91bnQ9Y29uZGl0aW9uYWxfYW1vdW50LAogICAgLy8gICAgIHJlY2lwaWVudF95ZXM9cmVjaXBpZW50X3llcywKICAgIC8vICAgICByZWNpcGllbnRfbm89cmVjaXBpZW50X25vLAogICAgLy8gICAgIGRvbm9yX2FkZHJlc3M9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGV4ZWN1dGVkPWFyYzQuQm9vbChGYWxzZSkKICAgIC8vICkKICAgIGRpZyAxCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gZXhlY3V0ZWQ9YXJjNC5Cb29sKEZhbHNlKQogICAgYnl0ZWNfMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNzgtMjg2CiAgICAvLyBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXNbY2xhdXNlX2lkXSA9IENvbmRpdGlvbmFsQ2xhdXNlU3RydWN0KAogICAgLy8gICAgIGNsYXVzZV9pZD1jbGF1c2VfaWQsCiAgICAvLyAgICAgZXZlbnRfaWQ9ZXZlbnRfaWQsCiAgICAvLyAgICAgcGF5b3V0X2Ftb3VudD1jb25kaXRpb25hbF9hbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50X3llcz1yZWNpcGllbnRfeWVzLAogICAgLy8gICAgIHJlY2lwaWVudF9ubz1yZWNpcGllbnRfbm8sCiAgICAvLyAgICAgZG9ub3JfYWRkcmVzcz1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgZXhlY3V0ZWQ9YXJjNC5Cb29sKEZhbHNlKQogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyNzgKICAgIC8vIHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlc1tjbGF1c2VfaWRdID0gQ29uZGl0aW9uYWxDbGF1c2VTdHJ1Y3QoCiAgICBieXRlY18zIC8vICJjbGF1c2VzIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI3OC0yODYKICAgIC8vIHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlc1tjbGF1c2VfaWRdID0gQ29uZGl0aW9uYWxDbGF1c2VTdHJ1Y3QoCiAgICAvLyAgICAgY2xhdXNlX2lkPWNsYXVzZV9pZCwKICAgIC8vICAgICBldmVudF9pZD1ldmVudF9pZCwKICAgIC8vICAgICBwYXlvdXRfYW1vdW50PWNvbmRpdGlvbmFsX2Ftb3VudCwKICAgIC8vICAgICByZWNpcGllbnRfeWVzPXJlY2lwaWVudF95ZXMsCiAgICAvLyAgICAgcmVjaXBpZW50X25vPXJlY2lwaWVudF9ubywKICAgIC8vICAgICBkb25vcl9hZGRyZXNzPWFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICBleGVjdXRlZD1hcmM0LkJvb2woRmFsc2UpCiAgICAvLyApCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyODgtMjg5CiAgICAvLyAjIEFkZCBjbGF1c2UgdG8gZXZlbnQgaW5kZXggZm9yIGVmZmljaWVudCBsb29rdXAKICAgIC8vIGlmIGV2ZW50X2lkIGluIHNlbGYuZXZlbnRfY2xhdXNlczoKICAgIGJ5dGVjIDQgLy8gImV2ZW50X2NsYXVzZXMiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbWl4ZWRfZG9uYXRpb25fZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gZXhpc3RpbmdfY2xhdXNlcyA9IHNlbGYuZXZlbnRfY2xhdXNlc1tldmVudF9pZF0uY29weSgpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jbGF1c2VzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MjkxCiAgICAvLyBleGlzdGluZ19jbGF1c2VzLmFwcGVuZChjbGF1c2VfaWQpCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weToyOTIKICAgIC8vIHNlbGYuZXZlbnRfY2xhdXNlc1tldmVudF9pZF0gPSBleGlzdGluZ19jbGF1c2VzLmNvcHkoKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAoKbWl4ZWRfZG9uYXRpb25fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6Mjk4CiAgICAvLyByZXR1cm4gY2xhdXNlX2lkCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCm1peGVkX2RvbmF0aW9uX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6Mjk0LTI5NQogICAgLy8gIyBDcmVhdGUgbmV3IGFycmF5IHdpdGggdGhpcyBjbGF1c2UKICAgIC8vIG5ld19jbGF1c2VfYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oY2xhdXNlX2lkKQogICAgYnl0ZWMgNSAvLyAweDAwMDEKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gc2VsZi5ldmVudF9jbGF1c2VzW2V2ZW50X2lkXSA9IG5ld19jbGF1c2VfYXJyYXkuY29weSgpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgbWl4ZWRfZG9uYXRpb25fYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLnJlc3BvbnNpdmVfZG9uYXRpb24uY29udHJhY3QuUmVzcG9uc2l2ZURvbmF0aW9uLnJlc29sdmVfZXZlbnQoZXZlbnRfaWQ6IGJ5dGVzLCByZXNvbHV0aW9uOiBieXRlcykgLT4gdWludDY0OgpyZXNvbHZlX2V2ZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzAwLTMwNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVzb2x2ZV9ldmVudCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGV2ZW50X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByZXNvbHV0aW9uOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzE2LTMxNwogICAgLy8gIyBFbnN1cmUgdGhlIGV2ZW50IGV4aXN0cwogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIGluIHNlbGYubGlzdGVkX2V2ZW50cywgIkV2ZW50IGRvZXMgbm90IGV4aXN0IgogICAgYnl0ZWNfMiAvLyAiZXZlbnRzIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gRXZlbnQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZXZlbnRfc3RydWN0ID0gc2VsZi5saXN0ZWRfZXZlbnRzW2V2ZW50X2lkXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGlzdGVkX2V2ZW50cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjMyMS0zMjIKICAgIC8vICMgRW5zdXJlIHRoZSBldmVudCBpcyBzdGlsbCBwZW5kaW5nCiAgICAvLyBhc3NlcnQgZXZlbnRfc3RydWN0LnBlbmRpbmcubmF0aXZlLCAiRXZlbnQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZCIKICAgIGR1cAogICAgaW50Y18yIC8vIDgwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gRXZlbnQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzI0LTMyNQogICAgLy8gIyBFbnN1cmUgdGhlIGNhbGxlciBpcyB0aGUgYXV0aG9yaXplZCBvcmFjbGUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGV2ZW50X3N0cnVjdC5vcmFjbGVfYWRkcmVzcy5uYXRpdmUsICJPbmx5IGF1dGhvcml6ZWQgb3JhY2xlIGNhbiByZXNvbHZlIGV2ZW50IgogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGV4dHJhY3QgMTEgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgYXV0aG9yaXplZCBvcmFjbGUgY2FuIHJlc29sdmUgZXZlbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjMyNy0zMjgKICAgIC8vICMgVXBkYXRlIHRoZSBldmVudCBzdHJ1Y3QKICAgIC8vIGV2ZW50X3N0cnVjdC5wZW5kaW5nID0gYXJjNC5Cb29sKEZhbHNlKQogICAgaW50Y18yIC8vIDgwCiAgICBpbnRjXzAgLy8gMAogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozMjkKICAgIC8vIGV2ZW50X3N0cnVjdC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjXzMgLy8gODEKICAgIHN3YXAKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzMwCiAgICAvLyBzZWxmLmxpc3RlZF9ldmVudHNbZXZlbnRfaWRdID0gZXZlbnRfc3RydWN0LmNvcHkoKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzMyCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNwb25zaXZlX2RvbmF0aW9uLmNvbnRyYWN0LlJlc3BvbnNpdmVEb25hdGlvbi5leGVjdXRlX2NvbmRpdGlvbmFsX2NsYXVzZShjbGF1c2VfaWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmV4ZWN1dGVfY29uZGl0aW9uYWxfY2xhdXNlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzM0LTMzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZXhlY3V0ZV9jb25kaXRpb25hbF9jbGF1c2UoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBjbGF1c2VfaWQ6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vICMgRW5zdXJlIHRoZSBjbGF1c2UgZXhpc3RzCiAgICAvLyBhc3NlcnQgY2xhdXNlX2lkIGluIHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlcywgIkNsYXVzZSBkb2VzIG5vdCBleGlzdCIKICAgIGJ5dGVjXzMgLy8gImNsYXVzZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDbGF1c2UgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gY2xhdXNlX3N0cnVjdCA9IHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlc1tjbGF1c2VfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozNTQtMzU1CiAgICAvLyAjIEVuc3VyZSB0aGUgY2xhdXNlIGhhc24ndCBiZWVuIGV4ZWN1dGVkIHlldAogICAgLy8gYXNzZXJ0IG5vdCBjbGF1c2Vfc3RydWN0LmV4ZWN1dGVkLm5hdGl2ZSwgIkNsYXVzZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkIgogICAgZHVwCiAgICBpbnRjIDQgLy8gOTYwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gQ2xhdXNlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM1Ny0zNTgKICAgIC8vICMgR2V0IHRoZSBhc3NvY2lhdGVkIGV2ZW50CiAgICAvLyBhc3NlcnQgY2xhdXNlX3N0cnVjdC5ldmVudF9pZCBpbiBzZWxmLmxpc3RlZF9ldmVudHMsICJBc3NvY2lhdGVkIGV2ZW50IGRvZXMgbm90IGV4aXN0IgogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlY18yIC8vICJldmVudHMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQXNzb2NpYXRlZCBldmVudCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzU5CiAgICAvLyBldmVudF9zdHJ1Y3QgPSBzZWxmLmxpc3RlZF9ldmVudHNbY2xhdXNlX3N0cnVjdC5ldmVudF9pZF0uY29weSgpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5saXN0ZWRfZXZlbnRzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzYxLTM2MgogICAgLy8gIyBFbnN1cmUgdGhlIGV2ZW50IGhhcyBiZWVuIHJlc29sdmVkCiAgICAvLyBhc3NlcnQgbm90IGV2ZW50X3N0cnVjdC5wZW5kaW5nLm5hdGl2ZSwgIkV2ZW50IGhhcyBub3QgYmVlbiByZXNvbHZlZCB5ZXQiCiAgICBkdXAKICAgIGludGNfMiAvLyA4MAogICAgZ2V0Yml0CiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIEV2ZW50IGhhcyBub3QgYmVlbiByZXNvbHZlZCB5ZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM2NC0zNjUKICAgIC8vICMgRGV0ZXJtaW5lIHJlY2lwaWVudCBiYXNlZCBvbiBldmVudCByZXNvbHV0aW9uCiAgICAvLyBpZiBldmVudF9zdHJ1Y3QucmVzb2x1dGlvbi5uYXRpdmU6CiAgICBpbnRjXzMgLy8gODEKICAgIGdldGJpdAogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ6IGV4ZWN1dGVfY29uZGl0aW9uYWxfY2xhdXNlX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozNjYKICAgIC8vIHJlY2lwaWVudCA9IGNsYXVzZV9zdHJ1Y3QucmVjaXBpZW50X3llcy5uYXRpdmUKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDI0IDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwoKZXhlY3V0ZV9jb25kaXRpb25hbF9jbGF1c2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzcwLTM3NQogICAgLy8gIyBFeGVjdXRlIHRoZSBwYXlvdXQKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9Y2xhdXNlX3N0cnVjdC5wYXlvdXRfYW1vdW50Lm5hdGl2ZSwKICAgIC8vICAgICByZWNlaXZlcj1yZWNpcGllbnQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozNzIKICAgIC8vIGFtb3VudD1jbGF1c2Vfc3RydWN0LnBheW91dF9hbW91bnQubmF0aXZlLAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM3MC0zNzEKICAgIC8vICMgRXhlY3V0ZSB0aGUgcGF5b3V0CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozNzQKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozNzAtMzc1CiAgICAvLyAjIEV4ZWN1dGUgdGhlIHBheW91dAogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIGFtb3VudD1jbGF1c2Vfc3RydWN0LnBheW91dF9hbW91bnQubmF0aXZlLAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2lwaWVudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozNzctMzc4CiAgICAvLyAjIE1hcmsgdGhlIGNsYXVzZSBhcyBleGVjdXRlZAogICAgLy8gY2xhdXNlX3N0cnVjdC5leGVjdXRlZCA9IGFyYzQuQm9vbChUcnVlKQogICAgaW50YyA0IC8vIDk2MAogICAgaW50Y18xIC8vIDEKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6Mzc5CiAgICAvLyBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXNbY2xhdXNlX2lkXSA9IGNsYXVzZV9zdHJ1Y3QuY29weSgpCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6MzgxCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpleGVjdXRlX2NvbmRpdGlvbmFsX2NsYXVzZV9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM2OAogICAgLy8gcmVjaXBpZW50ID0gY2xhdXNlX3N0cnVjdC5yZWNpcGllbnRfbm8ubmF0aXZlCiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCA1NiAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGIgZXhlY3V0ZV9jb25kaXRpb25hbF9jbGF1c2VfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLnJlc3BvbnNpdmVfZG9uYXRpb24uY29udHJhY3QuUmVzcG9uc2l2ZURvbmF0aW9uLmV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnQoZXZlbnRfaWQ6IGJ5dGVzKSAtPiBieXRlczoKZXhlY3V0ZV9jbGF1c2VzX2Zvcl9ldmVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjM4My0zODcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBldmVudF9pZDogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTozOTgtMzk5CiAgICAvLyAjIEVuc3VyZSB0aGUgZXZlbnQgZXhpc3RzIGFuZCBpcyByZXNvbHZlZAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIGluIHNlbGYubGlzdGVkX2V2ZW50cywgIkV2ZW50IGRvZXMgbm90IGV4aXN0IgogICAgYnl0ZWNfMiAvLyAiZXZlbnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gRXZlbnQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gZXZlbnRfc3RydWN0ID0gc2VsZi5saXN0ZWRfZXZlbnRzW2V2ZW50X2lkXS5jb3B5KCkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5saXN0ZWRfZXZlbnRzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDAxCiAgICAvLyBhc3NlcnQgbm90IGV2ZW50X3N0cnVjdC5wZW5kaW5nLm5hdGl2ZSwgIkV2ZW50IGhhcyBub3QgYmVlbiByZXNvbHZlZCB5ZXQiCiAgICBpbnRjXzIgLy8gODAKICAgIGdldGJpdAogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBFdmVudCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQgeWV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MDMtNDA0CiAgICAvLyAjIEdldCBhbGwgY2xhdXNlcyBmb3IgdGhpcyBldmVudAogICAgLy8gaWYgZXZlbnRfaWQgbm90IGluIHNlbGYuZXZlbnRfY2xhdXNlczoKICAgIGJ5dGVjIDQgLy8gImV2ZW50X2NsYXVzZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDA1LTQwNgogICAgLy8gIyBObyBjbGF1c2VzIHRvIGV4ZWN1dGUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gY2xhdXNlX2lkcyA9IHNlbGYuZXZlbnRfY2xhdXNlc1tldmVudF9pZF0uY29weSgpCiAgICBmcmFtZV9kaWcgOAogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2NsYXVzZXMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MDkKICAgIC8vIGV4ZWN1dGVkX2NvdW50ID0gYXJjNC5VSW50NjQoMCkKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQxMS00MTIKICAgIC8vICMgRXhlY3V0ZSBlYWNoIHVuZXhlY3V0ZWQgY2xhdXNlCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoY2xhdXNlX2lkcy5sZW5ndGgpOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDYKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDExLTQxMgogICAgLy8gIyBFeGVjdXRlIGVhY2ggdW5leGVjdXRlZCBjbGF1c2UKICAgIC8vIGZvciBpIGluIHVyYW5nZShjbGF1c2VfaWRzLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDYKICAgIDwKICAgIGJ6IGV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfYWZ0ZXJfZm9yQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MTMKICAgIC8vIGNsYXVzZV9pZCA9IGNsYXVzZV9pZHNbaV0KICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MTUKICAgIC8vIGlmIGNsYXVzZV9pZCBpbiBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXM6CiAgICBieXRlY18zIC8vICJjbGF1c2VzIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICBieiBleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gY2xhdXNlX3N0cnVjdCA9IHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlc1tjbGF1c2VfaWRdLmNvcHkoKQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb25kaXRpb25hbF9jbGF1c2VzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDE4LTQxOQogICAgLy8gIyBTa2lwIGlmIGFscmVhZHkgZXhlY3V0ZWQKICAgIC8vIGlmIGNsYXVzZV9zdHJ1Y3QuZXhlY3V0ZWQubmF0aXZlOgogICAgaW50YyA0IC8vIDk2MAogICAgZ2V0Yml0CiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYm56IGV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfZm9yX2Zvb3RlckAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDIyLTQyMwogICAgLy8gIyBEZXRlcm1pbmUgcmVjaXBpZW50IGJhc2VkIG9uIGV2ZW50IHJlc29sdXRpb24KICAgIC8vIGlmIGV2ZW50X3N0cnVjdC5yZXNvbHV0aW9uLm5hdGl2ZToKICAgIGZyYW1lX2RpZyA3CiAgICBpbnRjXzMgLy8gODEKICAgIGdldGJpdAogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ6IGV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gcmVjaXBpZW50ID0gY2xhdXNlX3N0cnVjdC5yZWNpcGllbnRfeWVzLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGV4dHJhY3QgMjQgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCgpleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MjgtNDMzCiAgICAvLyAjIEV4ZWN1dGUgdGhlIHBheW91dAogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIGFtb3VudD1jbGF1c2Vfc3RydWN0LnBheW91dF9hbW91bnQubmF0aXZlLAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2lwaWVudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gYW1vdW50PWNsYXVzZV9zdHJ1Y3QucGF5b3V0X2Ftb3VudC5uYXRpdmUsCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDI4LTQyOQogICAgLy8gIyBFeGVjdXRlIHRoZSBwYXlvdXQKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gZmVlPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQyOC00MzMKICAgIC8vICMgRXhlY3V0ZSB0aGUgcGF5b3V0CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWNsYXVzZV9zdHJ1Y3QucGF5b3V0X2Ftb3VudC5uYXRpdmUsCiAgICAvLyAgICAgcmVjZWl2ZXI9cmVjaXBpZW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQzNS00MzYKICAgIC8vICMgTWFyayB0aGUgY2xhdXNlIGFzIGV4ZWN1dGVkCiAgICAvLyBjbGF1c2Vfc3RydWN0LmV4ZWN1dGVkID0gYXJjNC5Cb29sKFRydWUpCiAgICBpbnRjIDQgLy8gOTYwCiAgICBpbnRjXzEgLy8gMQogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuY29uZGl0aW9uYWxfY2xhdXNlc1tjbGF1c2VfaWRdID0gY2xhdXNlX3N0cnVjdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MzgKICAgIC8vIGV4ZWN1dGVkX2NvdW50ID0gYXJjNC5VSW50NjQoZXhlY3V0ZWRfY291bnQubmF0aXZlICsgMSkKICAgIGZyYW1lX2RpZyAzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfYnVyeSA0CgpleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMTI6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAzCgpleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2Zvcl9mb290ZXJAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0MTEtNDEyCiAgICAvLyAjIEV4ZWN1dGUgZWFjaCB1bmV4ZWN1dGVkIGNsYXVzZQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGNsYXVzZV9pZHMubGVuZ3RoKToKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIGV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfZm9yX2hlYWRlckAzCgpleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDI2CiAgICAvLyByZWNpcGllbnQgPSBjbGF1c2Vfc3RydWN0LnJlY2lwaWVudF9uby5uYXRpdmUKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDU2IDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYiBleGVjdXRlX2NsYXVzZXNfZm9yX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMTAKCmV4ZWN1dGVfY2xhdXNlc19mb3JfZXZlbnRfYWZ0ZXJfZm9yQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDQwCiAgICAvLyByZXR1cm4gZXhlY3V0ZWRfY291bnQKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNwb25zaXZlX2RvbmF0aW9uLmNvbnRyYWN0LlJlc3BvbnNpdmVEb25hdGlvbi5nZXRfZXZlbnRfaW5mbyhldmVudF9pZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfZXZlbnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQ0Mi00NDYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfZXZlbnRfaW5mbygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGV2ZW50X2lkOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBFdmVudFN0cnVjdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDU2CiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgaW4gc2VsZi5saXN0ZWRfZXZlbnRzLCAiRXZlbnQgZG9lcyBub3QgZXhpc3QiCiAgICBieXRlY18yIC8vICJldmVudHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBFdmVudCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDU3CiAgICAvLyByZXR1cm4gc2VsZi5saXN0ZWRfZXZlbnRzW2V2ZW50X2lkXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGlzdGVkX2V2ZW50cyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yZXNwb25zaXZlX2RvbmF0aW9uLmNvbnRyYWN0LlJlc3BvbnNpdmVEb25hdGlvbi5nZXRfY2xhdXNlX2luZm8oY2xhdXNlX2lkOiBieXRlcykgLT4gYnl0ZXM6CmdldF9jbGF1c2VfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQ1OS00NjMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY2xhdXNlX2luZm8oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBjbGF1c2VfaWQ6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IENvbmRpdGlvbmFsQ2xhdXNlU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo0NzMKICAgIC8vIGFzc2VydCBjbGF1c2VfaWQgaW4gc2VsZi5jb25kaXRpb25hbF9jbGF1c2VzLCAiQ2xhdXNlIGRvZXMgbm90IGV4aXN0IgogICAgYnl0ZWNfMyAvLyAiY2xhdXNlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENsYXVzZSBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NDc0CiAgICAvLyByZXR1cm4gc2VsZi5jb25kaXRpb25hbF9jbGF1c2VzW2NsYXVzZV9pZF0KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbmRpdGlvbmFsX2NsYXVzZXMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucmVzcG9uc2l2ZV9kb25hdGlvbi5jb250cmFjdC5SZXNwb25zaXZlRG9uYXRpb24uZ2V0X2NsYXVzZXNfZm9yX2V2ZW50KGV2ZW50X2lkOiBieXRlcykgLT4gYnl0ZXM6CmdldF9jbGF1c2VzX2Zvcl9ldmVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXNwb25zaXZlX2RvbmF0aW9uL2NvbnRyYWN0LnB5OjQ5NC00OTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY2xhdXNlc19mb3JfZXZlbnQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBldmVudF9pZDogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo1MDktNTEwCiAgICAvLyAjIFJldHVybiBpbmRleGVkIGNsYXVzZXMgZm9yIHRoaXMgZXZlbnQKICAgIC8vIGlmIGV2ZW50X2lkIGluIHNlbGYuZXZlbnRfY2xhdXNlczoKICAgIGJ5dGVjIDQgLy8gImV2ZW50X2NsYXVzZXMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9jbGF1c2VzX2Zvcl9ldmVudF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jlc3BvbnNpdmVfZG9uYXRpb24vY29udHJhY3QucHk6NTExCiAgICAvLyByZXR1cm4gc2VsZi5ldmVudF9jbGF1c2VzW2V2ZW50X2lkXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jbGF1c2VzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfY2xhdXNlc19mb3JfZXZlbnRfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmVzcG9uc2l2ZV9kb25hdGlvbi9jb250cmFjdC5weTo1MTMtNTE0CiAgICAvLyAjIE5vIGNsYXVzZXMgZm9yIHRoaXMgZXZlbnQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgc3dhcAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { "approval": "CiAFAAFQUcAHJgcBAAQVH3x1BmV2ZW50cwdjbGF1c2VzDWV2ZW50X2NsYXVzZXMCAAEIAAAAAAAAAAAxG0EBa4ILBJY+ku8EhI2+UgQSBtj9BKb+00QELbaZRgS1oWfKBBU6UlwEuE4V1gR2Xg8/BMid2QIELB1tFzYaAI4LAQEA3wC8AJMAeABgAE0AOgAnABUAAiJDMRkURDEYRDYaAYgETSlMULAjQzEZFEQxGESABhUffHUAALAjQzEZFEQxGEQ2GgGIBBkpTFCwI0MxGRREMRhENhoBiAP3KUxQsCNDMRkURDEYRDYaAYgDDilMULAjQzEZFEQxGEQ2GgGIAokoIk8CVClMULAjQzEZFEQxGEQ2GgE2GgKIAjooIk8CVClMULAjQzEZFEQxGEQ2GgE2GgI2GgM2GgQ2GgUxFiMJSTgQIxJEiAFLKUxQsCNDMRkURDEYRDYaATYaAjYaAzEWIwlJOBAjEkSIAJspTFCwI0MxGRREMRhENhoBMRYjCUk4ECMSRIgATygiTwJUKUxQsCNDMRkURDEYRDYaATYaAogAESlMULAjQzEZQP7kMRgURCNDigIBMgcWSYACACtQgAGAUCUiVIv/UIv+UCpLAlBJvEhMv4mKAgGL/zgHMgoSRIv/OAAxABJEi/84CElESYHoBw9EsYv+sgeyCCOyECKyAbMjiYoEASqL/FBJvUUBRL5EJFMoIk8CVCJTRIv/OAcyChJEi/84ADEAEkSL/zgISUQxAAEyB0xRAAgXCBZJTwIWMQBLAov8UE8CUIv9UIv+UExQKFArTwJQTL8nBIv8UEm9RQFBAByLAUm+RFcCAIsAUEkVgQgKFlcGAkxQSwG8SL+JJwWLAFCLAUm8SEy/iYoGASJJi/84BzIKEkSL/zgAMQASRIv/OAhJRIv7F0lOAkoJFklOAxdJREsBCE8CEkRBABCxi/qyB4sCsggjshAisgGzKov8UEm9RQFEvkQkUygiTwJUIlNEMQABMgdMUQAIFwgjCBZJjAExAEsBi/xQiwNQi/1Qi/5QTFAoUCtPAlBMvycEi/xQSYwAvUUBQQAgiwBJvkRXAgCLAVBJFYEIChZXBgJMUEsBvEi/iwGMAIknBYsBUIsASbxITL9C/+yKAgEqi/5QSb1FAURJvkRJJFMoIk8CVCJTRDEASwFXCyASRCQiVIv/IlMlTFRLAbxIvyOJigEBK4v/UEcCvUUBRL5MSU8CREkhBFMoIk8CVCJTFERXCAgqTFBJvUUBRL5ESSRTKCJPAlQiUxREJVMoIk8CVCJTQQAliwFXGCCxiwFJgRBbTwKyB7III7IQIrIBsyEEI1SLAEy/I4wAiYsBVzggQv/YigEBIkcEgABJKov/UEm9RQFEvkxJTwJEJFMoIk8CVCJTFEQnBIv/UEm9RQFAAAUnBowAiYsIvkxJTgKMAUQnBowDIlmMBiKMBYsFiwYMQQCAiwFXAgCLBYEIC4EIWCtMUEmMAL1FAYsDjARBAE6LAL5MSU4CjAJEIQRTKCJPAlQiU0AAO4sHJVMoIk8CVCJTQQA2iwJXGCCxiwJJgRBbTwKyB7III7IQIrIBsyEEI1SLAEy/iwMXIwgWjASLBIwDiwUjCIwFQv+AiwJXOCBC/8eLA4wAiYoBASqL/1BJvUUBRL5EiYoBASuL/1BJvUUBRL5EiYoBAScEi/9QSb1FAUEABosAvkRMiYACAABMiQ==", "clear": "CoEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 4, "minor": 10, "patch": 0 } }, "events": [], "templateVariables": {} }