{
  "address": "0x34fa02cf467232c201FB9E90c786A69c7d743D8D",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Claim",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum MVM_Verifier.SETTLEMENT",
          "name": "result",
          "type": "uint8"
        }
      ],
      "name": "Finalize",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "header",
          "type": "tuple"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "NewChallenge",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "stakeLost",
          "type": "uint256"
        }
      ],
      "name": "Penalize",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Reward",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "seq",
          "type": "address"
        }
      ],
      "name": "SlashSequencer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Stake",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "Verify1",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "Verify2",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "CONFIG_OWNER_KEY",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "absence_strikes",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "activeChallenges",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "chain_under_challenge",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "challenges",
      "outputs": [
        {
          "internalType": "address",
          "name": "challenger",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "header",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "numQualifiedVerifiers",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "numVerifiers",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "done",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "consensus_strikes",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "key",
          "type": "bytes"
        }
      ],
      "name": "decrypt",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "depositSeqStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableWhiteList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "key",
          "type": "bytes"
        }
      ],
      "name": "encrypt",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "elements",
          "type": "bytes32[]"
        }
      ],
      "name": "getMerkleRoot",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "isSufficientlyStaked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "isWhiteListed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "libAddressManager",
      "outputs": [
        {
          "internalType": "contract Lib_AddressManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "metis",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minStake",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "header",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "proposedHash",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "keyhash",
          "type": "bytes"
        }
      ],
      "name": "newChallenge",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "numQualifiedVerifiers",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "resolve",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "seqStake",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_minStake",
          "type": "uint256"
        }
      ],
      "name": "setMinStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "absence_threshold",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "fail_threshold",
          "type": "uint256"
        }
      ],
      "name": "setThreshold",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "window",
          "type": "uint256"
        }
      ],
      "name": "setVerifyWindow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "allowed",
          "type": "bool"
        }
      ],
      "name": "setWhiteList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "stake",
          "type": "uint256"
        }
      ],
      "name": "verifierStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "verifier_stakes",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "verifiers",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "hash",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "keyhash",
          "type": "bytes"
        }
      ],
      "name": "verify1",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "key",
          "type": "bytes"
        }
      ],
      "name": "verify2",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "verifyWindow",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "whitelist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "withdrawSeqStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xe4618550127bd40d957cfaa33fddf543b52560efd59bb59740a8d83934fdaed3",
  "receipt": {
    "to": null,
    "from": "0x8943545177806ED17B9F23F0a21ee5948eCaa776",
    "contractAddress": "0x34fa02cf467232c201FB9E90c786A69c7d743D8D",
    "transactionIndex": 0,
    "gasUsed": "4644894",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x14fbe4f4d481ba08fd73b5421ea851cb788f47a70873a216b24c97685477c5ad",
    "transactionHash": "0xe4618550127bd40d957cfaa33fddf543b52560efd59bb59740a8d83934fdaed3",
    "logs": [],
    "blockNumber": 182,
    "cumulativeGasUsed": "4644894",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "a4af6a73ed3a5b6911a24e59d7ed5284",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Claim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum MVM_Verifier.SETTLEMENT\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"Finalize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"NewChallenge\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeLost\",\"type\":\"uint256\"}],\"name\":\"Penalize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Reward\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"seq\",\"type\":\"address\"}],\"name\":\"SlashSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Stake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"Verify1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"Verify2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CONFIG_OWNER_KEY\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"absence_strikes\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeChallenges\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"chain_under_challenge\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numQualifiedVerifiers\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numVerifiers\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"consensus_strikes\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"decrypt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositSeqStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWhiteList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"encrypt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"elements\",\"type\":\"bytes32[]\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"isSufficientlyStaked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isWhiteListed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"proposedHash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"keyhash\",\"type\":\"bytes\"}],\"name\":\"newChallenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numQualifiedVerifiers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"seqStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minStake\",\"type\":\"uint256\"}],\"name\":\"setMinStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"absence_threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fail_threshold\",\"type\":\"uint256\"}],\"name\":\"setThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"window\",\"type\":\"uint256\"}],\"name\":\"setVerifyWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setWhiteList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"}],\"name\":\"verifierStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"verifier_stakes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"verifiers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"hash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"keyhash\",\"type\":\"bytes\"}],\"name\":\"verify1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"verify2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawSeqStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MVM/MVM_Verifier.sol\":\"MVM_Verifier\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _setOwner(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _setOwner(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _setOwner(newOwner);\\n    }\\n\\n    function _setOwner(address newOwner) private {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n     * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n     * 27 bytes to store arbitrary data.\\n     * @param _globalMetadata New global metadata to set.\\n     */\\n    function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Retrieves the container's global metadata field.\\n     * @return Container global metadata field.\\n     */\\n    function getGlobalMetadata() external view returns (bytes27);\\n\\n    /**\\n     * Retrieves the number of objects stored in the container.\\n     * @return Number of objects in the container.\\n     */\\n    function length() external view returns (uint256);\\n\\n    /**\\n     * Pushes an object into the container.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function push(bytes32 _object) external;\\n\\n    /**\\n     * Pushes an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _object A 32 byte value to insert into the container.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Set an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _index position.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function setByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes32 _object\\n    ) external;\\n\\n    /**\\n     * Retrieves an object from the container.\\n     * @param _index Index of the particular object to access.\\n     * @return 32 byte object value.\\n     */\\n    function get(uint256 _index) external view returns (bytes32);\\n\\n    /**\\n     * Removes all objects after and including a given index.\\n     * @param _index Object index to delete from.\\n     */\\n    function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n    /**\\n     * Removes all objects after and including a given index. Also allows setting the global\\n     * metadata field.\\n     * @param _index Object index to delete from.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n     * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n     * 27 bytes to store arbitrary data.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _globalMetadata New global metadata to set.\\n     */\\n    function setGlobalMetadataByChainId(uint256 _chainId, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Retrieves the container's global metadata field.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Container global metadata field.\\n     */\\n    function getGlobalMetadataByChainId(uint256 _chainId) external view returns (bytes27);\\n\\n    /**\\n     * Retrieves the number of objects stored in the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Number of objects in the container.\\n     */\\n    function lengthByChainId(uint256 _chainId) external view returns (uint256);\\n\\n    /**\\n     * Pushes an object into the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function pushByChainId(uint256 _chainId, bytes32 _object) external;\\n\\n    /**\\n     * Pushes an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _chainId identity for the l2 chain.\\n     * @param _object A 32 byte value to insert into the container.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function pushByChainId(\\n        uint256 _chainId,\\n        bytes32 _object,\\n        bytes27 _globalMetadata\\n    ) external;\\n\\n    /**\\n     * Retrieves an object from the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Index of the particular object to access.\\n     * @return 32 byte object value.\\n     */\\n    function getByChainId(uint256 _chainId, uint256 _index) external view returns (bytes32);\\n\\n    /**\\n     * Removes all objects after and including a given index.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Object index to delete from.\\n     */\\n    function deleteElementsAfterInclusiveByChainId(uint256 _chainId, uint256 _index) external;\\n\\n    /**\\n     * Removes all objects after and including a given index. Also allows setting the global\\n     * metadata field.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Object index to delete from.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function deleteElementsAfterInclusiveByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    ) external;\\n}\\n\",\"keccak256\":\"0x6e5473cd0f460bd5386c5f111c03d091b165b1b9391394d25326d30174b17fa4\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event StateBatchAppended(\\n        uint256 _chainId,\\n        uint256 indexed _batchIndex,\\n        bytes32 _batchRoot,\\n        uint256 _batchSize,\\n        uint256 _prevTotalElements,\\n        bytes _extraData\\n    );\\n\\n    event StateBatchDeleted(uint256 _chainId, uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    function batches() external view returns (IChainStorageContainer);\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElements() external view returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n    /**\\n     * Retrieves the timestamp of the last batch submitted by the sequencer.\\n     * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n     */\\n    function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n    /**\\n     * Appends a batch of state roots to the chain.\\n     * @param _batch Batch of state roots.\\n     * @param _shouldStartAtElement Index of the element at which this batch should start.\\n     */\\n    function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n    /**\\n     * Deletes all state roots after (and including) a given batch.\\n     * @param _batchHeader Header of the batch to start deleting from.\\n     */\\n    function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n    /**\\n     * Verifies a batch inclusion proof.\\n     * @param _element Hash of the element to verify a proof for.\\n     * @param _batchHeader Header of the batch in which the element was included.\\n     * @param _proof Merkle inclusion proof for the element.\\n     */\\n    function verifyStateCommitment(\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool _verified);\\n\\n    /**\\n     * Checks whether a given batch is still inside its fraud proof window.\\n     * @param _batchHeader Header of the batch to check.\\n     * @return _inside Whether or not the batch is inside the fraud proof window.\\n     */\\n    function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        external\\n        view\\n        returns (bool _inside);\\n\\n    /********************\\n     * chain id added func *\\n     ********************/\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElementsByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatchesByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalBatches);\\n\\n    /**\\n     * Retrieves the timestamp of the last batch submitted by the sequencer.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n     */\\n    function getLastSequencerTimestampByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _lastSequencerTimestamp);\\n\\n    /**\\n     * Appends a batch of state roots to the chain.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batch Batch of state roots.\\n     * @param _shouldStartAtElement Index of the element at which this batch should start.\\n     */\\n    function appendStateBatchByChainId(\\n        uint256 _chainId,\\n        bytes32[] calldata _batch,\\n        uint256 _shouldStartAtElement,\\n        string calldata proposer\\n    ) external;\\n\\n    /**\\n     * Deletes all state roots after (and including) a given batch.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batchHeader Header of the batch to start deleting from.\\n     */\\n    function deleteStateBatchByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) external;\\n\\n    /**\\n     * Verifies a batch inclusion proof.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _element Hash of the element to verify a proof for.\\n     * @param _batchHeader Header of the batch in which the element was included.\\n     * @param _proof Merkle inclusion proof for the element.\\n     */\\n    function verifyStateCommitmentByChainId(\\n        uint256 _chainId,\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool _verified);\\n\\n    /**\\n     * Checks whether a given batch is still inside its fraud proof window.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batchHeader Header of the batch to check.\\n     * @return _inside Whether or not the batch is inside the fraud proof window.\\n     */\\n    function insideFraudProofWindowByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) external view returns (bool _inside);\\n}\\n\",\"keccak256\":\"0xa7e8ab4f2dca0197e1a37ef99fe615449e7c3adabece3677ab9a5aee91510c07\",\"license\":\"MIT\"},\"contracts/MVM/MVM_Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n/* Contract Imports */\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { iMVM_DiscountOracle } from \\\"./iMVM_DiscountOracle.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../L1/rollup/IStateCommitmentChain.sol\\\";\\n\\ncontract MVM_Verifier is Lib_AddressResolver {\\n    // second slot\\n    address public metis;\\n\\n    enum SETTLEMENT {\\n        NOT_ENOUGH_VERIFIER,\\n        SAME_ROOT,\\n        AGREE,\\n        DISAGREE,\\n        PASS\\n    }\\n\\n    event NewChallenge(\\n        uint256 cIndex,\\n        uint256 chainID,\\n        Lib_OVMCodec.ChainBatchHeader header,\\n        uint256 timestamp\\n    );\\n    event Verify1(uint256 cIndex, address verifier);\\n    event Verify2(uint256 cIndex, address verifier);\\n    event Finalize(uint256 cIndex, address sender, SETTLEMENT result);\\n    event Penalize(address sender, uint256 stakeLost);\\n    event Reward(address target, uint256 amount);\\n    event Claim(address sender, uint256 amount);\\n    event Withdraw(address sender, uint256 amount);\\n    event Stake(address verifier, uint256 amount);\\n    event SlashSequencer(uint256 chainID, address seq);\\n\\n    /*************\\n     * Constants *\\n     *************/\\n    string public constant CONFIG_OWNER_KEY = \\\"METIS_MANAGER\\\";\\n\\n    //challenge info\\n    struct Challenge {\\n        address challenger;\\n        uint256 chainID;\\n        uint256 index;\\n        Lib_OVMCodec.ChainBatchHeader header;\\n        uint256 timestamp;\\n        uint256 numQualifiedVerifiers;\\n        uint256 numVerifiers;\\n        address[] verifiers;\\n        bool done;\\n    }\\n\\n    mapping(address => uint256) public verifier_stakes;\\n    mapping(uint256 => mapping(address => bytes)) private challenge_keys;\\n    mapping(uint256 => mapping(address => bytes)) private challenge_key_hashes;\\n    mapping(uint256 => mapping(address => bytes)) private challenge_hashes;\\n\\n    mapping(address => uint256) public rewards;\\n    mapping(address => uint8) public absence_strikes;\\n    mapping(address => uint8) public consensus_strikes;\\n\\n    // only one active challenge for each chain  chainid=>cIndex\\n    mapping(uint256 => uint256) public chain_under_challenge;\\n\\n    // white list\\n    mapping(address => bool) public whitelist;\\n    bool useWhiteList;\\n\\n    address[] public verifiers;\\n    Challenge[] public challenges;\\n\\n    uint256 public verifyWindow = 3600 * 24; // 24 hours of window to complete the each verify phase\\n    uint256 public activeChallenges;\\n\\n    uint256 public minStake;\\n    uint256 public seqStake;\\n\\n    uint256 public numQualifiedVerifiers;\\n\\n    uint256 FAIL_THRESHOLD = 2; // 1 time grace\\n    uint256 ABSENCE_THRESHOLD = 4; // 2 times grace\\n\\n    modifier onlyManager() {\\n        require(\\n            msg.sender == resolve(CONFIG_OWNER_KEY),\\n            \\\"MVM_Verifier: Function can only be called by the METIS_MANAGER.\\\"\\n        );\\n        _;\\n    }\\n\\n    modifier onlyWhitelisted() {\\n        require(isWhiteListed(msg.sender), \\\"only whitelisted verifiers can call\\\");\\n        _;\\n    }\\n\\n    modifier onlyStaked() {\\n        require(isSufficientlyStaked(msg.sender), \\\"insufficient stake\\\");\\n        _;\\n    }\\n\\n    constructor() Lib_AddressResolver(address(0)) {}\\n\\n    // add stake as a verifier\\n    function verifierStake(uint256 stake) public onlyWhitelisted {\\n        require(activeChallenges == 0, \\\"stake is currently prohibited\\\"); //ongoing challenge\\n        require(stake > 0, \\\"zero stake not allowed\\\");\\n        require(\\n            IERC20(metis).transferFrom(msg.sender, address(this), stake),\\n            \\\"transfer metis failed\\\"\\n        );\\n\\n        uint256 previousBalance = verifier_stakes[msg.sender];\\n        verifier_stakes[msg.sender] += stake;\\n\\n        require(isSufficientlyStaked(msg.sender), \\\"insufficient stake to qualify as a verifier\\\");\\n\\n        if (previousBalance == 0) {\\n            numQualifiedVerifiers++;\\n            verifiers.push(msg.sender);\\n        }\\n\\n        emit Stake(msg.sender, stake);\\n    }\\n\\n    // start a new challenge\\n    // @param chainID chainid\\n    // @param header chainbatch header\\n    // @param proposedHash encrypted hash of the correct state\\n    // @param keyhash hash of the decryption key\\n    //\\n    // @dev why do we ask for key and keyhash? because we want verifiers compute the state instead\\n    // of just copying from other verifiers.\\n    function newChallenge(\\n        uint256 chainID,\\n        Lib_OVMCodec.ChainBatchHeader calldata header,\\n        bytes calldata proposedHash,\\n        bytes calldata keyhash\\n    ) public onlyWhitelisted onlyStaked {\\n        uint256 tempIndex = chain_under_challenge[chainID] - 1;\\n        require(\\n            tempIndex == 0 || block.timestamp - challenges[tempIndex].timestamp > verifyWindow * 2,\\n            \\\"there is an ongoing challenge\\\"\\n        );\\n        if (tempIndex > 0) {\\n            finalize(tempIndex);\\n        }\\n        IStateCommitmentChain stateChain = IStateCommitmentChain(resolve(\\\"StateCommitmentChain\\\"));\\n\\n        // while the root is encrypted, the timestamp is available in the extradata field of the header\\n        require(\\n            stateChain.insideFraudProofWindow(header),\\n            \\\"the batch is outside of the fraud proof window\\\"\\n        );\\n\\n        Challenge memory c;\\n        c.chainID = chainID;\\n        c.challenger = msg.sender;\\n        c.timestamp = block.timestamp;\\n        c.header = header;\\n\\n        challenges.push(c);\\n        uint256 cIndex = challenges.length - 1;\\n\\n        // house keeping\\n        challenge_hashes[cIndex][msg.sender] = proposedHash;\\n        challenge_key_hashes[cIndex][msg.sender] = keyhash;\\n        challenges[cIndex].numVerifiers++; // the challenger\\n\\n        // this will prevent stake change\\n        activeChallenges++;\\n\\n        chain_under_challenge[chainID] = cIndex + 1; // +1 because 0 means no in-progress challenge\\n        emit NewChallenge(cIndex, chainID, header, block.timestamp);\\n    }\\n\\n    // phase 1 of the verify, provide an encrypted hash and the hash of the decryption key\\n    // @param cIndex index of the challenge\\n    // @param hash encrypted hash of the correct state (for the index referred in the challenge)\\n    // @param keyhash hash of the decryption key\\n    function verify1(\\n        uint256 cIndex,\\n        bytes calldata hash,\\n        bytes calldata keyhash\\n    ) public onlyWhitelisted onlyStaked {\\n        require(\\n            challenge_hashes[cIndex][msg.sender].length == 0,\\n            \\\"verify1 already completed for the sender\\\"\\n        );\\n        challenge_hashes[cIndex][msg.sender] = hash;\\n        challenge_key_hashes[cIndex][msg.sender] = keyhash;\\n        challenges[cIndex].numVerifiers++;\\n        emit Verify1(cIndex, msg.sender);\\n    }\\n\\n    // phase 2 of the verify, provide the actual key to decrypt the hash\\n    // @param cIndex index of the challenge\\n    // @param key the decryption key\\n    function verify2(uint256 cIndex, bytes calldata key) public onlyStaked onlyWhitelisted {\\n        require(\\n            challenges[cIndex].numVerifiers == numQualifiedVerifiers ||\\n                block.timestamp - challenges[cIndex].timestamp > verifyWindow,\\n            \\\"phase 2 not ready\\\"\\n        );\\n        require(\\n            challenge_hashes[cIndex][msg.sender].length > 0,\\n            \\\"you didn't participate in phase 1\\\"\\n        );\\n        if (challenge_keys[cIndex][msg.sender].length > 0) {\\n            finalize(cIndex);\\n            return;\\n        }\\n\\n        //verify whether the key matches the keyhash initially provided.\\n        require(\\n            sha256(key) == bytes32(challenge_key_hashes[cIndex][msg.sender]),\\n            \\\"key and keyhash don't match\\\"\\n        );\\n\\n        if (msg.sender == challenges[cIndex].challenger) {\\n            //decode the root in the header too\\n            challenges[cIndex].header.batchRoot = bytes32(\\n                decrypt(abi.encodePacked(challenges[cIndex].header.batchRoot), key)\\n            );\\n        }\\n        challenge_keys[cIndex][msg.sender] = key;\\n        challenge_hashes[cIndex][msg.sender] = decrypt(challenge_hashes[cIndex][msg.sender], key);\\n        challenges[cIndex].verifiers.push(msg.sender);\\n        emit Verify2(cIndex, msg.sender);\\n\\n        finalize(cIndex);\\n    }\\n\\n    function finalize(uint256 cIndex) internal {\\n        Challenge storage challenge = challenges[cIndex];\\n\\n        require(challenge.done == false, \\\"challenge is closed\\\");\\n\\n        if (\\n            challenge.verifiers.length != challenge.numVerifiers &&\\n            block.timestamp - challenge.timestamp < verifyWindow * 2\\n        ) {\\n            // not ready to finalize. do nothing\\n            return;\\n        }\\n\\n        IStateCommitmentChain stateChain = IStateCommitmentChain(resolve(\\\"StateCommitmentChain\\\"));\\n        bytes32 proposedHash = bytes32(challenge_hashes[cIndex][challenge.challenger]);\\n\\n        uint256 reward = 0;\\n\\n        address[] memory agrees = new address[](challenge.verifiers.length);\\n        uint256 numAgrees = 0;\\n        address[] memory disagrees = new address[](challenge.verifiers.length);\\n        uint256 numDisagrees = 0;\\n        address[] memory penalized = new address[](challenge.verifiers.length);\\n        uint256 numPenalized = 0;\\n\\n        for (uint256 i = 0; i < verifiers.length; i++) {\\n            if (!isSufficientlyStaked(verifiers[i]) || !isWhiteListed(verifiers[i])) {\\n                // not qualified as a verifier\\n                continue;\\n            }\\n\\n            //record the agreement\\n            if (bytes32(challenge_hashes[cIndex][verifiers[i]]) == proposedHash) {\\n                //agree with the challenger\\n                if (absence_strikes[verifiers[i]] > 0) {\\n                    absence_strikes[verifiers[i]] -= 1; // slowly clear the strike\\n                }\\n                agrees[numAgrees] = verifiers[i];\\n                numAgrees++;\\n            } else if (challenge_keys[cIndex][verifiers[i]].length == 0) {\\n                //absent\\n                absence_strikes[verifiers[i]] += 2;\\n                if (absence_strikes[verifiers[i]] > ABSENCE_THRESHOLD) {\\n                    reward += verifier_stakes[verifiers[i]];\\n                    penalized[numPenalized] = verifiers[i];\\n                    numPenalized++;\\n                }\\n            } else {\\n                //disagree with the challenger\\n                if (absence_strikes[verifiers[i]] > 0) {\\n                    absence_strikes[verifiers[i]] -= 1; // slowly clear the strike\\n                }\\n                disagrees[numDisagrees] = verifiers[i];\\n                numDisagrees++;\\n            }\\n        }\\n        for (uint256 i = 0; i < numPenalized; i++) {\\n            penalize(penalized[i]);\\n        }\\n\\n        if (\\n            Lib_OVMCodec.hashBatchHeader(challenge.header) !=\\n            stateChain.batches().getByChainId(challenge.chainID, challenge.header.batchIndex)\\n        ) {\\n            // wrong header, penalize the challenger\\n            reward += penalize(challenge.challenger);\\n\\n            // reward the disagrees. but no penalty on agrees because the input\\n            // is garbage.\\n            distributeReward(reward, disagrees, challenge.verifiers.length - 1);\\n            emit Finalize(cIndex, msg.sender, SETTLEMENT.DISAGREE);\\n        } else if (challenge.verifiers.length < (numQualifiedVerifiers * 75) / 100) {\\n            // the absent verifiers get a absense strike. no other penalties. already done\\n            emit Finalize(cIndex, msg.sender, SETTLEMENT.NOT_ENOUGH_VERIFIER);\\n        } else if (proposedHash != challenge.header.batchRoot) {\\n            if (numAgrees <= numDisagrees) {\\n                // no consensus, challenge failed.\\n                for (uint256 i = 0; i < numAgrees; i++) {\\n                    consensus_strikes[agrees[i]] += 2;\\n                    if (consensus_strikes[agrees[i]] > FAIL_THRESHOLD) {\\n                        reward += penalize(agrees[i]);\\n                    }\\n                }\\n                distributeReward(reward, disagrees, disagrees.length);\\n                emit Finalize(cIndex, msg.sender, SETTLEMENT.DISAGREE);\\n            } else {\\n                // reached agreement. delete the batch root and slash the sequencer if the header is still valid\\n                if (stateChain.insideFraudProofWindow(challenge.header)) {\\n                    // this header needs to be within the window\\n                    stateChain.deleteStateBatchByChainId(challenge.chainID, challenge.header);\\n\\n                    // temporary for the p1 of the decentralization roadmap\\n                    if (seqStake > 0) {\\n                        reward += seqStake;\\n\\n                        for (uint256 i = 0; i < numDisagrees; i++) {\\n                            consensus_strikes[disagrees[i]] += 2;\\n                            if (consensus_strikes[disagrees[i]] > FAIL_THRESHOLD) {\\n                                reward += penalize(disagrees[i]);\\n                            }\\n                        }\\n                        distributeReward(reward, agrees, agrees.length);\\n                    }\\n                    emit Finalize(cIndex, msg.sender, SETTLEMENT.AGREE);\\n                } else {\\n                    //not in the window anymore. let it pass... no penalty\\n                    emit Finalize(cIndex, msg.sender, SETTLEMENT.PASS);\\n                }\\n            }\\n        } else {\\n            //wasteful challenge, add consensus_strikes to the challenger\\n            consensus_strikes[challenge.challenger] += 2;\\n            if (consensus_strikes[challenge.challenger] > FAIL_THRESHOLD) {\\n                reward += penalize(challenge.challenger);\\n            }\\n            distributeReward(reward, challenge.verifiers, challenge.verifiers.length - 1);\\n            emit Finalize(cIndex, msg.sender, SETTLEMENT.SAME_ROOT);\\n        }\\n\\n        challenge.done = true;\\n        activeChallenges--;\\n        chain_under_challenge[challenge.chainID] = 0;\\n    }\\n\\n    function depositSeqStake(uint256 amount) public onlyManager {\\n        require(\\n            IERC20(metis).transferFrom(msg.sender, address(this), amount),\\n            \\\"transfer metis failed\\\"\\n        );\\n        seqStake += amount;\\n        emit Stake(msg.sender, amount);\\n    }\\n\\n    function withdrawSeqStake(address to) public onlyManager {\\n        require(seqStake > 0, \\\"no stake\\\");\\n        emit Withdraw(msg.sender, seqStake);\\n        uint256 amount = seqStake;\\n        seqStake = 0;\\n\\n        require(IERC20(metis).transfer(to, amount), \\\"transfer metis failed\\\");\\n    }\\n\\n    function claim() public {\\n        require(rewards[msg.sender] > 0, \\\"no reward to claim\\\");\\n        uint256 amount = rewards[msg.sender];\\n        rewards[msg.sender] = 0;\\n\\n        require(IERC20(metis).transfer(msg.sender, amount), \\\"token transfer failed\\\");\\n\\n        emit Claim(msg.sender, amount);\\n    }\\n\\n    function withdraw(uint256 amount) public {\\n        require(activeChallenges == 0, \\\"withdraw is currently prohibited\\\"); //ongoing challenge\\n\\n        uint256 balance = verifier_stakes[msg.sender];\\n        require(balance >= amount, \\\"insufficient stake to withdraw\\\");\\n\\n        if (balance - amount < minStake && balance >= minStake) {\\n            numQualifiedVerifiers--;\\n            deleteVerifier(msg.sender);\\n        }\\n        verifier_stakes[msg.sender] -= amount;\\n\\n        require(IERC20(metis).transfer(msg.sender, amount), \\\"token transfer failed\\\");\\n    }\\n\\n    function setMinStake(uint256 _minStake) public onlyManager {\\n        minStake = _minStake;\\n        uint256 num = 0;\\n        if (verifiers.length > 0) {\\n            address[] memory arr = new address[](verifiers.length);\\n            for (uint256 i = 0; i < verifiers.length; ++i) {\\n                if (verifier_stakes[verifiers[i]] >= minStake) {\\n                    arr[num] = verifiers[i];\\n                    num++;\\n                }\\n            }\\n            if (num < verifiers.length) {\\n                delete verifiers;\\n                for (uint256 i = 0; i < num; i++) {\\n                    verifiers.push(arr[i]);\\n                }\\n            }\\n        }\\n        numQualifiedVerifiers = num;\\n    }\\n\\n    // helper\\n    function isWhiteListed(address verifier) public view returns (bool) {\\n        return !useWhiteList || whitelist[verifier];\\n    }\\n\\n    function isSufficientlyStaked(address target) public view returns (bool) {\\n        return (verifier_stakes[target] >= minStake);\\n    }\\n\\n    // set the length of the time windows for each verification phase\\n    function setVerifyWindow(uint256 window) public onlyManager {\\n        verifyWindow = window;\\n    }\\n\\n    // add the verifier to the whitelist\\n    function setWhiteList(address verifier, bool allowed) public onlyManager {\\n        whitelist[verifier] = allowed;\\n        useWhiteList = true;\\n    }\\n\\n    // allow everyone to be the verifier\\n    function disableWhiteList() public onlyManager {\\n        useWhiteList = false;\\n    }\\n\\n    function setThreshold(uint256 absence_threshold, uint256 fail_threshold) public onlyManager {\\n        ABSENCE_THRESHOLD = absence_threshold;\\n        FAIL_THRESHOLD = fail_threshold;\\n    }\\n\\n    function getMerkleRoot(bytes32[] calldata elements) public pure returns (bytes32) {\\n        return Lib_MerkleTree.getMerkleRoot(elements);\\n    }\\n\\n    //helper fucntion to encrypt data\\n    function encrypt(bytes calldata data, bytes calldata key) public pure returns (bytes memory) {\\n        bytes memory encryptedData = data;\\n        uint256 j = 0;\\n\\n        for (uint256 i = 0; i < encryptedData.length; i++) {\\n            if (j == key.length) {\\n                j = 0;\\n            }\\n            encryptedData[i] = encryptByte(encryptedData[i], uint8(key[j]));\\n            j++;\\n        }\\n\\n        return encryptedData;\\n    }\\n\\n    function encryptByte(bytes1 b, uint8 k) internal pure returns (bytes1) {\\n        uint16 temp16 = uint16(uint8(b));\\n        temp16 += k;\\n\\n        if (temp16 > 255) {\\n            temp16 -= 256;\\n        }\\n        return bytes1(uint8(temp16));\\n    }\\n\\n    // helper fucntion to decrypt the data\\n    function decrypt(bytes memory data, bytes memory key) public pure returns (bytes memory) {\\n        bytes memory decryptedData = data;\\n        uint256 j = 0;\\n\\n        for (uint256 i = 0; i < decryptedData.length; i++) {\\n            if (j == key.length) {\\n                j = 0;\\n            }\\n\\n            decryptedData[i] = decryptByte(decryptedData[i], uint8(key[j]));\\n\\n            j++;\\n        }\\n\\n        return decryptedData;\\n    }\\n\\n    function decryptByte(bytes1 b, uint8 k) internal pure returns (bytes1) {\\n        uint16 temp16 = uint16(uint8(b));\\n        if (temp16 > k) {\\n            temp16 -= k;\\n        } else {\\n            temp16 = 256 - k;\\n        }\\n\\n        return bytes1(uint8(temp16));\\n    }\\n\\n    // calculate the rewards\\n    function distributeReward(\\n        uint256 amount,\\n        address[] memory list,\\n        uint256 num\\n    ) internal {\\n        uint256 reward = amount / num;\\n        if (reward == 0) {\\n            return;\\n        }\\n        uint256 total = 0;\\n        for (uint256 i; i < list.length; i++) {\\n            if (isSufficientlyStaked(list[i])) {\\n                rewards[list[i]] += reward;\\n                total += reward;\\n                emit Reward(list[i], reward);\\n            }\\n        }\\n\\n        if (total < amount) {\\n            if (isSufficientlyStaked(list[0])) {\\n                rewards[list[0]] += total - amount;\\n                emit Reward(list[0], total - amount);\\n            } else {\\n                rewards[list[1]] += total - amount;\\n                emit Reward(list[1], total - amount);\\n            }\\n        }\\n    }\\n\\n    // slash the verifier stake\\n    function penalize(address target) internal returns (uint256) {\\n        uint256 stake = verifier_stakes[target];\\n        verifier_stakes[target] = 0;\\n        numQualifiedVerifiers--;\\n        deleteVerifier(target);\\n        emit Penalize(target, stake);\\n\\n        return stake;\\n    }\\n\\n    function deleteVerifier(address target) internal {\\n        bool hasVerifier = false;\\n        uint256 pos = 0;\\n        for (uint256 i = 0; i < verifiers.length; i++) {\\n            if (verifiers[i] == target) {\\n                hasVerifier = true;\\n                pos = i;\\n                break;\\n            }\\n        }\\n        if (hasVerifier) {\\n            for (uint256 i = pos; i < verifiers.length - 1; i++) {\\n                verifiers[i] = verifiers[i + 1];\\n            }\\n            verifiers.pop();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbf57f2abd1746a0dab78fd6dc6c96bd92ca6786d8acc1aedbe1c697c2f056a9e\",\"license\":\"MIT\"},\"contracts/MVM/iMVM_DiscountOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\ninterface iMVM_DiscountOracle {\\n    function setDiscount(uint256 _discount) external;\\n\\n    function setMinL2Gas(uint256 _minL2Gas) external;\\n\\n    function setWhitelistedXDomainSender(address _sender, bool _isWhitelisted) external;\\n\\n    function isXDomainSenderAllowed(address _sender) external view returns (bool);\\n\\n    function setAllowAllXDomainSenders(bool _allowAllXDomainSenders) external;\\n\\n    function getMinL2Gas() external view returns (uint256);\\n\\n    function getDiscount() external view returns (uint256);\\n\\n    function processL2SeqGas(address sender, uint256 _chainId) external payable;\\n\\n    function withdrawToSeq(uint256 _amount, uint256 _chainId) external;\\n}\\n\",\"keccak256\":\"0x5fae2a8ff4190e28fc8a9bb6a0f258e21d07b1487f734b634c692f732c313f37\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum QueueOrigin {\\n        SEQUENCER_QUEUE,\\n        L1TOL2_QUEUE\\n    }\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct EVMAccount {\\n        uint256 nonce;\\n        uint256 balance;\\n        bytes32 storageRoot;\\n        bytes32 codeHash;\\n    }\\n\\n    struct ChainBatchHeader {\\n        uint256 batchIndex;\\n        bytes32 batchRoot;\\n        uint256 batchSize;\\n        uint256 prevTotalElements;\\n        bytes extraData;\\n    }\\n\\n    struct ChainInclusionProof {\\n        uint256 index;\\n        bytes32[] siblings;\\n    }\\n\\n    struct Transaction {\\n        uint256 timestamp;\\n        uint256 blockNumber;\\n        QueueOrigin l1QueueOrigin;\\n        address l1TxOrigin;\\n        address entrypoint;\\n        uint256 gasLimit;\\n        bytes data;\\n    }\\n\\n    struct TransactionChainElement {\\n        bool isSequenced;\\n        uint256 queueIndex; // QUEUED TX ONLY\\n        uint256 timestamp; // SEQUENCER TX ONLY\\n        uint256 blockNumber; // SEQUENCER TX ONLY\\n        bytes txData; // SEQUENCER TX ONLY\\n    }\\n\\n    struct QueueElement {\\n        bytes32 transactionHash;\\n        uint40 timestamp;\\n        uint40 blockNumber;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Encodes a standard OVM transaction.\\n     * @param _transaction OVM transaction to encode.\\n     * @return Encoded transaction bytes.\\n     */\\n    function encodeTransaction(Transaction memory _transaction)\\n        internal\\n        pure\\n        returns (bytes memory)\\n    {\\n        return\\n            abi.encodePacked(\\n                _transaction.timestamp,\\n                _transaction.blockNumber,\\n                _transaction.l1QueueOrigin,\\n                _transaction.l1TxOrigin,\\n                _transaction.entrypoint,\\n                _transaction.gasLimit,\\n                _transaction.data\\n            );\\n    }\\n\\n    /**\\n     * Hashes a standard OVM transaction.\\n     * @param _transaction OVM transaction to encode.\\n     * @return Hashed transaction\\n     */\\n    function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n        return keccak256(encodeTransaction(_transaction));\\n    }\\n\\n    /**\\n     * @notice Decodes an RLP-encoded account state into a useful struct.\\n     * @param _encoded RLP-encoded account state.\\n     * @return Account state struct.\\n     */\\n    function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n        Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n        return\\n            EVMAccount({\\n                nonce: Lib_RLPReader.readUint256(accountState[0]),\\n                balance: Lib_RLPReader.readUint256(accountState[1]),\\n                storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n                codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n            });\\n    }\\n\\n    /**\\n     * Calculates a hash for a given batch header.\\n     * @param _batchHeader Header to hash.\\n     * @return Hash of the header.\\n     */\\n    function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        return\\n            keccak256(\\n                abi.encode(\\n                    _batchHeader.batchRoot,\\n                    _batchHeader.batchSize,\\n                    _batchHeader.prevTotalElements,\\n                    _batchHeader.extraData\\n                )\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0xd727df7cc99ff84e9c5722120163e7bf0077170758a4c9b0aa90b8e3abb0e134\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    mapping(bytes32 => address) private addresses;\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Changes the address associated with a particular name.\\n     * @param _name String name to associate an address with.\\n     * @param _address Address to associate with the name.\\n     */\\n    function setAddress(string memory _name, address _address) external onlyOwner {\\n        bytes32 nameHash = _getNameHash(_name);\\n        address oldAddress = addresses[nameHash];\\n        addresses[nameHash] = _address;\\n\\n        emit AddressSet(_name, _address, oldAddress);\\n    }\\n\\n    /**\\n     * Retrieves the address associated with a given name.\\n     * @param _name Name to retrieve an address for.\\n     * @return Address associated with the given name.\\n     */\\n    function getAddress(string memory _name) external view returns (address) {\\n        return addresses[_getNameHash(_name)];\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Computes the hash of a name.\\n     * @param _name Name to compute a hash for.\\n     * @return Hash of the given name.\\n     */\\n    function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(_name));\\n    }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    Lib_AddressManager public libAddressManager;\\n\\n    /***************\\n     * Constructor *\\n     ***************/\\n\\n    /**\\n     * @param _libAddressManager Address of the Lib_AddressManager.\\n     */\\n    constructor(address _libAddressManager) {\\n        libAddressManager = Lib_AddressManager(_libAddressManager);\\n    }\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Resolves the address associated with a given name.\\n     * @param _name Name to resolve an address for.\\n     * @return Address associated with the given name.\\n     */\\n    function resolve(string memory _name) public view returns (address) {\\n        return libAddressManager.getAddress(_name);\\n    }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n    /*************\\n     * Constants *\\n     *************/\\n\\n    uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum RLPItemType {\\n        DATA_ITEM,\\n        LIST_ITEM\\n    }\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct RLPItem {\\n        uint256 length;\\n        uint256 ptr;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Converts bytes to a reference to memory position and length.\\n     * @param _in Input bytes to convert.\\n     * @return Output memory reference.\\n     */\\n    function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n        uint256 ptr;\\n        assembly {\\n            ptr := add(_in, 32)\\n        }\\n\\n        return RLPItem({ length: _in.length, ptr: ptr });\\n    }\\n\\n    /**\\n     * Reads an RLP list value into a list of RLP items.\\n     * @param _in RLP list value.\\n     * @return Decoded RLP list items.\\n     */\\n    function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n        (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n        // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n        // writing to the length. Since we can't know the number of RLP items without looping over\\n        // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n        // simply set a reasonable maximum list length and decrease the size before we finish.\\n        RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n        uint256 itemCount = 0;\\n        uint256 offset = listOffset;\\n        while (offset < _in.length) {\\n            require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n            (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n                RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n            );\\n\\n            out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n            itemCount += 1;\\n            offset += itemOffset + itemLength;\\n        }\\n\\n        // Decrease the array size to match the actual item count.\\n        assembly {\\n            mstore(out, itemCount)\\n        }\\n\\n        return out;\\n    }\\n\\n    /**\\n     * Reads an RLP list value into a list of RLP items.\\n     * @param _in RLP list value.\\n     * @return Decoded RLP list items.\\n     */\\n    function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n        return readList(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bytes value into bytes.\\n     * @param _in RLP bytes value.\\n     * @return Decoded bytes.\\n     */\\n    function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n        (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n        return _copy(_in.ptr, itemOffset, itemLength);\\n    }\\n\\n    /**\\n     * Reads an RLP bytes value into bytes.\\n     * @param _in RLP bytes value.\\n     * @return Decoded bytes.\\n     */\\n    function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n        return readBytes(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP string value into a string.\\n     * @param _in RLP string value.\\n     * @return Decoded string.\\n     */\\n    function readString(RLPItem memory _in) internal pure returns (string memory) {\\n        return string(readBytes(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP string value into a string.\\n     * @param _in RLP string value.\\n     * @return Decoded string.\\n     */\\n    function readString(bytes memory _in) internal pure returns (string memory) {\\n        return readString(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bytes32 value into a bytes32.\\n     * @param _in RLP bytes32 value.\\n     * @return Decoded bytes32.\\n     */\\n    function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n        require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n        (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n        uint256 ptr = _in.ptr + itemOffset;\\n        bytes32 out;\\n        assembly {\\n            out := mload(ptr)\\n\\n            // Shift the bytes over to match the item size.\\n            if lt(itemLength, 32) {\\n                out := div(out, exp(256, sub(32, itemLength)))\\n            }\\n        }\\n\\n        return out;\\n    }\\n\\n    /**\\n     * Reads an RLP bytes32 value into a bytes32.\\n     * @param _in RLP bytes32 value.\\n     * @return Decoded bytes32.\\n     */\\n    function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n        return readBytes32(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP uint256 value into a uint256.\\n     * @param _in RLP uint256 value.\\n     * @return Decoded uint256.\\n     */\\n    function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n        return uint256(readBytes32(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP uint256 value into a uint256.\\n     * @param _in RLP uint256 value.\\n     * @return Decoded uint256.\\n     */\\n    function readUint256(bytes memory _in) internal pure returns (uint256) {\\n        return readUint256(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bool value into a bool.\\n     * @param _in RLP bool value.\\n     * @return Decoded bool.\\n     */\\n    function readBool(RLPItem memory _in) internal pure returns (bool) {\\n        require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n        uint256 ptr = _in.ptr;\\n        uint256 out;\\n        assembly {\\n            out := byte(0, mload(ptr))\\n        }\\n\\n        require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n        return out != 0;\\n    }\\n\\n    /**\\n     * Reads an RLP bool value into a bool.\\n     * @param _in RLP bool value.\\n     * @return Decoded bool.\\n     */\\n    function readBool(bytes memory _in) internal pure returns (bool) {\\n        return readBool(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP address value into a address.\\n     * @param _in RLP address value.\\n     * @return Decoded address.\\n     */\\n    function readAddress(RLPItem memory _in) internal pure returns (address) {\\n        if (_in.length == 1) {\\n            return address(0);\\n        }\\n\\n        require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n        return address(uint160(readUint256(_in)));\\n    }\\n\\n    /**\\n     * Reads an RLP address value into a address.\\n     * @param _in RLP address value.\\n     * @return Decoded address.\\n     */\\n    function readAddress(bytes memory _in) internal pure returns (address) {\\n        return readAddress(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads the raw bytes of an RLP item.\\n     * @param _in RLP item to read.\\n     * @return Raw RLP bytes.\\n     */\\n    function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n        return _copy(_in);\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Decodes the length of an RLP item.\\n     * @param _in RLP item to decode.\\n     * @return Offset of the encoded data.\\n     * @return Length of the encoded data.\\n     * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n     */\\n    function _decodeLength(RLPItem memory _in)\\n        private\\n        pure\\n        returns (\\n            uint256,\\n            uint256,\\n            RLPItemType\\n        )\\n    {\\n        require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n        uint256 ptr = _in.ptr;\\n        uint256 prefix;\\n        assembly {\\n            prefix := byte(0, mload(ptr))\\n        }\\n\\n        if (prefix <= 0x7f) {\\n            // Single byte.\\n\\n            return (0, 1, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xb7) {\\n            // Short string.\\n\\n            uint256 strLen = prefix - 0x80;\\n\\n            require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n            return (1, strLen, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xbf) {\\n            // Long string.\\n            uint256 lenOfStrLen = prefix - 0xb7;\\n\\n            require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n            uint256 strLen;\\n            assembly {\\n                // Pick out the string length.\\n                strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n            }\\n\\n            require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n            return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xf7) {\\n            // Short list.\\n            uint256 listLen = prefix - 0xc0;\\n\\n            require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n            return (1, listLen, RLPItemType.LIST_ITEM);\\n        } else {\\n            // Long list.\\n            uint256 lenOfListLen = prefix - 0xf7;\\n\\n            require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n            uint256 listLen;\\n            assembly {\\n                // Pick out the list length.\\n                listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n            }\\n\\n            require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n            return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n        }\\n    }\\n\\n    /**\\n     * Copies the bytes from a memory location.\\n     * @param _src Pointer to the location to read from.\\n     * @param _offset Offset to start reading from.\\n     * @param _length Number of bytes to read.\\n     * @return Copied bytes.\\n     */\\n    function _copy(\\n        uint256 _src,\\n        uint256 _offset,\\n        uint256 _length\\n    ) private pure returns (bytes memory) {\\n        bytes memory out = new bytes(_length);\\n        if (out.length == 0) {\\n            return out;\\n        }\\n\\n        uint256 src = _src + _offset;\\n        uint256 dest;\\n        assembly {\\n            dest := add(out, 32)\\n        }\\n\\n        // Copy over as many complete words as we can.\\n        for (uint256 i = 0; i < _length / 32; i++) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n\\n            src += 32;\\n            dest += 32;\\n        }\\n\\n        // Pick out the remaining bytes.\\n        uint256 mask;\\n        unchecked {\\n            mask = 256**(32 - (_length % 32)) - 1;\\n        }\\n\\n        assembly {\\n            mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n        }\\n        return out;\\n    }\\n\\n    /**\\n     * Copies an RLP item into bytes.\\n     * @param _in RLP item to copy.\\n     * @return Copied bytes.\\n     */\\n    function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n        return _copy(_in.ptr, 0, _in.length);\\n    }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Calculates a merkle root for a list of 32-byte leaf hashes.  WARNING: If the number\\n     * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n     * If you do not know the original length of elements for the tree you are verifying, then\\n     * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n     * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n     * @param _elements Array of hashes from which to generate a merkle root.\\n     * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n     */\\n    function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n        require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n        if (_elements.length == 1) {\\n            return _elements[0];\\n        }\\n\\n        uint256[16] memory defaults = [\\n            0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n            0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n            0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n            0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n            0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n            0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n            0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n            0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n            0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n            0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n            0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n            0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n            0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n            0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n            0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n            0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n        ];\\n\\n        // Reserve memory space for our hashes.\\n        bytes memory buf = new bytes(64);\\n\\n        // We'll need to keep track of left and right siblings.\\n        bytes32 leftSibling;\\n        bytes32 rightSibling;\\n\\n        // Number of non-empty nodes at the current depth.\\n        uint256 rowSize = _elements.length;\\n\\n        // Current depth, counting from 0 at the leaves\\n        uint256 depth = 0;\\n\\n        // Common sub-expressions\\n        uint256 halfRowSize; // rowSize / 2\\n        bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n        while (rowSize > 1) {\\n            halfRowSize = rowSize / 2;\\n            rowSizeIsOdd = rowSize % 2 == 1;\\n\\n            for (uint256 i = 0; i < halfRowSize; i++) {\\n                leftSibling = _elements[(2 * i)];\\n                rightSibling = _elements[(2 * i) + 1];\\n                assembly {\\n                    mstore(add(buf, 32), leftSibling)\\n                    mstore(add(buf, 64), rightSibling)\\n                }\\n\\n                _elements[i] = keccak256(buf);\\n            }\\n\\n            if (rowSizeIsOdd) {\\n                leftSibling = _elements[rowSize - 1];\\n                rightSibling = bytes32(defaults[depth]);\\n                assembly {\\n                    mstore(add(buf, 32), leftSibling)\\n                    mstore(add(buf, 64), rightSibling)\\n                }\\n\\n                _elements[halfRowSize] = keccak256(buf);\\n            }\\n\\n            rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n            depth++;\\n        }\\n\\n        return _elements[0];\\n    }\\n\\n    /**\\n     * Verifies a merkle branch for the given leaf hash.  Assumes the original length\\n     * of leaves generated is a known, correct input, and does not return true for indices\\n     * extending past that index (even if _siblings would be otherwise valid.)\\n     * @param _root The Merkle root to verify against.\\n     * @param _leaf The leaf hash to verify inclusion of.\\n     * @param _index The index in the tree of this leaf.\\n     * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n     * (bottom of the tree).\\n     * @param _totalLeaves The total number of leaves originally passed into.\\n     * @return Whether or not the merkle branch and leaf passes verification.\\n     */\\n    function verify(\\n        bytes32 _root,\\n        bytes32 _leaf,\\n        uint256 _index,\\n        bytes32[] memory _siblings,\\n        uint256 _totalLeaves\\n    ) internal pure returns (bool) {\\n        require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n        require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n        require(\\n            _siblings.length == _ceilLog2(_totalLeaves),\\n            \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n        );\\n\\n        bytes32 computedRoot = _leaf;\\n\\n        for (uint256 i = 0; i < _siblings.length; i++) {\\n            if ((_index & 1) == 1) {\\n                computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n            } else {\\n                computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n            }\\n\\n            _index >>= 1;\\n        }\\n\\n        return _root == computedRoot;\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Calculates the integer ceiling of the log base 2 of an input.\\n     * @param _in Unsigned input to calculate the log.\\n     * @return ceil(log_base_2(_in))\\n     */\\n    function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n        require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n        if (_in == 1) {\\n            return 0;\\n        }\\n\\n        // Find the highest set bit (will be floor(log_2)).\\n        // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n        uint256 val = _in;\\n        uint256 highest = 0;\\n        for (uint256 i = 128; i >= 1; i >>= 1) {\\n            if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n                highest += i;\\n                val >>= i;\\n            }\\n        }\\n\\n        // Increment by one if this is not a perfect logarithm.\\n        if ((uint256(1) << highest) != _in) {\\n            highest += 1;\\n        }\\n\\n        return highest;\\n    }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x608060405262015180600e556002601355600460145534801561002157600080fd5b50600080546001600160a01b0319169055615209806100416000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80636f9170f611610145578063b4b6de38116100bd578063e59745541161008c578063ef53b04111610071578063ef53b0411461056c578063fca0fd6c1461057f578063ffa444ec1461058857600080fd5b8063e597455414610529578063eab0fca31461053c57600080fd5b8063b4b6de38146104f2578063b646c02514610505578063b9c362091461050e578063dcd836161461052157600080fd5b8063939f59fe1161011457806398fe9dfb116100f957806398fe9dfb146104a95780639b19251a146104bc578063ac1eff68146104df57600080fd5b8063939f59fe14610473578063966df42b1461048657600080fd5b80636f9170f6146104035780638c80fd90146104265780638d14e127146104395780638f1d37761461044c57600080fd5b8063461a4478116101d857806353dec0e8116101a75780635cc38c021161018c5780635cc38c02146103945780636593363f146103b4578063669fdeb5146103c757600080fd5b806353dec0e81461036e5780635bf0f25d1461038157600080fd5b8063461a4478146103375780634869bfb61461034a5780634d4127af1461035d5780634e71d92d1461036657600080fd5b80632e1a7d4d116102145780632e1a7d4d146102d1578063375b3c0a146102e6578063383e5e69146102ef57806340a89eae1461030257600080fd5b8063015cfec7146102465780630700037d1461026f57806315b90cb21461029d578063299ca478146102a6575b600080fd5b6102596102543660046145f6565b6105a8565b60405161026691906146cd565b60405180910390f35b61028f61027d3660046146f5565b60066020526000908152604090205481565b604051908152602001610266565b61028f60115481565b6000546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b6102e46102df366004614712565b6106c7565b005b61028f60105481565b6102e46102fd3660046146f5565b6108cc565b6103256103103660046146f5565b60076020526000908152604090205460ff1681565b60405160ff9091168152602001610266565b6102b96103453660046147ee565b610b13565b61028f61035836600461483f565b610bb3565b61028f60125481565b6102e4610bf8565b6102e461037c366004614712565b610d92565b6102e461038f366004614712565b610f92565b61028f6103a2366004614712565b60096020526000908152604090205481565b6102e46103c23660046148b4565b6112f9565b6102596040518060400160405280600d81526020017f4d455449535f4d414e414745520000000000000000000000000000000000000081525081565b6104166104113660046146f5565b611907565b6040519015158152602001610266565b6102e4610434366004614712565b611936565b6102e461044736600461490e565b611bc3565b61045f61045a366004614712565b611cbc565b604051610266989796959493929190614947565b6102e46104813660046149dd565b611df1565b6103256104943660046146f5565b60086020526000908152604090205460ff1681565b6102596104b7366004614a77565b612026565b6104166104ca3660046146f5565b600a6020526000908152604090205460ff1681565b6102b96104ed366004614712565b6120ee565b6102e4610500366004614adb565b612118565b61028f600f5481565b6102e461051c366004614b81565b612732565b6102e4612801565b6001546102b9906001600160a01b031681565b61041661054a3660046146f5565b6010546001600160a01b03909116600090815260026020526040902054101590565b6102e461057a366004614712565b6128d1565b61028f600e5481565b61028f6105963660046146f5565b60026020526000908152604090205481565b6060600085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093945083925050505b82518110156106bb57818514156105fd57600091505b61065a83828151811061061257610612614ba3565b01602001517fff000000000000000000000000000000000000000000000000000000000000001687878581811061064b5761064b614ba3565b919091013560f81c905061299a565b83828151811061066c5761066c614ba3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816106a581614c01565b92505080806106b390614c01565b9150506105e7565b50909695505050505050565b600f541561071c5760405162461bcd60e51b815260206004820181905260248201527f77697468647261772069732063757272656e746c792070726f6869626974656460448201526064015b60405180910390fd5b336000908152600260205260409020548181101561077c5760405162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e74207374616b6520746f20776974686472617700006044820152606401610713565b6010546107898383614c1c565b10801561079857506010548110155b156107bb57601280549060006107ad83614c33565b91905055506107bb336129d6565b33600090815260026020526040812080548492906107da908490614c1c565b90915550506001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561084457600080fd5b505af1158015610858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087c9190614c4a565b6108c85760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610713565b5050565b61090a6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146109905760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6000601154116109e25760405162461bcd60e51b815260206004820152600860248201527f6e6f207374616b650000000000000000000000000000000000000000000000006044820152606401610713565b6011546040805133815260208101929092527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a16011805460009091556001546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b158015610a8f57600080fd5b505af1158015610aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac79190614c4a565b6108c85760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610713565b600080546040517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bf40fac190610b5d9085906004016146cd565b60206040518083038186803b158015610b7557600080fd5b505afa158015610b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bad9190614c67565b92915050565b6000610bf1838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b4892505050565b9392505050565b33600090815260066020526040902054610c545760405162461bcd60e51b815260206004820152601260248201527f6e6f2072657761726420746f20636c61696d00000000000000000000000000006044820152606401610713565b33600081815260066020526040808220805492905560015490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101939093526024830182905290916001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610cd157600080fd5b505af1158015610ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d099190614c4a565b610d555760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610713565b60408051338152602081018390527f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d491015b60405180910390a150565b610dd06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b031614610e565760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610ec157600080fd5b505af1158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef99190614c4a565b610f455760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610713565b8060116000828254610f579190614c84565b909155505060408051338152602081018390527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9101610d87565b610f9b33611907565b61100d5760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b600f541561105d5760405162461bcd60e51b815260206004820152601d60248201527f7374616b652069732063757272656e746c792070726f686962697465640000006044820152606401610713565b600081116110ad5760405162461bcd60e51b815260206004820152601660248201527f7a65726f207374616b65206e6f7420616c6c6f776564000000000000000000006044820152606401610713565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561111857600080fd5b505af115801561112c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111509190614c4a565b61119c5760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610713565b3360009081526002602052604081208054918391906111bb8385614c84565b90915550506010543360009081526002602052604090205410156112475760405162461bcd60e51b815260206004820152602b60248201527f696e73756666696369656e74207374616b6520746f207175616c69667920617360448201527f20612076657269666965720000000000000000000000000000000000000000006064820152608401610713565b806112bc576012805490600061125c83614c01565b9091555050600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555b60408051338152602081018490527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a910160405180910390a15050565b60105433600090815260026020526040902054101561135a5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610713565b61136333611907565b6113d55760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b601254600d84815481106113eb576113eb614ba3565b90600052602060002090600d0201600a015414806114395750600e54600d848154811061141a5761141a614ba3565b90600052602060002090600d020160080154426114379190614c1c565b115b6114855760405162461bcd60e51b815260206004820152601160248201527f70686173652032206e6f742072656164790000000000000000000000000000006044820152606401610713565b6000838152600560209081526040808320338452909152812080546114a990614c9c565b90501161151e5760405162461bcd60e51b815260206004820152602160248201527f796f75206469646e277420706172746963697061746520696e2070686173652060448201527f31000000000000000000000000000000000000000000000000000000000000006064820152608401610713565b60008381526003602090815260408083203384529091528120805461154290614c9c565b90501115611558576115538361302c565b505050565b6000838152600460209081526040808320338452909152902061157a90614cf0565b6002838360405161158c929190614d31565b602060405180830381855afa1580156115a9573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115cc9190614d41565b146116195760405162461bcd60e51b815260206004820152601b60248201527f6b657920616e64206b65796861736820646f6e2774206d6174636800000000006044820152606401610713565b600d838154811061162c5761162c614ba3565b60009182526020909120600d90910201546001600160a01b031633141561171d576116ec600d848154811061166357611663614ba3565b90600052602060002090600d02016003016001015460405160200161168a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181526020601f86018190048102840181019092528483529190859085908190840183828082843760009201919091525061202692505050565b6116f590614d5a565b600d848154811061170857611708614ba3565b600091825260209091206004600d9092020101555b60008381526003602090815260408083203384529091529020611741908383614388565b50600083815260056020908152604080832033845290915290208054611825919061176b90614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461179790614c9c565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b505050505083838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061202692505050565b600084815260056020908152604080832033845282529091208251611850939192919091019061440c565b50600d838154811061186457611864614ba3565b60009182526020808320600b600d9093020191909101805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016339081179091556040517fcd699b485caf6a8424399921287eff9b6648355e67560923d33b3f9d85517263916118f6918691909182526001600160a01b0316602082015260400190565b60405180910390a16115538361302c565b600b5460009060ff161580610bad5750506001600160a01b03166000908152600a602052604090205460ff1690565b6119746040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146119fa5760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6010819055600c5460009015611bbd57600c5460009067ffffffffffffffff811115611a2857611a2861472b565b604051908082528060200260200182016040528015611a51578160200160208202803683370190505b50905060005b600c54811015611b1e5760105460026000600c8481548110611a7b57611a7b614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205410611b0e57600c8181548110611ab857611ab8614ba3565b9060005260206000200160009054906101000a90046001600160a01b0316828481518110611ae857611ae8614ba3565b6001600160a01b039092166020928302919091019091015282611b0a81614c01565b9350505b611b1781614c01565b9050611a57565b50600c54821015611bbb57611b35600c6000614480565b60005b82811015611bb957600c828281518110611b5457611b54614ba3565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390921691909117905580611bb181614c01565b915050611b38565b505b505b60125550565b611c016040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b031614611c875760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6001600160a01b039091166000908152600a60205260409020805491151560ff19928316179055600b80549091166001179055565b600d8181548110611ccc57600080fd5b90600052602060002090600d02016000915090508060000160009054906101000a90046001600160a01b031690806001015490806002015490806003016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054611d4c90614c9c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7890614c9c565b8015611dc55780601f10611d9a57610100808354040283529160200191611dc5565b820191906000526020600020905b815481529060010190602001808311611da857829003601f168201915b5050509190925250505060088201546009830154600a840154600c909401549293919290919060ff1688565b611dfa33611907565b611e6c5760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b601054336000908152600260205260409020541015611ecd5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610713565b600085815260056020908152604080832033845290915290208054611ef190614c9c565b159050611f665760405162461bcd60e51b815260206004820152602860248201527f7665726966793120616c726561647920636f6d706c6574656420666f7220746860448201527f652073656e6465720000000000000000000000000000000000000000000000006064820152608401610713565b60008581526005602090815260408083203384529091529020611f8a908585614388565b5060008581526004602090815260408083203384529091529020611faf908383614388565b50600d8581548110611fc357611fc3614ba3565b600091825260208220600a600d9092020101805491611fe183614c01565b9091555050604080518681523360208201527f6f8abfaae8c5cb428b362c84259e542ab1f6424d0717b3495b02c4126e92943291015b60405180910390a15050505050565b6060826000805b82518110156120e457845182141561204457600091505b61208383828151811061205957612059614ba3565b602001015160f81c60f81b86848151811061207657612076614ba3565b016020015160f81c613f88565b83828151811061209557612095614ba3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816120ce81614c01565b92505080806120dc90614c01565b91505061202d565b5090949350505050565b600c81815481106120fe57600080fd5b6000918252602090912001546001600160a01b0316905081565b61212133611907565b6121935760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b6010543360009081526002602052604090205410156121f45760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610713565b60008681526009602052604081205461220f90600190614c1c565b90508015806122595750600e54612227906002614d7e565b600d828154811061223a5761223a614ba3565b90600052602060002090600d020160080154426122579190614c1c565b115b6122a55760405162461bcd60e51b815260206004820152601d60248201527f746865726520697320616e206f6e676f696e67206368616c6c656e67650000006044820152606401610713565b80156122b4576122b48161302c565b60006122f46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610b13565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639418bddd9061233c908a90600401614e88565b60206040518083038186803b15801561235457600080fd5b505afa158015612368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238c9190614c4a565b6123fe5760405162461bcd60e51b815260206004820152602e60248201527f746865206261746368206973206f757473696465206f6620746865206672617560448201527f642070726f6f662077696e646f770000000000000000000000000000000000006064820152608401610713565b6124066144a1565b6020810189905233815242608082015261241f88614e9b565b6060808301918252600d80546001810182556000829052845191027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180546001600160a01b039093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921782556020808601517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb68301556040808701517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb7840155945180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb88401908155818301517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb9850155958101517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba840155938401517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebb830155608084015180518796949594936125c7937fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebc90910192019061440c565b5050506080820151600882015560a0820151600982015560c0820151600a82015560e0820151805161260391600b84019160209091019061452b565b506101009190910151600c909101805460ff1916911515919091179055600d5460009061263290600190614c1c565b60008181526005602090815260408083203384529091529020909150612659908989614388565b506000818152600460209081526040808320338452909152902061267e908787614388565b50600d818154811061269257612692614ba3565b600091825260208220600a600d90920201018054916126b083614c01565b9091555050600f80549060006126c583614c01565b909155506126d69050816001614c84565b60008b8152600960205260409081902091909155517f441214906ecb1ed44d085cb85ab8071c4734e7b4975b38397b9a5df89dec72689061271e9083908d908d904290614f24565b60405180910390a150505050505050505050565b6127706040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146127f65760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b601491909155601355565b61283f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146128c55760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b600b805460ff19169055565b61290f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146129955760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b600e55565b600060f883901c6129ae60ff841682614f54565b905060ff8161ffff1611156129cc576129c961010082614f7a565b90505b60f81b9392505050565b60008060005b600c54811015612a3c57836001600160a01b0316600c8281548110612a0357612a03614ba3565b6000918252602090912001546001600160a01b03161415612a2a5760019250809150612a3c565b80612a3481614c01565b9150506129dc565b50811561155357805b600c54612a5490600190614c1c565b811015612af757600c612a68826001614c84565b81548110612a7857612a78614ba3565b600091825260209091200154600c80546001600160a01b039092169183908110612aa457612aa4614ba3565b600091825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580612aef81614c01565b915050612a45565b50600c805480612b0957612b09614f9d565b600082815260209020810160001990810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505050565b600080825111612bc05760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e0000000000000000000000006064820152608401610713565b815160011415612bec5781600081518110612bdd57612bdd614ba3565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561300257612e9d600285614ffb565b9150612eaa60028561500f565b600114905060005b82811015612f56578a612ec6826002614d7e565b81518110612ed657612ed6614ba3565b602002602001015196508a816002612eee9190614d7e565b612ef9906001614c84565b81518110612f0957612f09614ba3565b6020026020010151955086602089015285604089015287805190602001208b8281518110612f3957612f39614ba3565b602090810291909101015280612f4e81614c01565b915050612eb2565b508015612fd25789612f69600186614c1c565b81518110612f7957612f79614ba3565b60200260200101519550878360108110612f9557612f95614ba3565b602002015160001b945085602088015284604088015286805190602001208a8381518110612fc557612fc5614ba3565b6020026020010181815250505b80612fde576000612fe1565b60015b612fee9060ff1683614c84565b935082612ffa81614c01565b935050612e89565b8960008151811061301557613015614ba3565b602002602001015198505050505050505050919050565b6000600d828154811061304157613041614ba3565b60009182526020909120600d90910201600c81015490915060ff16156130a95760405162461bcd60e51b815260206004820152601360248201527f6368616c6c656e676520697320636c6f736564000000000000000000000000006044820152606401610713565b600a810154600b820154148015906130db5750600e546130ca906002614d7e565b60088201546130d99042614c1c565b105b156130e4575050565b60006131246040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610b13565b600084815260056020908152604080832086546001600160a01b0316845290915281209192509061315490614cf0565b905060008084600b018054905067ffffffffffffffff8111156131795761317961472b565b6040519080825280602002602001820160405280156131a2578160200160208202803683370190505b50905060008086600b018054905067ffffffffffffffff8111156131c8576131c861472b565b6040519080825280602002602001820160405280156131f1578160200160208202803683370190505b50905060008088600b018054905067ffffffffffffffff8111156132175761321761472b565b604051908082528060200260200182016040528015613240578160200160208202803683370190505b5090506000805b600c548110156137445761329e600c828154811061326757613267614ba3565b6000918252602090912001546001600160a01b03166010546001600160a01b03909116600090815260026020526040902054101590565b15806132d757506132d5600c82815481106132bb576132bb614ba3565b6000918252602090912001546001600160a01b0316611907565b155b156132e157613732565b60008c8152600560205260408120600c80548c9391908590811061330757613307614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001902061333490614cf0565b141561345757600060076000600c848154811061335357613353614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156133ea57600160076000600c848154811061339a5761339a614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906133d190849060ff16615023565b92506101000a81548160ff021916908360ff1602179055505b600c81815481106133fd576133fd614ba3565b9060005260206000200160009054906101000a90046001600160a01b031687878151811061342d5761342d614ba3565b6001600160a01b03909216602092830291909101909101528561344f81614c01565b965050613732565b60008c8152600360205260408120600c80549192918490811061347c5761347c614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001902080546134ab90614c9c565b1515905061361957600260076000600c84815481106134cc576134cc614ba3565b60009182526020808320909101546001600160a01b031683528201929092526040018120805490919061350390849060ff16615046565b92506101000a81548160ff021916908360ff16021790555060145460076000600c848154811061353557613535614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156136145760026000600c838154811061357a5761357a614ba3565b60009182526020808320909101546001600160a01b031683528201929092526040019020546135a99089614c84565b9750600c81815481106135be576135be614ba3565b9060005260206000200160009054906101000a90046001600160a01b03168383815181106135ee576135ee614ba3565b6001600160a01b03909216602092830291909101909101528161361081614c01565b9250505b613732565b600060076000600c848154811061363257613632614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156136c957600160076000600c848154811061367957613679614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906136b090849060ff16615023565b92506101000a81548160ff021916908360ff1602179055505b600c81815481106136dc576136dc614ba3565b9060005260206000200160009054906101000a90046001600160a01b031685858151811061370c5761370c614ba3565b6001600160a01b03909216602092830291909101909101528361372e81614c01565b9450505b8061373c81614c01565b915050613247565b5060005b818110156137855761377283828151811061376557613765614ba3565b6020026020010151613fbd565b508061377d81614c01565b915050613748565b50886001600160a01b031663cfdf677e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137bf57600080fd5b505afa1580156137d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f79190614c67565b60018b015460038c01546040517f67d18b9b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526001600160a01b0391909116906367d18b9b9060440160206040518083038186803b15801561386257600080fd5b505afa158015613876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389a9190614d41565b61396b8b6003016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546138e490614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461391090614c9c565b801561395d5780601f106139325761010080835404028352916020019161395d565b820191906000526020600020905b81548152906001019060200180831161394057829003601f168201915b505050505081525050614040565b146139ef578954613984906001600160a01b0316613fbd565b61398e9088614c84565b96506139ae878560018d600b01805490506139a99190614c1c565b614086565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360036040516139e29392919061506b565b60405180910390a1613f43565b6064601254604b613a009190614d7e565b613a0a9190614ffb565b600b8b01541015613a49577fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360006040516139e29392919061506b565b60048a01548814613e0457828511613b605760005b85811015613b5357600260086000898481518110613a7e57613a7e614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff16613ac19190615046565b92506101000a81548160ff021916908360ff16021790555060135460086000898481518110613af257613af2614ba3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613b4157613b3487828151811061376557613765614ba3565b613b3e9089614c84565b97505b80613b4b81614c01565b915050613a5e565b506139ae87858651614086565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690639418bddd90613ba89060038e0190600401615178565b60206040518083038186803b158015613bc057600080fd5b505afa158015613bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf89190614c4a565b15613dd05760018a01546040517f2ab65ec70000000000000000000000000000000000000000000000000000000081526001600160a01b038b1691632ab65ec791613c4b919060038f019060040161518b565b600060405180830381600087803b158015613c6557600080fd5b505af1158015613c79573d6000803e3d6000fd5b5050505060006011541115613d9c57601154613c959088614c84565b965060005b83811015613d8f57600260086000878481518110613cba57613cba614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff16613cfd9190615046565b92506101000a81548160ff021916908360ff16021790555060135460086000878481518110613d2e57613d2e614ba3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613d7d57613d7085828151811061376557613765614ba3565b613d7a9089614c84565b97505b80613d8781614c01565b915050613c9a565b50613d9c87878851614086565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360026040516139e29392919061506b565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360046040516139e29392919061506b565b89546001600160a01b03166000908152600860205260408120805460029290613e3190849060ff16615046565b82546101009290920a60ff8181021990931691831602179091556013548c546001600160a01b031660009081526008602052604090205490911611159050613e94578954613e87906001600160a01b0316613fbd565b613e919088614c84565b96505b613f06878b600b01805480602002602001604051908101604052809291908181526020018280548015613ef057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613ed2575b505050600b8f01546139a9925060019150614c1c565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b336001604051613f3a9392919061506b565b60405180910390a15b600c8a01805460ff19166001179055600f8054906000613f6283614c33565b909155505050600190980154600090815260096020526040812055505050505050505050565b600060f883901c60ff8316811115613fae57613fa760ff841682614f7a565b90506129cc565b6129c960ff8416610100614f7a565b6001600160a01b0381166000908152600260205260408120805490829055601280549083613fea83614c33565b9190505550613ff8836129d6565b604080516001600160a01b0385168152602081018390527f39505629e9ffd84b4cea98325402ef1c5a184b431c9a7314a352e064f6658bed910160405180910390a192915050565b6000816020015182604001518360600151846080015160405160200161406994939291906151a4565b604051602081830303815290604052805190602001209050919050565b60006140928285614ffb565b90508061409f5750505050565b6000805b84518110156141c9576140eb8582815181106140c1576140c1614ba3565b60200260200101516010546001600160a01b03909116600090815260026020526040902054101590565b156141b757826006600087848151811061410757614107614ba3565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461413e9190614c84565b9091555061414e90508383614c84565b91507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc985828151811061418357614183614ba3565b6020026020010151846040516141ae9291906001600160a01b03929092168252602082015260400190565b60405180910390a15b806141c181614c01565b9150506140a3565b5084811015614381576141e8846000815181106140c1576140c1614ba3565b156142bb576141f78582614c1c565b600660008660008151811061420e5761420e614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142459190614c84565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460008151811061428057614280614ba3565b602002602001015186836142949190614c1c565b604080516001600160a01b03909316835260208301919091520160405180910390a1614381565b6142c58582614c1c565b60066000866001815181106142dc576142dc614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546143139190614c84565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460018151811061434e5761434e614ba3565b602002602001015186836143629190614c1c565b604080516001600160a01b039093168352602083019190915201612017565b5050505050565b82805461439490614c9c565b90600052602060002090601f0160209004810192826143b657600085556143fc565b82601f106143cf5782800160ff198235161785556143fc565b828001600101855582156143fc579182015b828111156143fc5782358255916020019190600101906143e1565b50614408929150614598565b5090565b82805461441890614c9c565b90600052602060002090601f01602090048101928261443a57600085556143fc565b82601f1061445357805160ff19168380011785556143fc565b828001600101855582156143fc579182015b828111156143fc578251825591602001919060010190614465565b508054600082559060005260206000209081019061449e9190614598565b50565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016145006040518060a0016040528060008152602001600080191681526020016000815260200160008152602001606081525090565b8152602001600081526020016000815260200160008152602001606081526020016000151581525090565b8280548282559060005260206000209081019282156143fc579160200282015b828111156143fc57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390911617825560209092019160019091019061454b565b5b808211156144085760008155600101614599565b60008083601f8401126145bf57600080fd5b50813567ffffffffffffffff8111156145d757600080fd5b6020830191508360208285010111156145ef57600080fd5b9250929050565b6000806000806040858703121561460c57600080fd5b843567ffffffffffffffff8082111561462457600080fd5b614630888389016145ad565b9096509450602087013591508082111561464957600080fd5b50614656878288016145ad565b95989497509550505050565b6000815180845260005b818110156146885760208185018101518683018201520161466c565b8181111561469a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610bf16020830184614662565b6001600160a01b038116811461449e57600080fd5b60006020828403121561470757600080fd5b8135610bf1816146e0565b60006020828403121561472457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156147755761477561472b565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156147bb576147bb61472b565b816040528093508581528686860111156147d457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561480057600080fd5b813567ffffffffffffffff81111561481757600080fd5b8201601f8101841361482857600080fd5b6148378482356020840161475a565b949350505050565b6000806020838503121561485257600080fd5b823567ffffffffffffffff8082111561486a57600080fd5b818501915085601f83011261487e57600080fd5b81358181111561488d57600080fd5b8660208260051b85010111156148a257600080fd5b60209290920196919550909350505050565b6000806000604084860312156148c957600080fd5b83359250602084013567ffffffffffffffff8111156148e757600080fd5b6148f3868287016145ad565b9497909650939450505050565b801515811461449e57600080fd5b6000806040838503121561492157600080fd5b823561492c816146e0565b9150602083013561493c81614900565b809150509250929050565b60006101006001600160a01b038b16835289602084015288604084015280606084015287518184015250602087015161012083015260408701516101408301526060870151610160830152608087015160a06101808401526149ad6101a0840182614662565b9150508560808301528460a08301528360c08301526149d060e083018415159052565b9998505050505050505050565b6000806000806000606086880312156149f557600080fd5b85359450602086013567ffffffffffffffff80821115614a1457600080fd5b614a2089838a016145ad565b90965094506040880135915080821115614a3957600080fd5b50614a46888289016145ad565b969995985093965092949392505050565b600082601f830112614a6857600080fd5b610bf18383356020850161475a565b60008060408385031215614a8a57600080fd5b823567ffffffffffffffff80821115614aa257600080fd5b614aae86838701614a57565b93506020850135915080821115614ac457600080fd5b50614ad185828601614a57565b9150509250929050565b60008060008060008060808789031215614af457600080fd5b86359550602087013567ffffffffffffffff80821115614b1357600080fd5b9088019060a0828b031215614b2757600080fd5b90955060408801359080821115614b3d57600080fd5b614b498a838b016145ad565b90965094506060890135915080821115614b6257600080fd5b50614b6f89828a016145ad565b979a9699509497509295939492505050565b60008060408385031215614b9457600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000600019821415614c1557614c15614bd2565b5060010190565b600082821015614c2e57614c2e614bd2565b500390565b600081614c4257614c42614bd2565b506000190190565b600060208284031215614c5c57600080fd5b8151610bf181614900565b600060208284031215614c7957600080fd5b8151610bf1816146e0565b60008219821115614c9757614c97614bd2565b500190565b600181811c90821680614cb057607f821691505b60208210811415614cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000614cfc8254614c9c565b82601f821115614d125783600052602060002090505b5491506020811015614cea5760001960209190910360031b1b16919050565b8183823760009101908152919050565b600060208284031215614d5357600080fd5b5051919050565b80516020808301519190811015614cea5760001960209190910360031b1b16919050565b6000816000190483118215151615614d9857614d98614bd2565b500290565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b80358252602081013560208301526040810135604083015260608101356060830152600060808201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112614e3f57600080fd5b8201803567ffffffffffffffff811115614e5857600080fd5b803603841315614e6757600080fd5b60a06080860152614e7f60a086018260208501614d9d565b95945050505050565b602081526000610bf16020830184614de6565b600060a08236031215614ead57600080fd5b60405160a0810167ffffffffffffffff8282108183111715614ed157614ed161472b565b81604052843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115614f0b57600080fd5b50614f1836828601614a57565b60808301525092915050565b848152836020820152608060408201526000614f436080830185614de6565b905082606083015295945050505050565b600061ffff808316818516808303821115614f7157614f71614bd2565b01949350505050565b600061ffff83811690831681811015614f9557614f95614bd2565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261500a5761500a614fcc565b500490565b60008261501e5761501e614fcc565b500690565b600060ff821660ff84168082101561503d5761503d614bd2565b90039392505050565b600060ff821660ff84168060ff0382111561506357615063614bd2565b019392505050565b8381526001600160a01b038316602082015260608101600583106150b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b80548252600060018083015460208181870152600285015460408701526003850154606087015260048501915060a060808701526000825461510781614c9c565b8060a08a015260c086831660008114615127576001811461513b57615169565b60ff198416828c015260e08b019450615169565b866000528560002060005b848110156151615781548d8201850152908901908701615146565b8c0183019550505b50929998505050505050505050565b602081526000610bf160208301846150c6565b82815260406020820152600061483760408301846150c6565b8481528360208201528260408201526080606082015260006151c96080830184614662565b969550505050505056fea264697066735822122011b16d369a26a20a1eb6bf705e986edb81e9f6d4f16d766006f854f00cd240e064736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102415760003560e01c80636f9170f611610145578063b4b6de38116100bd578063e59745541161008c578063ef53b04111610071578063ef53b0411461056c578063fca0fd6c1461057f578063ffa444ec1461058857600080fd5b8063e597455414610529578063eab0fca31461053c57600080fd5b8063b4b6de38146104f2578063b646c02514610505578063b9c362091461050e578063dcd836161461052157600080fd5b8063939f59fe1161011457806398fe9dfb116100f957806398fe9dfb146104a95780639b19251a146104bc578063ac1eff68146104df57600080fd5b8063939f59fe14610473578063966df42b1461048657600080fd5b80636f9170f6146104035780638c80fd90146104265780638d14e127146104395780638f1d37761461044c57600080fd5b8063461a4478116101d857806353dec0e8116101a75780635cc38c021161018c5780635cc38c02146103945780636593363f146103b4578063669fdeb5146103c757600080fd5b806353dec0e81461036e5780635bf0f25d1461038157600080fd5b8063461a4478146103375780634869bfb61461034a5780634d4127af1461035d5780634e71d92d1461036657600080fd5b80632e1a7d4d116102145780632e1a7d4d146102d1578063375b3c0a146102e6578063383e5e69146102ef57806340a89eae1461030257600080fd5b8063015cfec7146102465780630700037d1461026f57806315b90cb21461029d578063299ca478146102a6575b600080fd5b6102596102543660046145f6565b6105a8565b60405161026691906146cd565b60405180910390f35b61028f61027d3660046146f5565b60066020526000908152604090205481565b604051908152602001610266565b61028f60115481565b6000546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b6102e46102df366004614712565b6106c7565b005b61028f60105481565b6102e46102fd3660046146f5565b6108cc565b6103256103103660046146f5565b60076020526000908152604090205460ff1681565b60405160ff9091168152602001610266565b6102b96103453660046147ee565b610b13565b61028f61035836600461483f565b610bb3565b61028f60125481565b6102e4610bf8565b6102e461037c366004614712565b610d92565b6102e461038f366004614712565b610f92565b61028f6103a2366004614712565b60096020526000908152604090205481565b6102e46103c23660046148b4565b6112f9565b6102596040518060400160405280600d81526020017f4d455449535f4d414e414745520000000000000000000000000000000000000081525081565b6104166104113660046146f5565b611907565b6040519015158152602001610266565b6102e4610434366004614712565b611936565b6102e461044736600461490e565b611bc3565b61045f61045a366004614712565b611cbc565b604051610266989796959493929190614947565b6102e46104813660046149dd565b611df1565b6103256104943660046146f5565b60086020526000908152604090205460ff1681565b6102596104b7366004614a77565b612026565b6104166104ca3660046146f5565b600a6020526000908152604090205460ff1681565b6102b96104ed366004614712565b6120ee565b6102e4610500366004614adb565b612118565b61028f600f5481565b6102e461051c366004614b81565b612732565b6102e4612801565b6001546102b9906001600160a01b031681565b61041661054a3660046146f5565b6010546001600160a01b03909116600090815260026020526040902054101590565b6102e461057a366004614712565b6128d1565b61028f600e5481565b61028f6105963660046146f5565b60026020526000908152604090205481565b6060600085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093945083925050505b82518110156106bb57818514156105fd57600091505b61065a83828151811061061257610612614ba3565b01602001517fff000000000000000000000000000000000000000000000000000000000000001687878581811061064b5761064b614ba3565b919091013560f81c905061299a565b83828151811061066c5761066c614ba3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816106a581614c01565b92505080806106b390614c01565b9150506105e7565b50909695505050505050565b600f541561071c5760405162461bcd60e51b815260206004820181905260248201527f77697468647261772069732063757272656e746c792070726f6869626974656460448201526064015b60405180910390fd5b336000908152600260205260409020548181101561077c5760405162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e74207374616b6520746f20776974686472617700006044820152606401610713565b6010546107898383614c1c565b10801561079857506010548110155b156107bb57601280549060006107ad83614c33565b91905055506107bb336129d6565b33600090815260026020526040812080548492906107da908490614c1c565b90915550506001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561084457600080fd5b505af1158015610858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087c9190614c4a565b6108c85760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610713565b5050565b61090a6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146109905760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6000601154116109e25760405162461bcd60e51b815260206004820152600860248201527f6e6f207374616b650000000000000000000000000000000000000000000000006044820152606401610713565b6011546040805133815260208101929092527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a16011805460009091556001546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b158015610a8f57600080fd5b505af1158015610aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac79190614c4a565b6108c85760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610713565b600080546040517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bf40fac190610b5d9085906004016146cd565b60206040518083038186803b158015610b7557600080fd5b505afa158015610b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bad9190614c67565b92915050565b6000610bf1838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b4892505050565b9392505050565b33600090815260066020526040902054610c545760405162461bcd60e51b815260206004820152601260248201527f6e6f2072657761726420746f20636c61696d00000000000000000000000000006044820152606401610713565b33600081815260066020526040808220805492905560015490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101939093526024830182905290916001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610cd157600080fd5b505af1158015610ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d099190614c4a565b610d555760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610713565b60408051338152602081018390527f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d491015b60405180910390a150565b610dd06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b031614610e565760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610ec157600080fd5b505af1158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef99190614c4a565b610f455760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610713565b8060116000828254610f579190614c84565b909155505060408051338152602081018390527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9101610d87565b610f9b33611907565b61100d5760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b600f541561105d5760405162461bcd60e51b815260206004820152601d60248201527f7374616b652069732063757272656e746c792070726f686962697465640000006044820152606401610713565b600081116110ad5760405162461bcd60e51b815260206004820152601660248201527f7a65726f207374616b65206e6f7420616c6c6f776564000000000000000000006044820152606401610713565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561111857600080fd5b505af115801561112c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111509190614c4a565b61119c5760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610713565b3360009081526002602052604081208054918391906111bb8385614c84565b90915550506010543360009081526002602052604090205410156112475760405162461bcd60e51b815260206004820152602b60248201527f696e73756666696369656e74207374616b6520746f207175616c69667920617360448201527f20612076657269666965720000000000000000000000000000000000000000006064820152608401610713565b806112bc576012805490600061125c83614c01565b9091555050600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555b60408051338152602081018490527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a910160405180910390a15050565b60105433600090815260026020526040902054101561135a5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610713565b61136333611907565b6113d55760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b601254600d84815481106113eb576113eb614ba3565b90600052602060002090600d0201600a015414806114395750600e54600d848154811061141a5761141a614ba3565b90600052602060002090600d020160080154426114379190614c1c565b115b6114855760405162461bcd60e51b815260206004820152601160248201527f70686173652032206e6f742072656164790000000000000000000000000000006044820152606401610713565b6000838152600560209081526040808320338452909152812080546114a990614c9c565b90501161151e5760405162461bcd60e51b815260206004820152602160248201527f796f75206469646e277420706172746963697061746520696e2070686173652060448201527f31000000000000000000000000000000000000000000000000000000000000006064820152608401610713565b60008381526003602090815260408083203384529091528120805461154290614c9c565b90501115611558576115538361302c565b505050565b6000838152600460209081526040808320338452909152902061157a90614cf0565b6002838360405161158c929190614d31565b602060405180830381855afa1580156115a9573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115cc9190614d41565b146116195760405162461bcd60e51b815260206004820152601b60248201527f6b657920616e64206b65796861736820646f6e2774206d6174636800000000006044820152606401610713565b600d838154811061162c5761162c614ba3565b60009182526020909120600d90910201546001600160a01b031633141561171d576116ec600d848154811061166357611663614ba3565b90600052602060002090600d02016003016001015460405160200161168a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181526020601f86018190048102840181019092528483529190859085908190840183828082843760009201919091525061202692505050565b6116f590614d5a565b600d848154811061170857611708614ba3565b600091825260209091206004600d9092020101555b60008381526003602090815260408083203384529091529020611741908383614388565b50600083815260056020908152604080832033845290915290208054611825919061176b90614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461179790614c9c565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b505050505083838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061202692505050565b600084815260056020908152604080832033845282529091208251611850939192919091019061440c565b50600d838154811061186457611864614ba3565b60009182526020808320600b600d9093020191909101805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016339081179091556040517fcd699b485caf6a8424399921287eff9b6648355e67560923d33b3f9d85517263916118f6918691909182526001600160a01b0316602082015260400190565b60405180910390a16115538361302c565b600b5460009060ff161580610bad5750506001600160a01b03166000908152600a602052604090205460ff1690565b6119746040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146119fa5760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6010819055600c5460009015611bbd57600c5460009067ffffffffffffffff811115611a2857611a2861472b565b604051908082528060200260200182016040528015611a51578160200160208202803683370190505b50905060005b600c54811015611b1e5760105460026000600c8481548110611a7b57611a7b614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205410611b0e57600c8181548110611ab857611ab8614ba3565b9060005260206000200160009054906101000a90046001600160a01b0316828481518110611ae857611ae8614ba3565b6001600160a01b039092166020928302919091019091015282611b0a81614c01565b9350505b611b1781614c01565b9050611a57565b50600c54821015611bbb57611b35600c6000614480565b60005b82811015611bb957600c828281518110611b5457611b54614ba3565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390921691909117905580611bb181614c01565b915050611b38565b505b505b60125550565b611c016040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b031614611c875760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b6001600160a01b039091166000908152600a60205260409020805491151560ff19928316179055600b80549091166001179055565b600d8181548110611ccc57600080fd5b90600052602060002090600d02016000915090508060000160009054906101000a90046001600160a01b031690806001015490806002015490806003016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054611d4c90614c9c565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7890614c9c565b8015611dc55780601f10611d9a57610100808354040283529160200191611dc5565b820191906000526020600020905b815481529060010190602001808311611da857829003601f168201915b5050509190925250505060088201546009830154600a840154600c909401549293919290919060ff1688565b611dfa33611907565b611e6c5760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b601054336000908152600260205260409020541015611ecd5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610713565b600085815260056020908152604080832033845290915290208054611ef190614c9c565b159050611f665760405162461bcd60e51b815260206004820152602860248201527f7665726966793120616c726561647920636f6d706c6574656420666f7220746860448201527f652073656e6465720000000000000000000000000000000000000000000000006064820152608401610713565b60008581526005602090815260408083203384529091529020611f8a908585614388565b5060008581526004602090815260408083203384529091529020611faf908383614388565b50600d8581548110611fc357611fc3614ba3565b600091825260208220600a600d9092020101805491611fe183614c01565b9091555050604080518681523360208201527f6f8abfaae8c5cb428b362c84259e542ab1f6424d0717b3495b02c4126e92943291015b60405180910390a15050505050565b6060826000805b82518110156120e457845182141561204457600091505b61208383828151811061205957612059614ba3565b602001015160f81c60f81b86848151811061207657612076614ba3565b016020015160f81c613f88565b83828151811061209557612095614ba3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816120ce81614c01565b92505080806120dc90614c01565b91505061202d565b5090949350505050565b600c81815481106120fe57600080fd5b6000918252602090912001546001600160a01b0316905081565b61212133611907565b6121935760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610713565b6010543360009081526002602052604090205410156121f45760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610713565b60008681526009602052604081205461220f90600190614c1c565b90508015806122595750600e54612227906002614d7e565b600d828154811061223a5761223a614ba3565b90600052602060002090600d020160080154426122579190614c1c565b115b6122a55760405162461bcd60e51b815260206004820152601d60248201527f746865726520697320616e206f6e676f696e67206368616c6c656e67650000006044820152606401610713565b80156122b4576122b48161302c565b60006122f46040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610b13565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639418bddd9061233c908a90600401614e88565b60206040518083038186803b15801561235457600080fd5b505afa158015612368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238c9190614c4a565b6123fe5760405162461bcd60e51b815260206004820152602e60248201527f746865206261746368206973206f757473696465206f6620746865206672617560448201527f642070726f6f662077696e646f770000000000000000000000000000000000006064820152608401610713565b6124066144a1565b6020810189905233815242608082015261241f88614e9b565b6060808301918252600d80546001810182556000829052845191027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180546001600160a01b039093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921782556020808601517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb68301556040808701517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb7840155945180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb88401908155818301517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb9850155958101517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba840155938401517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebb830155608084015180518796949594936125c7937fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebc90910192019061440c565b5050506080820151600882015560a0820151600982015560c0820151600a82015560e0820151805161260391600b84019160209091019061452b565b506101009190910151600c909101805460ff1916911515919091179055600d5460009061263290600190614c1c565b60008181526005602090815260408083203384529091529020909150612659908989614388565b506000818152600460209081526040808320338452909152902061267e908787614388565b50600d818154811061269257612692614ba3565b600091825260208220600a600d90920201018054916126b083614c01565b9091555050600f80549060006126c583614c01565b909155506126d69050816001614c84565b60008b8152600960205260409081902091909155517f441214906ecb1ed44d085cb85ab8071c4734e7b4975b38397b9a5df89dec72689061271e9083908d908d904290614f24565b60405180910390a150505050505050505050565b6127706040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146127f65760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b601491909155601355565b61283f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146128c55760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b600b805460ff19169055565b61290f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610b13565b6001600160a01b0316336001600160a01b0316146129955760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610713565b600e55565b600060f883901c6129ae60ff841682614f54565b905060ff8161ffff1611156129cc576129c961010082614f7a565b90505b60f81b9392505050565b60008060005b600c54811015612a3c57836001600160a01b0316600c8281548110612a0357612a03614ba3565b6000918252602090912001546001600160a01b03161415612a2a5760019250809150612a3c565b80612a3481614c01565b9150506129dc565b50811561155357805b600c54612a5490600190614c1c565b811015612af757600c612a68826001614c84565b81548110612a7857612a78614ba3565b600091825260209091200154600c80546001600160a01b039092169183908110612aa457612aa4614ba3565b600091825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580612aef81614c01565b915050612a45565b50600c805480612b0957612b09614f9d565b600082815260209020810160001990810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505050565b600080825111612bc05760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e0000000000000000000000006064820152608401610713565b815160011415612bec5781600081518110612bdd57612bdd614ba3565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b600184111561300257612e9d600285614ffb565b9150612eaa60028561500f565b600114905060005b82811015612f56578a612ec6826002614d7e565b81518110612ed657612ed6614ba3565b602002602001015196508a816002612eee9190614d7e565b612ef9906001614c84565b81518110612f0957612f09614ba3565b6020026020010151955086602089015285604089015287805190602001208b8281518110612f3957612f39614ba3565b602090810291909101015280612f4e81614c01565b915050612eb2565b508015612fd25789612f69600186614c1c565b81518110612f7957612f79614ba3565b60200260200101519550878360108110612f9557612f95614ba3565b602002015160001b945085602088015284604088015286805190602001208a8381518110612fc557612fc5614ba3565b6020026020010181815250505b80612fde576000612fe1565b60015b612fee9060ff1683614c84565b935082612ffa81614c01565b935050612e89565b8960008151811061301557613015614ba3565b602002602001015198505050505050505050919050565b6000600d828154811061304157613041614ba3565b60009182526020909120600d90910201600c81015490915060ff16156130a95760405162461bcd60e51b815260206004820152601360248201527f6368616c6c656e676520697320636c6f736564000000000000000000000000006044820152606401610713565b600a810154600b820154148015906130db5750600e546130ca906002614d7e565b60088201546130d99042614c1c565b105b156130e4575050565b60006131246040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610b13565b600084815260056020908152604080832086546001600160a01b0316845290915281209192509061315490614cf0565b905060008084600b018054905067ffffffffffffffff8111156131795761317961472b565b6040519080825280602002602001820160405280156131a2578160200160208202803683370190505b50905060008086600b018054905067ffffffffffffffff8111156131c8576131c861472b565b6040519080825280602002602001820160405280156131f1578160200160208202803683370190505b50905060008088600b018054905067ffffffffffffffff8111156132175761321761472b565b604051908082528060200260200182016040528015613240578160200160208202803683370190505b5090506000805b600c548110156137445761329e600c828154811061326757613267614ba3565b6000918252602090912001546001600160a01b03166010546001600160a01b03909116600090815260026020526040902054101590565b15806132d757506132d5600c82815481106132bb576132bb614ba3565b6000918252602090912001546001600160a01b0316611907565b155b156132e157613732565b60008c8152600560205260408120600c80548c9391908590811061330757613307614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001902061333490614cf0565b141561345757600060076000600c848154811061335357613353614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156133ea57600160076000600c848154811061339a5761339a614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906133d190849060ff16615023565b92506101000a81548160ff021916908360ff1602179055505b600c81815481106133fd576133fd614ba3565b9060005260206000200160009054906101000a90046001600160a01b031687878151811061342d5761342d614ba3565b6001600160a01b03909216602092830291909101909101528561344f81614c01565b965050613732565b60008c8152600360205260408120600c80549192918490811061347c5761347c614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001902080546134ab90614c9c565b1515905061361957600260076000600c84815481106134cc576134cc614ba3565b60009182526020808320909101546001600160a01b031683528201929092526040018120805490919061350390849060ff16615046565b92506101000a81548160ff021916908360ff16021790555060145460076000600c848154811061353557613535614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156136145760026000600c838154811061357a5761357a614ba3565b60009182526020808320909101546001600160a01b031683528201929092526040019020546135a99089614c84565b9750600c81815481106135be576135be614ba3565b9060005260206000200160009054906101000a90046001600160a01b03168383815181106135ee576135ee614ba3565b6001600160a01b03909216602092830291909101909101528161361081614c01565b9250505b613732565b600060076000600c848154811061363257613632614ba3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156136c957600160076000600c848154811061367957613679614ba3565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906136b090849060ff16615023565b92506101000a81548160ff021916908360ff1602179055505b600c81815481106136dc576136dc614ba3565b9060005260206000200160009054906101000a90046001600160a01b031685858151811061370c5761370c614ba3565b6001600160a01b03909216602092830291909101909101528361372e81614c01565b9450505b8061373c81614c01565b915050613247565b5060005b818110156137855761377283828151811061376557613765614ba3565b6020026020010151613fbd565b508061377d81614c01565b915050613748565b50886001600160a01b031663cfdf677e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137bf57600080fd5b505afa1580156137d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f79190614c67565b60018b015460038c01546040517f67d18b9b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526001600160a01b0391909116906367d18b9b9060440160206040518083038186803b15801561386257600080fd5b505afa158015613876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389a9190614d41565b61396b8b6003016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546138e490614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461391090614c9c565b801561395d5780601f106139325761010080835404028352916020019161395d565b820191906000526020600020905b81548152906001019060200180831161394057829003601f168201915b505050505081525050614040565b146139ef578954613984906001600160a01b0316613fbd565b61398e9088614c84565b96506139ae878560018d600b01805490506139a99190614c1c565b614086565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360036040516139e29392919061506b565b60405180910390a1613f43565b6064601254604b613a009190614d7e565b613a0a9190614ffb565b600b8b01541015613a49577fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360006040516139e29392919061506b565b60048a01548814613e0457828511613b605760005b85811015613b5357600260086000898481518110613a7e57613a7e614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff16613ac19190615046565b92506101000a81548160ff021916908360ff16021790555060135460086000898481518110613af257613af2614ba3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613b4157613b3487828151811061376557613765614ba3565b613b3e9089614c84565b97505b80613b4b81614c01565b915050613a5e565b506139ae87858651614086565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690639418bddd90613ba89060038e0190600401615178565b60206040518083038186803b158015613bc057600080fd5b505afa158015613bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf89190614c4a565b15613dd05760018a01546040517f2ab65ec70000000000000000000000000000000000000000000000000000000081526001600160a01b038b1691632ab65ec791613c4b919060038f019060040161518b565b600060405180830381600087803b158015613c6557600080fd5b505af1158015613c79573d6000803e3d6000fd5b5050505060006011541115613d9c57601154613c959088614c84565b965060005b83811015613d8f57600260086000878481518110613cba57613cba614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff16613cfd9190615046565b92506101000a81548160ff021916908360ff16021790555060135460086000878481518110613d2e57613d2e614ba3565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613d7d57613d7085828151811061376557613765614ba3565b613d7a9089614c84565b97505b80613d8781614c01565b915050613c9a565b50613d9c87878851614086565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360026040516139e29392919061506b565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360046040516139e29392919061506b565b89546001600160a01b03166000908152600860205260408120805460029290613e3190849060ff16615046565b82546101009290920a60ff8181021990931691831602179091556013548c546001600160a01b031660009081526008602052604090205490911611159050613e94578954613e87906001600160a01b0316613fbd565b613e919088614c84565b96505b613f06878b600b01805480602002602001604051908101604052809291908181526020018280548015613ef057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613ed2575b505050600b8f01546139a9925060019150614c1c565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b336001604051613f3a9392919061506b565b60405180910390a15b600c8a01805460ff19166001179055600f8054906000613f6283614c33565b909155505050600190980154600090815260096020526040812055505050505050505050565b600060f883901c60ff8316811115613fae57613fa760ff841682614f7a565b90506129cc565b6129c960ff8416610100614f7a565b6001600160a01b0381166000908152600260205260408120805490829055601280549083613fea83614c33565b9190505550613ff8836129d6565b604080516001600160a01b0385168152602081018390527f39505629e9ffd84b4cea98325402ef1c5a184b431c9a7314a352e064f6658bed910160405180910390a192915050565b6000816020015182604001518360600151846080015160405160200161406994939291906151a4565b604051602081830303815290604052805190602001209050919050565b60006140928285614ffb565b90508061409f5750505050565b6000805b84518110156141c9576140eb8582815181106140c1576140c1614ba3565b60200260200101516010546001600160a01b03909116600090815260026020526040902054101590565b156141b757826006600087848151811061410757614107614ba3565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461413e9190614c84565b9091555061414e90508383614c84565b91507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc985828151811061418357614183614ba3565b6020026020010151846040516141ae9291906001600160a01b03929092168252602082015260400190565b60405180910390a15b806141c181614c01565b9150506140a3565b5084811015614381576141e8846000815181106140c1576140c1614ba3565b156142bb576141f78582614c1c565b600660008660008151811061420e5761420e614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142459190614c84565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460008151811061428057614280614ba3565b602002602001015186836142949190614c1c565b604080516001600160a01b03909316835260208301919091520160405180910390a1614381565b6142c58582614c1c565b60066000866001815181106142dc576142dc614ba3565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546143139190614c84565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460018151811061434e5761434e614ba3565b602002602001015186836143629190614c1c565b604080516001600160a01b039093168352602083019190915201612017565b5050505050565b82805461439490614c9c565b90600052602060002090601f0160209004810192826143b657600085556143fc565b82601f106143cf5782800160ff198235161785556143fc565b828001600101855582156143fc579182015b828111156143fc5782358255916020019190600101906143e1565b50614408929150614598565b5090565b82805461441890614c9c565b90600052602060002090601f01602090048101928261443a57600085556143fc565b82601f1061445357805160ff19168380011785556143fc565b828001600101855582156143fc579182015b828111156143fc578251825591602001919060010190614465565b508054600082559060005260206000209081019061449e9190614598565b50565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016145006040518060a0016040528060008152602001600080191681526020016000815260200160008152602001606081525090565b8152602001600081526020016000815260200160008152602001606081526020016000151581525090565b8280548282559060005260206000209081019282156143fc579160200282015b828111156143fc57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390911617825560209092019160019091019061454b565b5b808211156144085760008155600101614599565b60008083601f8401126145bf57600080fd5b50813567ffffffffffffffff8111156145d757600080fd5b6020830191508360208285010111156145ef57600080fd5b9250929050565b6000806000806040858703121561460c57600080fd5b843567ffffffffffffffff8082111561462457600080fd5b614630888389016145ad565b9096509450602087013591508082111561464957600080fd5b50614656878288016145ad565b95989497509550505050565b6000815180845260005b818110156146885760208185018101518683018201520161466c565b8181111561469a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610bf16020830184614662565b6001600160a01b038116811461449e57600080fd5b60006020828403121561470757600080fd5b8135610bf1816146e0565b60006020828403121561472457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156147755761477561472b565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156147bb576147bb61472b565b816040528093508581528686860111156147d457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561480057600080fd5b813567ffffffffffffffff81111561481757600080fd5b8201601f8101841361482857600080fd5b6148378482356020840161475a565b949350505050565b6000806020838503121561485257600080fd5b823567ffffffffffffffff8082111561486a57600080fd5b818501915085601f83011261487e57600080fd5b81358181111561488d57600080fd5b8660208260051b85010111156148a257600080fd5b60209290920196919550909350505050565b6000806000604084860312156148c957600080fd5b83359250602084013567ffffffffffffffff8111156148e757600080fd5b6148f3868287016145ad565b9497909650939450505050565b801515811461449e57600080fd5b6000806040838503121561492157600080fd5b823561492c816146e0565b9150602083013561493c81614900565b809150509250929050565b60006101006001600160a01b038b16835289602084015288604084015280606084015287518184015250602087015161012083015260408701516101408301526060870151610160830152608087015160a06101808401526149ad6101a0840182614662565b9150508560808301528460a08301528360c08301526149d060e083018415159052565b9998505050505050505050565b6000806000806000606086880312156149f557600080fd5b85359450602086013567ffffffffffffffff80821115614a1457600080fd5b614a2089838a016145ad565b90965094506040880135915080821115614a3957600080fd5b50614a46888289016145ad565b969995985093965092949392505050565b600082601f830112614a6857600080fd5b610bf18383356020850161475a565b60008060408385031215614a8a57600080fd5b823567ffffffffffffffff80821115614aa257600080fd5b614aae86838701614a57565b93506020850135915080821115614ac457600080fd5b50614ad185828601614a57565b9150509250929050565b60008060008060008060808789031215614af457600080fd5b86359550602087013567ffffffffffffffff80821115614b1357600080fd5b9088019060a0828b031215614b2757600080fd5b90955060408801359080821115614b3d57600080fd5b614b498a838b016145ad565b90965094506060890135915080821115614b6257600080fd5b50614b6f89828a016145ad565b979a9699509497509295939492505050565b60008060408385031215614b9457600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000600019821415614c1557614c15614bd2565b5060010190565b600082821015614c2e57614c2e614bd2565b500390565b600081614c4257614c42614bd2565b506000190190565b600060208284031215614c5c57600080fd5b8151610bf181614900565b600060208284031215614c7957600080fd5b8151610bf1816146e0565b60008219821115614c9757614c97614bd2565b500190565b600181811c90821680614cb057607f821691505b60208210811415614cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000614cfc8254614c9c565b82601f821115614d125783600052602060002090505b5491506020811015614cea5760001960209190910360031b1b16919050565b8183823760009101908152919050565b600060208284031215614d5357600080fd5b5051919050565b80516020808301519190811015614cea5760001960209190910360031b1b16919050565b6000816000190483118215151615614d9857614d98614bd2565b500290565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b80358252602081013560208301526040810135604083015260608101356060830152600060808201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112614e3f57600080fd5b8201803567ffffffffffffffff811115614e5857600080fd5b803603841315614e6757600080fd5b60a06080860152614e7f60a086018260208501614d9d565b95945050505050565b602081526000610bf16020830184614de6565b600060a08236031215614ead57600080fd5b60405160a0810167ffffffffffffffff8282108183111715614ed157614ed161472b565b81604052843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115614f0b57600080fd5b50614f1836828601614a57565b60808301525092915050565b848152836020820152608060408201526000614f436080830185614de6565b905082606083015295945050505050565b600061ffff808316818516808303821115614f7157614f71614bd2565b01949350505050565b600061ffff83811690831681811015614f9557614f95614bd2565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261500a5761500a614fcc565b500490565b60008261501e5761501e614fcc565b500690565b600060ff821660ff84168082101561503d5761503d614bd2565b90039392505050565b600060ff821660ff84168060ff0382111561506357615063614bd2565b019392505050565b8381526001600160a01b038316602082015260608101600583106150b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b80548252600060018083015460208181870152600285015460408701526003850154606087015260048501915060a060808701526000825461510781614c9c565b8060a08a015260c086831660008114615127576001811461513b57615169565b60ff198416828c015260e08b019450615169565b866000528560002060005b848110156151615781548d8201850152908901908701615146565b8c0183019550505b50929998505050505050505050565b602081526000610bf160208301846150c6565b82815260406020820152600061483760408301846150c6565b8481528360208201528260408201526080606082015260006151c96080830184614662565b969550505050505056fea264697066735822122011b16d369a26a20a1eb6bf705e986edb81e9f6d4f16d766006f854f00cd240e064736f6c63430008090033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "resolve(string)": {
        "params": {
          "_name": "Name to resolve an address for."
        },
        "returns": {
          "_0": "Address associated with the given name."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "resolve(string)": {
        "notice": "Resolves the address associated with a given name."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 16631,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "libAddressManager",
        "offset": 0,
        "slot": "0",
        "type": "t_contract(Lib_AddressManager)16623"
      },
      {
        "astId": 13310,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "metis",
        "offset": 0,
        "slot": "1",
        "type": "t_address"
      },
      {
        "astId": 13412,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "verifier_stakes",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 13418,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenge_keys",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))"
      },
      {
        "astId": 13424,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenge_key_hashes",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))"
      },
      {
        "astId": 13430,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenge_hashes",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))"
      },
      {
        "astId": 13434,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "rewards",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 13438,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "absence_strikes",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_uint8)"
      },
      {
        "astId": 13442,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "consensus_strikes",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_uint8)"
      },
      {
        "astId": 13446,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "chain_under_challenge",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_uint256,t_uint256)"
      },
      {
        "astId": 13450,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "whitelist",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 13452,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "useWhiteList",
        "offset": 0,
        "slot": "11",
        "type": "t_bool"
      },
      {
        "astId": 13455,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "verifiers",
        "offset": 0,
        "slot": "12",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 13459,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenges",
        "offset": 0,
        "slot": "13",
        "type": "t_array(t_struct(Challenge)13408_storage)dyn_storage"
      },
      {
        "astId": 13464,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "verifyWindow",
        "offset": 0,
        "slot": "14",
        "type": "t_uint256"
      },
      {
        "astId": 13466,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "activeChallenges",
        "offset": 0,
        "slot": "15",
        "type": "t_uint256"
      },
      {
        "astId": 13468,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "minStake",
        "offset": 0,
        "slot": "16",
        "type": "t_uint256"
      },
      {
        "astId": 13470,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "seqStake",
        "offset": 0,
        "slot": "17",
        "type": "t_uint256"
      },
      {
        "astId": 13472,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "numQualifiedVerifiers",
        "offset": 0,
        "slot": "18",
        "type": "t_uint256"
      },
      {
        "astId": 13475,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "FAIL_THRESHOLD",
        "offset": 0,
        "slot": "19",
        "type": "t_uint256"
      },
      {
        "astId": 13478,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "ABSENCE_THRESHOLD",
        "offset": 0,
        "slot": "20",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_struct(Challenge)13408_storage)dyn_storage": {
        "base": "t_struct(Challenge)13408_storage",
        "encoding": "dynamic_array",
        "label": "struct MVM_Verifier.Challenge[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_contract(Lib_AddressManager)16623": {
        "encoding": "inplace",
        "label": "contract Lib_AddressManager",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_address,t_uint8)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint8)",
        "numberOfBytes": "32",
        "value": "t_uint8"
      },
      "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(address => bytes))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_bytes_storage)"
      },
      "t_mapping(t_uint256,t_uint256)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_struct(ChainBatchHeader)16324_storage": {
        "encoding": "inplace",
        "label": "struct Lib_OVMCodec.ChainBatchHeader",
        "members": [
          {
            "astId": 16315,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "batchIndex",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 16317,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "batchRoot",
            "offset": 0,
            "slot": "1",
            "type": "t_bytes32"
          },
          {
            "astId": 16319,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "batchSize",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 16321,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "prevTotalElements",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 16323,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "extraData",
            "offset": 0,
            "slot": "4",
            "type": "t_bytes_storage"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_struct(Challenge)13408_storage": {
        "encoding": "inplace",
        "label": "struct MVM_Verifier.Challenge",
        "members": [
          {
            "astId": 13389,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "challenger",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 13391,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "chainID",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 13393,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "index",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 13396,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "header",
            "offset": 0,
            "slot": "3",
            "type": "t_struct(ChainBatchHeader)16324_storage"
          },
          {
            "astId": 13398,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "timestamp",
            "offset": 0,
            "slot": "8",
            "type": "t_uint256"
          },
          {
            "astId": 13400,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "numQualifiedVerifiers",
            "offset": 0,
            "slot": "9",
            "type": "t_uint256"
          },
          {
            "astId": 13402,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "numVerifiers",
            "offset": 0,
            "slot": "10",
            "type": "t_uint256"
          },
          {
            "astId": 13405,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "verifiers",
            "offset": 0,
            "slot": "11",
            "type": "t_array(t_address)dyn_storage"
          },
          {
            "astId": 13407,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "done",
            "offset": 0,
            "slot": "12",
            "type": "t_bool"
          }
        ],
        "numberOfBytes": "416"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}