{ "name": "Rain", "structs": { "RainRec": [ { "name": "creator", "type": "address" }, { "name": "gate_creator", "type": "address" }, { "name": "label", "type": "byte[32]" }, { "name": "prize_asset", "type": "uint64" }, { "name": "drip", "type": "uint64" }, { "name": "interval_rounds", "type": "uint64" }, { "name": "last_rain_round", "type": "uint64" }, { "name": "pot", "type": "uint64" }, { "name": "tickets", "type": "uint64" }, { "name": "draw_id", "type": "uint64" }, { "name": "cumulative", "type": "uint64" }, { "name": "mode", "type": "uint64" }, { "name": "wave_cap", "type": "uint64" }, { "name": "wave_count", "type": "uint64" }, { "name": "last_share", "type": "uint64" }, { "name": "last_wave_id", "type": "uint64" }, { "name": "wave_unclaimed", "type": "uint64" }, { "name": "commit_round", "type": "uint64" }, { "name": "prize_locked", "type": "uint64" } ] }, "methods": [ { "name": "bootstrap", "args": [ { "type": "pay", "name": "mbr_payment" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Fund the app account's own floor. Creator only, once.", "events": [], "recommendations": {} }, { "name": "opt_in_prize_asset", "args": [ { "type": "uint64", "name": "prize" }, { "type": "pay", "name": "mbr_payment" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Let the hub hold an asset so rains can pay in it. Anyone, once per asset.", "events": [], "recommendations": {} }, { "name": "create_rain", "args": [ { "type": "pay", "name": "mbr_payment" }, { "type": "byte[32]", "name": "label" }, { "type": "address", "name": "gate_creator" }, { "type": "uint64", "name": "prize_asset" }, { "type": "uint64", "name": "drip" }, { "type": "uint64", "name": "interval_rounds" }, { "type": "uint64", "name": "mode" }, { "type": "uint64", "name": "wave_cap" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Open a rain. Returns its id. Anyone, after bootstrap.\n`gate_creator` zero leaves entry open. Set to a collection's minting account, only holders of something it created may enter.\n`prize_asset` zero keeps the pot in ALGO. Set, the hub must already be opted into that asset.\n`mode` is SPLIT (0), ONE (1), or WAVE (2). WAVE needs `wave_cap` > 0; the others need it 0.", "events": [], "recommendations": {} }, { "name": "set_rain", "args": [ { "type": "uint64", "name": "rain_id" }, { "type": "uint64", "name": "drip" }, { "type": "uint64", "name": "interval_rounds" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Tune the slice and the interval. The rain's creator, after it exists.", "events": [], "recommendations": {} }, { "name": "enter", "args": [ { "type": "pay", "name": "mbr_payment" }, { "type": "uint64", "name": "rain_id" }, { "type": "uint64", "name": "gate_asset" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Take a ticket on one rain. One per account per rain.\nSPLIT/ONE: you are in every future drop. WAVE: you also check in for the open drop if there is still a seat. A ONE rain with a draw open refuses entry until `resolve` or `abandon`: the committed round's seed is public, and a ticket taken against it could aim the winner.", "events": [], "recommendations": {} }, { "name": "gm", "args": [ { "type": "uint64", "name": "rain_id" }, { "type": "uint64", "name": "gate_asset" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Check in for this WAVE drop. First `wave_cap` people this interval.\nAlso settles any unclaimed share from the last drop you were in. Returns the open wave id, or 0 if you were already in or it is full.", "events": [], "recommendations": {} }, { "name": "deposit", "args": [ { "type": "pay", "name": "payment" }, { "type": "uint64", "name": "rain_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add ALGO to a rain's pot. Anyone, any amount. Returns the new pot.", "events": [], "recommendations": {} }, { "name": "deposit_asset", "args": [ { "type": "axfer", "name": "transfer" }, { "type": "uint64", "name": "rain_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add the prize asset to a rain's pot. Anyone, any amount.", "events": [], "recommendations": {} }, { "name": "draw", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Rain on up to DRAW_SCAN due rains. Zero arguments.\nA no-op returning 0 when the hub is empty or nothing is due. A scheduled call that fails would trip keeper backoff; a quiet week must be uneventful. Fires every due rain it opens, not just the first.", "events": [ { "name": "Rained", "args": [ { "type": "uint64", "name": "rain_id" }, { "type": "uint64", "name": "draw_id" }, { "type": "uint64", "name": "mode" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "share" }, { "type": "uint64", "name": "count" } ], "desc": "Emitted when a rain actually falls (or a lottery locks)." } ], "recommendations": {} }, { "name": "resolve", "args": [ { "type": "uint64", "name": "rain_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Pick the ONE winner from the committed round's block seed.\nAnyone, once the committed round has passed and while its seed is still readable. Credits that ticket. Returns the winning index.", "events": [], "recommendations": {} }, { "name": "abandon", "args": [ { "type": "uint64", "name": "rain_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Return a ONE lock to the pot after the seed window. Anyone.", "events": [], "recommendations": {} }, { "name": "claim", "args": [ { "type": "uint64", "name": "rain_id" }, { "type": "uint64", "name": "gate_asset" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Pull the rain credited to you on this rain.\nOn a gated rain you must still hold a collection token. WAVE also settles the last drop you checked in for. Returns 0 when there is nothing to collect, rather than failing.", "events": [], "recommendations": {} }, { "name": "allocation_of", "args": [ { "type": "uint64", "name": "rain_id" }, { "type": "address", "name": "who" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "What `who` can claim on this rain right now.", "events": [], "recommendations": {} }, { "name": "rain_of", "args": [ { "type": "uint64", "name": "rain_id" } ], "returns": { "type": "(address,address,byte[32],uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "RainRec" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "The rain box, for clients that would rather not decode it.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Anyone creates a rain. Arcron fires the ones that are due.", "networks": {}, "state": { "schema": { "global": { "ints": 3, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "next_rain_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmV4dF9yYWluX2lk" }, "cursor": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y3Vyc29y" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdHN0cmFwcGVk" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 245 ], "errorMessage": "Already bootstrapped" }, { "pc": [ 904 ], "errorMessage": "Already entered" }, { "pc": [ 326 ], "errorMessage": "Already opted in" }, { "pc": [ 1864, 2102 ], "errorMessage": "Amount must be positive" }, { "pc": [ 1842, 2074 ], "errorMessage": "Deposit must go to the app account" }, { "pc": [ 1858 ], "errorMessage": "Deposit must not close" }, { "pc": [ 2090 ], "errorMessage": "Deposit must not close the asset" }, { "pc": [ 1850, 2082 ], "errorMessage": "Deposit must not rekey" }, { "pc": [ 949 ], "errorMessage": "Draw open; enter after resolve or abandon" }, { "pc": [ 457, 648 ], "errorMessage": "Drip must be positive" }, { "pc": [ 4896, 4904 ], "errorMessage": "Hold a token from the collection" }, { "pc": [ 492 ], "errorMessage": "Hub is not opted into the prize asset" }, { "pc": [ 468, 660 ], "errorMessage": "Interval above maximum" }, { "pc": [ 463, 654 ], "errorMessage": "Interval below minimum" }, { "pc": [ 4945 ], "errorMessage": "MBR payment must come from the caller" }, { "pc": [ 4937 ], "errorMessage": "MBR payment must fund the app account" }, { "pc": [ 4961 ], "errorMessage": "MBR payment must not close" }, { "pc": [ 4953 ], "errorMessage": "MBR payment must not rekey" }, { "pc": [ 4969 ], "errorMessage": "MBR payment too small" }, { "pc": [ 3509 ], "errorMessage": "Missing ticket" }, { "pc": [ 3495 ], "errorMessage": "Missing ticket index" }, { "pc": [ 3438, 3717 ], "errorMessage": "No draw is open" }, { "pc": [ 633, 844, 1205, 1820, 2052, 3416, 3695, 4618 ], "errorMessage": "No such rain" }, { "pc": [ 3431, 3710 ], "errorMessage": "Not a ONE rain" }, { "pc": [ 1214 ], "errorMessage": "Not a WAVE rain" }, { "pc": [ 282, 454 ], "errorMessage": "Not bootstrapped" }, { "pc": [ 239 ], "errorMessage": "Only the creator can bootstrap" }, { "pc": [ 645 ], "errorMessage": "Only the rain's creator can tune it" }, { "pc": [ 4394 ], "errorMessage": "Opt in to the prize asset first" }, { "pc": [ 291 ], "errorMessage": "Prize asset has a clawback address" }, { "pc": [ 300 ], "errorMessage": "Prize asset has a freeze address" }, { "pc": [ 309 ], "errorMessage": "Prize asset has a manager address" }, { "pc": [ 316 ], "errorMessage": "Prize asset is frozen by default" }, { "pc": [ 4913 ], "errorMessage": "That asset is not from the collection" }, { "pc": [ 4922 ], "errorMessage": "The prize is not a ticket" }, { "pc": [ 2066 ], "errorMessage": "This rain pays ALGO; use deposit" }, { "pc": [ 1834 ], "errorMessage": "This rain pays an asset; use deposit_asset" }, { "pc": [ 3451 ], "errorMessage": "Too early" }, { "pc": [ 472 ], "errorMessage": "Unknown mode" }, { "pc": [ 590 ], "errorMessage": "Wave cap is for WAVE rains" }, { "pc": [ 478 ], "errorMessage": "Wave cap must be positive" }, { "pc": [ 3461 ], "errorMessage": "Window closed; abandon" }, { "pc": [ 3731 ], "errorMessage": "Window still open" }, { "pc": [ 2096 ], "errorMessage": "Wrong asset" }, { "pc": [ 4903 ], "errorMessage": "account opted into asset" }, { "pc": [ 287, 296, 305, 314, 4909 ], "errorMessage": "asset exists" }, { "pc": [ 1246, 2350, 3930, 3961, 4501, 4525 ], "errorMessage": "check Box exists" }, { "pc": [ 243, 279, 451 ], "errorMessage": "check self.bootstrapped exists" }, { "pc": [ 2293 ], "errorMessage": "check self.cursor exists" }, { "pc": [ 506, 2276 ], "errorMessage": "check self.next_rain_id exists" }, { "pc": [ 376, 385, 4471 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 263, 396, 408, 420, 432, 444, 601, 610, 620, 818, 827, 1181, 1190, 1810, 2042, 3405, 3685, 3891, 3900, 4459, 4608 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 2034 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 233, 275, 365, 810, 1802 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAyIDE2MCAxMjggMTkyIDE1MiAxMzYgMjE2IDE3NiAxNDQgMTg0IDEwMDAwMCAxMDAwMDAwMDAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHg3MiAiYm9vdHN0cmFwcGVkIiAweDc0ICJuZXh0X3JhaW5faWQiICJjdXJzb3IiIDB4MjljZjNmNDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gc2VsZi5uZXh0X3JhaW5faWQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA0IC8vICJuZXh0X3JhaW5faWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5jdXJzb3IgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA1IC8vICJjdXJzb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjEzMAogICAgLy8gc2VsZi5ib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18yIC8vICJib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTI0CiAgICAvLyBjbGFzcyBSYWluKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMwogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTRlOGQxNjQgMHhkNzZhZTNmMSAweDU2N2UwYjVlIDB4ZWI5ZDNkMTEgMHg0ZDEwMDIwZCAweDc2N2IxZmVmIDB4OGNhYjA3M2UgMHgxZjVjNTI4NSAweDUwNmU1ZGQwIDB4N2JjYjVlYmMgMHg4MGIxOWY5YyAweDYwNzQzZjUwIDB4NDExZGQ0ZDQgMHhiZmJlZWRlMiAvLyBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAib3B0X2luX3ByaXplX2Fzc2V0KHVpbnQ2NCxwYXkpdWludDY0IiwgbWV0aG9kICJjcmVhdGVfcmFpbihwYXksYnl0ZVszMl0sYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X3JhaW4odWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZW50ZXIocGF5LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJnbSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZGVwb3NpdChwYXksdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZGVwb3NpdF9hc3NldChheGZlcix1aW50NjQpdWludDY0IiwgbWV0aG9kICJkcmF3KCl1aW50NjQiLCBtZXRob2QgInJlc29sdmUodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYWJhbmRvbih1aW50NjQpdWludDY0IiwgbWV0aG9kICJjbGFpbSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYWxsb2NhdGlvbl9vZih1aW50NjQsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJhaW5fb2YodWludDY0KShhZGRyZXNzLGFkZHJlc3MsYnl0ZVszMl0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGJvb3RzdHJhcCBvcHRfaW5fcHJpemVfYXNzZXQgY3JlYXRlX3JhaW4gc2V0X3JhaW4gZW50ZXIgZ20gZGVwb3NpdCBkZXBvc2l0X2Fzc2V0IGRyYXcgcmVzb2x2ZSBhYmFuZG9uIGNsYWltIGFsbG9jYXRpb25fb2YgcmFpbl9vZgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIzOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmJvb3RzdHJhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgdGhlIGNyZWF0b3IgY2FuIGJvb3RzdHJhcCIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBjcmVhdG9yIGNhbiBib290c3RyYXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IHNlbGYuYm9vdHN0cmFwcGVkLnZhbHVlID09IDAsICJBbHJlYWR5IGJvb3RzdHJhcHBlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJib290c3RyYXBwZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm9vdHN0cmFwcGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxMzcKICAgIC8vIHNlbGYuX3JlcXVpcmVfbWJyKG1icl9wYXltZW50LCBVSW50NjQoQVBQX0JBU0VfTUJSKSkKICAgIGludGMgMTMgLy8gMTAwMDAwCiAgICBjYWxsc3ViIF9yZXF1aXJlX21icgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTM4CiAgICAvLyBzZWxmLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVJbnQ2NCgxKQogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4ub3B0X2luX3ByaXplX2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX3ByaXplX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTQwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGR1cAogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLmJvb3RzdHJhcHBlZC52YWx1ZSA9PSAxLCAiTm90IGJvb3RzdHJhcHBlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJib290c3RyYXBwZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm9vdHN0cmFwcGVkIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTQ0CiAgICAvLyBhc3NlcnQgcHJpemUuY2xhd2JhY2sgPT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIlByaXplIGFzc2V0IGhhcyBhIGNsYXdiYWNrIGFkZHJlc3MiCiAgICBkaWcgMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUHJpemUgYXNzZXQgaGFzIGEgY2xhd2JhY2sgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTQ1CiAgICAvLyBhc3NlcnQgcHJpemUuZnJlZXplID09IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJQcml6ZSBhc3NldCBoYXMgYSBmcmVlemUgYWRkcmVzcyIKICAgIGRpZyAxCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUHJpemUgYXNzZXQgaGFzIGEgZnJlZXplIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gYXNzZXJ0IHByaXplLm1hbmFnZXIgPT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIlByaXplIGFzc2V0IGhhcyBhIG1hbmFnZXIgYWRkcmVzcyIKICAgIGRpZyAxCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWFuYWdlcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFByaXplIGFzc2V0IGhhcyBhIG1hbmFnZXIgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHByaXplLmRlZmF1bHRfZnJvemVuLCAiUHJpemUgYXNzZXQgaXMgZnJvemVuIGJ5IGRlZmF1bHQiCiAgICBkaWcgMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBQcml6ZSBhc3NldCBpcyBmcm96ZW4gYnkgZGVmYXVsdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgbm90IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuaXNfb3B0ZWRfaW4ocHJpemUpLCAiQWxyZWFkeSBvcHRlZCBpbiIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IG9wdGVkIGluCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxNDkKICAgIC8vIHNlbGYuX3JlcXVpcmVfbWJyKG1icl9wYXltZW50LCBVSW50NjQoQVNTRVRfT1BUX0lOX01CUikpCiAgICBpbnRjIDEzIC8vIDEwMDAwMAogICAgY2FsbHN1YiBfcmVxdWlyZV9tYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE1MC0xNTUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXByaXplLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxNTAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTU0CiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTUwLTE1NQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9cHJpemUsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxNDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uY3JlYXRlX3JhaW5bcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVfcmFpbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTgxCiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gMSwgIk5vdCBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gYXNzZXJ0IGRyaXAgPiAwLCAiRHJpcCBtdXN0IGJlIHBvc2l0aXZlIgogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gRHJpcCBtdXN0IGJlIHBvc2l0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxODMKICAgIC8vIGFzc2VydCBpbnRlcnZhbF9yb3VuZHMgPj0gTUlOX0lOVEVSVkFMX1JPVU5EUywgIkludGVydmFsIGJlbG93IG1pbmltdW0iCiAgICBkaWcgMQogICAgcHVzaGludCAxMAogICAgPj0KICAgIGFzc2VydCAvLyBJbnRlcnZhbCBiZWxvdyBtaW5pbXVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxODQKICAgIC8vIGFzc2VydCBpbnRlcnZhbF9yb3VuZHMgPD0gTUFYX0lOVEVSVkFMX1JPVU5EUywgIkludGVydmFsIGFib3ZlIG1heGltdW0iCiAgICBzd2FwCiAgICBpbnRjIDE0IC8vIDEwMDAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSW50ZXJ2YWwgYWJvdmUgbWF4aW11bQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTg1CiAgICAvLyBhc3NlcnQgbW9kZSA8PSBXQVZFLCAiVW5rbm93biBtb2RlIgogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgPD0KICAgIGFzc2VydCAvLyBVbmtub3duIG1vZGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gaWYgbW9kZSA9PSBXQVZFOgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBjcmVhdGVfcmFpbl9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTg3CiAgICAvLyBhc3NlcnQgd2F2ZV9jYXAgPiAwLCAiV2F2ZSBjYXAgbXVzdCBiZSBwb3NpdGl2ZSIKICAgIGFzc2VydCAvLyBXYXZlIGNhcCBtdXN0IGJlIHBvc2l0aXZlCgpjcmVhdGVfcmFpbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxOTAKICAgIC8vIGlmIHByaXplX2Fzc2V0ID4gMDoKICAgIGRpZyA4CiAgICBieiBjcmVhdGVfcmFpbl9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gYXNzZXJ0IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTkxLTE5MwogICAgLy8gYXNzZXJ0IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQocHJpemVfYXNzZXQpCiAgICAvLyApLCAiSHViIGlzIG5vdCBvcHRlZCBpbnRvIHRoZSBwcml6ZSBhc3NldCIKICAgIGRpZyA5CiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEh1YiBpcyBub3Qgb3B0ZWQgaW50byB0aGUgcHJpemUgYXNzZXQKCmNyZWF0ZV9yYWluX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gc2VsZi5fcmVxdWlyZV9tYnIobWJyX3BheW1lbnQsIFVJbnQ2NChSQUlOX0JPWF9NQlIpKQogICAgdW5jb3ZlciA2CiAgICBwdXNoaW50IDk1NzAwCiAgICBjYWxsc3ViIF9yZXF1aXJlX21icgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTk2CiAgICAvLyByYWluX2lkID0gc2VsZi5uZXh0X3JhaW5faWQudmFsdWUgKyAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibmV4dF9yYWluX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5leHRfcmFpbl9pZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxOTcKICAgIC8vIGJveCA9IEJveChSYWluUmVjLCBrZXk9b3AuY29uY2F0KFJBSU5fUFJFRklYLCBvcC5pdG9iKHJhaW5faWQpKSkKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDcyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToxOTkKICAgIC8vIGNyZWF0b3I9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjA1CiAgICAvLyBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjA2CiAgICAvLyBwb3Q9YXJjNC5VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MTk4LTIxOAogICAgLy8gYm94LnZhbHVlID0gUmFpblJlYygKICAgIC8vICAgICBjcmVhdG9yPWFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICBnYXRlX2NyZWF0b3I9Z2F0ZV9jcmVhdG9yLAogICAgLy8gICAgIGxhYmVsPWxhYmVsLmNvcHkoKSwKICAgIC8vICAgICBwcml6ZV9hc3NldD1hcmM0LlVJbnQ2NChwcml6ZV9hc3NldCksCiAgICAvLyAgICAgZHJpcD1hcmM0LlVJbnQ2NChkcmlwKSwKICAgIC8vICAgICBpbnRlcnZhbF9yb3VuZHM9YXJjNC5VSW50NjQoaW50ZXJ2YWxfcm91bmRzKSwKICAgIC8vICAgICBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgdGlja2V0cz1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGN1bXVsYXRpdmU9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgbW9kZT1hcmM0LlVJbnQ2NChtb2RlKSwKICAgIC8vICAgICB3YXZlX2NhcD1hcmM0LlVJbnQ2NCh3YXZlX2NhcCksCiAgICAvLyAgICAgd2F2ZV9jb3VudD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYXN0X3NoYXJlPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhc3Rfd2F2ZV9pZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBjb21taXRfcm91bmQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgcHJpemVfbG9ja2VkPWFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm5leHRfcmFpbl9pZC52YWx1ZSA9IHJhaW5faWQKICAgIGJ5dGVjIDQgLy8gIm5leHRfcmFpbl9pZCIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjcmVhdGVfcmFpbl9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gYXNzZXJ0IHdhdmVfY2FwID09IDAsICJXYXZlIGNhcCBpcyBmb3IgV0FWRSByYWlucyIKICAgICEKICAgIGFzc2VydCAvLyBXYXZlIGNhcCBpcyBmb3IgV0FWRSByYWlucwogICAgYiBjcmVhdGVfcmFpbl9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLnNldF9yYWluW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X3JhaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgZHVwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYm94ID0gQm94KFJhaW5SZWMsIGtleT1vcC5jb25jYXQoUkFJTl9QUkVGSVgsIG9wLml0b2IocmFpbl9pZCkpKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjI2CiAgICAvLyBhc3NlcnQgYm94LCAiTm8gc3VjaCByYWluIgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBObyBzdWNoIHJhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjIyNwogICAgLy8gcmVjID0gYm94LnZhbHVlLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IHJlYy5jcmVhdG9yLm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAiT25seSB0aGUgcmFpbidzIGNyZWF0b3IgY2FuIHR1bmUgaXQiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIHJhaW4ncyBjcmVhdG9yIGNhbiB0dW5lIGl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyMjkKICAgIC8vIGFzc2VydCBkcmlwID4gMCwgIkRyaXAgbXVzdCBiZSBwb3NpdGl2ZSIKICAgIHVuY292ZXIgNQogICAgYXNzZXJ0IC8vIERyaXAgbXVzdCBiZSBwb3NpdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjMwCiAgICAvLyBhc3NlcnQgaW50ZXJ2YWxfcm91bmRzID49IE1JTl9JTlRFUlZBTF9ST1VORFMsICJJbnRlcnZhbCBiZWxvdyBtaW5pbXVtIgogICAgZGlnIDMKICAgIHB1c2hpbnQgMTAKICAgID49CiAgICBhc3NlcnQgLy8gSW50ZXJ2YWwgYmVsb3cgbWluaW11bQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjMxCiAgICAvLyBhc3NlcnQgaW50ZXJ2YWxfcm91bmRzIDw9IE1BWF9JTlRFUlZBTF9ST1VORFMsICJJbnRlcnZhbCBhYm92ZSBtYXhpbXVtIgogICAgdW5jb3ZlciAzCiAgICBpbnRjIDE0IC8vIDEwMDAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gSW50ZXJ2YWwgYWJvdmUgbWF4aW11bQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjMyLTIzNgogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIGRyaXA9YXJjNC5VSW50NjQoZHJpcCksCiAgICAvLyAgICAgaW50ZXJ2YWxfcm91bmRzPWFyYzQuVUludDY0KGludGVydmFsX3JvdW5kcyksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyMzUKICAgIC8vIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICBkaWcgMgogICAgZXh0cmFjdCA2NCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjMyLTIzNgogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIGRyaXA9YXJjNC5VSW50NjQoZHJpcCksCiAgICAvLyAgICAgaW50ZXJ2YWxfcm91bmRzPWFyYzQuVUludDY0KGludGVydmFsX3JvdW5kcyksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyAzCiAgICBleHRyYWN0IDk2IDgKICAgIGRpZyA0CiAgICBleHRyYWN0IDEyMCA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAxMjggOAogICAgZGlnIDYKICAgIGV4dHJhY3QgMTM2IDgKICAgIGRpZyA3CiAgICBleHRyYWN0IDE0NCA4CiAgICBkaWcgOAogICAgZXh0cmFjdCAxNTIgOAogICAgZGlnIDkKICAgIGV4dHJhY3QgMTYwIDgKICAgIGRpZyAxMAogICAgZXh0cmFjdCAxNjggOAogICAgZGlnIDExCiAgICBleHRyYWN0IDE3NiA4CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgMTg0IDgKICAgIGRpZyAxMwogICAgZXh0cmFjdCAxOTIgOAogICAgZGlnIDE0CiAgICBleHRyYWN0IDIwMCA4CiAgICBkaWcgMTUKICAgIGV4dHJhY3QgMjA4IDgKICAgIHVuY292ZXIgMTYKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTYKICAgIHVuY292ZXIgMTYKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTYKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uZW50ZXJbcm91dGluZ10oKSAtPiB2b2lkOgplbnRlcjoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjQ3CiAgICAvLyBib3ggPSBCb3goUmFpblJlYywga2V5PW9wLmNvbmNhdChSQUlOX1BSRUZJWCwgb3AuaXRvYihyYWluX2lkKSkpCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ5dGVjXzEgLy8gMHg3MgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYXNzZXJ0IGJveCwgIk5vIHN1Y2ggcmFpbiIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm8gc3VjaCByYWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyNDkKICAgIC8vIHJlYyA9IGJveC52YWx1ZS5jb3B5KCkKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjUwCiAgICAvLyBzZWxmLl9yZXF1aXJlX2dhdGUocmVjLCBnYXRlX2Fzc2V0KQogICAgc3dhcAogICAgY2FsbHN1YiBfcmVxdWlyZV9nYXRlCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gbmVlZGVkID0gVUludDY0KFRJQ0tFVF9NQlIpCiAgICBwdXNoaW50IDI4NTAwCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyNTMKICAgIC8vIGlmIHJlYy5tb2RlLm5hdGl2ZSA9PSBPTkU6CiAgICBkdXAKICAgIGV4dHJhY3QgMTYwIDgKICAgIGNvdmVyIDQKICAgIGludGMgNCAvLyAxNjAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgZHVwCiAgICBieiBlbnRlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gbmVlZGVkID0gVUludDY0KFRJQ0tFVF9NQlIgKyBJTkRFWF9NQlIpCiAgICBwdXNoaW50IDUwNjAwCiAgICBidXJ5IDgKCmVudGVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gc2VsZi5fcmVxdWlyZV9tYnIobWJyX3BheW1lbnQsIG5lZWRlZCkKICAgIHVuY292ZXIgNAogICAgZGlnIDcKICAgIGNhbGxzdWIgX3JlcXVpcmVfbWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NzYKICAgIC8vIHJldHVybiBvcC5jb25jYXQoVElDS0VUX1BSRUZJWCwgb3AuY29uY2F0KG9wLml0b2IocmFpbl9pZCksIHdoby5ieXRlcykpCiAgICBkaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjU3CiAgICAvLyB0aWNrZXQgPSBCb3goVGlja2V0LCBrZXk9c2VsZi5fdGlja2V0X2tleShyYWluX2lkLCBUeG4uc2VuZGVyKSkKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY3NgogICAgLy8gcmV0dXJuIG9wLmNvbmNhdChUSUNLRVRfUFJFRklYLCBvcC5jb25jYXQob3AuaXRvYihyYWluX2lkKSwgd2hvLmJ5dGVzKSkKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDc0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjU4CiAgICAvLyBhc3NlcnQgbm90IHRpY2tldCwgIkFscmVhZHkgZW50ZXJlZCIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgZW50ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjYwCiAgICAvLyBjcmVkaXQ6IFVJbnQ2NCA9IHJlYy5jdW11bGF0aXZlLm5hdGl2ZSBpZiByZWMubW9kZS5uYXRpdmUgPT0gU1BMSVQgZWxzZSBVSW50NjQoMCkKICAgIGRpZyAzCiAgICBibnogZW50ZXJfdGVybmFyeV9mYWxzZUA1CiAgICBkaWcgMgogICAgaW50YyA3IC8vIDE1MgogICAgZXh0cmFjdF91aW50NjQKCmVudGVyX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gd2F2ZV9pZCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gdGlja2V0czogVUludDY0ID0gcmVjLnRpY2tldHMubmF0aXZlICsgMQogICAgZGlnIDMKICAgIGR1cAogICAgaW50YyA4IC8vIDEzNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGNvdmVyIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gd2F2ZV9jb3VudDogVUludDY0ID0gcmVjLndhdmVfY291bnQubmF0aXZlCiAgICBpbnRjIDEwIC8vIDE3NgogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gaWYgcmVjLm1vZGUubmF0aXZlID09IE9ORToKICAgIHN3YXAKICAgIGJ6IGVudGVyX2Vsc2VfYm9keUA4CiAgICB1bmNvdmVyIDMKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjY2LTI3MAogICAgLy8gIyBgcmVzb2x2ZWAgZHJhd3Mgb3ZlciB0aGUgbGl2ZSBjb3VudCwgYW5kIGFuIG9wZW4gZHJhdydzIHNlZWQgaXMKICAgIC8vICMgcHVibGljIG9uY2UgYGNvbW1pdF9yb3VuZGAgcGFzc2VzLiBBIHRpY2tldCB0YWtlbiB3aGlsZSB0aGUKICAgIC8vICMgcHJpemUgaXMgbG9ja2VkIGNvdWxkIGJlIG9uZSBvZiBhIGJhdGNoIHNpemVkIHRvIGNhdGNoIGl0LCBzbwogICAgLy8gIyB0aGUgY291bnQgZnJlZXplcyBhdCBmaXJlIGFuZCByZW9wZW5zIGF0IHJlc29sdmUgb3IgYWJhbmRvbi4KICAgIC8vIGFzc2VydCByZWMucHJpemVfbG9ja2VkLm5hdGl2ZSA9PSAwLCAiRHJhdyBvcGVuOyBlbnRlciBhZnRlciByZXNvbHZlIG9yIGFiYW5kb24iCiAgICBkaWcgMgogICAgaW50YyA5IC8vIDIxNgogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydCAvLyBEcmF3IG9wZW47IGVudGVyIGFmdGVyIHJlc29sdmUgb3IgYWJhbmRvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjczCiAgICAvLyBrZXk9b3AuY29uY2F0KElOREVYX1BSRUZJWCwgb3AuY29uY2F0KG9wLml0b2IocmFpbl9pZCksIG9wLml0b2IocmVjLnRpY2tldHMubmF0aXZlKSkpLAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICB1bmNvdmVyIDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NmUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjc1CiAgICAvLyBpbmRleC52YWx1ZSA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgYm94X3B1dAoKZW50ZXJfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gY3JlZGl0PWFyYzQuVUludDY0KGNyZWRpdCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyODMKICAgIC8vIHdhdmVfaWQ9YXJjNC5VSW50NjQod2F2ZV9pZCksCiAgICBkaWcgOAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjg0CiAgICAvLyBzZXR0bGVkX2lkPWFyYzQuVUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI4MS0yODUKICAgIC8vIHRpY2tldC52YWx1ZSA9IFRpY2tldCgKICAgIC8vICAgICBjcmVkaXQ9YXJjNC5VSW50NjQoY3JlZGl0KSwKICAgIC8vICAgICB3YXZlX2lkPWFyYzQuVUludDY0KHdhdmVfaWQpLAogICAgLy8gICAgIHNldHRsZWRfaWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjg2LTI5MAogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHRpY2tldHM9YXJjNC5VSW50NjQodGlja2V0cyksCiAgICAvLyAgICAgd2F2ZV9jb3VudD1hcmM0LlVJbnQ2NCh3YXZlX2NvdW50KSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyODkKICAgIC8vIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICBkaWcgMgogICAgZXh0cmFjdCA2NCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjg2LTI5MAogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHRpY2tldHM9YXJjNC5VSW50NjQodGlja2V0cyksCiAgICAvLyAgICAgd2F2ZV9jb3VudD1hcmM0LlVJbnQ2NCh3YXZlX2NvdW50KSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDMKICAgIGV4dHJhY3QgOTYgOAogICAgZGlnIDQKICAgIGV4dHJhY3QgMTA0IDgKICAgIGRpZyA1CiAgICBleHRyYWN0IDExMiA4CiAgICBkaWcgNgogICAgZXh0cmFjdCAxMjAgOAogICAgZGlnIDcKICAgIGV4dHJhY3QgMTI4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gdGlja2V0cz1hcmM0LlVJbnQ2NCh0aWNrZXRzKSwKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI4Ni0yOTAKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICB0aWNrZXRzPWFyYzQuVUludDY0KHRpY2tldHMpLAogICAgLy8gICAgIHdhdmVfY291bnQ9YXJjNC5VSW50NjQod2F2ZV9jb3VudCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyA5CiAgICBleHRyYWN0IDE0NCA4CiAgICBkaWcgMTAKICAgIGV4dHJhY3QgMTUyIDgKICAgIGRpZyAxMQogICAgZXh0cmFjdCAxNjggOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjg4CiAgICAvLyB3YXZlX2NvdW50PWFyYzQuVUludDY0KHdhdmVfY291bnQpLAogICAgdW5jb3ZlciAxMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjg2LTI5MAogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHRpY2tldHM9YXJjNC5VSW50NjQodGlja2V0cyksCiAgICAvLyAgICAgd2F2ZV9jb3VudD1hcmM0LlVJbnQ2NCh3YXZlX2NvdW50KSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDEzCiAgICBleHRyYWN0IDE4NCA4CiAgICBkaWcgMTQKICAgIGV4dHJhY3QgMTkyIDgKICAgIGRpZyAxNQogICAgZXh0cmFjdCAyMDAgOAogICAgZGlnIDE2CiAgICBleHRyYWN0IDIwOCA4CiAgICB1bmNvdmVyIDE3CiAgICBleHRyYWN0IDIxNiA4CiAgICB1bmNvdmVyIDE3CiAgICB1bmNvdmVyIDE3CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTYKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmVudGVyX2Vsc2VfYm9keUA4OgogICAgdW5jb3ZlciA1CiAgICBwb3AKICAgIHVuY292ZXIgNgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyNzYKICAgIC8vIGVsaWYgcmVjLm1vZGUubmF0aXZlID09IFdBVkU6CiAgICB1bmNvdmVyIDMKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogZW50ZXJfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mjc3CiAgICAvLyBpZiByZWMud2F2ZV9jb3VudC5uYXRpdmUgPCByZWMud2F2ZV9jYXAubmF0aXZlOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMTY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgID4KICAgIGJ6IGVudGVyX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gd2F2ZV9pZCA9IHJlYy5sYXN0X3dhdmVfaWQubmF0aXZlICsgMQogICAgZGlnIDIKICAgIGludGMgNiAvLyAxOTIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyNzkKICAgIC8vIHdhdmVfY291bnQgPSByZWMud2F2ZV9jb3VudC5uYXRpdmUgKyAxCiAgICB1bmNvdmVyIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjb3ZlciAzCiAgICBiIGVudGVyX2FmdGVyX2lmX2Vsc2VAMTMKCmVudGVyX3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gY3JlZGl0OiBVSW50NjQgPSByZWMuY3VtdWxhdGl2ZS5uYXRpdmUgaWYgcmVjLm1vZGUubmF0aXZlID09IFNQTElUIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYiBlbnRlcl90ZXJuYXJ5X21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmdtW3JvdXRpbmddKCkgLT4gdm9pZDoKZ206CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weToyOTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzAwCiAgICAvLyBib3ggPSBCb3goUmFpblJlYywga2V5PW9wLmNvbmNhdChSQUlOX1BSRUZJWCwgb3AuaXRvYihyYWluX2lkKSkpCiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzAxCiAgICAvLyBhc3NlcnQgYm94LCAiTm8gc3VjaCByYWluIgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBObyBzdWNoIHJhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gcmVjID0gYm94LnZhbHVlLmNvcHkoKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozMDMKICAgIC8vIGFzc2VydCByZWMubW9kZS5uYXRpdmUgPT0gV0FWRSwgIk5vdCBhIFdBVkUgcmFpbiIKICAgIGR1cAogICAgaW50YyA0IC8vIDE2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhIFdBVkUgcmFpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLl9yZXF1aXJlX2dhdGUocmVjLCBnYXRlX2Fzc2V0KQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9yZXF1aXJlX2dhdGUKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMwNgogICAgLy8gdGlja2V0X2JveCA9IEJveChUaWNrZXQsIGtleT1zZWxmLl90aWNrZXRfa2V5KHJhaW5faWQsIFR4bi5zZW5kZXIpKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Njc2CiAgICAvLyByZXR1cm4gb3AuY29uY2F0KFRJQ0tFVF9QUkVGSVgsIG9wLmNvbmNhdChvcC5pdG9iKHJhaW5faWQpLCB3aG8uYnl0ZXMpKQogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4NzQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozMDcKICAgIC8vIGlmIG5vdCB0aWNrZXRfYm94OgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ21fYWZ0ZXJfaWZfZWxzZUAzCiAgICBwb3BuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmdtX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5nbUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdtX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMwOQogICAgLy8gdGlja2V0ID0gdGlja2V0X2JveC52YWx1ZS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gcmVjLCB0aWNrZXQgPSBzZWxmLl9zZXR0bGVfd2F2ZShyZWMsIHRpY2tldCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY2FsbHN1YiBfc2V0dGxlX3dhdmUKICAgIHBvcG4gMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gb3Blbl93YXZlOiBVSW50NjQgPSByZWMubGFzdF93YXZlX2lkLm5hdGl2ZSArIDEKICAgIGR1cAogICAgZXh0cmFjdCAxOTIgOAogICAgY292ZXIgNQogICAgaW50YyA2IC8vIDE5MgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzEzCiAgICAvLyBpZiB0aWNrZXQud2F2ZV9pZC5uYXRpdmUgPT0gb3Blbl93YXZlOgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgYnogZ21fYWZ0ZXJfaWZfZWxzZUA1CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMxNAogICAgLy8gdGlja2V0X2JveC52YWx1ZSA9IHRpY2tldC5jb3B5KCkKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMxNQogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKGxhYmVsPXJlYy5sYWJlbC5jb3B5KCkpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDEKICAgIGV4dHJhY3QgMzIgMzIKICAgIGRpZyAyCiAgICBleHRyYWN0IDY0IDMyCiAgICBkaWcgMwogICAgZXh0cmFjdCA5NiA4CiAgICBkaWcgNAogICAgZXh0cmFjdCAxMDQgOAogICAgZGlnIDUKICAgIGV4dHJhY3QgMTEyIDgKICAgIGRpZyA2CiAgICBleHRyYWN0IDEyMCA4CiAgICBkaWcgNwogICAgZXh0cmFjdCAxMjggOAogICAgZGlnIDgKICAgIGV4dHJhY3QgMTM2IDgKICAgIGRpZyA5CiAgICBleHRyYWN0IDE0NCA4CiAgICBkaWcgMTAKICAgIGV4dHJhY3QgMTUyIDgKICAgIGRpZyAxMQogICAgZXh0cmFjdCAxNjAgOAogICAgZGlnIDEyCiAgICBleHRyYWN0IDE2OCA4CiAgICBkaWcgMTMKICAgIGV4dHJhY3QgMTc2IDgKICAgIGRpZyAxNAogICAgZXh0cmFjdCAxODQgOAogICAgZGlnIDE1CiAgICBleHRyYWN0IDIwMCA4CiAgICBkaWcgMTYKICAgIGV4dHJhY3QgMjA4IDgKICAgIHVuY292ZXIgMTcKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTcKICAgIHVuY292ZXIgMTcKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDE1CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMxNgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBiIGdtX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5nbUA4CgpnbV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozMTcKICAgIC8vIGlmIHJlYy53YXZlX2NvdW50Lm5hdGl2ZSA+PSByZWMud2F2ZV9jYXAubmF0aXZlOgogICAgZGlnIDMKICAgIGR1cAogICAgZXh0cmFjdCAxNzYgOAogICAgY292ZXIgNQogICAgZHVwCiAgICBpbnRjIDEwIC8vIDE3NgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNgogICAgZHVwCiAgICBleHRyYWN0IDE2OCA4CiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDE2OAogICAgZXh0cmFjdF91aW50NjQKICAgID49CiAgICBieiBnbV9hZnRlcl9pZl9lbHNlQDcKICAgIGJ1cnkgMQogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gdGlja2V0X2JveC52YWx1ZSA9IHRpY2tldC5jb3B5KCkKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzE5CiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UobGFiZWw9cmVjLmxhYmVsLmNvcHkoKSkKICAgIHN3YXAKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMgogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIKICAgIGRpZyAzCiAgICBleHRyYWN0IDk2IDgKICAgIGRpZyA0CiAgICBleHRyYWN0IDEwNCA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAxMTIgOAogICAgZGlnIDYKICAgIGV4dHJhY3QgMTIwIDgKICAgIGRpZyA3CiAgICBleHRyYWN0IDEyOCA4CiAgICBkaWcgOAogICAgZXh0cmFjdCAxMzYgOAogICAgZGlnIDkKICAgIGV4dHJhY3QgMTQ0IDgKICAgIGRpZyAxMAogICAgZXh0cmFjdCAxNTIgOAogICAgZGlnIDExCiAgICBleHRyYWN0IDE2MCA4CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgMTg0IDgKICAgIGRpZyAxMwogICAgZXh0cmFjdCAyMDAgOAogICAgZGlnIDE0CiAgICBleHRyYWN0IDIwOCA4CiAgICB1bmNvdmVyIDE1CiAgICBleHRyYWN0IDIxNiA4CiAgICB1bmNvdmVyIDE1CiAgICB1bmNvdmVyIDE1CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzIwCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGIgZ21fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmdtQDgKCmdtX2FmdGVyX2lmX2Vsc2VANzoKICAgIHVuY292ZXIgNgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozMjIKICAgIC8vIHRpY2tldCA9IHRpY2tldC5fcmVwbGFjZSh3YXZlX2lkPWFyYzQuVUludDY0KG9wZW5fd2F2ZSkpCiAgICB1bmNvdmVyIDMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMTYgOAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMyMy0zMjYKICAgIC8vIHJlYyA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICB3YXZlX2NvdW50PWFyYzQuVUludDY0KHJlYy53YXZlX2NvdW50Lm5hdGl2ZSArIDEpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzI1CiAgICAvLyBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMyMy0zMjYKICAgIC8vIHJlYyA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICB3YXZlX2NvdW50PWFyYzQuVUludDY0KHJlYy53YXZlX2NvdW50Lm5hdGl2ZSArIDEpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMwogICAgZXh0cmFjdCA5NiA4CiAgICBkaWcgNAogICAgZXh0cmFjdCAxMDQgOAogICAgZGlnIDUKICAgIGV4dHJhY3QgMTEyIDgKICAgIGRpZyA2CiAgICBleHRyYWN0IDEyMCA4CiAgICBkaWcgNwogICAgZXh0cmFjdCAxMjggOAogICAgZGlnIDgKICAgIGV4dHJhY3QgMTM2IDgKICAgIGRpZyA5CiAgICBleHRyYWN0IDE0NCA4CiAgICBkaWcgMTAKICAgIGV4dHJhY3QgMTUyIDgKICAgIGRpZyAxMQogICAgZXh0cmFjdCAxNjAgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzI0CiAgICAvLyB3YXZlX2NvdW50PWFyYzQuVUludDY0KHJlYy53YXZlX2NvdW50Lm5hdGl2ZSArIDEpLAogICAgdW5jb3ZlciAxNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMyMy0zMjYKICAgIC8vIHJlYyA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICB3YXZlX2NvdW50PWFyYzQuVUludDY0KHJlYy53YXZlX2NvdW50Lm5hdGl2ZSArIDEpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMTMKICAgIGV4dHJhY3QgMTg0IDgKICAgIGRpZyAxNAogICAgZXh0cmFjdCAyMDAgOAogICAgZGlnIDE1CiAgICBleHRyYWN0IDIwOCA4CiAgICB1bmNvdmVyIDE2CiAgICBleHRyYWN0IDIxNiA4CiAgICB1bmNvdmVyIDE2CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMyNwogICAgLy8gdGlja2V0X2JveC52YWx1ZSA9IHRpY2tldC5jb3B5KCkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozMjgKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5jb3B5KCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGIgZ21fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmdtQDgKCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmRlcG9zaXRbcm91dGluZ10oKSAtPiB2b2lkOgpkZXBvc2l0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzMxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzM0CiAgICAvLyBib3ggPSBCb3goUmFpblJlYywga2V5PW9wLmNvbmNhdChSQUlOX1BSRUZJWCwgb3AuaXRvYihyYWluX2lkKSkpCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzM1CiAgICAvLyBhc3NlcnQgYm94LCAiTm8gc3VjaCByYWluIgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBObyBzdWNoIHJhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gcmVjID0gYm94LnZhbHVlLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gYXNzZXJ0IHJlYy5wcml6ZV9hc3NldC5uYXRpdmUgPT0gMCwgIlRoaXMgcmFpbiBwYXlzIGFuIGFzc2V0OyB1c2UgZGVwb3NpdF9hc3NldCIKICAgIGR1cAogICAgZXh0cmFjdCA5NiA4CiAgICBkaWcgMQogICAgcHVzaGludCA5NgogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydCAvLyBUaGlzIHJhaW4gcGF5cyBhbiBhc3NldDsgdXNlIGRlcG9zaXRfYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkaWcgMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzM4LTM0MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwYXltZW50LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJEZXBvc2l0IG11c3QgZ28gdG8gdGhlIGFwcCBhY2NvdW50IgogICAgYXNzZXJ0IC8vIERlcG9zaXQgbXVzdCBnbyB0byB0aGUgYXBwIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHBheW1lbnQucmVrZXlfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIkRlcG9zaXQgbXVzdCBub3QgcmVrZXkiCiAgICBkaWcgMwogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIERlcG9zaXQgbXVzdCBub3QgcmVrZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcGF5bWVudC5jbG9zZV9yZW1haW5kZXJfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZGlnIDMKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM0Mi0zNDQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcGF5bWVudC5jbG9zZV9yZW1haW5kZXJfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgLy8gKSwgIkRlcG9zaXQgbXVzdCBub3QgY2xvc2UiCiAgICBhc3NlcnQgLy8gRGVwb3NpdCBtdXN0IG5vdCBjbG9zZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzQ1CiAgICAvLyBhc3NlcnQgcGF5bWVudC5hbW91bnQgPiAwLCAiQW1vdW50IG11c3QgYmUgcG9zaXRpdmUiCiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gQW1vdW50IG11c3QgYmUgcG9zaXRpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gcG90OiBVSW50NjQgPSByZWMucG90Lm5hdGl2ZSArIHBheW1lbnQuYW1vdW50CiAgICBkaWcgMgogICAgaW50YyA1IC8vIDEyOAogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKHBvdD1hcmM0LlVJbnQ2NChwb3QpLCBsYWJlbD1yZWMubGFiZWwuY29weSgpKQogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDMKICAgIGV4dHJhY3QgMzIgMzIKICAgIGRpZyA0CiAgICBleHRyYWN0IDY0IDMyCiAgICBkaWcgNQogICAgZXh0cmFjdCAxMDQgOAogICAgZGlnIDYKICAgIGV4dHJhY3QgMTEyIDgKICAgIGRpZyA3CiAgICBleHRyYWN0IDEyMCA4CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGRpZyA4CiAgICBleHRyYWN0IDEzNiA4CiAgICBkaWcgOQogICAgZXh0cmFjdCAxNDQgOAogICAgZGlnIDEwCiAgICBleHRyYWN0IDE1MiA4CiAgICBkaWcgMTEKICAgIGV4dHJhY3QgMTYwIDgKICAgIGRpZyAxMgogICAgZXh0cmFjdCAxNjggOAogICAgZGlnIDEzCiAgICBleHRyYWN0IDE3NiA4CiAgICBkaWcgMTQKICAgIGV4dHJhY3QgMTg0IDgKICAgIGRpZyAxNQogICAgZXh0cmFjdCAxOTIgOAogICAgZGlnIDE2CiAgICBleHRyYWN0IDIwMCA4CiAgICBkaWcgMTcKICAgIGV4dHJhY3QgMjA4IDgKICAgIHVuY292ZXIgMTgKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTcKICAgIHVuY292ZXIgMTcKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzMxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmRlcG9zaXRfYXNzZXRbcm91dGluZ10oKSAtPiB2b2lkOgpkZXBvc2l0X2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gYm94ID0gQm94KFJhaW5SZWMsIGtleT1vcC5jb25jYXQoUkFJTl9QUkVGSVgsIG9wLml0b2IocmFpbl9pZCkpKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDcyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gYXNzZXJ0IGJveCwgIk5vIHN1Y2ggcmFpbiIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm8gc3VjaCByYWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNTUKICAgIC8vIHJlYyA9IGJveC52YWx1ZS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNTYKICAgIC8vIGFzc2V0ID0gcmVjLnByaXplX2Fzc2V0Lm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDk2IDgKICAgIGRpZyAxCiAgICBwdXNoaW50IDk2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzU3CiAgICAvLyBhc3NlcnQgYXNzZXQgPiAwLCAiVGhpcyByYWluIHBheXMgQUxHTzsgdXNlIGRlcG9zaXQiCiAgICBkdXAKICAgIGFzc2VydCAvLyBUaGlzIHJhaW4gcGF5cyBBTEdPOyB1c2UgZGVwb3NpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzU5CiAgICAvLyB0cmFuc2Zlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkaWcgNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNTgtMzYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRyYW5zZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJEZXBvc2l0IG11c3QgZ28gdG8gdGhlIGFwcCBhY2NvdW50IgogICAgYXNzZXJ0IC8vIERlcG9zaXQgbXVzdCBnbyB0byB0aGUgYXBwIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gYXNzZXJ0IHRyYW5zZmVyLnJla2V5X3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJEZXBvc2l0IG11c3Qgbm90IHJla2V5IgogICAgZGlnIDQKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBEZXBvc2l0IG11c3Qgbm90IHJla2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNjMKICAgIC8vIHRyYW5zZmVyLmFzc2V0X2Nsb3NlX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGRpZyA0CiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM2Mi0zNjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdHJhbnNmZXIuYXNzZXRfY2xvc2VfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgLy8gKSwgIkRlcG9zaXQgbXVzdCBub3QgY2xvc2UgdGhlIGFzc2V0IgogICAgYXNzZXJ0IC8vIERlcG9zaXQgbXVzdCBub3QgY2xvc2UgdGhlIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNjUKICAgIC8vIGFzc2VydCB0cmFuc2Zlci54ZmVyX2Fzc2V0LmlkID09IGFzc2V0LCAiV3JvbmcgYXNzZXQiCiAgICBkaWcgNAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNjYKICAgIC8vIGFzc2VydCB0cmFuc2Zlci5hc3NldF9hbW91bnQgPiAwLCAiQW1vdW50IG11c3QgYmUgcG9zaXRpdmUiCiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzY3CiAgICAvLyBwb3Q6IFVJbnQ2NCA9IHJlYy5wb3QubmF0aXZlICsgdHJhbnNmZXIuYXNzZXRfYW1vdW50CiAgICBkaWcgMgogICAgaW50YyA1IC8vIDEyOAogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM2OAogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKHBvdD1hcmM0LlVJbnQ2NChwb3QpLCBsYWJlbD1yZWMubGFiZWwuY29weSgpKQogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDMKICAgIGV4dHJhY3QgMzIgMzIKICAgIGRpZyA0CiAgICBleHRyYWN0IDY0IDMyCiAgICBkaWcgNQogICAgZXh0cmFjdCAxMDQgOAogICAgZGlnIDYKICAgIGV4dHJhY3QgMTEyIDgKICAgIGRpZyA3CiAgICBleHRyYWN0IDEyMCA4CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGRpZyA4CiAgICBleHRyYWN0IDEzNiA4CiAgICBkaWcgOQogICAgZXh0cmFjdCAxNDQgOAogICAgZGlnIDEwCiAgICBleHRyYWN0IDE1MiA4CiAgICBkaWcgMTEKICAgIGV4dHJhY3QgMTYwIDgKICAgIGRpZyAxMgogICAgZXh0cmFjdCAxNjggOAogICAgZGlnIDEzCiAgICBleHRyYWN0IDE3NiA4CiAgICBkaWcgMTQKICAgIGV4dHJhY3QgMTg0IDgKICAgIGRpZyAxNQogICAgZXh0cmFjdCAxOTIgOAogICAgZGlnIDE2CiAgICBleHRyYWN0IDIwMCA4CiAgICBkaWcgMTcKICAgIGV4dHJhY3QgMjA4IDgKICAgIHVuY292ZXIgMTgKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTcKICAgIHVuY292ZXIgMTcKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmRyYXdbcm91dGluZ10oKSAtPiB2b2lkOgpkcmF3OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gbiA9IHNlbGYubmV4dF9yYWluX2lkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibmV4dF9yYWluX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3JhaW5faWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODAKICAgIC8vIGlmIG4gPT0gMDoKICAgIGJueiBkcmF3X2FmdGVyX2lmX2Vsc2VAMwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODEKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCgpkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5kcmF3QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozNzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZHJhd19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODIKICAgIC8vIHN0YXJ0ID0gc2VsZi5jdXJzb3IudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3Vyc29yIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzgzCiAgICAvLyBmaXJlZCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NAogICAgLy8gZm9yIHN0ZXAgaW4gdXJhbmdlKERSQVdfU0NBTik6CiAgICBpbnRjXzAgLy8gMAoKZHJhd19mb3JfaGVhZGVyQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODQKICAgIC8vIGZvciBzdGVwIGluIHVyYW5nZShEUkFXX1NDQU4pOgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgIDwKICAgIGJ6IGRyYXdfYWZ0ZXJfZm9yQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NQogICAgLy8gcmlkID0gKHN0YXJ0ICsgc3RlcCkgJSBuICsgMQogICAgZHVwMgogICAgKwogICAgZGlnIDQKICAgICUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MTcKICAgIC8vIGJveCA9IEJveChSYWluUmVjLCBrZXk9b3AuY29uY2F0KFJBSU5fUFJFRklYLCBvcC5pdG9iKHJhaW5faWQpKSkKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgNQogICAgYnl0ZWNfMSAvLyAweDcyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTE4CiAgICAvLyBpZiBub3QgYm94OgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZHJhd19hZnRlcl9pZl9lbHNlQDExCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTE5CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uX3RyeV9maXJlQDQyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mzg2CiAgICAvLyBmaXJlZCArPSBzZWxmLl90cnlfZmlyZShyaWQpCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NAogICAgLy8gZm9yIHN0ZXAgaW4gdXJhbmdlKERSQVdfU0NBTik6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYiBkcmF3X2Zvcl9oZWFkZXJANAoKZHJhd19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTIwCiAgICAvLyByZWMgPSBib3gudmFsdWUuY29weSgpCiAgICBkaWcgOAogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTIxCiAgICAvLyBpZiByZWMubGFzdF9yYWluX3JvdW5kLm5hdGl2ZSAhPSAwOgogICAgZHVwCiAgICBleHRyYWN0IDEyMCA4CiAgICBidXJ5IDEzCiAgICBwdXNoaW50IDEyMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA3CiAgICBieiBkcmF3X2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gaWYgR2xvYmFsLnJvdW5kIDwgcmVjLmxhc3RfcmFpbl9yb3VuZC5uYXRpdmUgKyByZWMuaW50ZXJ2YWxfcm91bmRzLm5hdGl2ZToKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDgKICAgIHB1c2hpbnQgMTEyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDcKICAgICsKICAgIDwKICAgIGJ6IGRyYXdfYWZ0ZXJfaWZfZWxzZUAxNAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUyMwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gZmlyZWQgKz0gc2VsZi5fdHJ5X2ZpcmUocmlkKQogICAgYiBkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fdHJ5X2ZpcmVANDIKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUyNQogICAgLy8gbW9kZSA9IHJlYy5tb2RlLm5hdGl2ZQogICAgZGlnIDcKICAgIGR1cAogICAgZXh0cmFjdCAxNjAgOAogICAgYnVyeSAxMgogICAgaW50YyA0IC8vIDE2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTI2CiAgICAvLyBpZiBtb2RlID09IFNQTElUOgogICAgYm56IGRyYXdfYWZ0ZXJfaWZfZWxzZUAyMwogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MzUKICAgIC8vIGlmIHJlYy50aWNrZXRzLm5hdGl2ZSA9PSAwOgogICAgZGlnIDcKICAgIGR1cAogICAgZXh0cmFjdCAxMzYgOAogICAgY292ZXIgNQogICAgaW50YyA4IC8vIDEzNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBibnogZHJhd19hZnRlcl9pZl9lbHNlQDE3CiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUzNgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gZmlyZWQgKz0gc2VsZi5fdHJ5X2ZpcmUocmlkKQogICAgYiBkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fdHJ5X2ZpcmVANDIKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUzNwogICAgLy8gc2hhcmUgPSByZWMuZHJpcC5uYXRpdmUgLy8gcmVjLnRpY2tldHMubmF0aXZlCiAgICBkaWcgOAogICAgZHVwCiAgICBleHRyYWN0IDEwNCA4CiAgICBjb3ZlciA1CiAgICBwdXNoaW50IDEwNAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICAvCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUzOAogICAgLy8gaWYgc2hhcmUgPT0gMDoKICAgIGJueiBkcmF3X2FmdGVyX2lmX2Vsc2VAMTkKICAgIHVuY292ZXIgMwogICAgcG9wCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MzkKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODYKICAgIC8vIGZpcmVkICs9IHNlbGYuX3RyeV9maXJlKHJpZCkKICAgIGIgZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uX3RyeV9maXJlQDQyCgpkcmF3X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NDAKICAgIC8vIHBhaWQgPSBzaGFyZSAqIHJlYy50aWNrZXRzLm5hdGl2ZQogICAgZGlnIDMKICAgIGRpZyA5CiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gaWYgcmVjLnBvdC5uYXRpdmUgPCBwYWlkOgogICAgZGlnIDEyCiAgICBpbnRjIDUgLy8gMTI4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDwKICAgIGJ6IGRyYXdfYWZ0ZXJfaWZfZWxzZUAyMQogICAgcG9wCiAgICB1bmNvdmVyIDMKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0MgogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gZmlyZWQgKz0gc2VsZi5fdHJ5X2ZpcmUocmlkKQogICAgYiBkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fdHJ5X2ZpcmVANDIKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gZHJhd19pZCA9IHJlYy5kcmF3X2lkLm5hdGl2ZSArIDEKICAgIGRpZyAxMgogICAgZHVwCiAgICBpbnRjIDExIC8vIDE0NAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NDQtNTUwCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHJlYy5wb3QubmF0aXZlIC0gcGFpZCksCiAgICAvLyAgICAgY3VtdWxhdGl2ZT1hcmM0LlVJbnQ2NChyZWMuY3VtdWxhdGl2ZS5uYXRpdmUgKyBzaGFyZSksCiAgICAvLyAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDEKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDIKICAgIGV4dHJhY3QgMzIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0OQogICAgLy8gbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDY0IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NDQtNTUwCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHJlYy5wb3QubmF0aXZlIC0gcGFpZCksCiAgICAvLyAgICAgY3VtdWxhdGl2ZT1hcmM0LlVJbnQ2NChyZWMuY3VtdWxhdGl2ZS5uYXRpdmUgKyBzaGFyZSksCiAgICAvLyAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDQKICAgIGV4dHJhY3QgOTYgOAogICAgZGlnIDUKICAgIGV4dHJhY3QgMTEyIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0OAogICAgLy8gbGFzdF9yYWluX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcG90PWFyYzQuVUludDY0KHJlYy5wb3QubmF0aXZlIC0gcGFpZCksCiAgICB1bmNvdmVyIDgKICAgIHVuY292ZXIgMTQKICAgIGR1cAogICAgY292ZXIgMTAKICAgIC0KICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU0NwogICAgLy8gZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTQ2CiAgICAvLyBjdW11bGF0aXZlPWFyYzQuVUludDY0KHJlYy5jdW11bGF0aXZlLm5hdGl2ZSArIHNoYXJlKSwKICAgIGRpZyA4CiAgICBpbnRjIDcgLy8gMTUyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAxNAogICAgZHVwCiAgICBjb3ZlciAxMQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTQ0LTU1MAogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHBvdD1hcmM0LlVJbnQ2NChyZWMucG90Lm5hdGl2ZSAtIHBhaWQpLAogICAgLy8gICAgIGN1bXVsYXRpdmU9YXJjNC5VSW50NjQocmVjLmN1bXVsYXRpdmUubmF0aXZlICsgc2hhcmUpLAogICAgLy8gICAgIGRyYXdfaWQ9YXJjNC5VSW50NjQoZHJhd19pZCksCiAgICAvLyAgICAgbGFzdF9yYWluX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyA5CiAgICBleHRyYWN0IDE2OCA4CiAgICBkaWcgMTAKICAgIGV4dHJhY3QgMTc2IDgKICAgIGRpZyAxMQogICAgZXh0cmFjdCAxODQgOAogICAgZGlnIDEyCiAgICBleHRyYWN0IDE5MiA4CiAgICBkaWcgMTMKICAgIGV4dHJhY3QgMjAwIDgKICAgIGRpZyAxNAogICAgZXh0cmFjdCAyMDggOAogICAgdW5jb3ZlciAxNQogICAgZXh0cmFjdCAyMTYgOAogICAgdW5jb3ZlciAxNQogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBkdXAKICAgIGNvdmVyIDExCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICBkaWcgMjIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU1NQogICAgLy8gbW9kZT1hcmM0LlVJbnQ2NChTUExJVCksCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTU2CiAgICAvLyBwYWlkPWFyYzQuVUludDY0KHBhaWQpLAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NTcKICAgIC8vIHNoYXJlPWFyYzQuVUludDY0KHNoYXJlKSwKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTUyLTU1OQogICAgLy8gUmFpbmVkKAogICAgLy8gICAgIHJhaW5faWQ9YXJjNC5VSW50NjQocmFpbl9pZCksCiAgICAvLyAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICBtb2RlPWFyYzQuVUludDY0KFNQTElUKSwKICAgIC8vICAgICBwYWlkPWFyYzQuVUludDY0KHBhaWQpLAogICAgLy8gICAgIHNoYXJlPWFyYzQuVUludDY0KHNoYXJlKSwKICAgIC8vICAgICBjb3VudD1hcmM0LlVJbnQ2NChyZWMudGlja2V0cy5uYXRpdmUpLAogICAgLy8gKQogICAgdW5jb3ZlciA5CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTUxLTU2MAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIFJhaW5lZCgKICAgIC8vICAgICAgICAgcmFpbl9pZD1hcmM0LlVJbnQ2NChyYWluX2lkKSwKICAgIC8vICAgICAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICAgICAgbW9kZT1hcmM0LlVJbnQ2NChTUExJVCksCiAgICAvLyAgICAgICAgIHBhaWQ9YXJjNC5VSW50NjQocGFpZCksCiAgICAvLyAgICAgICAgIHNoYXJlPWFyYzQuVUludDY0KHNoYXJlKSwKICAgIC8vICAgICAgICAgY291bnQ9YXJjNC5VSW50NjQocmVjLnRpY2tldHMubmF0aXZlKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiUmFpbmVkKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODYKICAgIC8vIGZpcmVkICs9IHNlbGYuX3RyeV9maXJlKHJpZCkKICAgIGIgZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uX3RyeV9maXJlQDQyCgpkcmF3X2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MjgKICAgIC8vIGlmIG1vZGUgPT0gV0FWRToKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogZHJhd19hZnRlcl9pZl9lbHNlQDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NjYKICAgIC8vIHBvdCA9IHJlYy5wb3QubmF0aXZlICsgcmVjLmxhc3Rfc2hhcmUubmF0aXZlICogcmVjLndhdmVfdW5jbGFpbWVkLm5hdGl2ZQogICAgZGlnIDcKICAgIGR1cAogICAgaW50YyA1IC8vIDEyOAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjIDEyIC8vIDE4NAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBwdXNoaW50IDIwMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgNAogICAgKgogICAgKwogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NjcKICAgIC8vIGlmIHJlYy53YXZlX2NvdW50Lm5hdGl2ZSA9PSAwOgogICAgZHVwCiAgICBleHRyYWN0IDE3NiA4CiAgICBidXJ5IDEyCiAgICBpbnRjIDEwIC8vIDE3NgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgNAogICAgYm56IGRyYXdfYWZ0ZXJfaWZfZWxzZUAyOAogICAgdW5jb3ZlciAzCiAgICBwb3AKICAgIHVuY292ZXIgNQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NjgKICAgIC8vIGlmIHJlYy53YXZlX3VuY2xhaW1lZC5uYXRpdmUgPiAwOgogICAgYnogZHJhd19hZnRlcl9pZl9lbHNlQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NjktNTc0CiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHBvdCksCiAgICAvLyAgICAgd2F2ZV91bmNsYWltZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgbGFzdF9zaGFyZT1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDYKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTczCiAgICAvLyBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU2OS01NzQKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90KSwKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYXN0X3NoYXJlPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMwogICAgZXh0cmFjdCA5NiA4CiAgICBkaWcgNAogICAgZXh0cmFjdCAxMDQgOAogICAgZGlnIDUKICAgIGV4dHJhY3QgMTEyIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU3MAogICAgLy8gcG90PWFyYzQuVUludDY0KHBvdCksCiAgICBkaWcgMTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU2OS01NzQKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90KSwKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYXN0X3NoYXJlPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgNwogICAgZXh0cmFjdCAxMzYgOAogICAgZGlnIDgKICAgIGV4dHJhY3QgMTQ0IDgKICAgIGRpZyA5CiAgICBleHRyYWN0IDE1MiA4CiAgICBkaWcgMTAKICAgIGV4dHJhY3QgMTY4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU3MgogICAgLy8gbGFzdF9zaGFyZT1hcmM0LlVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1NjktNTc0CiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHBvdCksCiAgICAvLyAgICAgd2F2ZV91bmNsYWltZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgbGFzdF9zaGFyZT1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDEyCiAgICBleHRyYWN0IDE5MiA4CiAgICBkaWcgMTMKICAgIGV4dHJhY3QgMjA4IDgKICAgIHVuY292ZXIgMTQKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTQKICAgIHVuY292ZXIgMTQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBkaWcgMjAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIGRpZyAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEzCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIHN3YXAKICAgIGJveF9wdXQKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU3NQogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gZmlyZWQgKz0gc2VsZi5fdHJ5X2ZpcmUocmlkKQogICAgYiBkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fdHJ5X2ZpcmVANDIKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTc2CiAgICAvLyBzaGFyZSA9IHJlYy5kcmlwLm5hdGl2ZSAvLyByZWMud2F2ZV9jb3VudC5uYXRpdmUKICAgIGRpZyA4CiAgICBkdXAKICAgIGV4dHJhY3QgMTA0IDgKICAgIGNvdmVyIDYKICAgIHB1c2hpbnQgMTA0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIC8KICAgIGR1cAogICAgY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTc3CiAgICAvLyBpZiBzaGFyZSA9PSAwOgogICAgYm56IGRyYXdfYWZ0ZXJfaWZfZWxzZUAzMAogICAgdW5jb3ZlciAyCiAgICBwb3AKICAgIHVuY292ZXIgMwogICAgcG9wCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU3OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gZmlyZWQgKz0gc2VsZi5fdHJ5X2ZpcmUocmlkKQogICAgYiBkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fdHJ5X2ZpcmVANDIKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gcGFpZCA9IHNoYXJlICogcmVjLndhdmVfY291bnQubmF0aXZlCiAgICBkaWcgNAogICAgdW5jb3ZlciAzCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gaWYgcG90IDwgcGFpZDoKICAgIGRpZyAxMAogICAgPgogICAgYnogZHJhd19hZnRlcl9pZl9lbHNlQDMyCiAgICB1bmNvdmVyIDMKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTgxCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mzg2CiAgICAvLyBmaXJlZCArPSBzZWxmLl90cnlfZmlyZShyaWQpCiAgICBiIGRyYXdfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLl90cnlfZmlyZUA0MgoKZHJhd19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTgyCiAgICAvLyBkcmF3X2lkID0gcmVjLmRyYXdfaWQubmF0aXZlICsgMQogICAgZGlnIDEwCiAgICBkdXAKICAgIGludGMgMTEgLy8gMTQ0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gd2F2ZV9pZCA9IHJlYy5sYXN0X3dhdmVfaWQubmF0aXZlICsgMQogICAgZGlnIDEKICAgIGludGMgNiAvLyAxOTIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTg0LTU5MwogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHBvdD1hcmM0LlVJbnQ2NChwb3QgLSBwYWlkKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGxhc3Rfc2hhcmU9YXJjNC5VSW50NjQoc2hhcmUpLAogICAgLy8gICAgIGxhc3Rfd2F2ZV9pZD1hcmM0LlVJbnQ2NCh3YXZlX2lkKSwKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NChyZWMud2F2ZV9jb3VudC5uYXRpdmUpLAogICAgLy8gICAgIHdhdmVfY291bnQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyAzCiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1OTIKICAgIC8vIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICBkaWcgNAogICAgZXh0cmFjdCA2NCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTg0LTU5MwogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHBvdD1hcmM0LlVJbnQ2NChwb3QgLSBwYWlkKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGxhc3Rfc2hhcmU9YXJjNC5VSW50NjQoc2hhcmUpLAogICAgLy8gICAgIGxhc3Rfd2F2ZV9pZD1hcmM0LlVJbnQ2NCh3YXZlX2lkKSwKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NChyZWMud2F2ZV9jb3VudC5uYXRpdmUpLAogICAgLy8gICAgIHdhdmVfY291bnQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyA1CiAgICBleHRyYWN0IDk2IDgKICAgIGRpZyA2CiAgICBleHRyYWN0IDExMiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1ODcKICAgIC8vIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1ODUKICAgIC8vIHBvdD1hcmM0LlVJbnQ2NChwb3QgLSBwYWlkKSwKICAgIGRpZyAxOAogICAgdW5jb3ZlciAxNQogICAgZHVwCiAgICBjb3ZlciAxMQogICAgLQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTg0LTU5MwogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHBvdD1hcmM0LlVJbnQ2NChwb3QgLSBwYWlkKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGxhc3Rfc2hhcmU9YXJjNC5VSW50NjQoc2hhcmUpLAogICAgLy8gICAgIGxhc3Rfd2F2ZV9pZD1hcmM0LlVJbnQ2NCh3YXZlX2lkKSwKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NChyZWMud2F2ZV9jb3VudC5uYXRpdmUpLAogICAgLy8gICAgIHdhdmVfY291bnQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyA5CiAgICBleHRyYWN0IDEzNiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1ODYKICAgIC8vIGRyYXdfaWQ9YXJjNC5VSW50NjQoZHJhd19pZCksCiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU4NC01OTMKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90IC0gcGFpZCksCiAgICAvLyAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgICBsYXN0X3NoYXJlPWFyYzQuVUludDY0KHNoYXJlKSwKICAgIC8vICAgICBsYXN0X3dhdmVfaWQ9YXJjNC5VSW50NjQod2F2ZV9pZCksCiAgICAvLyAgICAgd2F2ZV91bmNsYWltZWQ9YXJjNC5VSW50NjQocmVjLndhdmVfY291bnQubmF0aXZlKSwKICAgIC8vICAgICB3YXZlX2NvdW50PWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGV4dHJhY3QgMTUyIDgKICAgIGRpZyAxMQogICAgZXh0cmFjdCAxNjggOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTkxCiAgICAvLyB3YXZlX2NvdW50PWFyYzQuVUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU4OAogICAgLy8gbGFzdF9zaGFyZT1hcmM0LlVJbnQ2NChzaGFyZSksCiAgICB1bmNvdmVyIDE4CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1ODkKICAgIC8vIGxhc3Rfd2F2ZV9pZD1hcmM0LlVJbnQ2NCh3YXZlX2lkKSwKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU4NC01OTMKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90IC0gcGFpZCksCiAgICAvLyAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgICBsYXN0X3NoYXJlPWFyYzQuVUludDY0KHNoYXJlKSwKICAgIC8vICAgICBsYXN0X3dhdmVfaWQ9YXJjNC5VSW50NjQod2F2ZV9pZCksCiAgICAvLyAgICAgd2F2ZV91bmNsYWltZWQ9YXJjNC5VSW50NjQocmVjLndhdmVfY291bnQubmF0aXZlKSwKICAgIC8vICAgICB3YXZlX2NvdW50PWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMTQKICAgIGV4dHJhY3QgMjA4IDgKICAgIHVuY292ZXIgMTUKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTUKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTgKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBkaWcgMTkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMTMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU5OAogICAgLy8gbW9kZT1hcmM0LlVJbnQ2NChXQVZFKSwKICAgIGludGNfMyAvLyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1OTkKICAgIC8vIHBhaWQ9YXJjNC5VSW50NjQocGFpZCksCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjU5NS02MDIKICAgIC8vIFJhaW5lZCgKICAgIC8vICAgICByYWluX2lkPWFyYzQuVUludDY0KHJhaW5faWQpLAogICAgLy8gICAgIGRyYXdfaWQ9YXJjNC5VSW50NjQoZHJhd19pZCksCiAgICAvLyAgICAgbW9kZT1hcmM0LlVJbnQ2NChXQVZFKSwKICAgIC8vICAgICBwYWlkPWFyYzQuVUludDY0KHBhaWQpLAogICAgLy8gICAgIHNoYXJlPWFyYzQuVUludDY0KHNoYXJlKSwKICAgIC8vICAgICBjb3VudD1hcmM0LlVJbnQ2NChyZWMud2F2ZV9jb3VudC5uYXRpdmUpLAogICAgLy8gKQogICAgdW5jb3ZlciA5CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTk0LTYwMwogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIFJhaW5lZCgKICAgIC8vICAgICAgICAgcmFpbl9pZD1hcmM0LlVJbnQ2NChyYWluX2lkKSwKICAgIC8vICAgICAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICAgICAgbW9kZT1hcmM0LlVJbnQ2NChXQVZFKSwKICAgIC8vICAgICAgICAgcGFpZD1hcmM0LlVJbnQ2NChwYWlkKSwKICAgIC8vICAgICAgICAgc2hhcmU9YXJjNC5VSW50NjQoc2hhcmUpLAogICAgLy8gICAgICAgICBjb3VudD1hcmM0LlVJbnQ2NChyZWMud2F2ZV9jb3VudC5uYXRpdmUpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJSYWluZWQodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjYwNAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gZmlyZWQgKz0gc2VsZi5fdHJ5X2ZpcmUocmlkKQogICAgYiBkcmF3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fdHJ5X2ZpcmVANDIKCmRyYXdfYWZ0ZXJfaWZfZWxzZUAzNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjYwOQogICAgLy8gaWYgcmVjLnByaXplX2xvY2tlZC5uYXRpdmUgPiAwOgogICAgZGlnIDcKICAgIGludGMgOSAvLyAyMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBkcmF3X2FmdGVyX2lmX2Vsc2VAMzYKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTAKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODYKICAgIC8vIGZpcmVkICs9IHNlbGYuX3RyeV9maXJlKHJpZCkKICAgIGIgZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uX3RyeV9maXJlQDQyCgpkcmF3X2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTEKICAgIC8vIGlmIHJlYy50aWNrZXRzLm5hdGl2ZSA9PSAwOgogICAgZGlnIDcKICAgIGR1cAogICAgZXh0cmFjdCAxMzYgOAogICAgY292ZXIgNQogICAgaW50YyA4IC8vIDEzNgogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBkcmF3X2FmdGVyX2lmX2Vsc2VAMzgKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjEyCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mzg2CiAgICAvLyBmaXJlZCArPSBzZWxmLl90cnlfZmlyZShyaWQpCiAgICBiIGRyYXdfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLl90cnlfZmlyZUA0MgoKZHJhd19hZnRlcl9pZl9lbHNlQDM4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjEzCiAgICAvLyBpZiByZWMucG90Lm5hdGl2ZSA8IHJlYy5kcmlwLm5hdGl2ZToKICAgIGRpZyA4CiAgICBkdXAKICAgIGludGMgNSAvLyAxMjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDYKICAgIGR1cAogICAgZXh0cmFjdCAxMDQgOAogICAgY292ZXIgNwogICAgcHVzaGludCAxMDQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIDwKICAgIGJ6IGRyYXdfYWZ0ZXJfaWZfZWxzZUA0MAogICAgdW5jb3ZlciAyCiAgICBwb3AKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICB1bmNvdmVyIDQKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIHVuY292ZXIgNAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODYKICAgIC8vIGZpcmVkICs9IHNlbGYuX3RyeV9maXJlKHJpZCkKICAgIGIgZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uX3RyeV9maXJlQDQyCgpkcmF3X2FmdGVyX2lmX2Vsc2VANDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTUKICAgIC8vIGRyYXdfaWQgPSByZWMuZHJhd19pZC5uYXRpdmUgKyAxCiAgICBkaWcgMTEKICAgIGR1cAogICAgaW50YyAxMSAvLyAxNDQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjE2LTYyMwogICAgLy8gYm94LnZhbHVlID0gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHBvdD1hcmM0LlVJbnQ2NChyZWMucG90Lm5hdGl2ZSAtIHJlYy5kcmlwLm5hdGl2ZSksCiAgICAvLyAgICAgcHJpemVfbG9ja2VkPWFyYzQuVUludDY0KHJlYy5kcmlwLm5hdGl2ZSksCiAgICAvLyAgICAgY29tbWl0X3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCArIENPTU1JVF9ERUxBWSksCiAgICAvLyAgICAgZHJhd19pZD1hcmM0LlVJbnQ2NChkcmF3X2lkKSwKICAgIC8vICAgICBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDEKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDIKICAgIGV4dHJhY3QgMzIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjYyMgogICAgLy8gbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDY0IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHJlYy5wb3QubmF0aXZlIC0gcmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBwcml6ZV9sb2NrZWQ9YXJjNC5VSW50NjQocmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBjb21taXRfcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kICsgQ09NTUlUX0RFTEFZKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgNAogICAgZXh0cmFjdCA5NiA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAxMTIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjIxCiAgICAvLyBsYXN0X3JhaW5fcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjE3CiAgICAvLyBwb3Q9YXJjNC5VSW50NjQocmVjLnBvdC5uYXRpdmUgLSByZWMuZHJpcC5uYXRpdmUpLAogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMQogICAgLQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjIwCiAgICAvLyBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHJlYy5wb3QubmF0aXZlIC0gcmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBwcml6ZV9sb2NrZWQ9YXJjNC5VSW50NjQocmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBjb21taXRfcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kICsgQ09NTUlUX0RFTEFZKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgOAogICAgZXh0cmFjdCAxNTIgOAogICAgZGlnIDkKICAgIGV4dHJhY3QgMTY4IDgKICAgIGRpZyAxMAogICAgZXh0cmFjdCAxNzYgOAogICAgZGlnIDExCiAgICBleHRyYWN0IDE4NCA4CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgMTkyIDgKICAgIHVuY292ZXIgMTMKICAgIGV4dHJhY3QgMjAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gY29tbWl0X3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCArIENPTU1JVF9ERUxBWSksCiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMiAvLyA4CiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHJlYy5wb3QubmF0aXZlIC0gcmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBwcml6ZV9sb2NrZWQ9YXJjNC5VSW50NjQocmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBjb21taXRfcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kICsgQ09NTUlUX0RFTEFZKSwKICAgIC8vICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgIGxhc3RfcmFpbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgZHVwCiAgICBjb3ZlciA2CiAgICBjb25jYXQKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgZGlnIDIwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjYyOAogICAgLy8gbW9kZT1hcmM0LlVJbnQ2NChPTkUpLAogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjYyNS02MzIKICAgIC8vIFJhaW5lZCgKICAgIC8vICAgICByYWluX2lkPWFyYzQuVUludDY0KHJhaW5faWQpLAogICAgLy8gICAgIGRyYXdfaWQ9YXJjNC5VSW50NjQoZHJhd19pZCksCiAgICAvLyAgICAgbW9kZT1hcmM0LlVJbnQ2NChPTkUpLAogICAgLy8gICAgIHBhaWQ9YXJjNC5VSW50NjQocmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICBzaGFyZT1hcmM0LlVJbnQ2NChyZWMuZHJpcC5uYXRpdmUpLAogICAgLy8gICAgIGNvdW50PWFyYzQuVUludDY0KHJlYy50aWNrZXRzLm5hdGl2ZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDgKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MjQtNjMzCiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgUmFpbmVkKAogICAgLy8gICAgICAgICByYWluX2lkPWFyYzQuVUludDY0KHJhaW5faWQpLAogICAgLy8gICAgICAgICBkcmF3X2lkPWFyYzQuVUludDY0KGRyYXdfaWQpLAogICAgLy8gICAgICAgICBtb2RlPWFyYzQuVUludDY0KE9ORSksCiAgICAvLyAgICAgICAgIHBhaWQ9YXJjNC5VSW50NjQocmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICAgICAgc2hhcmU9YXJjNC5VSW50NjQocmVjLmRyaXAubmF0aXZlKSwKICAgIC8vICAgICAgICAgY291bnQ9YXJjNC5VSW50NjQocmVjLnRpY2tldHMubmF0aXZlKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiUmFpbmVkKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MzQKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODYKICAgIC8vIGZpcmVkICs9IHNlbGYuX3RyeV9maXJlKHJpZCkKICAgIGIgZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uX3RyeV9maXJlQDQyCgpkcmF3X2FmdGVyX2ZvckA3OgogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozODcKICAgIC8vIHNlbGYuY3Vyc29yLnZhbHVlID0gKHN0YXJ0ICsgRFJBV19TQ0FOKSAlIG4KICAgIHB1c2hpbnQgNAogICAgKwogICAgdW5jb3ZlciAyCiAgICAlCiAgICBieXRlYyA1IC8vICJjdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzcxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGIgZHJhd19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uZHJhd0A4CgoKLy8gc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5yZXNvbHZlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVzb2x2ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM5MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTozOTcKICAgIC8vIGJveCA9IEJveChSYWluUmVjLCBrZXk9b3AuY29uY2F0KFJBSU5fUFJFRklYLCBvcC5pdG9iKHJhaW5faWQpKSkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHg3MgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Mzk4CiAgICAvLyBhc3NlcnQgYm94LCAiTm8gc3VjaCByYWluIgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBObyBzdWNoIHJhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVjID0gYm94LnZhbHVlLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gYXNzZXJ0IHJlYy5tb2RlLm5hdGl2ZSA9PSBPTkUsICJOb3QgYSBPTkUgcmFpbiIKICAgIGR1cAogICAgZXh0cmFjdCAxNjAgOAogICAgZGlnIDEKICAgIGludGMgNCAvLyAxNjAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYSBPTkUgcmFpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDAxCiAgICAvLyBhc3NlcnQgcmVjLnByaXplX2xvY2tlZC5uYXRpdmUgPiAwLCAiTm8gZHJhdyBpcyBvcGVuIgogICAgZGlnIDEKICAgIGludGMgOSAvLyAyMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBkcmF3IGlzIG9wZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQwMgogICAgLy8gYXNzZXJ0IEdsb2JhbC5yb3VuZCA+IHJlYy5jb21taXRfcm91bmQubmF0aXZlLCAiVG9vIGVhcmx5IgogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMwogICAgcHVzaGludCAyMDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIFRvbyBlYXJseQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDAzCiAgICAvLyBhc3NlcnQgR2xvYmFsLnJvdW5kIDw9IHJlYy5jb21taXRfcm91bmQubmF0aXZlICsgU0VFRF9XSU5ET1csICJXaW5kb3cgY2xvc2VkOyBhYmFuZG9uIgogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgcHVzaGludCA4MDAKICAgICsKICAgIDw9CiAgICBhc3NlcnQgLy8gV2luZG93IGNsb3NlZDsgYWJhbmRvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDA1CiAgICAvLyBzZWVkID0gb3AuQmxvY2suYmxrX3NlZWQocmVjLmNvbW1pdF9yb3VuZC5uYXRpdmUpCiAgICBibG9jayBCbGtTZWVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MDYKICAgIC8vIGluZGV4OiBVSW50NjQgPSBvcC5leHRyYWN0X3VpbnQ2NChzZWVkLCAwKSAlIHJlYy50aWNrZXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgZXh0cmFjdCAxMzYgOAogICAgZGlnIDQKICAgIGludGMgOCAvLyAxMzYKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgICUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQwOQogICAgLy8ga2V5PW9wLmNvbmNhdChJTkRFWF9QUkVGSVgsIG9wLmNvbmNhdChvcC5pdG9iKHJhaW5faWQpLCBvcC5pdG9iKGluZGV4KSkpLAogICAgaXRvYgogICAgZGlnIDYKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDZlCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gYXNzZXJ0IHdpbm5lcl9ib3gsICJNaXNzaW5nIHRpY2tldCBpbmRleCIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTWlzc2luZyB0aWNrZXQgaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gd2lubmVyID0gd2lubmVyX2JveC52YWx1ZS5jb3B5KCkKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Njc2CiAgICAvLyByZXR1cm4gb3AuY29uY2F0KFRJQ0tFVF9QUkVGSVgsIG9wLmNvbmNhdChvcC5pdG9iKHJhaW5faWQpLCB3aG8uYnl0ZXMpKQogICAgdW5jb3ZlciA3CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gMHg3NAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MTQKICAgIC8vIGFzc2VydCB0aWNrZXRfYm94LCAiTWlzc2luZyB0aWNrZXQiCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIE1pc3NpbmcgdGlja2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MTUKICAgIC8vIHRpY2tldCA9IHRpY2tldF9ib3gudmFsdWUuY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDE3CiAgICAvLyBjcmVkaXQ9YXJjNC5VSW50NjQodGlja2V0LmNyZWRpdC5uYXRpdmUgKyByZWMucHJpemVfbG9ja2VkLm5hdGl2ZSksCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciA1CiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MTYtNDE4CiAgICAvLyB0aWNrZXRfYm94LnZhbHVlID0gdGlja2V0Ll9yZXBsYWNlKAogICAgLy8gICAgIGNyZWRpdD1hcmM0LlVJbnQ2NCh0aWNrZXQuY3JlZGl0Lm5hdGl2ZSArIHJlYy5wcml6ZV9sb2NrZWQubmF0aXZlKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICBleHRyYWN0IDggOAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDE2IDgKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MTktNDIzCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcHJpemVfbG9ja2VkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGNvbW1pdF9yb3VuZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDMKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDQKICAgIGV4dHJhY3QgMzIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIGRpZyA1CiAgICBleHRyYWN0IDY0IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MTktNDIzCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcHJpemVfbG9ja2VkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGNvbW1pdF9yb3VuZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDYKICAgIGV4dHJhY3QgOTYgOAogICAgZGlnIDcKICAgIGV4dHJhY3QgMTA0IDgKICAgIGRpZyA4CiAgICBleHRyYWN0IDExMiA4CiAgICBkaWcgOQogICAgZXh0cmFjdCAxMjAgOAogICAgZGlnIDEwCiAgICBleHRyYWN0IDEyOCA4CiAgICBkaWcgMTEKICAgIGV4dHJhY3QgMTQ0IDgKICAgIGRpZyAxMgogICAgZXh0cmFjdCAxNTIgOAogICAgZGlnIDEzCiAgICBleHRyYWN0IDE2OCA4CiAgICBkaWcgMTQKICAgIGV4dHJhY3QgMTc2IDgKICAgIGRpZyAxNQogICAgZXh0cmFjdCAxODQgOAogICAgZGlnIDE2CiAgICBleHRyYWN0IDE5MiA4CiAgICB1bmNvdmVyIDE3CiAgICBleHRyYWN0IDIwMCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MjEKICAgIC8vIGNvbW1pdF9yb3VuZD1hcmM0LlVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MTktNDIzCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcHJpemVfbG9ja2VkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGNvbW1pdF9yb3VuZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNQogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6MzkwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmFiYW5kb25bcm91dGluZ10oKSAtPiB2b2lkOgphYmFuZG9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQyOQogICAgLy8gYm94ID0gQm94KFJhaW5SZWMsIGtleT1vcC5jb25jYXQoUkFJTl9QUkVGSVgsIG9wLml0b2IocmFpbl9pZCkpKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDcyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gYXNzZXJ0IGJveCwgIk5vIHN1Y2ggcmFpbiIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm8gc3VjaCByYWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MzEKICAgIC8vIHJlYyA9IGJveC52YWx1ZS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MzIKICAgIC8vIGFzc2VydCByZWMubW9kZS5uYXRpdmUgPT0gT05FLCAiTm90IGEgT05FIHJhaW4iCiAgICBkdXAKICAgIGV4dHJhY3QgMTYwIDgKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMTYwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGEgT05FIHJhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gYXNzZXJ0IHJlYy5wcml6ZV9sb2NrZWQubmF0aXZlID4gMCwgIk5vIGRyYXcgaXMgb3BlbiIKICAgIGRpZyAxCiAgICBpbnRjIDkgLy8gMjE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZHJhdyBpcyBvcGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MzQKICAgIC8vIGFzc2VydCBHbG9iYWwucm91bmQgPiByZWMuY29tbWl0X3JvdW5kLm5hdGl2ZSArIFNFRURfV0lORE9XLCAiV2luZG93IHN0aWxsIG9wZW4iCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAzCiAgICBwdXNoaW50IDIwOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgODAwCiAgICArCiAgICA+CiAgICBhc3NlcnQgLy8gV2luZG93IHN0aWxsIG9wZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzNQogICAgLy8gcG90OiBVSW50NjQgPSByZWMucG90Lm5hdGl2ZSArIHJlYy5wcml6ZV9sb2NrZWQubmF0aXZlCiAgICBkaWcgMgogICAgaW50YyA1IC8vIDEyOAogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzNi00NDEKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90KSwKICAgIC8vICAgICBwcml6ZV9sb2NrZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgY29tbWl0X3JvdW5kPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMgogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMwogICAgZXh0cmFjdCAzMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDQwCiAgICAvLyBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzNi00NDEKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90KSwKICAgIC8vICAgICBwcml6ZV9sb2NrZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgY29tbWl0X3JvdW5kPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgNQogICAgZXh0cmFjdCA5NiA4CiAgICBkaWcgNgogICAgZXh0cmFjdCAxMDQgOAogICAgZGlnIDcKICAgIGV4dHJhY3QgMTEyIDgKICAgIGRpZyA4CiAgICBleHRyYWN0IDEyMCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MzcKICAgIC8vIHBvdD1hcmM0LlVJbnQ2NChwb3QpLAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0MzYtNDQxCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgcG90PWFyYzQuVUludDY0KHBvdCksCiAgICAvLyAgICAgcHJpemVfbG9ja2VkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGNvbW1pdF9yb3VuZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKQogICAgZGlnIDkKICAgIGV4dHJhY3QgMTM2IDgKICAgIGRpZyAxMAogICAgZXh0cmFjdCAxNDQgOAogICAgZGlnIDExCiAgICBleHRyYWN0IDE1MiA4CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgMTY4IDgKICAgIGRpZyAxMwogICAgZXh0cmFjdCAxNzYgOAogICAgZGlnIDE0CiAgICBleHRyYWN0IDE4NCA4CiAgICBkaWcgMTUKICAgIGV4dHJhY3QgMTkyIDgKICAgIHVuY292ZXIgMTYKICAgIGV4dHJhY3QgMjAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gY29tbWl0X3JvdW5kPWFyYzQuVUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQzNi00NDEKICAgIC8vIGJveC52YWx1ZSA9IHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICBwb3Q9YXJjNC5VSW50NjQocG90KSwKICAgIC8vICAgICBwcml6ZV9sb2NrZWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgY29tbWl0X3JvdW5kPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApCiAgICB1bmNvdmVyIDE2CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5jbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNsYWltOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NTIKICAgIC8vIGJveCA9IEJveChSYWluUmVjLCBrZXk9b3AuY29uY2F0KFJBSU5fUFJFRklYLCBvcC5pdG9iKHJhaW5faWQpKSkKICAgIGl0b2IKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweDcyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDUzCiAgICAvLyBpZiBub3QgYm94OgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY2xhaW1fYWZ0ZXJfaWZfZWxzZUAzCiAgICBwb3BuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ1NAogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNsYWltX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5jbGFpbUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NTUKICAgIC8vIHJlYyA9IGJveC52YWx1ZS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDU2CiAgICAvLyB0aWNrZXRfYm94ID0gQm94KFRpY2tldCwga2V5PXNlbGYuX3RpY2tldF9rZXkocmFpbl9pZCwgVHhuLnNlbmRlcikpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NzYKICAgIC8vIHJldHVybiBvcC5jb25jYXQoVElDS0VUX1BSRUZJWCwgb3AuY29uY2F0KG9wLml0b2IocmFpbl9pZCksIHdoby5ieXRlcykpCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDc0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDU3CiAgICAvLyBpZiBub3QgdGlja2V0X2JveDoKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGNsYWltX2FmdGVyX2lmX2Vsc2VANQogICAgcG9wbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NDQKICAgIC8vIEBhYmltZXRob2QoKQogICAgYiBjbGFpbV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uY2xhaW1AMTcKCmNsYWltX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ1OQogICAgLy8gdGlja2V0ID0gdGlja2V0X2JveC52YWx1ZS5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDYxCiAgICAvLyBpZiByZWMubW9kZS5uYXRpdmUgPT0gV0FWRToKICAgIGR1cAogICAgaW50YyA0IC8vIDE2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogY2xhaW1fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NjIKICAgIC8vIHJlYywgdGlja2V0ID0gc2VsZi5fc2V0dGxlX3dhdmUocmVjLCB0aWNrZXQpCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NldHRsZV93YXZlCiAgICBwb3BuIDIKICAgIGNvdmVyIDIKCmNsYWltX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ2NQogICAgLy8gaWYgcmVjLm1vZGUubmF0aXZlID09IFNQTElUOgogICAgZHVwbiAyCiAgICBleHRyYWN0IDE2MCA4CiAgICBjb3ZlciA0CiAgICBpbnRjIDQgLy8gMTYwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IGNsYWltX2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDY2CiAgICAvLyBvd2VkID0gcmVjLmN1bXVsYXRpdmUubmF0aXZlIC0gdGlja2V0LmNyZWRpdC5uYXRpdmUKICAgIGR1cG4gMgogICAgZXh0cmFjdCAxNTIgOAogICAgYnVyeSA4CiAgICBpbnRjIDcgLy8gMTUyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NjcKICAgIC8vIGlmIG93ZWQgPiAwOgogICAgYnogY2xhaW1fYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDY4CiAgICAvLyB0aWNrZXQgPSB0aWNrZXQuX3JlcGxhY2UoY3JlZGl0PWFyYzQuVUludDY0KHJlYy5jdW11bGF0aXZlLm5hdGl2ZSkpCiAgICB1bmNvdmVyIDMKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgOAogICAgZGlnIDgKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDMKCmNsYWltX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NzQKICAgIC8vIGlmIG93ZWQgPT0gMDoKICAgIGR1cAogICAgYm56IGNsYWltX2FmdGVyX2lmX2Vsc2VAMTYKICAgIHBvcAogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gdGlja2V0X2JveC52YWx1ZSA9IHRpY2tldC5jb3B5KCkKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDc2CiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UobGFiZWw9cmVjLmxhYmVsLmNvcHkoKSkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMgogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIKICAgIGRpZyAzCiAgICBleHRyYWN0IDk2IDgKICAgIGRpZyA0CiAgICBleHRyYWN0IDEwNCA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAxMTIgOAogICAgZGlnIDYKICAgIGV4dHJhY3QgMTIwIDgKICAgIGRpZyA3CiAgICBleHRyYWN0IDEyOCA4CiAgICBkaWcgOAogICAgZXh0cmFjdCAxMzYgOAogICAgZGlnIDkKICAgIGV4dHJhY3QgMTQ0IDgKICAgIGRpZyAxMAogICAgZXh0cmFjdCAxNTIgOAogICAgZGlnIDExCiAgICBleHRyYWN0IDE2OCA4CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgMTc2IDgKICAgIGRpZyAxMwogICAgZXh0cmFjdCAxODQgOAogICAgZGlnIDE0CiAgICBleHRyYWN0IDE5MiA4CiAgICBkaWcgMTUKICAgIGV4dHJhY3QgMjAwIDgKICAgIGRpZyAxNgogICAgZXh0cmFjdCAyMDggOAogICAgdW5jb3ZlciAxNwogICAgZXh0cmFjdCAyMTYgOAogICAgdW5jb3ZlciAxNwogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGIgY2xhaW1fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmNsYWltQDE3CgpjbGFpbV9hZnRlcl9pZl9lbHNlQDE2OgogICAgdW5jb3ZlciA0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gc2VsZi5fcmVxdWlyZV9nYXRlKHJlYywgZ2F0ZV9hc3NldCkKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiBfcmVxdWlyZV9nYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0ODAKICAgIC8vIHRpY2tldF9ib3gudmFsdWUgPSB0aWNrZXQuY29weSgpCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDgxCiAgICAvLyBib3gudmFsdWUgPSByZWMuX3JlcGxhY2UobGFiZWw9cmVjLmxhYmVsLmNvcHkoKSkKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMgogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIKICAgIGRpZyAzCiAgICBleHRyYWN0IDk2IDgKICAgIGRpZyA0CiAgICBleHRyYWN0IDEwNCA4CiAgICBkaWcgNQogICAgZXh0cmFjdCAxMTIgOAogICAgZGlnIDYKICAgIGV4dHJhY3QgMTIwIDgKICAgIGRpZyA3CiAgICBleHRyYWN0IDEyOCA4CiAgICBkaWcgOAogICAgZXh0cmFjdCAxMzYgOAogICAgZGlnIDkKICAgIGV4dHJhY3QgMTQ0IDgKICAgIGRpZyAxMAogICAgZXh0cmFjdCAxNTIgOAogICAgZGlnIDExCiAgICBleHRyYWN0IDE2MCA4CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgMTY4IDgKICAgIGRpZyAxMwogICAgZXh0cmFjdCAxNzYgOAogICAgZGlnIDE0CiAgICBleHRyYWN0IDE4NCA4CiAgICBkaWcgMTUKICAgIGV4dHJhY3QgMTkyIDgKICAgIGRpZyAxNgogICAgZXh0cmFjdCAyMDAgOAogICAgZGlnIDE3CiAgICBleHRyYWN0IDIwOCA4CiAgICBkaWcgMTgKICAgIGV4dHJhY3QgMjE2IDgKICAgIHVuY292ZXIgMTgKICAgIHVuY292ZXIgMTgKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHB1c2hpbnQgOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5fcGF5KHJlYy5wcml6ZV9hc3NldC5uYXRpdmUsIG93ZWQpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2ODAKICAgIC8vIGlmIGFzc2V0ID09IDA6CiAgICBibnogY2xhaW1fZWxzZV9ib2R5QDIwCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY4MQogICAgLy8gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD1hbW91bnQsIGZlZT0wKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0NDQKICAgIC8vIEBhYmltZXRob2QoKQogICAgYiBjbGFpbV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uY2xhaW1AMTcKCmNsYWltX2Vsc2VfYm9keUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY4MwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIuaXNfb3B0ZWRfaW4oQXNzZXQoYXNzZXQpKSwgIk9wdCBpbiB0byB0aGUgcHJpemUgYXNzZXQgZmlyc3QiCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBPcHQgaW4gdG8gdGhlIHByaXplIGFzc2V0IGZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2ODQtNjg5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1Bc3NldChhc3NldCksCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6Njg2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY4NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2ODgKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2ODQtNjg5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1Bc3NldChhc3NldCksCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBiIGNsYWltX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5jbGFpbUAxNwoKY2xhaW1fZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDcwCiAgICAvLyBvd2VkID0gdGlja2V0LmNyZWRpdC5uYXRpdmUKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDcxCiAgICAvLyBpZiBvd2VkID4gMDoKICAgIGJ6IGNsYWltX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ3MgogICAgLy8gdGlja2V0ID0gdGlja2V0Ll9yZXBsYWNlKGNyZWRpdD1hcmM0LlVJbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgOAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDMKICAgIGIgY2xhaW1fYWZ0ZXJfaWZfZWxzZUAxNAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5yYWluLmNvbnRyYWN0LlJhaW4uYWxsb2NhdGlvbl9vZltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFsbG9jYXRpb25fb2Y6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0ODgKICAgIC8vIGJveCA9IEJveChSYWluUmVjLCBrZXk9b3AuY29uY2F0KFJBSU5fUFJFRklYLCBvcC5pdG9iKHJhaW5faWQpKSkKICAgIGl0b2IKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweDcyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDg5CiAgICAvLyBpZiBub3QgYm94OgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYWxsb2NhdGlvbl9vZl9hZnRlcl9pZl9lbHNlQDMKICAgIHBvcG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDkwCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgphbGxvY2F0aW9uX29mX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5hbGxvY2F0aW9uX29mQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFsbG9jYXRpb25fb2ZfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDkxCiAgICAvLyByZWMgPSBib3gudmFsdWUuY29weSgpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NzYKICAgIC8vIHJldHVybiBvcC5jb25jYXQoVElDS0VUX1BSRUZJWCwgb3AuY29uY2F0KG9wLml0b2IocmFpbl9pZCksIHdoby5ieXRlcykpCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gMHg3NAogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ5MwogICAgLy8gaWYgbm90IHRpY2tldF9ib3g6CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhbGxvY2F0aW9uX29mX2FmdGVyX2lmX2Vsc2VANQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0OTQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ4NQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBhbGxvY2F0aW9uX29mX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5hbGxvY2F0aW9uX29mQDEzCgphbGxvY2F0aW9uX29mX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ5NQogICAgLy8gdGlja2V0ID0gdGlja2V0X2JveC52YWx1ZS5jb3B5KCkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjQ5NgogICAgLy8gaWYgcmVjLm1vZGUubmF0aXZlID09IFNQTElUOgogICAgZGlnIDMKICAgIGludGMgNCAvLyAxNjAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMgogICAgYm56IGFsbG9jYXRpb25fb2ZfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo0OTcKICAgIC8vIG93ZWRfc3BsaXQ6IFVJbnQ2NCA9IHJlYy5jdW11bGF0aXZlLm5hdGl2ZSAtIHRpY2tldC5jcmVkaXQubmF0aXZlCiAgICBkaWcgMwogICAgaW50YyA3IC8vIDE1MgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGFsbG9jYXRpb25fb2ZfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmFsbG9jYXRpb25fb2ZAMTMKCmFsbG9jYXRpb25fb2ZfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDk5CiAgICAvLyBvd2VkOiBVSW50NjQgPSB0aWNrZXQuY3JlZGl0Lm5hdGl2ZQogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTAwCiAgICAvLyBpZiByZWMubW9kZS5uYXRpdmUgPT0gV0FWRToKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGFsbG9jYXRpb25fb2ZfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTAyCiAgICAvLyB0aWNrZXQud2F2ZV9pZC5uYXRpdmUgPT0gcmVjLmxhc3Rfd2F2ZV9pZC5uYXRpdmUKICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA1CiAgICBpbnRjIDYgLy8gMTkyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MDItNTAzCiAgICAvLyB0aWNrZXQud2F2ZV9pZC5uYXRpdmUgPT0gcmVjLmxhc3Rfd2F2ZV9pZC5uYXRpdmUKICAgIC8vIGFuZCB0aWNrZXQuc2V0dGxlZF9pZC5uYXRpdmUgIT0gcmVjLmxhc3Rfd2F2ZV9pZC5uYXRpdmUKICAgIGJ6IGFsbG9jYXRpb25fb2ZfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTAzCiAgICAvLyBhbmQgdGlja2V0LnNldHRsZWRfaWQubmF0aXZlICE9IHJlYy5sYXN0X3dhdmVfaWQubmF0aXZlCiAgICBkaWcgMwogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTAyLTUwMwogICAgLy8gdGlja2V0LndhdmVfaWQubmF0aXZlID09IHJlYy5sYXN0X3dhdmVfaWQubmF0aXZlCiAgICAvLyBhbmQgdGlja2V0LnNldHRsZWRfaWQubmF0aXZlICE9IHJlYy5sYXN0X3dhdmVfaWQubmF0aXZlCiAgICBieiBhbGxvY2F0aW9uX29mX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjUwNQogICAgLy8gb3dlZCArPSByZWMubGFzdF9zaGFyZS5uYXRpdmUKICAgIGRpZyA0CiAgICBpbnRjIDEyIC8vIDE4NAogICAgZXh0cmFjdF91aW50NjQKICAgICsKCmFsbG9jYXRpb25fb2ZfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NDg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGFsbG9jYXRpb25fb2ZfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLmFsbG9jYXRpb25fb2ZAMTMKCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLnJhaW5fb2Zbcm91dGluZ10oKSAtPiB2b2lkOgpyYWluX29mOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MTEKICAgIC8vIGJveCA9IEJveChSYWluUmVjLCBrZXk9b3AuY29uY2F0KFJBSU5fUFJFRklYLCBvcC5pdG9iKHJhaW5faWQpKSkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHg3MgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MTIKICAgIC8vIGFzc2VydCBib3gsICJObyBzdWNoIHJhaW4iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIE5vIHN1Y2ggcmFpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NTEzCiAgICAvLyByZXR1cm4gYm94LnZhbHVlLmNvcHkoKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo1MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLl9zZXR0bGVfd2F2ZShyZWM6IGJ5dGVzLCB0aWNrZXQ6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIGJ5dGVzLCBieXRlczoKX3NldHRsZV93YXZlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjM2LTYzNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfc2V0dGxlX3dhdmUoc2VsZiwgcmVjOiBSYWluUmVjLCB0aWNrZXQ6IFRpY2tldCkgLT4gdHVwbGVbUmFpblJlYywgVGlja2V0XToKICAgIHByb3RvIDIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjM4CiAgICAvLyBpZiB0aWNrZXQud2F2ZV9pZC5uYXRpdmUgIT0gcmVjLmxhc3Rfd2F2ZV9pZC5uYXRpdmU6CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgOCA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDE5MiA4CiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGMgNiAvLyAxOTIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgICE9CiAgICBieiBfc2V0dGxlX3dhdmVfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2MzkKICAgIC8vIHJldHVybiByZWMuY29weSgpLCB0aWNrZXQuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZHVwMgogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNgogICAgcmV0c3ViCgpfc2V0dGxlX3dhdmVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjQwCiAgICAvLyBpZiB0aWNrZXQuc2V0dGxlZF9pZC5uYXRpdmUgPT0gcmVjLmxhc3Rfd2F2ZV9pZC5uYXRpdmU6CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgYnogX3NldHRsZV93YXZlX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjQxCiAgICAvLyByZXR1cm4gcmVjLmNvcHkoKSwgdGlja2V0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGR1cDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICByZXRzdWIKCl9zZXR0bGVfd2F2ZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDIKICAgIC8vIHVuY2xhaW1lZCA9IHJlYy53YXZlX3VuY2xhaW1lZC5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyMDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY0MwogICAgLy8gaWYgdW5jbGFpbWVkID4gMDoKICAgIGJ6IF9zZXR0bGVfd2F2ZV9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gdW5jbGFpbWVkIC09IDEKICAgIGludGNfMSAvLyAxCiAgICAtCgpfc2V0dGxlX3dhdmVfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjQ1LTY0OAogICAgLy8gcmV0dXJuIHJlYy5fcmVwbGFjZSgKICAgIC8vICAgICB3YXZlX3VuY2xhaW1lZD1hcmM0LlVJbnQ2NCh1bmNsYWltZWQpLAogICAgLy8gICAgIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICAvLyApLCB0aWNrZXQuX3JlcGxhY2UoCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMCAzMgogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDcKICAgIC8vIGxhYmVsPXJlYy5sYWJlbC5jb3B5KCksCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY0NS02NDgKICAgIC8vIHJldHVybiByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgd2F2ZV91bmNsYWltZWQ9YXJjNC5VSW50NjQodW5jbGFpbWVkKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKSwgdGlja2V0Ll9yZXBsYWNlKAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDk2IDgKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAxMDQgOAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDExMiA4CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMTIwIDgKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAxMjggOAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDEzNiA4CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMTQ0IDgKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAxNTIgOAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDE2MCA4CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMTY4IDgKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAxNzYgOAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDE4NCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDYKICAgIC8vIHdhdmVfdW5jbGFpbWVkPWFyYzQuVUludDY0KHVuY2xhaW1lZCksCiAgICB1bmNvdmVyIDE1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDUtNjQ4CiAgICAvLyByZXR1cm4gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHdhdmVfdW5jbGFpbWVkPWFyYzQuVUludDY0KHVuY2xhaW1lZCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICksIHRpY2tldC5fcmVwbGFjZSgKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyMDggOAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIxNiA4CiAgICB1bmNvdmVyIDE3CiAgICB1bmNvdmVyIDE3CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTYKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDkKICAgIC8vIGNyZWRpdD1hcmM0LlVJbnQ2NCh0aWNrZXQuY3JlZGl0Lm5hdGl2ZSArIHJlYy5sYXN0X3NoYXJlLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDUtNjQ4CiAgICAvLyByZXR1cm4gcmVjLl9yZXBsYWNlKAogICAgLy8gICAgIHdhdmVfdW5jbGFpbWVkPWFyYzQuVUludDY0KHVuY2xhaW1lZCksCiAgICAvLyAgICAgbGFiZWw9cmVjLmxhYmVsLmNvcHkoKSwKICAgIC8vICksIHRpY2tldC5fcmVwbGFjZSgKICAgIGludGMgMTIgLy8gMTg0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NDkKICAgIC8vIGNyZWRpdD1hcmM0LlVJbnQ2NCh0aWNrZXQuY3JlZGl0Lm5hdGl2ZSArIHJlYy5sYXN0X3NoYXJlLm5hdGl2ZSksCiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjQ4LTY1MQogICAgLy8gKSwgdGlja2V0Ll9yZXBsYWNlKAogICAgLy8gICAgIGNyZWRpdD1hcmM0LlVJbnQ2NCh0aWNrZXQuY3JlZGl0Lm5hdGl2ZSArIHJlYy5sYXN0X3NoYXJlLm5hdGl2ZSksCiAgICAvLyAgICAgc2V0dGxlZF9pZD1yZWMubGFzdF93YXZlX2lkLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY0NS02NTEKICAgIC8vIHJldHVybiByZWMuX3JlcGxhY2UoCiAgICAvLyAgICAgd2F2ZV91bmNsYWltZWQ9YXJjNC5VSW50NjQodW5jbGFpbWVkKSwKICAgIC8vICAgICBsYWJlbD1yZWMubGFiZWwuY29weSgpLAogICAgLy8gKSwgdGlja2V0Ll9yZXBsYWNlKAogICAgLy8gICAgIGNyZWRpdD1hcmM0LlVJbnQ2NCh0aWNrZXQuY3JlZGl0Lm5hdGl2ZSArIHJlYy5sYXN0X3NoYXJlLm5hdGl2ZSksCiAgICAvLyAgICAgc2V0dGxlZF9pZD1yZWMubGFzdF93YXZlX2lkLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucmFpbi5jb250cmFjdC5SYWluLl9yZXF1aXJlX2dhdGUocmVjOiBieXRlcywgZ2F0ZV9hc3NldDogdWludDY0KSAtPiBieXRlczoKX3JlcXVpcmVfZ2F0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY1My02NTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlcXVpcmVfZ2F0ZShzZWxmLCByZWM6IFJhaW5SZWMsIGdhdGVfYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NTUKICAgIC8vIGdhdGUgPSByZWMuZ2F0ZV9jcmVhdG9yLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDMyIDMyCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gaWYgZ2F0ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogX3JlcXVpcmVfZ2F0ZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY1NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIuaXNfb3B0ZWRfaW4oZ2F0ZV9hc3NldCksICJIb2xkIGEgdG9rZW4gZnJvbSB0aGUgY29sbGVjdGlvbiIKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBIb2xkIGEgdG9rZW4gZnJvbSB0aGUgY29sbGVjdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjU4CiAgICAvLyBhc3NlcnQgZ2F0ZV9hc3NldC5iYWxhbmNlKFR4bi5zZW5kZXIpID4gMCwgIkhvbGQgYSB0b2tlbiBmcm9tIHRoZSBjb2xsZWN0aW9uIgogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIGFzc2VydCAvLyBIb2xkIGEgdG9rZW4gZnJvbSB0aGUgY29sbGVjdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjU5CiAgICAvLyBhc3NlcnQgZ2F0ZV9hc3NldC5jcmVhdG9yID09IGdhdGUsICJUaGF0IGFzc2V0IGlzIG5vdCBmcm9tIHRoZSBjb2xsZWN0aW9uIgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgID09CiAgICBhc3NlcnQgLy8gVGhhdCBhc3NldCBpcyBub3QgZnJvbSB0aGUgY29sbGVjdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjYwCiAgICAvLyBhc3NlcnQgZ2F0ZV9hc3NldC5pZCAhPSByZWMucHJpemVfYXNzZXQubmF0aXZlLCAiVGhlIHByaXplIGlzIG5vdCBhIHRpY2tldCIKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5NgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgIT0KICAgIGFzc2VydCAvLyBUaGUgcHJpemUgaXMgbm90IGEgdGlja2V0CgpfcmVxdWlyZV9nYXRlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnJhaW4uY29udHJhY3QuUmFpbi5fcmVxdWlyZV9tYnIocGF5bWVudDogdWludDY0LCBtaW5pbXVtOiB1aW50NjQpIC0+IHZvaWQ6Cl9yZXF1aXJlX21icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY2Mi02NjMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlcXVpcmVfbWJyKHNlbGYsIHBheW1lbnQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLCBtaW5pbXVtOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY2NQogICAgLy8gcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY2NC02NjYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiTUJSIHBheW1lbnQgbXVzdCBmdW5kIHRoZSBhcHAgYWNjb3VudCIKICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IGZ1bmQgdGhlIGFwcCBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NjcKICAgIC8vIGFzc2VydCBwYXltZW50LnNlbmRlciA9PSBUeG4uc2VuZGVyLCAiTUJSIHBheW1lbnQgbXVzdCBjb21lIGZyb20gdGhlIGNhbGxlciIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIE1CUiBwYXltZW50IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY2OAogICAgLy8gYXNzZXJ0IHBheW1lbnQucmVrZXlfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIk1CUiBwYXltZW50IG11c3Qgbm90IHJla2V5IgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBub3QgcmVrZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yYWluL2NvbnRyYWN0LnB5OjY3MAogICAgLy8gcGF5bWVudC5jbG9zZV9yZW1haW5kZXJfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmFpbi9jb250cmFjdC5weTo2NjktNjcxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHBheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJNQlIgcGF5bWVudCBtdXN0IG5vdCBjbG9zZSIKICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IG5vdCBjbG9zZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JhaW4vY29udHJhY3QucHk6NjcyCiAgICAvLyBhc3NlcnQgcGF5bWVudC5hbW91bnQgPj0gbWluaW11bSwgIk1CUiBwYXltZW50IHRvbyBzbWFsbCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgdG9vIHNtYWxsCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "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", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [ { "name": "Rained", "args": [ { "type": "uint64", "name": "rain_id" }, { "type": "uint64", "name": "draw_id" }, { "type": "uint64", "name": "mode" }, { "type": "uint64", "name": "paid" }, { "type": "uint64", "name": "share" }, { "type": "uint64", "name": "count" } ], "desc": "Emitted when a rain actually falls (or a lottery locks)." } ], "templateVariables": {} }