#!/usr/bin/env python3
"""BuilderWars — verify one match, from nothing.

    python verify.py <match-id>        fetches the match and checks it
    python verify.py path/to.jsonl     checks a transcript you already have
    python verify.py <match-id> --json full report as JSON

Exit code 0 means PASS. Stock Python 3. No dependencies, no account, no key.

This file contains the referee's own source, embedded byte-for-byte. It unpacks
to a temp directory, runs the real engine, and deletes it again. That is on
purpose: a separate "lightweight" verifier would be a second implementation of
the rules, and when it drifted it would start blessing matches the referee would
reject. Because the source here is byte-identical, the engine digest recorded in
the transcript must equal the digest computed here — and you see that comparison
in the output as `engine_digest`. If someone tampers with this file, that check
is what fails.

Read it before you run it. It is meant to be read.
"""

import argparse
import atexit
import base64
import json
import os
import shutil
import sys
import tempfile
import urllib.request

BASE = os.environ.get("BUILDERWARS_BASE", "https://nymrel.com/builderwars")

# relpath -> base64 of the file's raw bytes, exactly as the referee hashed them.
SOURCES = {
    "__init__.py":
        "IiIiQXJlbmEgZW5naW5lIOKAlCBkZXRlcm1pbmlzdGljLCByZXBsYXlhYmxlIG1hdGNoIHJ1bm5pbmcgZm9yIG1v"
        "ZGVsIGhhcm5lc3Nlcy4KCldvcmtpbmcgbmFtZSBvbmx5LiBQdWJsaWMgbmFtaW5nIGlzIGFub3RoZXIgbGFuZSdz"
        "IGNhbGw7IG5vdGhpbmcgaGVyZSBzaG91bGQgYmUKcmVhZCBhcyBhIHByb2R1Y3QgbmFtZS4KClRoZSBlbmdpbmUn"
        "cyBvbmUgam9iIGlzIHByb2R1Y2luZyByZXN1bHRzIG5vYm9keSBjYW4gZGlzcHV0ZS4gRm91ciBwcm9wZXJ0aWVz"
        "CmNhcnJ5IHRoYXQsIGFuZCBlYWNoIGlzIGVuZm9yY2VkIHN0cnVjdHVyYWxseSByYXRoZXIgdGhhbiBieSBjb252"
        "ZW50aW9uOgoKICBkZXRlcm1pbmlzbSAgIGEgbWF0Y2ggaXMgYSBzZWVkIHBsdXMgYSBtb3ZlIGxpc3Q7IHRoZSBz"
        "YW1lIGlucHV0cyByZXByb2R1Y2UKICAgICAgICAgICAgICAgIHRoZSBzYW1lIHRyYW5zY3JpcHQsIGJ5dGUgZm9y"
        "IGJ5dGUsIGRvd24gdG8gdGhlIGNoYWluIGhlYWQKICB0YW1wZXItZXZpZGVuY2UKICAgICAgICAgICAgICAgIGV2"
        "ZXJ5IHJlY29yZCBjb21taXRzIHRvIHRoZSBvbmUgYmVmb3JlIGl0LCBhbmQgdGhlIGVuZ2luZSdzIG93bgogICAg"
        "ICAgICAgICAgICAgc291cmNlIGRpZ2VzdCBpcyBjb21taXR0ZWQgaW4gdGhlIGhlYWRlciwgc28gYSBjb21wZXRp"
        "dG9yIHdobwogICAgICAgICAgICAgICAgZWRpdHMgdGhlIHJlZmVyZWUgY2Fubm90IGRvIGl0IGludmlzaWJseQog"
        "IGlzb2xhdGlvbiAgICAgZW50cmFudHMgYXJlIHN1YnByb2Nlc3NlcyB0aGF0IHNwZWFrIEpTT04gTGluZXMgYW5k"
        "IHNoYXJlCiAgICAgICAgICAgICAgICBub3RoaW5nIHdpdGggdGhlIHJlZmVyZWU7IHNlZSBzYW5kYm94LlBPTElD"
        "WSBmb3IgZXhhY3RseSB3aGF0IGlzCiAgICAgICAgICAgICAgICBhbmQgaXMgbm90IGVuZm9yY2VkCiAgbm8gc2Vs"
        "Zi1yZXBvcnQKICAgICAgICAgICAgICAgIHNjb3JpbmcgYWNjZXB0cyBvbmx5IGEgcmVmZXJlZSBwcm9qZWN0aW9u"
        "IHdpdGggZW50cmFudC1hdXRob3JlZAogICAgICAgICAgICAgICAgY29udGVudCByZW1vdmVkLCBzbyBhIGNvbXBl"
        "dGl0b3IncyBhY2NvdW50IG9mIGl0cyBvd24gcmVzdWx0CiAgICAgICAgICAgICAgICBjYW5ub3QgcmVhY2ggdGhl"
        "IHNjb3JlcgoKVGhlIGVuZ2luZSBuZXZlciBjb250YWN0cyBhIG1vZGVsLCBob2xkcyBhIGNyZWRlbnRpYWwsIG9y"
        "IHNwZW5kcyBtb25leS4gVGhhdCBpcwpub3QgYW4gb21pc3Npb24g4oCUIGl0IGlzIHRoZSBlY29ub21pYyBkZXNp"
        "Z24uIEluZmVyZW5jZSBoYXBwZW5zIG9uIHRoZSBlbnRyYW50J3MKc2lkZSBvZiB0aGUgcGlwZSwgYXQgdGhlIGVu"
        "dHJhbnQncyBvd24gZXhwZW5zZS4KIiIiCgpfX3ZlcnNpb25fXyA9ICIwLjEuMCIKUFJPVE9DT0wgPSAiYXJlbmEv"
        "MSIK",
    "canonical.py":
        "IiIiQ2Fub25pY2FsIGVuY29kaW5nIGFuZCBoYXNoaW5nLgoKRXZlcnkgaW50ZWdyaXR5IHByb3BlcnR5IGluIHRo"
        "aXMgZW5naW5lIHJlc3RzIG9uIHRoaXMgbW9kdWxlIHByb2R1Y2luZyBpZGVudGljYWwKYnl0ZXMgb24gYW55IG1h"
        "Y2hpbmUsIGZvciBhbnkgZXF1YWwgdmFsdWUuIEl0IGlzIGRlbGliZXJhdGVseSBzdHJpY3Q6IGFueXRoaW5nCndo"
        "b3NlIHRleHR1YWwgZm9ybSBjb3VsZCB2YXJ5IGFjcm9zcyBwbGF0Zm9ybXMgb3IgaW50ZXJwcmV0ZXIgdmVyc2lv"
        "bnMgaXMKcmVqZWN0ZWQgYXQgZW5jb2RlIHRpbWUgcmF0aGVyIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIGEgZGlm"
        "ZmVyZW50IGhhc2ggbGF0ZXIuCgpGbG9hdHMgYXJlIHRoZSBub3RhYmxlIGJhbi4gYDAuMSArIDAuMmAgYW5kIGEg"
        "SlNPTiByb3VuZC10cmlwIG9mIGl0IGRvIG5vdApyZWxpYWJseSBhZ3JlZSBhY3Jvc3MgbGFuZ3VhZ2VzLCBhbmQg"
        "YSBzY29yaW5nIHBhdGggdGhhdCBhZG1pdHMgZmxvYXRzIGFkbWl0cyBhCnJlcGxheSB0aGF0IGRpc2FncmVlcyB3"
        "aXRoIHRoZSBtYXRjaCBpdCBpcyBzdXBwb3NlZCB0byByZXByb2R1Y2UuIFNjb3JlcyBhbmQKZ2FtZSBzdGF0ZSBh"
        "cmUgaW50ZWdlcnMuCiIiIgoKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGpzb24KCkdFTkVTSVMgPSAiMCIgKiA2NApf"
        "U0VQID0gYiJceDFmIiAgIyBBU0NJSSB1bml0IHNlcGFyYXRvcjsga2VlcHMgcHJldi1oYXNoIGFuZCBib2R5IGZy"
        "b20gZXZlciBydW5uaW5nIHRvZ2V0aGVyCgoKY2xhc3MgTm9uQ2Fub25pY2FsKFZhbHVlRXJyb3IpOgogICAgIiIi"
        "UmFpc2VkIHdoZW4gYSB2YWx1ZSBjYW5ub3QgYmUgZW5jb2RlZCB0byBzdGFibGUgYnl0ZXMuIiIiCgoKZGVmIF9j"
        "aGVjayhvYmosIHBhdGg9IiQiKToKICAgICMgYm9vbCBtdXN0IGJlIHRlc3RlZCBiZWZvcmUgaW50OiBib29sIGlz"
        "IGEgc3ViY2xhc3Mgb2YgaW50IGluIFB5dGhvbi4KICAgIGlmIG9iaiBpcyBOb25lIG9yIGlzaW5zdGFuY2Uob2Jq"
        "LCAoYm9vbCwgc3RyKSk6CiAgICAgICAgcmV0dXJuCiAgICBpZiBpc2luc3RhbmNlKG9iaiwgZmxvYXQpOgogICAg"
        "ICAgIHJhaXNlIE5vbkNhbm9uaWNhbCgKICAgICAgICAgICAgZiJ7cGF0aH06IGZsb2F0IGlzIG5vdCBjYW5vbmlj"
        "YWxseSBlbmNvZGFibGUuIFVzZSBhbiBpbnQsIG9yIGEgc3RyaW5nICIKICAgICAgICAgICAgZiJpZiB0aGUgdmFs"
        "dWUgaXMgZ2VudWluZWx5IGZyYWN0aW9uYWwuIgogICAgICAgICkKICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBpbnQp"
        "OgogICAgICAgIHJldHVybgogICAgaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgogICAgICAgIGZvciBrLCB2IGlu"
        "IG9iai5pdGVtcygpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrLCBzdHIpOgogICAgICAgICAgICAg"
        "ICAgcmFpc2UgTm9uQ2Fub25pY2FsKGYie3BhdGh9OiBvYmplY3Qga2V5cyBtdXN0IGJlIHN0cmluZ3MsIGdvdCB7"
        "dHlwZShrKS5fX25hbWVfX30iKQogICAgICAgICAgICBfY2hlY2sodiwgZiJ7cGF0aH0ue2t9IikKICAgICAgICBy"
        "ZXR1cm4KICAgIGlmIGlzaW5zdGFuY2Uob2JqLCAobGlzdCwgdHVwbGUpKToKICAgICAgICBmb3IgaSwgdiBpbiBl"
        "bnVtZXJhdGUob2JqKToKICAgICAgICAgICAgX2NoZWNrKHYsIGYie3BhdGh9W3tpfV0iKQogICAgICAgIHJldHVy"
        "bgogICAgcmFpc2UgTm9uQ2Fub25pY2FsKGYie3BhdGh9OiB7dHlwZShvYmopLl9fbmFtZV9ffSBpcyBub3QgY2Fu"
        "b25pY2FsbHkgZW5jb2RhYmxlIikKCgpkZWYgY2Fub25pY2FsX2J5dGVzKG9iaikgLT4gYnl0ZXM6CiAgICAiIiJE"
        "ZXRlcm1pbmlzdGljIFVURi04IEpTT046IHNvcnRlZCBrZXlzLCBubyBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Uu"
        "IiIiCiAgICBfY2hlY2sob2JqKQogICAgcmV0dXJuIGpzb24uZHVtcHMoCiAgICAgICAgb2JqLCBzb3J0X2tleXM9"
        "VHJ1ZSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBlbnN1cmVfYXNjaWk9RmFsc2UsIGFsbG93X25hbj1GYWxzZQog"
        "ICAgKS5lbmNvZGUoInV0Zi04IikKCgpkZWYgZGlnZXN0KG9iaikgLT4gc3RyOgogICAgIiIic2hhMjU2IG9mIHRo"
        "ZSBjYW5vbmljYWwgZW5jb2Rpbmcgb2YgYSB2YWx1ZS4iIiIKICAgIHJldHVybiBoYXNobGliLnNoYTI1NihjYW5v"
        "bmljYWxfYnl0ZXMob2JqKSkuaGV4ZGlnZXN0KCkKCgpkZWYgY2hhaW4ocHJldl9oZXg6IHN0ciwgYm9keSkgLT4g"
        "c3RyOgogICAgIiIiSGFzaCBvbmUgdHJhbnNjcmlwdCByZWNvcmQgb250byB0aGUgY2hhaW4uCgogICAgSW5jbHVk"
        "aW5nIHRoZSBwcmV2aW91cyBoYXNoIGluIHRoZSBwcmVpbWFnZSBpcyB3aGF0IG1ha2VzIGFuIGVkaXQgYW55d2hl"
        "cmUgaW4KICAgIHRoZSB0cmFuc2NyaXB0IGludmFsaWRhdGUgZXZlcnkgcmVjb3JkIGFmdGVyIGl0LgogICAgIiIi"
        "CiAgICBoID0gaGFzaGxpYi5zaGEyNTYoKQogICAgaC51cGRhdGUocHJldl9oZXguZW5jb2RlKCJhc2NpaSIpKQog"
        "ICAgaC51cGRhdGUoX1NFUCkKICAgIGgudXBkYXRlKGNhbm9uaWNhbF9ieXRlcyhib2R5KSkKICAgIHJldHVybiBo"
        "LmhleGRpZ2VzdCgpCgoKZGVmIGZpbGVfZGlnZXN0KHBhdGgpIC0+IHN0cjoKICAgIGggPSBoYXNobGliLnNoYTI1"
        "NigpCiAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgZmg6CiAgICAgICAgZm9yIGJsb2NrIGluIGl0ZXIobGFt"
        "YmRhOiBmaC5yZWFkKDY1NTM2KSwgYiIiKToKICAgICAgICAgICAgaC51cGRhdGUoYmxvY2spCiAgICByZXR1cm4g"
        "aC5oZXhkaWdlc3QoKQo=",
    "integrity.py":
        "IiIiRW5naW5lIHNlbGYtaWRlbnRpZmljYXRpb24uCgpUaGUgZmFpbHVyZSB0aGlzIGV4aXN0cyB0byBwcmV2ZW50"
        "OiBhIGNvbXBldGl0b3IgZWRpdHMgdGhlIHJlZmVyZWUsIHRoZW4gcmVwb3J0cwphIGNsZWFuIHJlc3VsdCBhZ2Fp"
        "bnN0IHRoZWlyIG93biBlZGl0ZWQgcnVsZXMuIEhhc2hpbmcgdGhlIGVuZ2luZSdzIG93biBzb3VyY2UKaW50byB0"
        "aGUgdHJhbnNjcmlwdCBoZWFkZXIgbWVhbnMgYSByZXN1bHQgaXMgb25seSBtZWFuaW5nZnVsIHJlbGF0aXZlIHRv"
        "IGEgbmFtZWQKZW5naW5lIGJ1aWxkLCBhbmQgYSB2ZXJpZmllciBzYXlzIG91dCBsb3VkIHdoZXRoZXIgaXQgaXMg"
        "cnVubmluZyB0aGF0IGJ1aWxkLgoKVGhpcyBkb2VzIG5vdCBzdG9wIHNvbWVvbmUgZWRpdGluZyB0aGUgZW5naW5l"
        "IG9uIHRoZWlyIG93biBtYWNoaW5lLiBJdCBzdG9wcwp0aGVtIGRvaW5nIGl0IGludmlzaWJseS4KIiIiCgppbXBv"
        "cnQgb3MKCmZyb20gLmNhbm9uaWNhbCBpbXBvcnQgZGlnZXN0LCBmaWxlX2RpZ2VzdAoKX1NLSVBfRElSUyA9IHsi"
        "X19weWNhY2hlX18iLCAiLmdpdCIsICIucHl0ZXN0X2NhY2hlIn0KCgpkZWYgZW5naW5lX2ZpbGVzKHJvb3Q9Tm9u"
        "ZSk6CiAgICAiIiIocmVscGF0aCwgc2hhMjU2KSBmb3IgZXZlcnkgLnB5IGluIHRoZSBhcmVuYSBwYWNrYWdlLCBz"
        "b3J0ZWQgYnkgcGF0aC4iIiIKICAgIHJvb3QgPSBvcy5wYXRoLmFic3BhdGgocm9vdCBvciBvcy5wYXRoLmRpcm5h"
        "bWUoX19maWxlX18pKQogICAgb3V0ID0gW10KICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGlu"
        "IG9zLndhbGsocm9vdCk6CiAgICAgICAgZGlybmFtZXNbOl0gPSBzb3J0ZWQoZCBmb3IgZCBpbiBkaXJuYW1lcyBp"
        "ZiBkIG5vdCBpbiBfU0tJUF9ESVJTKQogICAgICAgIGZvciBuYW1lIGluIHNvcnRlZChmaWxlbmFtZXMpOgogICAg"
        "ICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgiLnB5Iik6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAg"
        "ICAgICAgICBmdWxsID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpCiAgICAgICAgICAgIHJlbCA9IG9zLnBh"
        "dGgucmVscGF0aChmdWxsLCByb290KS5yZXBsYWNlKG9zLnNlcCwgIi8iKQogICAgICAgICAgICBvdXQuYXBwZW5k"
        "KFtyZWwsIGZpbGVfZGlnZXN0KGZ1bGwpXSkKICAgIHJldHVybiBvdXQKCgpkZWYgZW5naW5lX2RpZ2VzdChyb290"
        "PU5vbmUpOgogICAgIiIiT25lIGhhc2ggY292ZXJpbmcgdGhlIHdob2xlIHJlZmVyZWUgaW1wbGVtZW50YXRpb24u"
        "IiIiCiAgICByZXR1cm4gZGlnZXN0KGVuZ2luZV9maWxlcyhyb290KSkKCgpkZWYgc2NyaXB0X2RpZ2VzdChjbWQp"
        "OgogICAgIiIiSGFzaCB0aGUgZW50cmFudCdzIG93biBzY3JpcHQgd2hlbiB0aGUgY29tbWFuZCBsaW5lIHBvaW50"
        "cyBhdCBhIHJlYWwgZmlsZS4KCiAgICBCaW5kcyAid2hpY2ggaGFybmVzcyBwbGF5ZWQiIHRvIHRoZSByZXN1bHQs"
        "IHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBhCiAgICBjb250ZXN0IHdob3NlIHRoZXNpcyBpcyB0aGF0IHRo"
        "ZSBoYXJuZXNzIGlzIHRoZSB2YXJpYWJsZS4KICAgICIiIgogICAgZm9yIHRva2VuIGluIGNtZDoKICAgICAgICBp"
        "ZiBpc2luc3RhbmNlKHRva2VuLCBzdHIpIGFuZCBvcy5wYXRoLmlzZmlsZSh0b2tlbik6CiAgICAgICAgICAgIGV4"
        "dCA9IG9zLnBhdGguc3BsaXRleHQodG9rZW4pWzFdLmxvd2VyKCkKICAgICAgICAgICAgaWYgZXh0IGluICgiLnB5"
        "IiwgIi5qcyIsICIubWpzIiwgIi50cyIsICIuc2giLCAiLnBzMSIsICIucmIiLCAiLmV4ZSIpOgogICAgICAgICAg"
        "ICAgICAgcmV0dXJuIHsicGF0aCI6IG9zLnBhdGguYmFzZW5hbWUodG9rZW4pLCAic2hhMjU2IjogZmlsZV9kaWdl"
        "c3QodG9rZW4pfQogICAgcmV0dXJuIE5vbmUK",
    "match.py":
        "IiIiVGhlIG1hdGNoIHJ1bm5lci4KCk93bnMgdGhlIHJlZmVyZWUsIHRoZSB0d28gZW50cmFudCBwcm9jZXNzZXMs"
        "IGFuZCB0aGUgdHJhbnNjcmlwdC4gTm90aGluZyBlbHNlIGluCnRoZSBzeXN0ZW0gaXMgYWxsb3dlZCB0byB3cml0"
        "ZSBhIHJlY29yZC4KClRocmVlIHByb3BlcnRpZXMgdGhpcyBmaWxlIGlzIGJ1aWx0IHRvIGhvbGQ6CgogIDEuIFRo"
        "ZSByZWZlcmVlIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgdG91Y2hlcyBzdGF0ZS4gQW4gZW50cmFudCdzIG1lc3Nh"
        "Z2UgaXMKICAgICByZWFkIGZvciBleGFjdGx5IG9uZSBrZXksIGBtb3ZlYCwgd2hpY2ggaXMgY2hlY2tlZCBhZ2Fp"
        "bnN0IHRoZSBydWxlcyBiZWZvcmUKICAgICBpdCBjYW4gY2hhbmdlIGFueXRoaW5nLgogIDIuIEV2ZXJ5dGhpbmcg"
        "dGhhdCBkZWNpZGVkIHRoZSBvdXRjb21lIGlzIGNvbW1pdHRlZCB0byBhIGhhc2ggY2hhaW4gYXMgaXQKICAgICBo"
        "YXBwZW5zLCBpbmNsdWRpbmcgdGhlIGVuZ2luZSdzIG93biBzb3VyY2UgZGlnZXN0LgogIDMuIE5vdGhpbmcgaW4g"
        "aGVyZSBvcGVucyBhIG5ldHdvcmsgY29ubmVjdGlvbiwgcmVhZHMgYSBjcmVkZW50aWFsLCBvciBrbm93cwogICAg"
        "IHdoYXQgYSBtb2RlbCBpcy4gSW5mZXJlbmNlLCBpZiBhbnksIGhhcHBlbnMgb24gdGhlIGZhciBzaWRlIG9mIGEg"
        "cGlwZSwgYXQKICAgICB0aGUgZW50cmFudCdzIG93biBleHBlbnNlLgoiIiIKCmltcG9ydCBqc29uCmltcG9ydCBv"
        "cwppbXBvcnQgcmFuZG9tCmltcG9ydCBzaHV0aWwKaW1wb3J0IHRpbWUKCmZyb20gLmNhbm9uaWNhbCBpbXBvcnQg"
        "ZGlnZXN0CmZyb20gLmdhbWVzIGltcG9ydCBsb2FkIGFzIGxvYWRfZ2FtZQpmcm9tIC5pbnRlZ3JpdHkgaW1wb3J0"
        "IGVuZ2luZV9kaWdlc3QsIGVuZ2luZV9maWxlcywgc2NyaXB0X2RpZ2VzdApmcm9tIC5zYW5kYm94IGltcG9ydCBQ"
        "T0xJQ1ksIEVudHJhbnQsIEVudHJhbnRGYWlsdXJlCmZyb20gLnNjb3JpbmcgaW1wb3J0IHJlZmVyZWVfcHJvamVj"
        "dGlvbiwgc2NvcmUKZnJvbSAudHJhbnNjcmlwdCBpbXBvcnQgVHJhbnNjcmlwdFdyaXRlcgoKUFJPVE9DT0wgPSAi"
        "YXJlbmEvMSIKCgpjbGFzcyBfU2lkZWNhcjoKICAgICIiIlRpbWluZyBhbmQgc3RkZXJyLCBkZWxpYmVyYXRlbHkg"
        "T1VUU0lERSB0aGUgaGFzaCBjaGFpbi4KCiAgICBMYXRlbmN5IGFuZCBjYXB0dXJlZCBzdGRlcnIgdmFyeSBiZXR3"
        "ZWVuIHR3byBydW5zIG9mIHRoZSBzYW1lIG1hdGNoIG9uIHRoZQogICAgc2FtZSBpbnB1dHMuIENvbW1pdHRpbmcg"
        "dGhlbSB3b3VsZCBtZWFuIGEgcmUtcnVuIG5ldmVyIHJlcHJvZHVjZXMgdGhlCiAgICBvcmlnaW5hbCBjaGFpbiBo"
        "ZWFkLCB3aGljaCB3b3VsZCBjb3N0IHRoZSBlbmdpbmUgaXRzIHN0cm9uZ2VzdCBwcm9wZXJ0eSBmb3IKICAgIHRo"
        "ZSBzYWtlIG9mIHR3byBkaWFnbm9zdGljIGZpZWxkcy4gVGhleSBhcmUgd3JpdHRlbiBoZXJlIGluc3RlYWQ6IHVz"
        "ZWZ1bCwKICAgIGluc3BlY3RhYmxlLCBhbmQgZXhwbGljaXRseSBub3QgcGFydCBvZiB3aGF0IGEgcmVzdWx0IHJl"
        "c3RzIG9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9"
        "IHBhdGgKICAgICAgICBzZWxmLl9maCA9IG9wZW4ocGF0aCwgInciLCBlbmNvZGluZz0idXRmLTgiLCBuZXdsaW5l"
        "PSJcbiIpCiAgICAgICAgc2VsZi5fZmgud3JpdGUoCiAgICAgICAgICAgIGpzb24uZHVtcHMoeyJraW5kIjogIm5v"
        "dGljZSIsICJhdXRob3JpdGF0aXZlIjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICJub3RlIjogImRp"
        "YWdub3N0aWNzIG9ubHk7IG5vdCBoYXNoZWQsIG5vdCBzY29yZWQifSkgKyAiXG4iCiAgICAgICAgKQoKICAgIGRl"
        "ZiB3cml0ZShzZWxmLCBraW5kLCAqKmZpZWxkcyk6CiAgICAgICAgc2VsZi5fZmgud3JpdGUoanNvbi5kdW1wcyh7"
        "ImtpbmQiOiBraW5kLCAqKmZpZWxkc30sIGVuc3VyZV9hc2NpaT1GYWxzZSkgKyAiXG4iKQogICAgICAgIHNlbGYu"
        "X2ZoLmZsdXNoKCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuX2ZoLmNsb3NlZDoK"
        "ICAgICAgICAgICAgc2VsZi5fZmguY2xvc2UoKQoKCmRlZiBtYXRjaF9pZF9mb3IoZ2FtZV9uYW1lLCBzZWVkLCBl"
        "bnRyYW50X25hbWVzKToKICAgICIiIkNvbnRlbnQtYWRkcmVzc2VkIGlkOiBzYW1lIG1hdGNodXAgYW5kIHNlZWQs"
        "IHNhbWUgaWQuIiIiCiAgICByZXR1cm4gZGlnZXN0KHsiZ2FtZSI6IGdhbWVfbmFtZSwgInNlZWQiOiBzZWVkLCAi"
        "ZW50cmFudHMiOiBsaXN0KGVudHJhbnRfbmFtZXMpfSlbOjE2XQoKCmRlZiBfbWFuaWZlc3RfZGlnZXN0KG1hbmlm"
        "ZXN0KToKICAgICMgSGFzaCBuYW1lcyBvbmx5LiBWYWx1ZXMgb2YgZGVjbGFyZWQgZW52IHZhcnMgYXJlIG5ldmVy"
        "IHJlYWQgaGVyZS4KICAgIHJldHVybiBkaWdlc3QoCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6IG1hbmlm"
        "ZXN0WyJuYW1lIl0sCiAgICAgICAgICAgICJjbWQiOiBsaXN0KG1hbmlmZXN0WyJjbWQiXSksCiAgICAgICAgICAg"
        "ICJlbnYiOiBzb3J0ZWQobWFuaWZlc3QuZ2V0KCJlbnYiLCBbXSkpLAogICAgICAgICAgICAiY2xhaW1lZF9tb2Rl"
        "bCI6IG1hbmlmZXN0LmdldCgiY2xhaW1lZF9tb2RlbCIpLAogICAgICAgIH0KICAgICkKCgpkZWYgcnVuX21hdGNo"
        "KAogICAgKiwKICAgIGdhbWVfbmFtZSwKICAgIHNlZWQsCiAgICBlbnRyYW50cywKICAgIG91dF9kaXIsCiAgICBt"
        "b3ZlX3RpbWVvdXRfcz0xNS4wLAogICAgbWF0Y2hfaWQ9Tm9uZSwKICAgIGtlZXBfc2NyYXRjaD1GYWxzZSwKKToK"
        "ICAgIGlmIGxlbihlbnRyYW50cykgIT0gMjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0aGlzIHJ1bm5lciBw"
        "bGF5cyB0d28tc2VhdCBnYW1lczsgZ290ICVkIGVudHJhbnRzIiAlIGxlbihlbnRyYW50cykpCiAgICBpZiBub3Qg"
        "aXNpbnN0YW5jZShzZWVkLCBpbnQpIG9yIGlzaW5zdGFuY2Uoc2VlZCwgYm9vbCk6CiAgICAgICAgcmFpc2UgVmFs"
        "dWVFcnJvcigic2VlZCBtdXN0IGJlIGFuIGludCBzbyBpdCBjYW4gYmUgY2Fub25pY2FsbHkgZW5jb2RlZCIpCgog"
        "ICAgZ2FtZSA9IGxvYWRfZ2FtZShnYW1lX25hbWUpCiAgICBtaWQgPSBtYXRjaF9pZCBvciBtYXRjaF9pZF9mb3Io"
        "Z2FtZV9uYW1lLCBzZWVkLCBbZVsibmFtZSJdIGZvciBlIGluIGVudHJhbnRzXSkKICAgIG91dF9kaXIgPSBvcy5w"
        "YXRoLmFic3BhdGgob3V0X2RpcikKICAgIG9zLm1ha2VkaXJzKG91dF9kaXIsIGV4aXN0X29rPVRydWUpCiAgICB0"
        "cmFuc2NyaXB0X3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0X2RpciwgZiJ7bWlkfS5qc29ubCIpCiAgICBzaWRlY2Fy"
        "X3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0X2RpciwgZiJ7bWlkfS5kaWFnbm9zdGljcy5qc29ubCIpCiAgICBzY3Jh"
        "dGNoX3Jvb3QgPSBvcy5wYXRoLmpvaW4ob3V0X2RpciwgZiIuc2NyYXRjaC17bWlkfSIpCgogICAgcHJvY3MgPSBb"
        "XQogICAgdHcgPSBUcmFuc2NyaXB0V3JpdGVyKHRyYW5zY3JpcHRfcGF0aCkKICAgIHNpZGUgPSBfU2lkZWNhcihz"
        "aWRlY2FyX3BhdGgpCiAgICB0cnk6CiAgICAgICAgIyAtLSBoZWFkZXI6IGNvbW1pdCB0byB0aGUgcnVsZXMgYmVm"
        "b3JlIGEgbW92ZSBpcyBwbGF5ZWQgLS0tLS0tLS0tLS0KICAgICAgICB0dy5hcHBlbmQoCiAgICAgICAgICAgICJo"
        "ZWFkZXIiLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicHJvdG9jb2wiOiBQUk9UT0NPTCwKICAgICAg"
        "ICAgICAgICAgICJtYXRjaF9pZCI6IG1pZCwKICAgICAgICAgICAgICAgICJnYW1lIjogeyJuYW1lIjogZ2FtZS5O"
        "QU1FLCAidmVyc2lvbiI6IGdhbWUuVkVSU0lPTiwgInN1bW1hcnkiOiBnYW1lLlNVTU1BUll9LAogICAgICAgICAg"
        "ICAgICAgInNlZWQiOiBzZWVkLAogICAgICAgICAgICAgICAgImVuZ2luZSI6IHsiZGlnZXN0IjogZW5naW5lX2Rp"
        "Z2VzdCgpLCAiZmlsZXMiOiBlbmdpbmVfZmlsZXMoKX0sCiAgICAgICAgICAgICAgICAiZW50cmFudHMiOiBbCiAg"
        "ICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAic2VhdCI6IGksCiAgICAgICAgICAg"
        "ICAgICAgICAgICAgICJuYW1lIjogZVsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAibWFuaWZlc3Rf"
        "ZGlnZXN0IjogX21hbmlmZXN0X2RpZ2VzdChlKSwKICAgICAgICAgICAgICAgICAgICAgICAgInNjcmlwdCI6IHNj"
        "cmlwdF9kaWdlc3QoZVsiY21kIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVjbGFyZWRfZW52Ijogc29y"
        "dGVkKGUuZ2V0KCJlbnYiLCBbXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAjIEFuIGVudHJhbnQncyBzdGF0"
        "ZW1lbnQgYWJvdXQgd2hpY2ggbW9kZWwgaXQgdXNlcy4gUmVjb3JkZWQKICAgICAgICAgICAgICAgICAgICAgICAg"
        "IyBhcyBhIGNsYWltLiBUaGUgZW5naW5lIGNhbm5vdCBhbmQgZG9lcyBub3QgdmVyaWZ5IGl0LgogICAgICAgICAg"
        "ICAgICAgICAgICAgICAiY2xhaW1lZF9tb2RlbCI6IGUuZ2V0KCJjbGFpbWVkX21vZGVsIiksCiAgICAgICAgICAg"
        "ICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciBpLCBlIGluIGVudW1lcmF0ZShlbnRyYW50cykKICAg"
        "ICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAic2FuZGJveF9wb2xpY3kiOiBQT0xJQ1ksCiAgICAgICAg"
        "ICAgICAgICAiYXR0ZXN0YXRpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgIm1vZGVsX2F0dGVzdGVkIjogRmFs"
        "c2UsCiAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6ICgKICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBl"
        "bmdpbmUgbmV2ZXIgY29udGFjdHMgYSBtb2RlbCwgc28gaXQgY2Fubm90IHdpdG5lc3Mgd2hpY2ggbW9kZWwgIgog"
        "ICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjZWQgYSBtb3ZlLiBSZXBsYXkgcHJvdmVzIHJ1bGUgY29tcGxp"
        "YW5jZSBhbmQgYWRqdWRpY2F0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgImludGVncml0eSwgbm90IG1v"
        "ZGVsIGlkZW50aXR5LiIKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAg"
        "ICAgICAgICJsaW1pdHMiOiB7Im1vdmVfdGltZW91dF9tcyI6IGludChtb3ZlX3RpbWVvdXRfcyAqIDEwMDApfSwK"
        "ICAgICAgICAgICAgfSwKICAgICAgICApCgogICAgICAgICMgLS0gc3RhcnQgZW50cmFudHMgLS0tLS0tLS0tLS0t"
        "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIGZvciBpLCBtYW5pZmVzdCBpbiBl"
        "bnVtZXJhdGUoZW50cmFudHMpOgogICAgICAgICAgICB3b3JrZGlyID0gb3MucGF0aC5qb2luKHNjcmF0Y2hfcm9v"
        "dCwgZiJzZWF0e2l9IikKICAgICAgICAgICAgcCA9IEVudHJhbnQobWFuaWZlc3QsIHdvcmtkaXIsIG1vdmVfdGlt"
        "ZW91dF9zPW1vdmVfdGltZW91dF9zKQogICAgICAgICAgICBwcm9jcy5hcHBlbmQocCkKCiAgICAgICAgc3RhdGUg"
        "PSBnYW1lLnNldHVwKHJhbmRvbS5SYW5kb20oc2VlZCkpCiAgICAgICAgYm91bmQgPSBnYW1lLm1vdmVfYm91bmQo"
        "c3RhdGUpCgogICAgICAgIG91dGNvbWUgPSBOb25lICAjIHNldCBieSBmb3JmZWl0IG9yIGJ5IHRoZSBnYW1lIGVu"
        "ZGluZwoKICAgICAgICBmb3IgaSwgcCBpbiBlbnVtZXJhdGUocHJvY3MpOgogICAgICAgICAgICB0cnk6CiAgICAg"
        "ICAgICAgICAgICBwLnN0YXJ0KCkKICAgICAgICAgICAgICAgIHJlcGx5ID0gcC5hc2soCiAgICAgICAgICAgICAg"
        "ICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJoZWxsbyIsCiAgICAgICAgICAgICAgICAg"
        "ICAgICAgICJwcm90b2NvbCI6IFBST1RPQ09MLAogICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hfaWQiOiBt"
        "aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICJ5b3VfYXJlIjogaSwKICAgICAgICAgICAgICAgICAgICAgICAg"
        "ImdhbWUiOiBnYW1lLk5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICJnYW1lX3ZlcnNpb24iOiBnYW1lLlZF"
        "UlNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICJydWxlcyI6IGdhbWUuUlVMRVMgaWYgaGFzYXR0cihnYW1l"
        "LCAiUlVMRVMiKSBlbHNlIGdhbWUuU1VNTUFSWSwKICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmVfdGltZW91"
        "dF9tcyI6IGludChtb3ZlX3RpbWVvdXRfcyAqIDEwMDApLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg"
        "ICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHJlcGx5LmdldCgidHlwZSIpICE9ICJyZWFkeSI6CiAgICAgICAg"
        "ICAgICAgICAgICAgcmFpc2UgRW50cmFudEZhaWx1cmUoIm5vdF9yZWFkeSIsIGYiZXhwZWN0ZWQgdHlwZT1yZWFk"
        "eSwgZ290IHtyZXBseS5nZXQoJ3R5cGUnKSFyfSIpCiAgICAgICAgICAgICAgICB0dy5hcHBlbmQoInJlYWR5Iiwg"
        "eyJwbGF5ZXIiOiBpLCAiZW50cmFudF9tZXNzYWdlIjogX3NhZmUocmVwbHkpfSkKICAgICAgICAgICAgZXhjZXB0"
        "IEVudHJhbnRGYWlsdXJlIGFzIGY6CiAgICAgICAgICAgICAgICB0dy5hcHBlbmQoCiAgICAgICAgICAgICAgICAg"
        "ICAgImZvcmZlaXQiLAogICAgICAgICAgICAgICAgICAgIHsicGxheWVyIjogaSwgInJlYXNvbiI6IGYucmVhc29u"
        "LCAiZGV0YWlsIjogZi5kZXRhaWwsICJwaGFzZSI6ICJoYW5kc2hha2UifSwKICAgICAgICAgICAgICAgICkKICAg"
        "ICAgICAgICAgICAgIHNpZGUud3JpdGUoInN0ZGVyciIsIHBsYXllcj1pLCBwaGFzZT0iaGFuZHNoYWtlIiwgdGFp"
        "bD1wLnN0ZGVycl90ZXh0KClbLTIwMDA6XSkKICAgICAgICAgICAgICAgIG91dGNvbWUgPSB7Indpbm5lciI6IDEg"
        "LSBpLCAicmVhc29uIjogZiJmb3JmZWl0OntmLnJlYXNvbn0ifQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAg"
        "ICAgdHcuYXBwZW5kKCJzdGF0ZSIsIHsic3RhdGUiOiBzdGF0ZSwgInN0YXRlX2RpZ2VzdCI6IGRpZ2VzdChzdGF0"
        "ZSksICJ0dXJuIjogMH0pCgogICAgICAgICMgLS0gcGxheSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"
        "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIEV2ZXJ5IGNhbGwgaW50byB0aGUgZ2FtZSBt"
        "b2R1bGUgaGFwcGVucyBpbnNpZGUgdGhpcyBib3VuZGFyeS4gQSBidWcgaW4KICAgICAgICAjIGEgZ2FtZSBtb2R1"
        "bGUgbXVzdCBub3Qga2lsbCB0aGUgcnVubmVyIGFuZCBsZWF2ZSBhIHRyYW5zY3JpcHQgd2l0aCBubwogICAgICAg"
        "ICMgZW5kaW5nIOKAlCBhIG1hdGNoIHRoYXQgc3RvcHMgd2l0aG91dCBhIHJlY29yZCBpcyB0aGUgZmFpbC1zaWxl"
        "bnQgc2hhcGUKICAgICAgICAjIHRoaXMgZW5naW5lIGV4aXN0cyB0byBhdm9pZC4gQW4gdW5oYW5kbGVkIGZhdWx0"
        "IGlzIHJlY29yZGVkIGFuZCBWT0lEUwogICAgICAgICMgdGhlIG1hdGNoLiBJdCBpcyBuZXZlciBjaGFyZ2VkIHRv"
        "IGEgcGxheWVyOiBhIHJlZmVyZWUncyBvd24gY3Jhc2ggbXVzdAogICAgICAgICMgbm90IGJlIGFsbG93ZWQgdG8g"
        "ZGVjaWRlIHdobyB3b24uCiAgICAgICAgdHVybiA9IDAKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIG91"
        "dGNvbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIGdhbWUudGVybWluYWwoc3RhdGUpIGlzIG5vdCBOb25l"
        "OgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiB0dXJuID49IGJvdW5kOgogICAg"
        "ICAgICAgICAgICAgICAgIHR3LmFwcGVuZCgiYWJvcnQiLCB7InJlYXNvbiI6ICJtb3ZlX2JvdW5kX2V4Y2VlZGVk"
        "IiwgImJvdW5kIjogYm91bmR9KQogICAgICAgICAgICAgICAgICAgIG91dGNvbWUgPSB7Indpbm5lciI6IE5vbmUs"
        "ICJyZWFzb24iOiAibW92ZV9ib3VuZF9leGNlZWRlZCJ9CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAg"
        "ICAgICAgICAgICBzZWF0ID0gc3RhdGVbInRvX21vdmUiXQogICAgICAgICAgICAgICAgcCA9IHByb2NzW3NlYXRd"
        "CiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm1vdmVfcmVx"
        "dWVzdCIsCiAgICAgICAgICAgICAgICAgICAgInR1cm4iOiB0dXJuLAogICAgICAgICAgICAgICAgICAgICJ5b3Vf"
        "YXJlIjogc2VhdCwKICAgICAgICAgICAgICAgICAgICAib2JzZXJ2YXRpb24iOiBnYW1lLm9ic2VydmF0aW9uKHN0"
        "YXRlLCBzZWF0KSwKICAgICAgICAgICAgICAgICAgICAibW92ZV90aW1lb3V0X21zIjogaW50KG1vdmVfdGltZW91"
        "dF9zICogMTAwMCksCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3RhcnRlZCA9IHRpbWUubW9u"
        "b3RvbmljKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXBseSA9IHAuYXNrKHJl"
        "cXVlc3QpCiAgICAgICAgICAgICAgICBleGNlcHQgRW50cmFudEZhaWx1cmUgYXMgZjoKICAgICAgICAgICAgICAg"
        "ICAgICB0dy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICJmb3JmZWl0IiwKICAgICAgICAgICAgICAg"
        "ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYXllciI6IHNlYXQsCiAgICAgICAgICAg"
        "ICAgICAgICAgICAgICAgICAicmVhc29uIjogZi5yZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAi"
        "ZGV0YWlsIjogZi5kZXRhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGhhc2UiOiAibW92ZSIsCiAg"
        "ICAgICAgICAgICAgICAgICAgICAgICAgICAidHVybiI6IHR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgIH0s"
        "CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNpZGUud3JpdGUoInN0ZGVyciIsIHBs"
        "YXllcj1zZWF0LCBwaGFzZT0ibW92ZSIsIHR1cm49dHVybiwgdGFpbD1wLnN0ZGVycl90ZXh0KClbLTIwMDA6XSkK"
        "ICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0geyJ3aW5uZXIiOiAxIC0gc2VhdCwgInJlYXNvbiI6IGYiZm9y"
        "ZmVpdDp7Zi5yZWFzb259In0KICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc2lkZS53"
        "cml0ZSgKICAgICAgICAgICAgICAgICAgICAibGF0ZW5jeSIsIHBsYXllcj1zZWF0LCB0dXJuPXR1cm4sIG1zPWlu"
        "dCgodGltZS5tb25vdG9uaWMoKSAtIHN0YXJ0ZWQpICogMTAwMCkKICAgICAgICAgICAgICAgICkKCiAgICAgICAg"
        "ICAgICAgICAjIFRoZSBvbmx5IGVudHJhbnQtYXV0aG9yZWQgdmFsdWUgdGhlIHJlZmVyZWUgcmVhZHMuCiAgICAg"
        "ICAgICAgICAgICBtb3ZlID0gcmVwbHkuZ2V0KCJtb3ZlIikKICAgICAgICAgICAgICAgIG9rLCB3aHkgPSBnYW1l"
        "LmxlZ2FsKHN0YXRlLCBtb3ZlKQogICAgICAgICAgICAgICAgaWYgbm90IG9rOgogICAgICAgICAgICAgICAgICAg"
        "IHR3LmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmUiLAogICAgICAgICAgICAgICAgICAgICAg"
        "ICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxheWVyIjogc2VhdCwKICAgICAgICAgICAgICAgICAg"
        "ICAgICAgICAgICJ0dXJuIjogdHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZlIjogbW92ZSBp"
        "ZiBfZW5jb2RhYmxlKG1vdmUpIGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhbCI6"
        "IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlamVjdGVkX2JlY2F1c2UiOiB3aHksCiAgICAg"
        "ICAgICAgICAgICAgICAgICAgICAgICAiZW50cmFudF9tZXNzYWdlIjogX3NhZmUocmVwbHkpLAogICAgICAgICAg"
        "ICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB0dy5hcHBl"
        "bmQoCiAgICAgICAgICAgICAgICAgICAgICAgICJmb3JmZWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgeyJw"
        "bGF5ZXIiOiBzZWF0LCAicmVhc29uIjogImlsbGVnYWxfbW92ZSIsICJkZXRhaWwiOiB3aHksICJwaGFzZSI6ICJt"
        "b3ZlIiwgInR1cm4iOiB0dXJufSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3V0"
        "Y29tZSA9IHsid2lubmVyIjogMSAtIHNlYXQsICJyZWFzb24iOiAiZm9yZmVpdDppbGxlZ2FsX21vdmUifQogICAg"
        "ICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgdHcuYXBwZW5kKAogICAgICAgICAgICAgICAg"
        "ICAgICJtb3ZlIiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwbGF5ZXIi"
        "OiBzZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAidHVybiI6IHR1cm4sCiAgICAgICAgICAgICAgICAgICAg"
        "ICAgICJtb3ZlIjogbW92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgImxlZ2FsIjogVHJ1ZSwKICAgICAgICAg"
        "ICAgICAgICAgICAgICAgImVudHJhbnRfbWVzc2FnZSI6IF9zYWZlKHJlcGx5KSwKICAgICAgICAgICAgICAgICAg"
        "ICB9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc3RhdGUgPSBnYW1lLmFwcGx5KHN0YXRlLCBt"
        "b3ZlKQogICAgICAgICAgICAgICAgdHVybiArPSAxCiAgICAgICAgICAgICAgICB0dy5hcHBlbmQoInN0YXRlIiwg"
        "eyJzdGF0ZSI6IHN0YXRlLCAic3RhdGVfZGlnZXN0IjogZGlnZXN0KHN0YXRlKSwgInR1cm4iOiB0dXJufSkKCiAg"
        "ICAgICAgICAgIGlmIG91dGNvbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVuZCA9IGdhbWUudGVybWluYWwo"
        "c3RhdGUpCiAgICAgICAgICAgICAgICBvdXRjb21lID0gKAogICAgICAgICAgICAgICAgICAgIHsid2lubmVyIjog"
        "ZW5kWyJ3aW5uZXIiXSwgInJlYXNvbiI6IGVuZFsicmVhc29uIl19CiAgICAgICAgICAgICAgICAgICAgaWYgZW5k"
        "CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7Indpbm5lciI6IE5vbmUsICJyZWFzb24iOiAidW5maW5pc2hlZCJ9"
        "CiAgICAgICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBhIGZhdWx0IGluIHRo"
        "ZSByZWZlcmVlLCBub3QgaW4gZWl0aGVyIGVudHJhbnQKICAgICAgICAgICAgdHcuYXBwZW5kKAogICAgICAgICAg"
        "ICAgICAgImVuZ2luZV9lcnJvciIsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImRldGFp"
        "bCI6IGYie2UuX19jbGFzc19fLl9fbmFtZV9ffToge2V9Ils6MTAwMF0sCiAgICAgICAgICAgICAgICAgICAgInBo"
        "YXNlIjogInJlZmVyZWUiLAogICAgICAgICAgICAgICAgICAgICJ0dXJuIjogdHVybiwKICAgICAgICAgICAgICAg"
        "IH0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3V0Y29tZSA9IHsid2lubmVyIjogTm9uZSwgInJlYXNvbiI6"
        "ICJlbmdpbmVfZXJyb3IifQoKICAgICAgICAjIC0tIHNjb3JlIGZyb20gcmVmZXJlZSBzdGF0ZSBvbmx5IC0tLS0t"
        "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHJlY29yZHNfc29fZmFyID0gX3JlbG9hZCh0"
        "cmFuc2NyaXB0X3BhdGgpCiAgICAgICAgc2NvcmVkID0gc2NvcmUocmVmZXJlZV9wcm9qZWN0aW9uKHJlY29yZHNf"
        "c29fZmFyKSwgZ2FtZSkKCiAgICAgICAgcmVzdWx0X2JvZHkgPSB7CiAgICAgICAgICAgICJ3aW5uZXIiOiBzY29y"
        "ZWRbIndpbm5lciJdLAogICAgICAgICAgICAicmVhc29uIjogc2NvcmVkWyJyZWFzb24iXSwKICAgICAgICAgICAg"
        "Im1vdmVzIjogc2NvcmVkWyJtb3ZlcyJdLAogICAgICAgICAgICAicG9pbnRzIjogc2NvcmVkWyJwb2ludHMiXSwK"
        "ICAgICAgICAgICAgImRlY2lzaXZlIjogc2NvcmVkWyJkZWNpc2l2ZSJdLAogICAgICAgICAgICAic2VhdHMiOiB7"
        "c3RyKGkpOiBlWyJuYW1lIl0gZm9yIGksIGUgaW4gZW51bWVyYXRlKGVudHJhbnRzKX0sCiAgICAgICAgICAgICJz"
        "Y29yZWRfZnJvbSI6ICJyZWZlcmVlX3N0YXRlX29ubHkiLAogICAgICAgICAgICAic2VsZl9yZXBvcnRfZXhjbHVk"
        "ZWQiOiBUcnVlLAogICAgICAgIH0KICAgICAgICByZXN1bHQgPSB0dy5hcHBlbmQoInJlc3VsdCIsIHJlc3VsdF9i"
        "b2R5KQoKICAgICAgICAjIFNheSBnb29kYnllOyBhIGZhaWx1cmUgaGVyZSBjYW5ub3QgY2hhbmdlIHRoZSByZWNv"
        "cmRlZCByZXN1bHQuCiAgICAgICAgZm9yIHAgaW4gcHJvY3M6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAg"
        "ICAgIHAuc2VuZCh7InR5cGUiOiAiZ29vZGJ5ZSIsICJyZXN1bHQiOiB7Indpbm5lciI6IHNjb3JlZFsid2lubmVy"
        "Il0sICJyZWFzb24iOiBzY29yZWRbInJlYXNvbiJdfX0pCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAg"
        "ICAgICAgICAgICAgICBwYXNzCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJtYXRjaF9pZCI6IG1pZCwK"
        "ICAgICAgICAgICAgInRyYW5zY3JpcHQiOiB0cmFuc2NyaXB0X3BhdGgsCiAgICAgICAgICAgICJkaWFnbm9zdGlj"
        "cyI6IHNpZGVjYXJfcGF0aCwKICAgICAgICAgICAgImNoYWluX2hlYWQiOiByZXN1bHRbImhhc2giXSwKICAgICAg"
        "ICAgICAgImVuZ2luZV9kaWdlc3QiOiBlbmdpbmVfZGlnZXN0KCksCiAgICAgICAgICAgICoqcmVzdWx0X2JvZHks"
        "CiAgICAgICAgfQogICAgZmluYWxseToKICAgICAgICB0dy5jbG9zZSgpCiAgICAgICAgZm9yIHAgaW4gcHJvY3M6"
        "CiAgICAgICAgICAgIHAuY2xvc2UoKQogICAgICAgICAgICBzaWRlLndyaXRlKCJzdGRlcnJfZmluYWwiLCBlbnRy"
        "YW50PXAubmFtZSwgdGFpbD1wLnN0ZGVycl90ZXh0KClbLTIwMDA6XSkKICAgICAgICBzaWRlLmNsb3NlKCkKICAg"
        "ICAgICBpZiBub3Qga2VlcF9zY3JhdGNoOgogICAgICAgICAgICBzaHV0aWwucm10cmVlKHNjcmF0Y2hfcm9vdCwg"
        "aWdub3JlX2Vycm9ycz1UcnVlKQoKCmRlZiBfcmVsb2FkKHBhdGgpOgogICAgZnJvbSAudHJhbnNjcmlwdCBpbXBv"
        "cnQgbG9hZAoKICAgIHJldHVybiBsb2FkKHBhdGgpCgoKZGVmIF9lbmNvZGFibGUodmFsdWUpOgogICAgZnJvbSAu"
        "Y2Fub25pY2FsIGltcG9ydCBOb25DYW5vbmljYWwsIGNhbm9uaWNhbF9ieXRlcwoKICAgIHRyeToKICAgICAgICBj"
        "YW5vbmljYWxfYnl0ZXModmFsdWUpCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBOb25DYW5vbmljYWw6"
        "CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIF9zYWZlKHZhbHVlLCBsaW1pdD00MDk2KToKICAgICIiIlJlY29y"
        "ZCBhbiBlbnRyYW50J3MgcmF3IG1lc3NhZ2UsIGJvdW5kZWQgYW5kIGNhbm9uaWNhbGx5IGVuY29kYWJsZS4KCiAg"
        "ICBLZXB0IGZvciBhdWRpdGFiaWxpdHkuIFJlbW92ZWQgYnkgcmVmZXJlZV9wcm9qZWN0aW9uIGJlZm9yZSBzY29y"
        "aW5nLgogICAgIiIiCiAgICBpZiBub3QgX2VuY29kYWJsZSh2YWx1ZSk6CiAgICAgICAgcmV0dXJuIHsidW5lbmNv"
        "ZGFibGUiOiBUcnVlLCAicmVwciI6IHJlcHIodmFsdWUpWzpsaW1pdF19CiAgICB0ZXh0ID0gcmVwcih2YWx1ZSkK"
        "ICAgIGlmIGxlbih0ZXh0KSA+IGxpbWl0OgogICAgICAgIHJldHVybiB7InRydW5jYXRlZCI6IFRydWUsICJyZXBy"
        "IjogdGV4dFs6bGltaXRdfQogICAgcmV0dXJuIHZhbHVlCg==",
    "replay.py":
        "IiIiSW5kZXBlbmRlbnQgcmVwbGF5IHZlcmlmaWNhdGlvbi4KCkdpdmUgdGhpcyBhIHRyYW5zY3JpcHQgYW5kIGl0"
        "IHJlLWRlcml2ZXMgdGhlIG1hdGNoIHdpdGhvdXQgdGhlIGVudHJhbnRzOiBpdApyZWNvbXB1dGVzIHRoZSBoYXNo"
        "IGNoYWluLCByZWJ1aWxkcyB0aGUgb3BlbmluZyBwb3NpdGlvbiBmcm9tIHRoZSBzZWVkLCByZXBsYXlzCmV2ZXJ5"
        "IHJlY29yZGVkIG1vdmUgdGhyb3VnaCB0aGlzIGVuZ2luZSdzIG93biBjb3B5IG9mIHRoZSBydWxlcywgYW5kIHJl"
        "LWRlcml2ZXMKdGhlIHNjb3JlIGZyb20gc3RhdGUgYWxvbmUuIFRoZW4gaXQgY29tcGFyZXMgYWxsIG9mIHRoYXQg"
        "dG8gd2hhdCB0aGUgdHJhbnNjcmlwdApjbGFpbXMuCgpXaGF0IGEgUEFTUyBwcm92ZXM6CiAgLSB0aGUgdHJhbnNj"
        "cmlwdCBoYXMgbm90IGJlZW4gYWx0ZXJlZCBzaW5jZSBpdCB3YXMgd3JpdHRlbgogIC0gdGhlIG9wZW5pbmcgcG9z"
        "aXRpb24gcmVhbGx5IGRvZXMgZm9sbG93IGZyb20gdGhlIHJlY29yZGVkIHNlZWQKICAtIGV2ZXJ5IG1vdmUgdGhh"
        "dCB3YXMgYWNjZXB0ZWQgd2FzIGxlZ2FsLCBhbmQgZXZlcnkgbW92ZSB0aGF0IHdhcyByZWplY3RlZCB3YXMKICAg"
        "IGdlbnVpbmVseSBpbGxlZ2FsCiAgLSBlYWNoIHJlY29yZGVkIHBvc2l0aW9uIGZvbGxvd3MgZnJvbSB0aGUgcHJl"
        "dmlvdXMgb25lIHVuZGVyIHRoZSBzdGF0ZWQgcnVsZXMKICAtIHRoZSByZWNvcmRlZCB3aW5uZXIgZm9sbG93cyBm"
        "cm9tIHRoZSBzdGF0ZSBoaXN0b3J5LCBub3QgZnJvbSBhbnlvbmUncyBzYXktc28KICAtIHRoZSBlbmdpbmUgdGhh"
        "dCB2ZXJpZmllZCBpcyBieXRlLWlkZW50aWNhbCB0byB0aGUgZW5naW5lIHRoYXQgcmVmZXJlZWQKICAgIChyZXBv"
        "cnRlZCBzZXBhcmF0ZWx5OyBhIG1pc21hdGNoIGRvZXMgbm90IHNpbGVudGx5IHBhc3MpCgpXaGF0IGEgUEFTUyBk"
        "b2VzIE5PVCBwcm92ZToKICAtIHRoYXQgYSBtb3ZlIGNhbWUgZnJvbSB0aGUgbW9kZWwgdGhlIGVudHJhbnQgY2xh"
        "aW1lZC4gVGhlIGVuZ2luZSBuZXZlcgogICAgY29udGFjdHMgYSBtb2RlbCwgc28gaXQgY2Fubm90IHdpdG5lc3Mg"
        "b25lLiBSZXN1bHRzIGNhcnJ5IGBtb2RlbF9hdHRlc3RlZDoKICAgIGZhbHNlYCBmb3IgdGhpcyByZWFzb24uCiAg"
        "LSB3YWxsLWNsb2NrIGV2ZW50cy4gQSB0aW1lb3V0IGlzIGEgcmVjb3JkZWQgZmFjdCBhYm91dCB0aGUgbWFjaGlu"
        "ZSB0aGUgbWF0Y2gKICAgIHJhbiBvbjsgcmVwbGF5IHZlcmlmaWVzIHRoZSBhZGp1ZGljYXRpb24gdGhhdCBmb2xs"
        "b3dlZCBpdCwgbm90IHRoZSB0aW1pbmcuCiIiIgoKaW1wb3J0IHJhbmRvbQoKZnJvbSAuY2Fub25pY2FsIGltcG9y"
        "dCBkaWdlc3QKZnJvbSAuZ2FtZXMgaW1wb3J0IGxvYWQgYXMgbG9hZF9nYW1lCmZyb20gLmludGVncml0eSBpbXBv"
        "cnQgZW5naW5lX2RpZ2VzdApmcm9tIC5zY29yaW5nIGltcG9ydCByZWZlcmVlX3Byb2plY3Rpb24sIHNjb3JlCmZy"
        "b20gLnRyYW5zY3JpcHQgaW1wb3J0IGZpcnN0LCBsb2FkLCB2ZXJpZnlfY2hhaW4KCgpkZWYgdmVyaWZ5KHRyYW5z"
        "Y3JpcHRfcGF0aCk6CiAgICByZXBvcnQgPSB7CiAgICAgICAgInRyYW5zY3JpcHQiOiBzdHIodHJhbnNjcmlwdF9w"
        "YXRoKSwKICAgICAgICAiY2hhaW5fb2siOiBGYWxzZSwKICAgICAgICAiZW5naW5lX2RpZ2VzdF9tYXRjaCI6IE5v"
        "bmUsCiAgICAgICAgInNldHVwX29rIjogRmFsc2UsCiAgICAgICAgIm1vdmVzX29rIjogRmFsc2UsCiAgICAgICAg"
        "InN0YXRlc19vayI6IEZhbHNlLAogICAgICAgICJyZXN1bHRfbWF0Y2hlc19yZWNvbXB1dGF0aW9uIjogRmFsc2Us"
        "CiAgICAgICAgInZlcmRpY3QiOiAiRkFJTCIsCiAgICAgICAgImNoZWNrcyI6IFtdLAogICAgICAgICJlcnJvcnMi"
        "OiBbXSwKICAgICAgICAicHJvdmVzIjogW10sCiAgICAgICAgImRvZXNfbm90X3Byb3ZlIjogW10sCiAgICB9Cgog"
        "ICAgZGVmIG5vdGUobmFtZSwgb2ssIGRldGFpbD1Ob25lKToKICAgICAgICByZXBvcnRbImNoZWNrcyJdLmFwcGVu"
        "ZCh7ImNoZWNrIjogbmFtZSwgIm9rIjogYm9vbChvayksICJkZXRhaWwiOiBkZXRhaWx9KQogICAgICAgIGlmIG5v"
        "dCBvayBhbmQgZGV0YWlsOgogICAgICAgICAgICByZXBvcnRbImVycm9ycyJdLmFwcGVuZChmIntuYW1lfToge2Rl"
        "dGFpbH0iKQogICAgICAgIHJldHVybiBvawoKICAgIHRyeToKICAgICAgICByZWNvcmRzID0gbG9hZCh0cmFuc2Ny"
        "aXB0X3BhdGgpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmVwb3J0WyJlcnJvcnMiXS5hcHBl"
        "bmQoZiJjb3VsZCBub3QgcmVhZCB0cmFuc2NyaXB0OiB7ZX0iKQogICAgICAgIHJldHVybiByZXBvcnQKCiAgICBp"
        "ZiBub3QgcmVjb3JkczoKICAgICAgICBub3RlKCJub25fZW1wdHkiLCBGYWxzZSwgInRyYW5zY3JpcHQgY29udGFp"
        "bnMgbm8gcmVjb3JkcyIpCiAgICAgICAgcmV0dXJuIHJlcG9ydAoKICAgICMgMS4gY2hhaW4gaW50ZWdyaXR5CiAg"
        "ICBvaywgZXJyID0gdmVyaWZ5X2NoYWluKHJlY29yZHMpCiAgICByZXBvcnRbImNoYWluX29rIl0gPSBvawogICAg"
        "bm90ZSgiaGFzaF9jaGFpbiIsIG9rLCBlcnIpCiAgICBpZiBub3Qgb2s6CiAgICAgICAgcmVwb3J0WyJlcnJvcnMi"
        "XS5hcHBlbmQoImNoYWluIGlzIGJyb2tlbjsgbm90aGluZyBiZWxvdyBjYW4gYmUgdHJ1c3RlZCIpCiAgICAgICAg"
        "cmV0dXJuIHJlcG9ydAogICAgcmVwb3J0WyJjaGFpbl9oZWFkIl0gPSByZWNvcmRzWy0xXVsiaGFzaCJdCgogICAg"
        "aGVhZGVyID0gZmlyc3QocmVjb3JkcywgImhlYWRlciIpCiAgICBpZiBoZWFkZXIgaXMgTm9uZToKICAgICAgICBy"
        "ZXBvcnRbImVycm9ycyJdLmFwcGVuZCgibm8gaGVhZGVyIHJlY29yZCIpCiAgICAgICAgcmV0dXJuIHJlcG9ydAog"
        "ICAgaCA9IGhlYWRlclsiYm9keSJdCiAgICByZXBvcnRbIm1hdGNoX2lkIl0gPSBoLmdldCgibWF0Y2hfaWQiKQog"
        "ICAgcmVwb3J0WyJzZWVkIl0gPSBoLmdldCgic2VlZCIpCiAgICByZXBvcnRbImdhbWUiXSA9IGguZ2V0KCJnYW1l"
        "Iiwge30pLmdldCgibmFtZSIpCgogICAgIyAyLiBpcyB0aGUgdmVyaWZ5aW5nIGVuZ2luZSB0aGUgcmVmZXJlZWlu"
        "ZyBlbmdpbmU/CiAgICBtaW5lID0gZW5naW5lX2RpZ2VzdCgpCiAgICB0aGVpcnMgPSBoLmdldCgiZW5naW5lIiwg"
        "e30pLmdldCgiZGlnZXN0IikKICAgIHJlcG9ydFsiZW5naW5lX2RpZ2VzdF9tYXRjaCJdID0gbWluZSA9PSB0aGVp"
        "cnMKICAgIHJlcG9ydFsiZW5naW5lX2RpZ2VzdF9yZWNvcmRlZCJdID0gdGhlaXJzCiAgICByZXBvcnRbImVuZ2lu"
        "ZV9kaWdlc3RfdmVyaWZpZXIiXSA9IG1pbmUKICAgIG5vdGUoCiAgICAgICAgImVuZ2luZV9kaWdlc3QiLAogICAg"
        "ICAgIG1pbmUgPT0gdGhlaXJzLAogICAgICAgIE5vbmUgaWYgbWluZSA9PSB0aGVpcnMgZWxzZSAidmVyaWZpZXIg"
        "ZW5naW5lIGRpZmZlcnMgZnJvbSB0aGUgZW5naW5lIHRoYXQgcmVmZXJlZWQiLAogICAgKQoKICAgIHRyeToKICAg"
        "ICAgICBnYW1lID0gbG9hZF9nYW1lKGhbImdhbWUiXVsibmFtZSJdKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBl"
        "OgogICAgICAgIHJlcG9ydFsiZXJyb3JzIl0uYXBwZW5kKGYidW5rbm93biBnYW1lOiB7ZX0iKQogICAgICAgIHJl"
        "dHVybiByZXBvcnQKICAgIGlmIGdhbWUuVkVSU0lPTiAhPSBoWyJnYW1lIl0uZ2V0KCJ2ZXJzaW9uIik6CiAgICAg"
        "ICAgbm90ZSgiZ2FtZV92ZXJzaW9uIiwgRmFsc2UsIGYidHJhbnNjcmlwdCB3YW50cyB7aFsnZ2FtZSddLmdldCgn"
        "dmVyc2lvbicpfSwgaGF2ZSB7Z2FtZS5WRVJTSU9OfSIpCiAgICAgICAgcmV0dXJuIHJlcG9ydAogICAgbm90ZSgi"
        "Z2FtZV92ZXJzaW9uIiwgVHJ1ZSkKCiAgICAjIDMuIHJlcGxheQogICAgY29tcHV0ZWQgPSBOb25lCiAgICBzZWVu"
        "X2luaXRpYWwgPSBGYWxzZQogICAgbW92ZV9jb3VudCA9IDAKICAgIHN0YXRlc19vayA9IFRydWUKICAgIG1vdmVz"
        "X29rID0gVHJ1ZQogICAgc2V0dXBfb2sgPSBGYWxzZQogICAgZm9yZmVpdHMgPSBbXQoKICAgICMgQSB0cmFuc2Ny"
        "aXB0IGhhbmRlZCB0byB0aGlzIGZ1bmN0aW9uIGlzIHVudHJ1c3RlZCBpbnB1dCDigJQgaXQgbWF5IGJlCiAgICAj"
        "IGNyYWZ0ZWQsIHRydW5jYXRlZCwgb3IgcHJvZHVjZWQgYnkgYSBidWdneSBlbmdpbmUuIGB2ZXJpZnlgIG11c3Qg"
        "YWx3YXlzCiAgICAjIHJldHVybiBhIHZlcmRpY3QgYW5kIG11c3QgbmV2ZXIgcmFpc2U6IGEgdmVyaWZpZXIgdGhh"
        "dCB0aHJvd3MgYSB0cmFjZWJhY2sKICAgICMgaXMgYSBkZW5pYWwtb2YtdmVyaWZpY2F0aW9uLCBhbmQgYSByZWFk"
        "ZXIgY2Fubm90IHRlbGwgYSBjcmFzaCBmcm9tIGEKICAgICMgcmVzdWx0IG5vYm9keSBsb29rZWQgYXQuIEZvdW5k"
        "IGJ5IG11dGF0aW9uLXRlc3RpbmcgdGhlIHNlbGYtY2hlY2suCiAgICB0cnk6CiAgICAgICAgZm9yIHJlYyBpbiBy"
        "ZWNvcmRzOgogICAgICAgICAgICBraW5kLCBib2R5ID0gcmVjWyJraW5kIl0sIHJlY1siYm9keSJdCgogICAgICAg"
        "ICAgICBpZiBraW5kID09ICJzdGF0ZSI6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2Vlbl9pbml0aWFsOgogICAg"
        "ICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gZ2FtZS5zZXR1cChyYW5kb20uUmFuZG9tKGhbInNlZWQiXSkpCiAg"
        "ICAgICAgICAgICAgICAgICAgc2Vlbl9pbml0aWFsID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHNldHVwX29r"
        "ID0gZGlnZXN0KGNvbXB1dGVkKSA9PSBib2R5WyJzdGF0ZV9kaWdlc3QiXQogICAgICAgICAgICAgICAgICAgIG5v"
        "dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuaW5nX3Bvc2l0aW9uX2Zyb21fc2VlZCIsCiAgICAgICAg"
        "ICAgICAgICAgICAgICAgIHNldHVwX29rLAogICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHNldHVwX29r"
        "IGVsc2UgInNlZWQgZG9lcyBub3QgcmVwcm9kdWNlIHRoZSByZWNvcmRlZCBvcGVuaW5nIHBvc2l0aW9uIiwKICAg"
        "ICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNldHVwX29rOgogICAgICAgICAg"
        "ICAgICAgICAgICAgICBzdGF0ZXNfb2sgPSBGYWxzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg"
        "ICAgICAgICBtYXRjaF8gPSBkaWdlc3QoY29tcHV0ZWQpID09IGJvZHlbInN0YXRlX2RpZ2VzdCJdCiAgICAgICAg"
        "ICAgICAgICAgICAgaWYgbm90IG1hdGNoXzoKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzX29rID0gRmFs"
        "c2UKICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYic3Rh"
        "dGVfYWZ0ZXJfdHVybl97Ym9keS5nZXQoJ3R1cm4nKX0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFs"
        "c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gZG9lcyBub3QgZm9sbG93IGZyb20gdGhl"
        "IHByZXZpb3VzIG1vdmUiLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBlbGlmIGtpbmQg"
        "PT0gIm1vdmUiOgogICAgICAgICAgICAgICAgbW92ZV9jb3VudCArPSAxCiAgICAgICAgICAgICAgICBpZiBjb21w"
        "dXRlZCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG1vdmVzX29rID0gRmFsc2UKICAgICAgICAgICAgICAg"
        "ICAgICBub3RlKGYibW92ZV90dXJuX3tib2R5LmdldCgndHVybicpfSIsIEZhbHNlLCAiYSBtb3ZlIHByZWNlZGVz"
        "IGFueSByZWNvcmRlZCBwb3NpdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAg"
        "ICAgIG9rX2hlcmUsIHdoeSA9IGdhbWUubGVnYWwoY29tcHV0ZWQsIGJvZHkuZ2V0KCJtb3ZlIikpCiAgICAgICAg"
        "ICAgICAgICBjbGFpbWVkX2xlZ2FsID0gYm9vbChib2R5LmdldCgibGVnYWwiKSkKICAgICAgICAgICAgICAgIGlm"
        "IG9rX2hlcmUgIT0gY2xhaW1lZF9sZWdhbDoKICAgICAgICAgICAgICAgICAgICBtb3Zlc19vayA9IEZhbHNlCiAg"
        "ICAgICAgICAgICAgICAgICAgbm90ZSgKICAgICAgICAgICAgICAgICAgICAgICAgZiJtb3ZlX3R1cm5fe2JvZHku"
        "Z2V0KCd0dXJuJyl9IiwKICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAg"
        "ICAgIGYidHJhbnNjcmlwdCBzYXlzIGxlZ2FsPXtjbGFpbWVkX2xlZ2FsfSwgdGhpcyBlbmdpbmUgc2F5cyBsZWdh"
        "bD17b2tfaGVyZX0gKHt3aHl9KSIsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxpZiBj"
        "bGFpbWVkX2xlZ2FsOgogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gZ2FtZS5hcHBseShjb21wdXRlZCwg"
        "Ym9keVsibW92ZSJdKQoKICAgICAgICAgICAgZWxpZiBraW5kID09ICJmb3JmZWl0IjoKICAgICAgICAgICAgICAg"
        "IGZvcmZlaXRzLmFwcGVuZChib2R5KQoKICAgICAgICAgICAgZWxpZiBraW5kID09ICJlbmdpbmVfZXJyb3IiOgog"
        "ICAgICAgICAgICAgICAgcmVwb3J0WyJlbmdpbmVfZXJyb3JfcmVjb3JkZWQiXSA9IGJvZHkuZ2V0KCJkZXRhaWwi"
        "KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIG5vdGUoCiAgICAgICAgICAgICJyZXBsYXlfZXhl"
        "Y3V0aW9uIiwKICAgICAgICAgICAgRmFsc2UsCiAgICAgICAgICAgIGYicmVwbGF5aW5nIHRoaXMgdHJhbnNjcmlw"
        "dCByYWlzZWQge2UuX19jbGFzc19fLl9fbmFtZV9ffToge2V9IiwKICAgICAgICApCiAgICAgICAgcmVwb3J0WyJ2"
        "ZXJkaWN0Il0gPSAiRkFJTCIKICAgICAgICByZXR1cm4gcmVwb3J0CgogICAgcmVwb3J0WyJzZXR1cF9vayJdID0g"
        "c2V0dXBfb2sKICAgIHJlcG9ydFsic3RhdGVzX29rIl0gPSBzdGF0ZXNfb2sKICAgIHJlcG9ydFsibW92ZXNfb2si"
        "XSA9IG1vdmVzX29rCiAgICByZXBvcnRbIm1vdmVzX3JlcGxheWVkIl0gPSBtb3ZlX2NvdW50CiAgICBub3RlKCJh"
        "bGxfcG9zaXRpb25zX2ZvbGxvd190aGVfcnVsZXMiLCBzdGF0ZXNfb2spCiAgICBub3RlKCJhbGxfbW92ZV9ydWxp"
        "bmdzX3JlcHJvZHVjZSIsIG1vdmVzX29rKQoKICAgICMgNC4gYWRqdWRpY2F0aW9uIG9mIGZvcmZlaXRzOiB0aGUg"
        "Zm9yZmVpdGluZyBzZWF0IG11c3QgYmUgdGhlIG9uZSB0aGF0IGxvc3QKICAgIGFkanVkaWNhdGlvbl9vayA9IFRy"
        "dWUKICAgIHJlY29yZGVkX3Jlc3VsdCA9IGZpcnN0KHJlY29yZHMsICJyZXN1bHQiKQogICAgaWYgcmVjb3JkZWRf"
        "cmVzdWx0IGFuZCBmb3JmZWl0czoKICAgICAgICBsb3NlciA9IGZvcmZlaXRzWzBdWyJwbGF5ZXIiXQogICAgICAg"
        "IGlmIHJlY29yZGVkX3Jlc3VsdFsiYm9keSJdLmdldCgid2lubmVyIikgIT0gMSAtIGxvc2VyOgogICAgICAgICAg"
        "ICBhZGp1ZGljYXRpb25fb2sgPSBGYWxzZQogICAgbm90ZSgiZm9yZmVpdF9hZGp1ZGljYXRpb24iLCBhZGp1ZGlj"
        "YXRpb25fb2ssIE5vbmUgaWYgYWRqdWRpY2F0aW9uX29rIGVsc2UgImZvcmZlaXRpbmcgc2VhdCB3YXMgbm90IHJ1"
        "bGVkIHRoZSBsb3NlciIpCgogICAgIyA1LiByZWNvbXB1dGUgdGhlIHNjb3JlIGZyb20gcmVmZXJlZSBzdGF0ZSwg"
        "aWdub3JpbmcgdGhlIHJlY29yZGVkIHJlc3VsdAogICAgdHJ5OgogICAgICAgIHJlY29tcHV0ZWQgPSBzY29yZShy"
        "ZWZlcmVlX3Byb2plY3Rpb24ocmVjb3JkcyksIGdhbWUpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAg"
        "ICAgbm90ZSgic2NvcmVfcmVjb21wdXRhdGlvbiIsIEZhbHNlLCBmIntlLl9fY2xhc3NfXy5fX25hbWVfX306IHtl"
        "fSIpCiAgICAgICAgcmVwb3J0WyJ2ZXJkaWN0Il0gPSAiRkFJTCIKICAgICAgICByZXR1cm4gcmVwb3J0CiAgICBy"
        "ZXBvcnRbInJlY29tcHV0ZWQiXSA9IHJlY29tcHV0ZWQKICAgIGlmIHJlY29yZGVkX3Jlc3VsdCBpcyBOb25lOgog"
        "ICAgICAgIG5vdGUoInJlc3VsdF9wcmVzZW50IiwgRmFsc2UsICJubyByZXN1bHQgcmVjb3JkIikKICAgICAgICBy"
        "ZXR1cm4gcmVwb3J0CiAgICByYiA9IHJlY29yZGVkX3Jlc3VsdFsiYm9keSJdCiAgICByZXBvcnRbInJlY29yZGVk"
        "Il0gPSB7azogcmIuZ2V0KGspIGZvciBrIGluICgid2lubmVyIiwgInJlYXNvbiIsICJtb3ZlcyIsICJwb2ludHMi"
        "LCAiZGVjaXNpdmUiKX0KICAgIHNhbWUgPSBhbGwocmVjb21wdXRlZFtrXSA9PSByYi5nZXQoaykgZm9yIGsgaW4g"
        "KCJ3aW5uZXIiLCAicmVhc29uIiwgIm1vdmVzIiwgInBvaW50cyIsICJkZWNpc2l2ZSIpKQogICAgcmVwb3J0WyJy"
        "ZXN1bHRfbWF0Y2hlc19yZWNvbXB1dGF0aW9uIl0gPSBzYW1lCiAgICBub3RlKAogICAgICAgICJyZWNvcmRlZF9y"
        "ZXN1bHRfZm9sbG93c19mcm9tX3N0YXRlIiwKICAgICAgICBzYW1lLAogICAgICAgIE5vbmUgaWYgc2FtZSBlbHNl"
        "IGYicmVjb3JkZWQge3JlcG9ydFsncmVjb3JkZWQnXX0gdnMgcmVjb21wdXRlZCB7cmVjb21wdXRlZH0iLAogICAg"
        "KQoKICAgIHBhc3NlZCA9ICgKICAgICAgICByZXBvcnRbImNoYWluX29rIl0KICAgICAgICBhbmQgc2V0dXBfb2sK"
        "ICAgICAgICBhbmQgc3RhdGVzX29rCiAgICAgICAgYW5kIG1vdmVzX29rCiAgICAgICAgYW5kIGFkanVkaWNhdGlv"
        "bl9vawogICAgICAgIGFuZCBzYW1lCiAgICApCiAgICByZXBvcnRbInZlcmRpY3QiXSA9ICJQQVNTIiBpZiBwYXNz"
        "ZWQgZWxzZSAiRkFJTCIKCiAgICByZXBvcnRbInByb3ZlcyJdID0gWwogICAgICAgICJ0cmFuc2NyaXB0IHVuYWx0"
        "ZXJlZCBzaW5jZSBpdCB3YXMgd3JpdHRlbiAoaGFzaCBjaGFpbiByZWNvbXB1dGVkKSIsCiAgICAgICAgIm9wZW5p"
        "bmcgcG9zaXRpb24gZm9sbG93cyBmcm9tIHRoZSByZWNvcmRlZCBzZWVkIiwKICAgICAgICAiZXZlcnkgbW92ZSBy"
        "dWxpbmcgcmVwcm9kdWNlcyB1bmRlciB0aGlzIGVuZ2luZSdzIHJ1bGVzIiwKICAgICAgICAiZXZlcnkgcG9zaXRp"
        "b24gZm9sbG93cyBmcm9tIHRoZSBwcmV2aW91cyBvbmUiLAogICAgICAgICJ0aGUgcmVjb3JkZWQgd2lubmVyIGZv"
        "bGxvd3MgZnJvbSBzdGF0ZSwgbm90IGZyb20gYW55IGVudHJhbnQncyBjbGFpbSIsCiAgICBdCiAgICByZXBvcnRb"
        "ImRvZXNfbm90X3Byb3ZlIl0gPSBbCiAgICAgICAgIndoaWNoIG1vZGVsIHByb2R1Y2VkIGFueSBtb3ZlICh0aGUg"
        "ZW5naW5lIG5ldmVyIGNvbnRhY3RzIGEgbW9kZWw7ICIKICAgICAgICBmIm1vZGVsX2F0dGVzdGVkPXtoLmdldCgn"
        "YXR0ZXN0YXRpb24nLCB7fSkuZ2V0KCdtb2RlbF9hdHRlc3RlZCcpfSkiLAogICAgICAgICJ3YWxsLWNsb2NrIGV2"
        "ZW50cyBzdWNoIGFzIHRpbWVvdXRzLCB3aGljaCBhcmUgcmVjb3JkZWQgZmFjdHMgYWJvdXQgdGhlICIKICAgICAg"
        "ICAibWFjaGluZSB0aGUgbWF0Y2ggcmFuIG9uIiwKICAgIF0KICAgIGlmIG5vdCByZXBvcnRbImVuZ2luZV9kaWdl"
        "c3RfbWF0Y2giXToKICAgICAgICByZXBvcnRbImRvZXNfbm90X3Byb3ZlIl0uYXBwZW5kKAogICAgICAgICAgICAi"
        "dGhhdCB0aGUgcmVmZXJlZWluZyBlbmdpbmUgbWF0Y2hlZCB0aGlzIG9uZSDigJQgdGhlIGVuZ2luZSBkaWdlc3Rz"
        "IGRpZmZlciwgIgogICAgICAgICAgICAic28gdGhlc2UgcmVzdWx0cyBkZXNjcmliZSBkaWZmZXJlbnQgcnVsZSBj"
        "b2RlIgogICAgICAgICkKICAgIHJldHVybiByZXBvcnQK",
    "sandbox.py":
        "IiIiRW50cmFudCBwcm9jZXNzIGNoYW5uZWwuCgpBbiBlbnRyYW50IGlzIGEgc3VicHJvY2VzcyB0aGF0IHNwZWFr"
        "cyBKU09OIExpbmVzIG92ZXIgc3RkaW4vc3Rkb3V0LiBUaGF0IGlzIHRoZQplbnRpcmUgY291cGxpbmcuIEl0IHNo"
        "YXJlcyBubyBtZW1vcnkgd2l0aCB0aGUgcmVmZXJlZSwgY2Fubm90IGltcG9ydCBpdCwgaXMgbm90CnRvbGQgd2hl"
        "cmUgdGhlIHRyYW5zY3JpcHQgbGl2ZXMsIGFuZCBpdHMgd29ya2luZyBkaXJlY3RvcnkgaXMgYSBzY3JhdGNoIGRp"
        "cgpjcmVhdGVkIGZvciB0aGUgbWF0Y2guCgpIb25lc3R5IGFib3V0IHdoYXQgInNhbmRib3giIG1lYW5zIGhlcmUg"
        "bWF0dGVycyBtb3JlIHRoYW4gdGhlIHdvcmQgZG9lcywgc28gdGhlCnBvbGljeSBpcyBlbnVtZXJhdGVkIGFuZCBz"
        "aGlwcGVkIGludG8gdGhlIHRyYW5zY3JpcHQgaGVhZGVyLiBTZWUgUE9MSUNZIGJlbG93LgpBIHJlc3VsdCBzaG91"
        "bGQgbmV2ZXIgaW1wbHkgYW4gaXNvbGF0aW9uIGd1YXJhbnRlZSB0aGUgaG9zdCBkaWQgbm90IGFjdHVhbGx5CnBy"
        "b3ZpZGUuCiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCBxdWV1ZQppbXBvcnQgc2h1dGlsCmltcG9y"
        "dCBzdWJwcm9jZXNzCmltcG9ydCB0aHJlYWRpbmcKCiMgUGFzc2VkIHRocm91Z2ggc28gYSBzdWJwcm9jZXNzIGNh"
        "biBzdGFydCBhdCBhbGwgb24gV2luZG93cyBhbmQgUE9TSVguIE5vbmUgb2YKIyB0aGVzZSBjYXJyeSBtb2RlbCBh"
        "Y2Nlc3MuCiMKIyBVU0VSUFJPRklMRSAvIExPQ0FMQVBQREFUQSAvIEFQUERBVEEgYXJlIGhlcmUgYmVjYXVzZSBy"
        "ZWFsIENMSSB0b29scyBuZWVkIHRoZW0KIyB0byBmaW5kIHRoZWlyIG93biBjb25maWcgYW5kIGRhdGEuIFByb2Jl"
        "ZCAyMDI2LTA4LTE0OiB3aXRob3V0IFVTRVJQUk9GSUxFLAojIGBvbGxhbWFgIGRpZXMgd2l0aCBgcGFuaWM6ICV1"
        "c2VycHJvZmlsZSUgaXMgbm90IGRlZmluZWRgIGJlZm9yZSByZWFkaW5nIGEKIyBwcm9tcHQsIHdoaWNoIHdvdWxk"
        "IGJsb2NrIGV2ZXJ5IENMSS1iYXNlZCBlbnRyYW50IG9uIFdpbmRvd3MuIFRoZXkgd2lkZW4gd2hhdAojIGFuIGVu"
        "dHJhbnQgY2FuIGxvY2F0ZSBvbiBkaXNrLCBidXQgdjEgYWxyZWFkeSBkZWNsYXJlcyBmaWxlc3lzdGVtIGNvbmZp"
        "bmVtZW50CiMgdW5lbmZvcmNlZCBiZWxvdywgc28gdGhpcyByZW1vdmVzIG5vIGd1YXJhbnRlZSB3ZSBhY3R1YWxs"
        "eSBtYWtlLiBUaWdodGVuIHRoaXMKIyBsaXN0IGFuZCB0aGUgT1MtbGV2ZWwgamFpbCB0b2dldGhlciwgbm90IHNl"
        "cGFyYXRlbHkuCl9CQVNFX0VOVl9LRVlTID0gKAogICAgIlBBVEgiLCAiU1lTVEVNUk9PVCIsICJXSU5ESVIiLCAi"
        "Q09NU1BFQyIsICJQQVRIRVhUIiwgIlRFTVAiLCAiVE1QIiwKICAgICJVU0VSUFJPRklMRSIsICJMT0NBTEFQUERB"
        "VEEiLCAiQVBQREFUQSIsICJIT01FRFJJVkUiLCAiSE9NRVBBVEgiLAogICAgIkhPTUUiLCAiTEFORyIsICJMQ19B"
        "TEwiLCAiVFoiLAopCgpQT0xJQ1kgPSB7CiAgICAicHJvdG9jb2wiOiAiYXJlbmEvMSIsCiAgICAiZW5mb3JjZWQi"
        "OiBbCiAgICAgICAgInNlcGFyYXRlX29zX3Byb2Nlc3MgKG5vIHNoYXJlZCBtZW1vcnkgb3IgaW1wb3J0cyB3aXRo"
        "IHRoZSByZWZlcmVlKSIsCiAgICAgICAgImN3ZF9pc29sYXRlZF9zY3JhdGNoX2RpciAoZW50cmFudCBpcyBzdGFy"
        "dGVkIGluIGEgcGVyLW1hdGNoIHNjcmF0Y2ggZGlyKSIsCiAgICAgICAgImVudl9hbGxvd2xpc3QgKG9ubHkgYmFz"
        "ZSBPUyB2YXJzIHBsdXMgbmFtZXMgdGhlIGVudHJhbnQgbWFuaWZlc3QgZGVjbGFyZXMpIiwKICAgICAgICAibm9f"
        "aW5oZXJpdGVkX2ZpbGVfaGFuZGxlcyAoY2xvc2VfZmRzKSIsCiAgICAgICAgInRyYW5zY3JpcHRfcGF0aF93aXRo"
        "aGVsZCAoZW50cmFudCBpcyBuZXZlciB0b2xkIHdoZXJlIHRoZSByZWNvcmQgaXMgd3JpdHRlbikiLAogICAgICAg"
        "ICJwZXJfbW92ZV93YWxsX2Nsb2NrX3RpbWVvdXQgKGV4Y2VlZGVkIC0+IGZvcmZlaXQpIiwKICAgICAgICAic3Rk"
        "b3V0X2xpbmVfc2l6ZV9jYXAiLAogICAgICAgICJzdGRvdXRfdG90YWxfc2l6ZV9jYXAiLAogICAgICAgICJzdGRl"
        "cnJfY2FwdHVyZWRfYW5kX2NhcHBlZCIsCiAgICAgICAgImtpbGxfb25fdGltZW91dF9hbmRfYXRfbWF0Y2hfZW5k"
        "IiwKICAgIF0sCiAgICAidW5lbmZvcmNlZF92MSI6IFsKICAgICAgICAibmV0d29ya19lZ3Jlc3NfYmxvY2tpbmcg"
        "KGFuIGVudHJhbnQgQ0FOIHJlYWNoIHRoZSBuZXR3b3JrOyBub3QgcmVzdHJpY3RlZCBieSB0aGUgaG9zdCBpbiB2"
        "MSkiLAogICAgICAgICJmaWxlc3lzdGVtX2NvbmZpbmVtZW50IChjd2QgaXMgc2V0LCBub3QgY2hyb290ZWQ7IGFu"
        "IGVudHJhbnQgQ0FOIHJlYWQgb3V0c2lkZSBpdCkiLAogICAgICAgICJjcHVfYW5kX21lbW9yeV9saW1pdHMgKG5v"
        "IGpvYiBvYmplY3QgLyBjZ3JvdXAgYXBwbGllZCBpbiB2MSkiLAogICAgXSwKICAgICJub3RlIjogKAogICAgICAg"
        "ICJUaGUgdW5lbmZvcmNlZCBpdGVtcyBuZWVkIGFuIE9TLWxldmVsIGphaWwgKGNvbnRhaW5lciwgV1NMIGNncm91"
        "cCwgV2luZG93cyBqb2IgIgogICAgICAgICJvYmplY3QgcGx1cyBhIGZpcmV3YWxsIHByb2ZpbGUpLiBVbnRpbCB0"
        "aGF0IHNoaXBzLCBhIG1hdGNoIHJ1biBvbiBhbiB1bnRydXN0ZWQgIgogICAgICAgICJlbnRyYW50IGlzIGlzb2xh"
        "dGVkIGluIHByb2Nlc3MgYnV0IG5vdCBpbiBjYXBhYmlsaXR5LCBhbmQgcmVzdWx0cyBzaG91bGQgYmUgIgogICAg"
        "ICAgICJsYWJlbGxlZCBhY2NvcmRpbmdseS4iCiAgICApLAp9CgoKY2xhc3MgRW50cmFudEZhaWx1cmUoRXhjZXB0"
        "aW9uKToKICAgICIiIlRoZSBlbnRyYW50IGRpZCBub3QgcHJvZHVjZSBhIHVzYWJsZSByZXNwb25zZS4gQ2Fycmll"
        "cyBhIGZvcmZlaXQgcmVhc29uLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFzb24sIGRldGFpbD1Ob25l"
        "KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKHJlYXNvbikKICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgog"
        "ICAgICAgIHNlbGYuZGV0YWlsID0gZGV0YWlsCgoKY2xhc3MgRW50cmFudDoKICAgIGRlZiBfX2luaXRfXygKICAg"
        "ICAgICBzZWxmLAogICAgICAgIG1hbmlmZXN0LAogICAgICAgIHdvcmtkaXIsCiAgICAgICAgbW92ZV90aW1lb3V0"
        "X3M9MTUuMCwKICAgICAgICBtYXhfbGluZV9ieXRlcz02NCAqIDEwMjQsCiAgICAgICAgbWF4X3RvdGFsX2J5dGVz"
        "PTQgKiAxMDI0ICogMTAyNCwKICAgICAgICBtYXhfc3RkZXJyX2J5dGVzPTY0ICogMTAyNCwKICAgICk6CiAgICAg"
        "ICAgc2VsZi5uYW1lID0gbWFuaWZlc3RbIm5hbWUiXQogICAgICAgIHNlbGYuY21kID0gbGlzdChtYW5pZmVzdFsi"
        "Y21kIl0pCiAgICAgICAgc2VsZi5kZWNsYXJlZF9lbnYgPSBsaXN0KG1hbmlmZXN0LmdldCgiZW52IiwgW10pKQog"
        "ICAgICAgIHNlbGYud29ya2RpciA9IHN0cih3b3JrZGlyKQogICAgICAgIHNlbGYubW92ZV90aW1lb3V0X3MgPSBm"
        "bG9hdChtb3ZlX3RpbWVvdXRfcykKICAgICAgICBzZWxmLm1heF9saW5lX2J5dGVzID0gaW50KG1heF9saW5lX2J5"
        "dGVzKQogICAgICAgIHNlbGYubWF4X3RvdGFsX2J5dGVzID0gaW50KG1heF90b3RhbF9ieXRlcykKICAgICAgICBz"
        "ZWxmLm1heF9zdGRlcnJfYnl0ZXMgPSBpbnQobWF4X3N0ZGVycl9ieXRlcykKCiAgICAgICAgc2VsZi5fcHJvYyA9"
        "IE5vbmUKICAgICAgICBzZWxmLl9xID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYuX3JlYWRlciA9IE5vbmUK"
        "ICAgICAgICBzZWxmLl9zdGRlcnJfYnVmID0gYnl0ZWFycmF5KCkKICAgICAgICBzZWxmLl9zdGRlcnJfdGhyZWFk"
        "ID0gTm9uZQogICAgICAgIHNlbGYuX2J5dGVzX3NlZW4gPSAwCgogICAgIyAtLSBsaWZlY3ljbGUgLS0tLS0tLS0t"
        "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgX2NoaWxkX2Vu"
        "dihzZWxmKToKICAgICAgICBlbnYgPSB7azogb3MuZW52aXJvbltrXSBmb3IgayBpbiBfQkFTRV9FTlZfS0VZUyBp"
        "ZiBrIGluIG9zLmVudmlyb259CiAgICAgICAgIyBUaGUgZW50cmFudCBkZWNsYXJlcyB3aGljaCBjcmVkZW50aWFs"
        "LWJlYXJpbmcgdmFyaWFibGVzIGl0IG5lZWRzLiBUaGUKICAgICAgICAjIGVuZ2luZSBwYXNzZXMgdGhlbSB0aHJv"
        "dWdoIHdpdGhvdXQgcmVhZGluZywgbG9nZ2luZyBvciBoYXNoaW5nIHZhbHVlcy4KICAgICAgICBmb3IgbmFtZSBp"
        "biBzZWxmLmRlY2xhcmVkX2VudjoKICAgICAgICAgICAgaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgogICAgICAgICAg"
        "ICAgICAgZW52W25hbWVdID0gb3MuZW52aXJvbltuYW1lXQogICAgICAgIGVudlsiUFlUSE9OVU5CVUZGRVJFRCJd"
        "ID0gIjEiCiAgICAgICAgZW52WyJQWVRIT05JT0VOQ09ESU5HIl0gPSAidXRmLTgiCiAgICAgICAgZW52WyJBUkVO"
        "QV9QUk9UT0NPTCJdID0gImFyZW5hLzEiCiAgICAgICAgcmV0dXJuIGVudgoKICAgIGRlZiBzdGFydChzZWxmKToK"
        "ICAgICAgICBvcy5tYWtlZGlycyhzZWxmLndvcmtkaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgY21kID0gbGlz"
        "dChzZWxmLmNtZCkKICAgICAgICAjIFJlc29sdmUgdGhlIGV4ZWN1dGFibGUgYWdhaW5zdCBQQVRIIG91cnNlbHZl"
        "cyBzbyBhIGZhaWx1cmUgdG8gZmluZCBpdAogICAgICAgICMgaXMgYSBjbGVhciBlcnJvciByYXRoZXIgdGhhbiBh"
        "biBvcGFxdWUgT1NFcnJvci4KICAgICAgICBleGUgPSBzaHV0aWwud2hpY2goY21kWzBdKQogICAgICAgIGlmIGV4"
        "ZToKICAgICAgICAgICAgY21kWzBdID0gZXhlCiAgICAgICAgc2VsZi5fcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4o"
        "CiAgICAgICAgICAgIGNtZCwKICAgICAgICAgICAgY3dkPXNlbGYud29ya2RpciwKICAgICAgICAgICAgZW52PXNl"
        "bGYuX2NoaWxkX2VudigpLAogICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgIHN0"
        "ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAg"
        "ICAgIGNsb3NlX2Zkcz1UcnVlLAogICAgICAgICAgICBidWZzaXplPTAsCiAgICAgICAgKQogICAgICAgIHNlbGYu"
        "X3JlYWRlciA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX3B1bXBfc3Rkb3V0LCBkYWVtb249VHJ1ZSkK"
        "ICAgICAgICBzZWxmLl9yZWFkZXIuc3RhcnQoKQogICAgICAgIHNlbGYuX3N0ZGVycl90aHJlYWQgPSB0aHJlYWRp"
        "bmcuVGhyZWFkKHRhcmdldD1zZWxmLl9wdW1wX3N0ZGVyciwgZGFlbW9uPVRydWUpCiAgICAgICAgc2VsZi5fc3Rk"
        "ZXJyX3RocmVhZC5zdGFydCgpCgogICAgZGVmIF9wdW1wX3N0ZG91dChzZWxmKToKICAgICAgICB0cnk6CiAgICAg"
        "ICAgICAgIGZvciByYXcgaW4gaXRlcihzZWxmLl9wcm9jLnN0ZG91dC5yZWFkbGluZSwgYiIiKToKICAgICAgICAg"
        "ICAgICAgIHNlbGYuX2J5dGVzX3NlZW4gKz0gbGVuKHJhdykKICAgICAgICAgICAgICAgIGlmIGxlbihyYXcpID4g"
        "c2VsZi5tYXhfbGluZV9ieXRlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9xLnB1dCgoImVycm9yIiwgZiJz"
        "dGRvdXQgbGluZSBleGNlZWRlZCB7c2VsZi5tYXhfbGluZV9ieXRlc30gYnl0ZXMiKSkKICAgICAgICAgICAgICAg"
        "ICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGlmIHNlbGYuX2J5dGVzX3NlZW4gPiBzZWxmLm1heF90b3RhbF9i"
        "eXRlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9xLnB1dCgoImVycm9yIiwgZiJzdGRvdXQgZXhjZWVkZWQg"
        "e3NlbGYubWF4X3RvdGFsX2J5dGVzfSBieXRlcyB0b3RhbCIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybgog"
        "ICAgICAgICAgICAgICAgbGluZSA9IHJhdy5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIikuc3RyaXAo"
        "KQogICAgICAgICAgICAgICAgaWYgbGluZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9xLnB1dCgoImxpbmUi"
        "LCBsaW5lKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHBpcGUgdG9ybiBkb3duIG1pZC1yZWFk"
        "CiAgICAgICAgICAgIHNlbGYuX3EucHV0KCgiZXJyb3IiLCBmInN0ZG91dCByZWFkIGZhaWxlZDoge2UuX19jbGFz"
        "c19fLl9fbmFtZV9ffSIpKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX3EucHV0KCgiZW9mIiwg"
        "Tm9uZSkpCgogICAgZGVmIF9wdW1wX3N0ZGVycihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBy"
        "YXcgaW4gaXRlcihzZWxmLl9wcm9jLnN0ZGVyci5yZWFkbGluZSwgYiIiKToKICAgICAgICAgICAgICAgIHJvb20g"
        "PSBzZWxmLm1heF9zdGRlcnJfYnl0ZXMgLSBsZW4oc2VsZi5fc3RkZXJyX2J1ZikKICAgICAgICAgICAgICAgIGlm"
        "IHJvb20gPiAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVycl9idWYuZXh0ZW5kKHJhd1s6cm9vbV0p"
        "CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICMgLS0gbWVzc2FnaW5nIC0t"
        "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVmIHNl"
        "bmQoc2VsZiwgcGF5bG9hZCk6CiAgICAgICAgaWYgc2VsZi5fcHJvYyBpcyBOb25lIG9yIHNlbGYuX3Byb2MucG9s"
        "bCgpIGlzIG5vdCBOb25lOgogICAgICAgICAgICByYWlzZSBFbnRyYW50RmFpbHVyZSgiZW50cmFudF9ub3RfcnVu"
        "bmluZyIpCiAgICAgICAgZGF0YSA9IChqc29uLmR1bXBzKHBheWxvYWQsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSwg"
        "ZW5zdXJlX2FzY2lpPUZhbHNlKSArICJcbiIpLmVuY29kZSgidXRmLTgiKQogICAgICAgIHRyeToKICAgICAgICAg"
        "ICAgc2VsZi5fcHJvYy5zdGRpbi53cml0ZShkYXRhKQogICAgICAgICAgICBzZWxmLl9wcm9jLnN0ZGluLmZsdXNo"
        "KCkKICAgICAgICBleGNlcHQgKEJyb2tlblBpcGVFcnJvciwgT1NFcnJvcikgYXMgZToKICAgICAgICAgICAgcmFp"
        "c2UgRW50cmFudEZhaWx1cmUoImVudHJhbnRfc3RkaW5fY2xvc2VkIiwgZS5fX2NsYXNzX18uX19uYW1lX18pIGZy"
        "b20gZQoKICAgIGRlZiByZWN2KHNlbGYsIHRpbWVvdXRfcz1Ob25lKToKICAgICAgICB0aW1lb3V0X3MgPSBzZWxm"
        "Lm1vdmVfdGltZW91dF9zIGlmIHRpbWVvdXRfcyBpcyBOb25lIGVsc2UgdGltZW91dF9zCiAgICAgICAgdHJ5Ogog"
        "ICAgICAgICAgICBraW5kLCB2YWx1ZSA9IHNlbGYuX3EuZ2V0KHRpbWVvdXQ9dGltZW91dF9zKQogICAgICAgIGV4"
        "Y2VwdCBxdWV1ZS5FbXB0eToKICAgICAgICAgICAgcmFpc2UgRW50cmFudEZhaWx1cmUoInRpbWVvdXQiLCBmIm5v"
        "IHJlc3BvbnNlIHdpdGhpbiB7dGltZW91dF9zOmd9cyIpCiAgICAgICAgaWYga2luZCA9PSAiZW9mIjoKICAgICAg"
        "ICAgICAgcmFpc2UgRW50cmFudEZhaWx1cmUoImVudHJhbnRfZXhpdGVkIiwgZiJleGl0IGNvZGUge3NlbGYuX3By"
        "b2MucG9sbCgpfSIpCiAgICAgICAgaWYga2luZCA9PSAiZXJyb3IiOgogICAgICAgICAgICByYWlzZSBFbnRyYW50"
        "RmFpbHVyZSgicHJvdG9jb2xfdmlvbGF0aW9uIiwgdmFsdWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtc2cg"
        "PSBqc29uLmxvYWRzKHZhbHVlKQogICAgICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvciBhcyBlOgogICAg"
        "ICAgICAgICByYWlzZSBFbnRyYW50RmFpbHVyZSgibWFsZm9ybWVkX2pzb24iLCBzdHIoZSkpIGZyb20gZQogICAg"
        "ICAgIGlmIG5vdCBpc2luc3RhbmNlKG1zZywgZGljdCk6CiAgICAgICAgICAgIHJhaXNlIEVudHJhbnRGYWlsdXJl"
        "KCJtYWxmb3JtZWRfbWVzc2FnZSIsICJ0b3AtbGV2ZWwgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3QiKQogICAgICAg"
        "IHJldHVybiBtc2cKCiAgICBkZWYgYXNrKHNlbGYsIHBheWxvYWQsIHRpbWVvdXRfcz1Ob25lKToKICAgICAgICBz"
        "ZWxmLnNlbmQocGF5bG9hZCkKICAgICAgICByZXR1cm4gc2VsZi5yZWN2KHRpbWVvdXRfcykKCiAgICAjIC0tIHRl"
        "YXJkb3duIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK"
        "ICAgIGRlZiBzdGRlcnJfdGV4dChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RkZXJyX2J1Zi5kZWNvZGUo"
        "InV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIikKCiAgICBkZWYgY2xvc2Uoc2VsZiwgZ3JhY2Vfcz0xLjApOgogICAg"
        "ICAgIGlmIHNlbGYuX3Byb2MgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJ5OgogICAgICAg"
        "ICAgICBpZiBzZWxmLl9wcm9jLnBvbGwoKSBpcyBOb25lOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAg"
        "ICAgICAgICAgIHNlbGYuX3Byb2Muc3RkaW4uY2xvc2UoKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlv"
        "bjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAg"
        "ICAgc2VsZi5fcHJvYy53YWl0KHRpbWVvdXQ9Z3JhY2VfcykKICAgICAgICAgICAgICAgIGV4Y2VwdCBzdWJwcm9j"
        "ZXNzLlRpbWVvdXRFeHBpcmVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Mua2lsbCgpCiAgICAgICAg"
        "ICAgICAgICAgICAgc2VsZi5fcHJvYy53YWl0KHRpbWVvdXQ9Z3JhY2VfcykKICAgICAgICBleGNlcHQgRXhjZXB0"
        "aW9uOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9wcm9jLmtpbGwoKQogICAgICAgICAg"
        "ICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGZpbmFsbHk6CiAgICAgICAg"
        "ICAgIGZvciBzdHJlYW0gaW4gKHNlbGYuX3Byb2Muc3Rkb3V0LCBzZWxmLl9wcm9jLnN0ZGVyciwgc2VsZi5fcHJv"
        "Yy5zdGRpbik6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCkK"
        "ICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcGFzcwo=",
    "scoring.py":
        "IiIiU2NvcmluZywgd2l0aCBlbnRyYW50IHNlbGYtcmVwb3J0IHN0cnVjdHVyYWxseSBleGNsdWRlZC4KClRoZSBy"
        "dWxlIHRoaXMgbW9kdWxlIGVuZm9yY2VzOiBhIGNvbXBldGl0b3IncyBvd24gYWNjb3VudCBvZiBob3cgaXQgZGlk"
        "IGlzIG5ldmVyCmFuIGlucHV0IHRvIHRoZSBzY29yZS4gU3RhdGluZyB0aGF0IGFzIGEgcG9saWN5IGlzIHdvcnRo"
        "bGVzcyDigJQgc29tZW9uZSB3aWxsIHJlYWQKdGhlIGZpZWxkICJiZWNhdXNlIGl0IHdhcyB0aGVyZSIuIFNvIGl0"
        "IGlzIGVuZm9yY2VkIGJ5IGNvbnN0cnVjdGlvbiBpbnN0ZWFkLgoKYHJlZmVyZWVfcHJvamVjdGlvbmAgZGVsZXRl"
        "cyBldmVyeSBlbnRyYW50LWF1dGhvcmVkIGJ5dGUgZnJvbSB0aGUgcmVjb3JkIHN0cmVhbSwKYW5kIGBzY29yZWAg"
        "YWNjZXB0cyBvbmx5IGEgcHJvamVjdGlvbi4gQSBzZWxmLXJlcG9ydGVkICJJIHdvbiIgY2Fubm90IHJlYWNoIHRo"
        "ZQpzY29yZXIgYmVjYXVzZSBpdCBubyBsb25nZXIgZXhpc3RzIGluIHRoZSB2YWx1ZSB0aGUgc2NvcmVyIGlzIGhh"
        "bmRlZC4KClRoZSBvbmUgZW50cmFudC1hdXRob3JlZCB2YWx1ZSB0aGF0IHN1cnZpdmVzIGlzIGBtb3ZlYCwgYW5k"
        "IGl0IHN1cnZpdmVzIGJlY2F1c2UKaXQgaXMgbm90IGEgcmVwb3J0IOKAlCBpdCBpcyBhIGdhbWUgYWN0aW9uLCB2"
        "YWxpZGF0ZWQgYWdhaW5zdCB0aGUgcnVsZXMgYnkgdGhlCnJlZmVyZWUgYmVmb3JlIGl0IGlzIHBlcm1pdHRlZCB0"
        "byBjaGFuZ2UgYW55IHN0YXRlLgoiIiIKCmZyb20gLmNhbm9uaWNhbCBpbXBvcnQgZGlnZXN0CgojIEVudHJhbnQt"
        "YXV0aG9yZWQga2V5cywgcmVjb3JkZWQgaW4gdGhlIHRyYW5zY3JpcHQgZm9yIGF1ZGl0YWJpbGl0eSBhbmQgcmVt"
        "b3ZlZAojIGJlZm9yZSBzY29yaW5nLiBBZGQgdG8gdGhpcyBzZXQsIG5ldmVyIHJlYWQgZnJvbSBpdC4KRU5UUkFO"
        "VF9BVVRIT1JFRCA9IGZyb3plbnNldCh7ImVudHJhbnRfbWVzc2FnZSIsICJlbnRyYW50X25vdGUiLCAiY2xhaW1l"
        "ZF9tb2RlbCJ9KQoKCmNsYXNzIE5vdEFQcm9qZWN0aW9uKEV4Y2VwdGlvbik6CiAgICBwYXNzCgoKZGVmIHJlZmVy"
        "ZWVfcHJvamVjdGlvbihyZWNvcmRzKToKICAgICIiIlN0cmlwIGVudHJhbnQtYXV0aG9yZWQgY29udGVudC4gVGhl"
        "IHJlc3VsdCBpcyByZWZlcmVlLWF1dGhvcmVkIG9ubHkuIiIiCiAgICBvdXQgPSBbXQogICAgZm9yIHJlYyBpbiBy"
        "ZWNvcmRzOgogICAgICAgIGJvZHkgPSB7azogdiBmb3IgaywgdiBpbiByZWNbImJvZHkiXS5pdGVtcygpIGlmIGsg"
        "bm90IGluIEVOVFJBTlRfQVVUSE9SRUR9CiAgICAgICAgaWYgcmVjWyJraW5kIl0gPT0gImhlYWRlciI6CiAgICAg"
        "ICAgICAgIGJvZHkgPSBkaWN0KGJvZHkpCiAgICAgICAgICAgIGJvZHlbImVudHJhbnRzIl0gPSBbCiAgICAgICAg"
        "ICAgICAgICB7azogdiBmb3IgaywgdiBpbiBlLml0ZW1zKCkgaWYgayBub3QgaW4gRU5UUkFOVF9BVVRIT1JFRH0K"
        "ICAgICAgICAgICAgICAgIGZvciBlIGluIGJvZHkuZ2V0KCJlbnRyYW50cyIsIFtdKQogICAgICAgICAgICBdCiAg"
        "ICAgICAgb3V0LmFwcGVuZCh7ImtpbmQiOiByZWNbImtpbmQiXSwgInNlcSI6IHJlY1sic2VxIl0sICJib2R5Ijog"
        "Ym9keSwgIl9wcm9qZWN0ZWQiOiBUcnVlfSkKICAgIHJldHVybiBvdXQKCgpkZWYgX3JlcXVpcmVfcHJvamVjdGlv"
        "bihyZWNvcmRzKToKICAgIGlmIG5vdCBhbGwoci5nZXQoIl9wcm9qZWN0ZWQiKSBmb3IgciBpbiByZWNvcmRzKToK"
        "ICAgICAgICByYWlzZSBOb3RBUHJvamVjdGlvbigKICAgICAgICAgICAgInNjb3JlKCkgYWNjZXB0cyBvbmx5IGEg"
        "cmVmZXJlZV9wcm9qZWN0aW9uKCk7IHBhc3NpbmcgcmF3IHJlY29yZHMgd291bGQgIgogICAgICAgICAgICAiZXhw"
        "b3NlIGVudHJhbnQtYXV0aG9yZWQgZmllbGRzIHRvIHRoZSBzY29yaW5nIHBhdGgiCiAgICAgICAgKQoKCmRlZiBz"
        "Y29yZShwcm9qZWN0aW9uLCBnYW1lKToKICAgICIiIkRlcml2ZSB0aGUgb3V0Y29tZSBmcm9tIHJlZmVyZWUgc3Rh"
        "dGUgYWxvbmUuCgogICAgRGVsaWJlcmF0ZWx5IGlnbm9yZXMgYW55IGByZXN1bHRgIHJlY29yZC4gUmVwbGF5IGNv"
        "bXBhcmVzIHdoYXQgdGhpcyByZXR1cm5zCiAgICBhZ2FpbnN0IHdoYXQgdGhlIG1hdGNoIHJlY29yZGVkLCBzbyBh"
        "IHJlY29yZGVkIHJlc3VsdCB0aGF0IGRvZXMgbm90IGZvbGxvdwogICAgZnJvbSB0aGUgc3RhdGUgaGlzdG9yeSBp"
        "cyBjYXVnaHQgcmF0aGVyIHRoYW4gdHJ1c3RlZC4KICAgICIiIgogICAgX3JlcXVpcmVfcHJvamVjdGlvbihwcm9q"
        "ZWN0aW9uKQoKICAgIHN0YXRlcyA9IFtyWyJib2R5Il1bInN0YXRlIl0gZm9yIHIgaW4gcHJvamVjdGlvbiBpZiBy"
        "WyJraW5kIl0gPT0gInN0YXRlIl0KICAgIGZvcmZlaXRzID0gW3JbImJvZHkiXSBmb3IgciBpbiBwcm9qZWN0aW9u"
        "IGlmIHJbImtpbmQiXSA9PSAiZm9yZmVpdCJdCiAgICBtb3ZlcyA9IFtyIGZvciByIGluIHByb2plY3Rpb24gaWYg"
        "clsia2luZCJdID09ICJtb3ZlIl0KICAgIGZhdWx0cyA9IFtyWyJib2R5Il0gZm9yIHIgaW4gcHJvamVjdGlvbiBp"
        "ZiByWyJraW5kIl0gPT0gImVuZ2luZV9lcnJvciJdCgogICAgaWYgZmF1bHRzOgogICAgICAgICMgVGhlIHJlZmVy"
        "ZWUgaXRzZWxmIGZhaWxlZC4gVm9pZCB0aGUgbWF0Y2gg4oCUIGRvIG5vdCBoYW5kIHRoZSB3aW4gdG8gdGhlCiAg"
        "ICAgICAgIyBvdGhlciBzZWF0LiBBIGJ1ZyBpbiB0aGUgcnVsZXMgY29kZSBtdXN0IG5ldmVyIGRlY2lkZSBhIGNv"
        "bnRlc3QsIGFuZAogICAgICAgICMgYW4gYXJlbmEgdGhhdCBxdWlldGx5IGF3YXJkcyB0aG9zZSBwb2ludHMgaXMg"
        "Zml4aW5nIG1hdGNoZXMgYnkgYWNjaWRlbnQuCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgIndpbm5lciI6"
        "IE5vbmUsCiAgICAgICAgICAgICJyZWFzb24iOiAiZW5naW5lX2Vycm9yIiwKICAgICAgICAgICAgIm1vdmVzIjog"
        "bGVuKG1vdmVzKSwKICAgICAgICAgICAgInBvaW50cyI6IHsiMCI6IDAsICIxIjogMH0sCiAgICAgICAgICAgICJk"
        "ZWNpc2l2ZSI6IEZhbHNlLAogICAgICAgIH0KCiAgICBpZiBub3Qgc3RhdGVzOgogICAgICAgIHJldHVybiB7Indp"
        "bm5lciI6IE5vbmUsICJyZWFzb24iOiAibm9fc3RhdGVfcmVjb3JkZWQiLCAibW92ZXMiOiAwLCAicG9pbnRzIjog"
        "e30sICJkZWNpc2l2ZSI6IEZhbHNlfQoKICAgIGlmIGZvcmZlaXRzOgogICAgICAgIGYgPSBmb3JmZWl0c1swXQog"
        "ICAgICAgIGxvc2VyID0gZlsicGxheWVyIl0KICAgICAgICB3aW5uZXIgPSAxIC0gbG9zZXIKICAgICAgICByZXR1"
        "cm4gewogICAgICAgICAgICAid2lubmVyIjogd2lubmVyLAogICAgICAgICAgICAicmVhc29uIjogZiJmb3JmZWl0"
        "OntmWydyZWFzb24nXX0iLAogICAgICAgICAgICAibW92ZXMiOiBsZW4obW92ZXMpLAogICAgICAgICAgICAicG9p"
        "bnRzIjogeyIwIjogMSBpZiB3aW5uZXIgPT0gMCBlbHNlIDAsICIxIjogMSBpZiB3aW5uZXIgPT0gMSBlbHNlIDB9"
        "LAogICAgICAgICAgICAiZGVjaXNpdmUiOiBUcnVlLAogICAgICAgIH0KCiAgICBlbmQgPSBnYW1lLnRlcm1pbmFs"
        "KHN0YXRlc1stMV0pCiAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAid2lu"
        "bmVyIjogTm9uZSwKICAgICAgICAgICAgInJlYXNvbiI6ICJ1bmZpbmlzaGVkIiwKICAgICAgICAgICAgIm1vdmVz"
        "IjogbGVuKG1vdmVzKSwKICAgICAgICAgICAgInBvaW50cyI6IHsiMCI6IDAsICIxIjogMH0sCiAgICAgICAgICAg"
        "ICJkZWNpc2l2ZSI6IEZhbHNlLAogICAgICAgIH0KCiAgICB3aW5uZXIgPSBlbmRbIndpbm5lciJdCiAgICByZXR1"
        "cm4gewogICAgICAgICJ3aW5uZXIiOiB3aW5uZXIsCiAgICAgICAgInJlYXNvbiI6IGVuZFsicmVhc29uIl0sCiAg"
        "ICAgICAgIm1vdmVzIjogbGVuKG1vdmVzKSwKICAgICAgICAicG9pbnRzIjogeyIwIjogMSBpZiB3aW5uZXIgPT0g"
        "MCBlbHNlIDAsICIxIjogMSBpZiB3aW5uZXIgPT0gMSBlbHNlIDB9LAogICAgICAgICJkZWNpc2l2ZSI6IHdpbm5l"
        "ciBpcyBub3QgTm9uZSwKICAgIH0KCgpkZWYgc2NvcmVfZGlnZXN0KHNjb3JlZCk6CiAgICByZXR1cm4gZGlnZXN0"
        "KHNjb3JlZCkK",
    "transcript.py":
        "IiIiSGFzaC1jaGFpbmVkIG1hdGNoIHRyYW5zY3JpcHQuCgpUaGUgdHJhbnNjcmlwdCBpcyB0aGUgbWF0Y2guIEEg"
        "cmVzdWx0IGlzIG5vdCBhIGNsYWltIHRoZSBlbmdpbmUgbWFrZXM7IGl0IGlzIHRoZQpoZWFkIG9mIGEgY2hhaW4g"
        "dGhhdCBhbnlvbmUgY2FuIHJlY29tcHV0ZSBmcm9tIHRoZSBmaWxlLiBSZWNvcmRzIGFyZSBhcHBlbmQtb25seQpK"
        "U09OIExpbmVzLCBlYWNoIGNvbW1pdHRpbmcgdG8gdGhlIG9uZSBiZWZvcmUgaXQuCgpPbmx5IHRoZSBlbmdpbmUg"
        "cHJvY2VzcyBldmVyIGhvbGRzIGEgd3JpdGVyLiBFbnRyYW50cyBuZXZlciBsZWFybiB0aGUgcGF0aC4KIiIiCgpp"
        "bXBvcnQganNvbgppbXBvcnQgb3MKCmZyb20gLmNhbm9uaWNhbCBpbXBvcnQgR0VORVNJUywgY2Fub25pY2FsX2J5"
        "dGVzLCBjaGFpbgoKCmNsYXNzIENoYWluQnJva2VuKEV4Y2VwdGlvbik6CiAgICBwYXNzCgoKY2xhc3MgVHJhbnNj"
        "cmlwdFdyaXRlcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBzdHIo"
        "cGF0aCkKICAgICAgICBzZWxmLnByZXYgPSBHRU5FU0lTCiAgICAgICAgc2VsZi5zZXEgPSAwCiAgICAgICAgb3Mu"
        "bWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkgb3IgIi4iLCBleGlzdF9vaz1UcnVlKQogICAgICAg"
        "IHNlbGYuX2ZoID0gb3BlbihzZWxmLnBhdGgsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IiwgbmV3bGluZT0iXG4iKQoK"
        "ICAgIGRlZiBhcHBlbmQoc2VsZiwga2luZDogc3RyLCBib2R5OiBkaWN0KSAtPiBkaWN0OgogICAgICAgIHJlY29y"
        "ZCA9IHsia2luZCI6IGtpbmQsICJzZXEiOiBzZWxmLnNlcSwgImJvZHkiOiBib2R5fQogICAgICAgIGggPSBjaGFp"
        "bihzZWxmLnByZXYsIHJlY29yZCkKICAgICAgICBsaW5lID0gZGljdChyZWNvcmQpCiAgICAgICAgbGluZVsicHJl"
        "diJdID0gc2VsZi5wcmV2CiAgICAgICAgbGluZVsiaGFzaCJdID0gaAogICAgICAgIHNlbGYuX2ZoLndyaXRlKAog"
        "ICAgICAgICAgICBqc29uLmR1bXBzKGxpbmUsIHNvcnRfa2V5cz1UcnVlLCBzZXBhcmF0b3JzPSgiLCIsICI6Iiks"
        "IGVuc3VyZV9hc2NpaT1GYWxzZSkgKyAiXG4iCiAgICAgICAgKQogICAgICAgIHNlbGYuX2ZoLmZsdXNoKCkKICAg"
        "ICAgICBvcy5mc3luYyhzZWxmLl9maC5maWxlbm8oKSkKICAgICAgICBzZWxmLnByZXYgPSBoCiAgICAgICAgc2Vs"
        "Zi5zZXEgKz0gMQogICAgICAgIHJldHVybiBsaW5lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGVhZChzZWxmKSAt"
        "PiBzdHI6CiAgICAgICAgcmV0dXJuIHNlbGYucHJldgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBpZiBu"
        "b3Qgc2VsZi5fZmguY2xvc2VkOgogICAgICAgICAgICBzZWxmLl9maC5jbG9zZSgpCgogICAgZGVmIF9fZW50ZXJf"
        "XyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjKToKICAgICAg"
        "ICBzZWxmLmNsb3NlKCkKCgpkZWYgbG9hZChwYXRoKToKICAgIHJlY29yZHMgPSBbXQogICAgd2l0aCBvcGVuKHBh"
        "dGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmg6CiAgICAgICAgZm9yIGxpbmVubywgbGluZSBpbiBlbnVt"
        "ZXJhdGUoZmgsIDEpOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBs"
        "aW5lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVj"
        "b3Jkcy5hcHBlbmQoanNvbi5sb2FkcyhsaW5lKSkKICAgICAgICAgICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVy"
        "cm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBDaGFpbkJyb2tlbihmImxpbmUge2xpbmVub306IG5vdCB2"
        "YWxpZCBKU09OICh7ZX0pIikgZnJvbSBlCiAgICByZXR1cm4gcmVjb3JkcwoKCmRlZiB2ZXJpZnlfY2hhaW4ocmVj"
        "b3Jkcyk6CiAgICAiIiJSZWNvbXB1dGUgZXZlcnkgaGFzaC4gUmV0dXJucyAob2ssIGVycm9yX29yX05vbmUpLgoK"
        "ICAgIFRoaXMgaXMgdGhlIGNoZWNrIHRoYXQgbWFrZXMgcG9zdC1ob2MgZWRpdGluZyBkZXRlY3RhYmxlOiBjaGFu"
        "Z2Ugb25lIGJ5dGUgb2YKICAgIG9uZSBib2R5IGFuZCBldmVyeSBzdWJzZXF1ZW50IGhhc2ggc3RvcHMgbWF0Y2hp"
        "bmcuCiAgICAiIiIKICAgIHByZXYgPSBHRU5FU0lTCiAgICBmb3IgaSwgcmVjIGluIGVudW1lcmF0ZShyZWNvcmRz"
        "KToKICAgICAgICBmb3IgZmllbGQgaW4gKCJraW5kIiwgInNlcSIsICJib2R5IiwgInByZXYiLCAiaGFzaCIpOgog"
        "ICAgICAgICAgICBpZiBmaWVsZCBub3QgaW4gcmVjOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCBmInJl"
        "Y29yZCB7aX06IG1pc3NpbmcgZmllbGQge2ZpZWxkIXJ9IgogICAgICAgIGlmIHJlY1sic2VxIl0gIT0gaToKICAg"
        "ICAgICAgICAgcmV0dXJuIEZhbHNlLCBmInJlY29yZCB7aX06IHNlcSBpcyB7cmVjWydzZXEnXX0sIGV4cGVjdGVk"
        "IHtpfSIKICAgICAgICBpZiByZWNbInByZXYiXSAhPSBwcmV2OgogICAgICAgICAgICByZXR1cm4gRmFsc2UsIGYi"
        "cmVjb3JkIHtpfTogcHJldiBkb2VzIG5vdCBtYXRjaCBwcmV2aW91cyByZWNvcmQncyBoYXNoIgogICAgICAgIGJv"
        "ZHkgPSB7ImtpbmQiOiByZWNbImtpbmQiXSwgInNlcSI6IHJlY1sic2VxIl0sICJib2R5IjogcmVjWyJib2R5Il19"
        "CiAgICAgICAgdHJ5OgogICAgICAgICAgICBleHBlY3QgPSBjaGFpbihwcmV2LCBib2R5KQogICAgICAgIGV4Y2Vw"
        "dCBFeGNlcHRpb24gYXMgZTogICMgbm9uLWNhbm9uaWNhbCBjb250ZW50IHNtdWdnbGVkIGludG8gYSByZWNvcmQK"
        "ICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCBmInJlY29yZCB7aX06IGJvZHkgaXMgbm90IGNhbm9uaWNhbGx5IGVu"
        "Y29kYWJsZSAoe2V9KSIKICAgICAgICBpZiBleHBlY3QgIT0gcmVjWyJoYXNoIl06CiAgICAgICAgICAgIHJldHVy"
        "biBGYWxzZSwgZiJyZWNvcmQge2l9OiBoYXNoIG1pc21hdGNoIChyZWNvcmQgd2FzIGFsdGVyZWQpIgogICAgICAg"
        "IHByZXYgPSByZWNbImhhc2giXQogICAgcmV0dXJuIFRydWUsIE5vbmUKCgpkZWYgaGVhZF9vZihyZWNvcmRzKToK"
        "ICAgIHJldHVybiByZWNvcmRzWy0xXVsiaGFzaCJdIGlmIHJlY29yZHMgZWxzZSBHRU5FU0lTCgoKZGVmIGZpbmQo"
        "cmVjb3Jkcywga2luZCk6CiAgICByZXR1cm4gW3IgZm9yIHIgaW4gcmVjb3JkcyBpZiByWyJraW5kIl0gPT0ga2lu"
        "ZF0KCgpkZWYgZmlyc3QocmVjb3Jkcywga2luZCk6CiAgICBmb3IgciBpbiByZWNvcmRzOgogICAgICAgIGlmIHJb"
        "ImtpbmQiXSA9PSBraW5kOgogICAgICAgICAgICByZXR1cm4gcgogICAgcmV0dXJuIE5vbmUKCgpfX2FsbF9fID0g"
        "WwogICAgIlRyYW5zY3JpcHRXcml0ZXIiLAogICAgIkNoYWluQnJva2VuIiwKICAgICJsb2FkIiwKICAgICJ2ZXJp"
        "ZnlfY2hhaW4iLAogICAgImhlYWRfb2YiLAogICAgImZpbmQiLAogICAgImZpcnN0IiwKICAgICJjYW5vbmljYWxf"
        "Ynl0ZXMiLApdCg==",
    "games/__init__.py":
        "IiIiR2FtZSBtb2R1bGVzLgoKQSBnYW1lIGlzIGEgcHVyZSBzdGF0ZSBtYWNoaW5lLiBJdCBuZXZlciBwZXJmb3Jt"
        "cyBJL08sIG5ldmVyIHNlZXMgYW4gZW50cmFudCwKYW5kIG5ldmVyIGNvbnN1bWVzIHJhbmRvbW5lc3Mgb3V0c2lk"
        "ZSBgc2V0dXBgLiBUaG9zZSB0aHJlZSByZXN0cmljdGlvbnMgYXJlIHdoYXQKbWFrZSBhIG1hdGNoIHJlcGxheWFi"
        "bGUgZnJvbSBhIHNlZWQgYW5kIGEgbW92ZSBsaXN0LgoKUmVxdWlyZWQgbW9kdWxlIGludGVyZmFjZSAoc2VlIEVO"
        "VFJBTlRfQ09OVFJBQ1QubWQgZm9yIHRoZSB3aXJlIHNpZGUpOgoKICAgIE5BTUU6IHN0cgogICAgVkVSU0lPTjog"
        "c3RyCiAgICBTVU1NQVJZOiBzdHIKICAgIFBMQVlFUlM6IGludAoKICAgIHNldHVwKHJuZykgICAgICAgICAgICAg"
        "ICAgICAtPiBzdGF0ZQogICAgb2JzZXJ2YXRpb24oc3RhdGUsIHBsYXllcikgIC0+IGRpY3QgICAjIHdoYXQgdGhh"
        "dCBwbGF5ZXIgaXMgYWxsb3dlZCB0byBzZWUKICAgIGxlZ2FsKHN0YXRlLCBtb3ZlKSAgICAgICAgICAtPiAoYm9v"
        "bCwgcmVhc29uKQogICAgYXBwbHkoc3RhdGUsIG1vdmUpICAgICAgICAgIC0+IHN0YXRlICAjIG11c3Qgbm90IG11"
        "dGF0ZSB0aGUgaW5wdXQKICAgIHRlcm1pbmFsKHN0YXRlKSAgICAgICAgICAgICAtPiBOb25lIHwgeyJ3aW5uZXIi"
        "OiBpbnQgfCBOb25lLCAicmVhc29uIjogc3RyfQogICAgbW92ZV9ib3VuZChzdGF0ZSkgICAgICAgICAgIC0+IGlu"
        "dCAgICAjIGhhcmQgY2FwIG9uIHJlbWFpbmluZyBtb3ZlcwoKYHN0YXRlYCBtdXN0IGJlIGNhbm9uaWNhbGx5IGVu"
        "Y29kYWJsZSAoc2VlIGFyZW5hLmNhbm9uaWNhbCkgYW5kIG11c3QgY2FycnkgYQoidG9fbW92ZSIga2V5LiBJbnRl"
        "Z2VycyBvbmx5IOKAlCBubyBmbG9hdHMgYW55d2hlcmUgaW4gc3RhdGUgb3Igc2NvcmluZy4KIiIiCgppbXBvcnQg"
        "aW1wb3J0bGliCgpSRUdJU1RSWSA9IHsibmltIjogImFyZW5hLmdhbWVzLm5pbSJ9CgoKZGVmIGxvYWQobmFtZSk6"
        "CiAgICBpZiBuYW1lIG5vdCBpbiBSRUdJU1RSWToKICAgICAgICByYWlzZSBLZXlFcnJvcihmInVua25vd24gZ2Ft"
        "ZSB7bmFtZSFyfTsga25vd246IHtzb3J0ZWQoUkVHSVNUUlkpfSIpCiAgICByZXR1cm4gaW1wb3J0bGliLmltcG9y"
        "dF9tb2R1bGUoUkVHSVNUUllbbmFtZV0pCg==",
    "games/nim.py":
        "IiIiTmltIOKAlCB0aGUgZW5naW5lJ3MgY29uZm9ybWFuY2UgZml4dHVyZSwgbm90IGEgY29tcGV0aXRpb24gZ2Ft"
        "ZS4KClRoaXMgaXMgaGVyZSBiZWNhdXNlIHByb3ZpbmcgYSBtYXRjaCBydW5uZXIgbmVlZHMgYSBnYW1lIHdob3Nl"
        "IGNvcnJlY3Qgb3V0Y29tZQppcyBub3QgYSBtYXR0ZXIgb2Ygb3Bpbmlvbi4gTmltIGlzIHNvbHZlZDogZnJvbSBh"
        "bnkgcG9zaXRpb24sIHRoZSBwbGF5ZXIgdG8gbW92ZQp3aW5zIGV4YWN0bHkgd2hlbiB0aGUgWE9SIG9mIHRoZSBo"
        "ZWFwIHNpemVzIGlzIG5vbi16ZXJvLCBhbmQgdGhlIHdpbm5pbmcgbW92ZSBpcwphbnkgbW92ZSB0aGF0IG1ha2Vz"
        "IHRoYXQgWE9SIHplcm8uIFNvIHRoZSByZWZlcmVlJ3MgYWRqdWRpY2F0aW9uIGNhbiBiZSBjaGVja2VkCmFnYWlu"
        "c3QgbWF0aGVtYXRpY3MgcmF0aGVyIHRoYW4gYWdhaW5zdCB0YXN0ZSwgd2hpY2ggaXMgd2hhdCBhIGZpeHR1cmUg"
        "aXMgZm9yLgoKRGVzaWduaW5nIHRoZSBhY3R1YWwgY29tcGV0aXRpb24gZ2FtZXMgaXMgYSBkaWZmZXJlbnQgbGFu"
        "ZSdzIHdvcmsuIE5vdGhpbmcgaGVyZQpzaG91bGQgYmUgcmVhZCBhcyBhIHByb3Bvc2FsIGZvciBvbmUuCgpJdCBo"
        "YXBwZW5zIHRvIGRlbW9uc3RyYXRlIHRoZSB0aGVzaXMgY2xlYW5seTogYSBoYXJuZXNzIHRoYXQgY29tcHV0ZXMg"
        "dGhlIFhPUgpiZWF0cyBhIGhhcm5lc3MgdGhhdCBhc2tzIHRoZSBtb2RlbCB0byBleWViYWxsIGl0LCB1c2luZyB0"
        "aGUgc2FtZSBtb2RlbCBiZWhpbmQKYm90aC4gU2tpbGwgbGl2ZXMgaW4gdGhlIGhhcm5lc3MuCgpOb3JtYWwgcGxh"
        "eTogdGhlIHBsYXllciB3aG8gcmVtb3ZlcyB0aGUgbGFzdCBvYmplY3Qgd2lucy4KIiIiCgpOQU1FID0gIm5pbSIK"
        "VkVSU0lPTiA9ICIxIgpTVU1NQVJZID0gIlJlbW92ZSBvYmplY3RzIGZyb20gaGVhcHM7IHRha2UgdGhlIGxhc3Qg"
        "b2JqZWN0IHRvIHdpbi4iClBMQVlFUlMgPSAyCgpSVUxFUyA9ICgKICAgICJIZWFwcyBvZiBvYmplY3RzIHNpdCBv"
        "biB0aGUgdGFibGUuIE9uIHlvdXIgdHVybiBjaG9vc2Ugb25lIGhlYXAgYW5kIHJlbW92ZSAiCiAgICAiYXQgbGVh"
        "c3Qgb25lIG9iamVjdCBmcm9tIGl0LiBZb3UgbWF5IHJlbW92ZSB1cCB0byB0aGUgd2hvbGUgaGVhcC4gVGhlIHBs"
        "YXllciAiCiAgICAid2hvIHJlbW92ZXMgdGhlIGZpbmFsIG9iamVjdCBvbiB0aGUgdGFibGUgd2lucy4gQSBtb3Zl"
        "IGlzICIKICAgICd7ImhlYXAiOiA8MC1iYXNlZCBoZWFwIGluZGV4PiwgInRha2UiOiA8Y291bnQgPj0gMT59LiBB"
        "biBpbGxlZ2FsIG9yICcKICAgICJtYWxmb3JtZWQgbW92ZSBmb3JmZWl0cyB0aGUgbWF0Y2guIgopCgoKZGVmIF94"
        "b3IoaGVhcHMpOgogICAgeCA9IDAKICAgIGZvciBoIGluIGhlYXBzOgogICAgICAgIHggXj0gaAogICAgcmV0dXJu"
        "IHgKCgpkZWYgc2V0dXAocm5nKToKICAgIGhlYXBzID0gW3JuZy5yYW5kaW50KDEsIDcpIGZvciBfIGluIHJhbmdl"
        "KHJuZy5jaG9pY2UoWzMsIDRdKSldCiAgICAjIFN0YXJ0IGZyb20gYSBmaXJzdC1wbGF5ZXIgd2luIHNvIHRoZSBv"
        "dXRjb21lIHR1cm5zIG9uIHBsYXkgcmF0aGVyIHRoYW4gb24KICAgICMgYSBkZWFkIHBvc2l0aW9uLiBOdWRnZSBv"
        "bmUgaGVhcCB1bnRpbCB0aGUgWE9SIGlzIG5vbi16ZXJvLgogICAgZ3VhcmQgPSAwCiAgICB3aGlsZSBfeG9yKGhl"
        "YXBzKSA9PSAwOgogICAgICAgIGkgPSBybmcucmFuZHJhbmdlKGxlbihoZWFwcykpCiAgICAgICAgaGVhcHNbaV0g"
        "PSBybmcucmFuZGludCgxLCA3KQogICAgICAgIGd1YXJkICs9IDEKICAgICAgICBpZiBndWFyZCA+IDY0OiAgIyB1"
        "bnJlYWNoYWJsZSBpbiBwcmFjdGljZTsgcmVmdXNlIHRvIGxvb3AgZm9yZXZlcgogICAgICAgICAgICBoZWFwc1sw"
        "XSA9IGhlYXBzWzBdICsgMSBpZiBoZWFwc1swXSA8IDcgZWxzZSAxCiAgICByZXR1cm4geyJoZWFwcyI6IGhlYXBz"
        "LCAidG9fbW92ZSI6IDAsICJsYXN0X21vdmVyIjogTm9uZSwgInR1cm4iOiAwfQoKCmRlZiBvYnNlcnZhdGlvbihz"
        "dGF0ZSwgcGxheWVyKToKICAgICMgTmltIGlzIGEgcGVyZmVjdC1pbmZvcm1hdGlvbiBnYW1lLCBzbyBib3RoIHBs"
        "YXllcnMgc2VlIHRoZSBzYW1lIGJvYXJkLgogICAgIyBUaGUgb2JzZXJ2YXRpb24gaXMgc3RpbGwgYnVpbHQgcGVy"
        "IHBsYXllciwgYmVjYXVzZSB0aGUgaW50ZXJmYWNlIG11c3Qgbm90CiAgICAjIGFzc3VtZSBvdGhlcndpc2UuCiAg"
        "ICByZXR1cm4gewogICAgICAgICJnYW1lIjogTkFNRSwKICAgICAgICAicnVsZXMiOiBSVUxFUywKICAgICAgICAi"
        "aGVhcHMiOiBsaXN0KHN0YXRlWyJoZWFwcyJdKSwKICAgICAgICAieW91X2FyZSI6IHBsYXllciwKICAgICAgICAi"
        "dG9fbW92ZSI6IHN0YXRlWyJ0b19tb3ZlIl0sCiAgICAgICAgInR1cm4iOiBzdGF0ZVsidHVybiJdLAogICAgICAg"
        "ICJvYmplY3RzX3JlbWFpbmluZyI6IHN1bShzdGF0ZVsiaGVhcHMiXSksCiAgICB9CgoKZGVmIGxlZ2FsKHN0YXRl"
        "LCBtb3ZlKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKG1vdmUsIGRpY3QpOgogICAgICAgIHJldHVybiBGYWxzZSwg"
        "Im1vdmUgbXVzdCBiZSBhbiBvYmplY3QiCiAgICBpZiBzZXQobW92ZSkgLSB7ImhlYXAiLCAidGFrZSJ9OgogICAg"
        "ICAgIHJldHVybiBGYWxzZSwgZiJ1bmV4cGVjdGVkIGtleXMgaW4gbW92ZToge3NvcnRlZChzZXQobW92ZSkgLSB7"
        "J2hlYXAnLCAndGFrZSd9KX0iCiAgICBpZiAiaGVhcCIgbm90IGluIG1vdmUgb3IgInRha2UiIG5vdCBpbiBtb3Zl"
        "OgogICAgICAgIHJldHVybiBGYWxzZSwgJ21vdmUgcmVxdWlyZXMgImhlYXAiIGFuZCAidGFrZSInCiAgICBoZWFw"
        "LCB0YWtlID0gbW92ZVsiaGVhcCJdLCBtb3ZlWyJ0YWtlIl0KICAgICMgYm9vbCBpcyBhbiBpbnQgc3ViY2xhc3M7"
        "IGEgSlNPTiBgdHJ1ZWAgaGVyZSBpcyBhIG1hbGZvcm1lZCBtb3ZlLCBub3QgaGVhcCAxLgogICAgaWYgaXNpbnN0"
        "YW5jZShoZWFwLCBib29sKSBvciBub3QgaXNpbnN0YW5jZShoZWFwLCBpbnQpOgogICAgICAgIHJldHVybiBGYWxz"
        "ZSwgJyJoZWFwIiBtdXN0IGJlIGFuIGludGVnZXInCiAgICBpZiBpc2luc3RhbmNlKHRha2UsIGJvb2wpIG9yIG5v"
        "dCBpc2luc3RhbmNlKHRha2UsIGludCk6CiAgICAgICAgcmV0dXJuIEZhbHNlLCAnInRha2UiIG11c3QgYmUgYW4g"
        "aW50ZWdlcicKICAgIGhlYXBzID0gc3RhdGVbImhlYXBzIl0KICAgIGlmIG5vdCAoMCA8PSBoZWFwIDwgbGVuKGhl"
        "YXBzKSk6CiAgICAgICAgcmV0dXJuIEZhbHNlLCBmJyJoZWFwIiB7aGVhcH0gb3V0IG9mIHJhbmdlIDAuLntsZW4o"
        "aGVhcHMpIC0gMX0nCiAgICBpZiB0YWtlIDwgMToKICAgICAgICByZXR1cm4gRmFsc2UsICcidGFrZSIgbXVzdCBi"
        "ZSBhdCBsZWFzdCAxJwogICAgaWYgdGFrZSA+IGhlYXBzW2hlYXBdOgogICAgICAgIHJldHVybiBGYWxzZSwgZici"
        "dGFrZSIge3Rha2V9IGV4Y2VlZHMgaGVhcCB7aGVhcH0gd2hpY2ggaG9sZHMge2hlYXBzW2hlYXBdfScKICAgIHJl"
        "dHVybiBUcnVlLCBOb25lCgoKZGVmIGFwcGx5KHN0YXRlLCBtb3ZlKToKICAgIG9rLCByZWFzb24gPSBsZWdhbChz"
        "dGF0ZSwgbW92ZSkKICAgIGlmIG5vdCBvazoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiYXBwbHkoKSBjYWxs"
        "ZWQgd2l0aCBhbiBpbGxlZ2FsIG1vdmU6IHtyZWFzb259IikKICAgIGhlYXBzID0gbGlzdChzdGF0ZVsiaGVhcHMi"
        "XSkKICAgIGhlYXBzW21vdmVbImhlYXAiXV0gLT0gbW92ZVsidGFrZSJdCiAgICByZXR1cm4gewogICAgICAgICJo"
        "ZWFwcyI6IGhlYXBzLAogICAgICAgICJ0b19tb3ZlIjogMSAtIHN0YXRlWyJ0b19tb3ZlIl0sCiAgICAgICAgImxh"
        "c3RfbW92ZXIiOiBzdGF0ZVsidG9fbW92ZSJdLAogICAgICAgICJ0dXJuIjogc3RhdGVbInR1cm4iXSArIDEsCiAg"
        "ICB9CgoKZGVmIHRlcm1pbmFsKHN0YXRlKToKICAgIGlmIHN1bShzdGF0ZVsiaGVhcHMiXSkgPT0gMDoKICAgICAg"
        "ICByZXR1cm4geyJ3aW5uZXIiOiBzdGF0ZVsibGFzdF9tb3ZlciJdLCAicmVhc29uIjogInRvb2tfbGFzdF9vYmpl"
        "Y3QifQogICAgcmV0dXJuIE5vbmUKCgpkZWYgbW92ZV9ib3VuZChzdGF0ZSk6CiAgICAjIEV2ZXJ5IGxlZ2FsIG1v"
        "dmUgcmVtb3ZlcyBhdCBsZWFzdCBvbmUgb2JqZWN0LgogICAgcmV0dXJuIHN1bShzdGF0ZVsiaGVhcHMiXSkKCgoj"
        "IC0tLSBzb2x2ZWQtZ2FtZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"
        "LS0tLS0tLS0KIyBFeHBvc2VkIHNvIGhhcm5lc3NlcyBjYW4gYmUgc3Ryb25nLiBUaGUgcmVmZXJlZSBkb2VzIG5v"
        "dCB1c2UgdGhlbSwgYW5kIGFuCiMgZW50cmFudCBpbXBvcnRpbmcgdGhlbSBnYWlucyBub3RoaW5nIGl0IGNvdWxk"
        "IG5vdCBjb21wdXRlIGluIHRocmVlIGxpbmVzLgoKCmRlZiB3aW5uaW5nX21vdmVzKGhlYXBzKToKICAgICIiIkV2"
        "ZXJ5IG1vdmUgdGhhdCBsZWF2ZXMgYW4gWE9SIG9mIHplcm8uIEVtcHR5IHdoZW4gdGhlIHBvc2l0aW9uIGlzIGxv"
        "c3QuIiIiCiAgICB0YXJnZXQgPSBfeG9yKGhlYXBzKQogICAgaWYgdGFyZ2V0ID09IDA6CiAgICAgICAgcmV0dXJu"
        "IFtdCiAgICBvdXQgPSBbXQogICAgZm9yIGksIGggaW4gZW51bWVyYXRlKGhlYXBzKToKICAgICAgICB3YW50ID0g"
        "aCBeIHRhcmdldAogICAgICAgIGlmIHdhbnQgPCBoOgogICAgICAgICAgICBvdXQuYXBwZW5kKHsiaGVhcCI6IGks"
        "ICJ0YWtlIjogaCAtIHdhbnR9KQogICAgcmV0dXJuIG91dAoKCmRlZiBsZWdhbF9tb3ZlcyhoZWFwcyk6CiAgICBy"
        "ZXR1cm4gW3siaGVhcCI6IGksICJ0YWtlIjogdH0gZm9yIGksIGggaW4gZW51bWVyYXRlKGhlYXBzKSBmb3IgdCBp"
        "biByYW5nZSgxLCBoICsgMSldCg==",
}

ENGINE_DIGEST = "268af65826d74f2d806baddb31dd66f0d7e809f483268f07c6136879670ccd81"


def _unpack():
    root = tempfile.mkdtemp(prefix="builderwars-verify-")
    atexit.register(shutil.rmtree, root, True)
    pkg = os.path.join(root, "arena")
    for rel, b64 in SOURCES.items():
        dest = os.path.join(pkg, *rel.split("/"))
        os.makedirs(os.path.dirname(dest), exist_ok=True)
        with open(dest, "wb") as fh:          # binary: hashes are over raw bytes
            fh.write(base64.b64decode(b64))
    sys.path.insert(0, root)
    return root


def _fetch(arg):
    """A local path is used as-is. Anything else is treated as a match id or URL."""
    if os.path.exists(arg):
        return arg, None
    url = arg if arg.startswith(("http://", "https://")) else f"{BASE}/m/{arg}.jsonl"
    tmp = tempfile.NamedTemporaryFile(prefix="builderwars-", suffix=".jsonl", delete=False)
    atexit.register(os.unlink, tmp.name)
    try:
        with urllib.request.urlopen(url, timeout=30) as resp:
            tmp.write(resp.read())
    except Exception as e:
        sys.stderr.write(f"could not fetch {url}\n  {e.__class__.__name__}: {e}\n")
        raise SystemExit(2)
    tmp.close()
    # Return the URL actually fetched. Re-deriving it for display would print a
    # BASE-prefixed path even when the caller passed a full URL.
    return tmp.name, url


def main():
    ap = argparse.ArgumentParser(description="Verify one BuilderWars match.")
    ap.add_argument("match", help="match id, URL, or path to a transcript")
    ap.add_argument("--json", action="store_true")
    args = ap.parse_args()

    _unpack()
    from arena.replay import verify          # the referee's own verifier

    path, source_url = _fetch(args.match)
    report = verify(path)

    if args.json:
        print(json.dumps(report, indent=2))
        return 0 if report["verdict"] == "PASS" else 1

    print(f"match      : {report.get('match_id')}  game={report.get('game')} seed={report.get('seed')}")
    if source_url:
        print(f"source     : {source_url}")
    print(f"chain head : {report.get('chain_head', '-')}")
    print()
    for c in report["checks"]:
        mark = "PASS" if c["ok"] else "FAIL"
        line = f"  [{mark}] {c['check']}"
        if c.get("detail"):
            line += f" - {c['detail']}"
        print(line)
    print()
    if report.get("recorded"):
        print(f"  recorded   : {json.dumps(report['recorded'])}")
        print(f"  recomputed : {json.dumps(report['recomputed'])}")
        print()
    print(f"VERDICT: {report['verdict']}")
    if report["verdict"] == "PASS":
        print("\nthis proves:")
        for p in report["proves"]:
            print(f"  + {p}")
        print("\nthis does NOT prove:")
        for p in report["does_not_prove"]:
            print(f"  - {p}")
    else:
        for e in report["errors"]:
            print(f"  ! {e}")
    return 0 if report["verdict"] == "PASS" else 1


if __name__ == "__main__":
    sys.exit(main())
