{
  "contractName": "GnosisSafe",
  "abi": [
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "AddedOwner",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "approvedHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "ApproveHash",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "masterCopy",
          "type": "address"
        }
      ],
      "name": "ChangedMasterCopy",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "threshold",
          "type": "uint256"
        }
      ],
      "name": "ChangedThreshold",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract Module",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "DisabledModule",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract Module",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "EnabledModule",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "txHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "payment",
          "type": "uint256"
        }
      ],
      "name": "ExecutionFailure",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "ExecutionFromModuleFailure",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "ExecutionFromModuleSuccess",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "txHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "payment",
          "type": "uint256"
        }
      ],
      "name": "ExecutionSuccess",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "RemovedOwner",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "msgHash",
          "type": "bytes32"
        }
      ],
      "name": "SignMsg",
      "type": "event"
    },
    { "payable": true, "stateMutability": "payable", "type": "fallback" },
    {
      "constant": true,
      "inputs": [],
      "name": "NAME",
      "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "VERSION",
      "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "owner", "type": "address" },
        { "internalType": "uint256", "name": "_threshold", "type": "uint256" }
      ],
      "name": "addOwnerWithThreshold",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        { "internalType": "address", "name": "", "type": "address" },
        { "internalType": "bytes32", "name": "", "type": "bytes32" }
      ],
      "name": "approvedHashes",
      "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "_masterCopy", "type": "address" }
      ],
      "name": "changeMasterCopy",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "uint256", "name": "_threshold", "type": "uint256" }
      ],
      "name": "changeThreshold",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "contract Module",
          "name": "prevModule",
          "type": "address"
        },
        {
          "internalType": "contract Module",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "disableModule",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "domainSeparator",
      "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "contract Module",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "enableModule",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "uint256", "name": "value", "type": "uint256" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "enum Enum.Operation",
          "name": "operation",
          "type": "uint8"
        }
      ],
      "name": "execTransactionFromModule",
      "outputs": [
        { "internalType": "bool", "name": "success", "type": "bool" }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "uint256", "name": "value", "type": "uint256" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "enum Enum.Operation",
          "name": "operation",
          "type": "uint8"
        }
      ],
      "name": "execTransactionFromModuleReturnData",
      "outputs": [
        { "internalType": "bool", "name": "success", "type": "bool" },
        { "internalType": "bytes", "name": "returnData", "type": "bytes" }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "getModules",
      "outputs": [
        { "internalType": "address[]", "name": "", "type": "address[]" }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        { "internalType": "address", "name": "start", "type": "address" },
        { "internalType": "uint256", "name": "pageSize", "type": "uint256" }
      ],
      "name": "getModulesPaginated",
      "outputs": [
        { "internalType": "address[]", "name": "array", "type": "address[]" },
        { "internalType": "address", "name": "next", "type": "address" }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "getOwners",
      "outputs": [
        { "internalType": "address[]", "name": "", "type": "address[]" }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "getThreshold",
      "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        { "internalType": "address", "name": "owner", "type": "address" }
      ],
      "name": "isOwner",
      "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "nonce",
      "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "prevOwner", "type": "address" },
        { "internalType": "address", "name": "owner", "type": "address" },
        { "internalType": "uint256", "name": "_threshold", "type": "uint256" }
      ],
      "name": "removeOwner",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "handler", "type": "address" }
      ],
      "name": "setFallbackHandler",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
      "name": "signedMessages",
      "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "prevOwner", "type": "address" },
        { "internalType": "address", "name": "oldOwner", "type": "address" },
        { "internalType": "address", "name": "newOwner", "type": "address" }
      ],
      "name": "swapOwner",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address[]", "name": "_owners", "type": "address[]" },
        { "internalType": "uint256", "name": "_threshold", "type": "uint256" },
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "address",
          "name": "fallbackHandler",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "paymentToken",
          "type": "address"
        },
        { "internalType": "uint256", "name": "payment", "type": "uint256" },
        {
          "internalType": "address payable",
          "name": "paymentReceiver",
          "type": "address"
        }
      ],
      "name": "setup",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "uint256", "name": "value", "type": "uint256" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "enum Enum.Operation",
          "name": "operation",
          "type": "uint8"
        },
        { "internalType": "uint256", "name": "safeTxGas", "type": "uint256" },
        { "internalType": "uint256", "name": "baseGas", "type": "uint256" },
        { "internalType": "uint256", "name": "gasPrice", "type": "uint256" },
        { "internalType": "address", "name": "gasToken", "type": "address" },
        {
          "internalType": "address payable",
          "name": "refundReceiver",
          "type": "address"
        },
        { "internalType": "bytes", "name": "signatures", "type": "bytes" }
      ],
      "name": "execTransaction",
      "outputs": [
        { "internalType": "bool", "name": "success", "type": "bool" }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "uint256", "name": "value", "type": "uint256" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "enum Enum.Operation",
          "name": "operation",
          "type": "uint8"
        }
      ],
      "name": "requiredTxGas",
      "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "hashToApprove",
          "type": "bytes32"
        }
      ],
      "name": "approveHash",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [{ "internalType": "bytes", "name": "_data", "type": "bytes" }],
      "name": "signMessage",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        { "internalType": "bytes", "name": "_data", "type": "bytes" },
        { "internalType": "bytes", "name": "_signature", "type": "bytes" }
      ],
      "name": "isValidSignature",
      "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        { "internalType": "bytes", "name": "message", "type": "bytes" }
      ],
      "name": "getMessageHash",
      "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "uint256", "name": "value", "type": "uint256" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "enum Enum.Operation",
          "name": "operation",
          "type": "uint8"
        },
        { "internalType": "uint256", "name": "safeTxGas", "type": "uint256" },
        { "internalType": "uint256", "name": "baseGas", "type": "uint256" },
        { "internalType": "uint256", "name": "gasPrice", "type": "uint256" },
        { "internalType": "address", "name": "gasToken", "type": "address" },
        {
          "internalType": "address",
          "name": "refundReceiver",
          "type": "address"
        },
        { "internalType": "uint256", "name": "_nonce", "type": "uint256" }
      ],
      "name": "encodeTransactionData",
      "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        { "internalType": "address", "name": "to", "type": "address" },
        { "internalType": "uint256", "name": "value", "type": "uint256" },
        { "internalType": "bytes", "name": "data", "type": "bytes" },
        {
          "internalType": "enum Enum.Operation",
          "name": "operation",
          "type": "uint8"
        },
        { "internalType": "uint256", "name": "safeTxGas", "type": "uint256" },
        { "internalType": "uint256", "name": "baseGas", "type": "uint256" },
        { "internalType": "uint256", "name": "gasPrice", "type": "uint256" },
        { "internalType": "address", "name": "gasToken", "type": "address" },
        {
          "internalType": "address",
          "name": "refundReceiver",
          "type": "address"
        },
        { "internalType": "uint256", "name": "_nonce", "type": "uint256" }
      ],
      "name": "getTransactionHash",
      "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"AddedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"approvedHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ApproveHash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"masterCopy\",\"type\":\"address\"}],\"name\":\"ChangedMasterCopy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ChangedThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract Module\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"DisabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract Module\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"EnabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemovedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"SignMsg\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":true,\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"addOwnerWithThreshold\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashToApprove\",\"type\":\"bytes32\"}],\"name\":\"approveHash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"approvedHashes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_masterCopy\",\"type\":\"address\"}],\"name\":\"changeMasterCopy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"changeThreshold\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract Module\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"contract Module\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"disableModule\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract Module\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"encodeTransactionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"execTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModuleReturnData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"getMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getModules\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"start\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getModulesPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"getTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"requiredTxGas\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymentToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"paymentReceiver\",\"type\":\"address\"}],\"name\":\"setup\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"signMessage\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"signedMessages\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"swapOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Stefan George - <stefan@gnosis.io>Richard Meissner - <richard@gnosis.io>Ricardo Guilherme Schmidt - (Status Research & Development GmbH) - Gas Token Payment\",\"methods\":{\"addOwnerWithThreshold(address,uint256)\":{\"details\":\"Allows to add a new owner to the Safe and update the threshold at the same time.      This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\",\"owner\":\"New owner address.\"}},\"approveHash(bytes32)\":{\"details\":\"Marks a hash as approved. This can be used to validate a hash that is used by a signature.\",\"params\":{\"hashToApprove\":\"The hash that should be marked as approved for signatures that are verified by this contract.\"}},\"changeMasterCopy(address)\":{\"details\":\"Allows to upgrade the contract. This can only be done via a Safe transaction.\",\"params\":{\"_masterCopy\":\"New contract address.\"}},\"changeThreshold(uint256)\":{\"details\":\"Allows to update the number of required confirmations by Safe owners.      This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\"}},\"disableModule(address,address)\":{\"details\":\"Allows to remove a module from the whitelist.      This can only be done via a Safe transaction.\",\"params\":{\"module\":\"Module to be removed.\",\"prevModule\":\"Module that pointed to the module to be removed in the linked list\"}},\"enableModule(address)\":{\"details\":\"Allows to add a module to the whitelist.      This can only be done via a Safe transaction.\",\"params\":{\"module\":\"Module to be whitelisted.\"}},\"encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)\":{\"details\":\"Returns the bytes that are hashed to be signed by owners.\",\"params\":{\"_nonce\":\"Transaction nonce.\",\"baseGas\":\"Gas costs for data used to trigger the safe transaction.\",\"data\":\"Data payload.\",\"gasPrice\":\"Maximum gas price that should be used for this transaction.\",\"gasToken\":\"Token address (or 0 if ETH) that is used for the payment.\",\"operation\":\"Operation type.\",\"refundReceiver\":\"Address of receiver of gas payment (or 0 if tx.origin).\",\"safeTxGas\":\"Fas that should be used for the safe transaction.\",\"to\":\"Destination address.\",\"value\":\"Ether value.\"},\"return\":\"Transaction hash bytes.\"},\"execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)\":{\"details\":\"Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.      Note: The fees are always transfered, even if the user transaction fails.\",\"params\":{\"baseGas\":\"Gas costs for that are indipendent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\",\"data\":\"Data payload of Safe transaction.\",\"gasPrice\":\"Gas price that should be used for the payment calculation.\",\"gasToken\":\"Token address (or 0 if ETH) that is used for the payment.\",\"operation\":\"Operation type of Safe transaction.\",\"refundReceiver\":\"Address of receiver of gas payment (or 0 if tx.origin).\",\"safeTxGas\":\"Gas that should be used for the Safe transaction.\",\"signatures\":\"Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\",\"to\":\"Destination address of Safe transaction.\",\"value\":\"Ether value of Safe transaction.\"}},\"execTransactionFromModule(address,uint256,bytes,uint8)\":{\"details\":\"Allows a Module to execute a Safe transaction without any further confirmations.\",\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"}},\"execTransactionFromModuleReturnData(address,uint256,bytes,uint8)\":{\"details\":\"Allows a Module to execute a Safe transaction without any further confirmations and return data\",\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"}},\"getMessageHash(bytes)\":{\"details\":\"Returns hash of a message that can be signed by owners.\",\"params\":{\"message\":\"Message that should be hashed\"},\"return\":\"Message hash.\"},\"getModules()\":{\"details\":\"Returns array of first 10 modules.\",\"return\":\"Array of modules.\"},\"getModulesPaginated(address,uint256)\":{\"details\":\"Returns array of modules.\",\"params\":{\"pageSize\":\"Maximum number of modules that should be returned.\",\"start\":\"Start of the page.\"},\"return\":\"Array of modules.\"},\"getOwners()\":{\"details\":\"Returns array of owners.\",\"return\":\"Array of Safe owners.\"},\"getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)\":{\"details\":\"Returns hash to be signed by owners.\",\"params\":{\"_nonce\":\"Transaction nonce.\",\"baseGas\":\"Gas costs for data used to trigger the safe transaction.\",\"data\":\"Data payload.\",\"gasPrice\":\"Maximum gas price that should be used for this transaction.\",\"gasToken\":\"Token address (or 0 if ETH) that is used for the payment.\",\"operation\":\"Operation type.\",\"refundReceiver\":\"Address of receiver of gas payment (or 0 if tx.origin).\",\"safeTxGas\":\"Fas that should be used for the safe transaction.\",\"to\":\"Destination address.\",\"value\":\"Ether value.\"},\"return\":\"Transaction hash.\"},\"isValidSignature(bytes,bytes)\":{\"details\":\"Should return whether the signature provided is valid for the provided data.      The save does not implement the interface since `checkSignatures` is not a view method.      The method will not perform any state changes (see parameters of `checkSignatures`)\",\"params\":{\"_data\":\"Arbitrary length data signed on the behalf of address(this)\",\"_signature\":\"Signature byte array associated with _data\"},\"return\":\"a bool upon valid or invalid signature with corresponding _data\"},\"removeOwner(address,address,uint256)\":{\"details\":\"Allows to remove an owner from the Safe and update the threshold at the same time.      This can only be done via a Safe transaction.\",\"params\":{\"_threshold\":\"New threshold.\",\"owner\":\"Owner address to be removed.\",\"prevOwner\":\"Owner that pointed to the owner to be removed in the linked list\"}},\"requiredTxGas(address,uint256,bytes,uint8)\":{\"details\":\"Allows to estimate a Safe transaction.      This method is only meant for estimation purpose, therefore two different protection mechanism against execution in a transaction have been made:      1.) The method can only be called from the safe itself      2.) The response is returned with a revert      When estimating set `from` to the address of the safe.      Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\",\"params\":{\"data\":\"Data payload of Safe transaction.\",\"operation\":\"Operation type of Safe transaction.\",\"to\":\"Destination address of Safe transaction.\",\"value\":\"Ether value of Safe transaction.\"},\"return\":\"Estimate without refunds and overhead fees (base transaction and payload data gas costs).\"},\"setFallbackHandler(address)\":{\"details\":\"Allows to add a contract to handle fallback calls.      Only fallback calls without value and with data will be forwarded.      This can only be done via a Safe transaction.\",\"params\":{\"handler\":\"contract to handle fallbacks calls.\"}},\"setup(address[],uint256,address,bytes,address,address,uint256,address)\":{\"details\":\"Setup function sets initial storage of contract.\",\"params\":{\"_owners\":\"List of Safe owners.\",\"_threshold\":\"Number of required confirmations for a Safe transaction.\",\"data\":\"Data payload for optional delegate call.\",\"fallbackHandler\":\"Handler for fallback calls to this contract\",\"payment\":\"Value that should be paid\",\"paymentReceiver\":\"Adddress that should receive the payment (or 0 if tx.origin)\",\"paymentToken\":\"Token that should be used for the payment (0 is ETH)\",\"to\":\"Contract address for optional delegate call.\"}},\"signMessage(bytes)\":{\"details\":\"Marks a message as signed\",\"params\":{\"_data\":\"Arbitrary length data that should be marked as signed on the behalf of address(this)\"}},\"swapOwner(address,address,address)\":{\"details\":\"Allows to swap/replace an owner from the Safe with another address.      This can only be done via a Safe transaction.\",\"params\":{\"newOwner\":\"New owner address.\",\"oldOwner\":\"Owner address to be replaced.\",\"prevOwner\":\"Owner that pointed to the owner to be replaced in the linked list\"}}},\"title\":\"Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\"},\"userdoc\":{\"methods\":{\"isValidSignature(bytes,bytes)\":{\"notice\":\"Implementation of ISignatureValidator (see `interfaces/ISignatureValidator.sol`)\"}}}},\"settings\":{\"compilationTarget\":{\"/mnt/d/Richard/Projects/safe-contracts/contracts/GnosisSafe.sol\":\"GnosisSafe\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/mnt/d/Richard/Projects/safe-contracts/contracts/GnosisSafe.sol\":{\"keccak256\":\"0xdfd7bf82cd4763e161c7d2fdcfb403978534cbbd4fa9d191fb102afd751d1657\",\"urls\":[\"bzz-raw://a347b3d31ae1acdcaf2ff2173d89cb45131c76ad2bf63392ce361294636a9029\",\"dweb:/ipfs/QmZggLvsosR1etmYqTnpLHLynakrap2NXRfLSPm3xiNJXg\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/base/Executor.sol\":{\"keccak256\":\"0xd2835623a200b6f14979751aff14e48362b5db0d86fff17dfb6a982790ff6c67\",\"urls\":[\"bzz-raw://df85c3b4dc546ffd8790a155bf6190b55168a69f469624a9134f1e7a9e079880\",\"dweb:/ipfs/QmXozPPHk7KAyoihdx4FEn4dEaR2x9yDJthQcZPR3Knxpv\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/base/FallbackManager.sol\":{\"keccak256\":\"0x18baeb026940c7a06ee4aceebed0118b920468777e2f08a45d39c0983ee57523\",\"urls\":[\"bzz-raw://75ec51dbc17c5e5c6701ed6809ea6c0d8bbd8dfdca944ed00d64d6f96fde98f0\",\"dweb:/ipfs/QmTbJz9p6oro7MCZKHBBBeoowQNYv7raQnoC5bfWxoQ4vR\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/base/Module.sol\":{\"keccak256\":\"0x0d168bb2c28fe04185e992692705925d700ecc32692e1a1f997478c55722b9ad\",\"urls\":[\"bzz-raw://72b39ab237628e99e68b89269a99efbf7f4c977ce8dcda9e947e74ffffc2bf36\",\"dweb:/ipfs/QmekYYrv5X2wdg2QqaP96qhkxpwTT8nt47CHvuBxzHv9hp\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/base/ModuleManager.sol\":{\"keccak256\":\"0xd1f41edf7fd05526882d77b9517155b5c2d30839aab3b019658d923355706c58\",\"urls\":[\"bzz-raw://b322ec622fe7860c63d7f8de376db60a58c8db37c6cedaf466ebd5de8776431a\",\"dweb:/ipfs/QmYor9Qm7mRyXa55VDz9Rcbf82QE2bmi9yFP5c2kMw15mk\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/base/OwnerManager.sol\":{\"keccak256\":\"0xd35138614ba872903e32335245e37afebbc5ebecc2ae6dce74a90623695842c0\",\"urls\":[\"bzz-raw://caa24730520469e1f40bf072d4582f5843bb37e0a04ef09b786cab7998d28d49\",\"dweb:/ipfs/QmbTiyea585HTmRpYtiNRozcRjyQmhMB9ijjNhKBSfMeYN\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/common/Enum.sol\":{\"keccak256\":\"0x7bc6e5afb9436d9f7e376c2cdba51ca1f337e1b31c04cca5769db3a77ed40081\",\"urls\":[\"bzz-raw://88b3a68baaff962b69b040af62698034bf9c99319e4a6dce71abc2c0c88fba91\",\"dweb:/ipfs/QmTefyhXcMALQew96u7YRLQBnye9vapqkKBWxbynWpMHDM\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/common/MasterCopy.sol\":{\"keccak256\":\"0x1577fad0dc06cb3ac2c7d66816a00d3b70c053a21ab5834ec7aceace9a7803a7\",\"urls\":[\"bzz-raw://7f23c1e11ebb2fbd3b55a4074b4a9f343c0ac02b372cbbe66a90d71a88ce1885\",\"dweb:/ipfs/QmexSrdAm4DqBjGi29yQTxSGKqJ5qC8jy1b5NJH6Zy9Cvh\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/common/SecuredTokenTransfer.sol\":{\"keccak256\":\"0xefb71775825579db9bab375c4e620deaf266b00a3e8c49ba382551c1dc3b66e9\",\"urls\":[\"bzz-raw://4c57d5ba7c81d72c0e537e68bc957c7429110447dc307f2a4b054594d1068603\",\"dweb:/ipfs/QmeEYz4hKpfpHLU8D1BDutWa1ZBav2idBfhWxtXZtrb8Vp\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/common/SelfAuthorized.sol\":{\"keccak256\":\"0x4c4f094227fc466846a97fe375c47ecdfcab050c303baeb69b5970d28db717a6\",\"urls\":[\"bzz-raw://42759fe6b2433ea24fd0fbe98a144ef55e464f87861a13aa364db8a6f4a01cf1\",\"dweb:/ipfs/QmTWPnHdfcBbddkMJxvEvoWs3CZoKB5rtz3s8K2ii9z9CG\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/common/SignatureDecoder.sol\":{\"keccak256\":\"0x9d6196319963155fd0a1dd45e6d4992489da251e18572c2fc62084482edb37a9\",\"urls\":[\"bzz-raw://0298c7d98d2368bc99ae8d28befc8d40250fd7128f45095321d3c9e199fec74b\",\"dweb:/ipfs/QmPK4Q2mSnsEuv5ayyDAzURAksYXmbbALQ2Z5xUcfx1q4K\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/external/GnosisSafeMath.sol\":{\"keccak256\":\"0xd1e8bb20e155e717ee4d3e82bee7cf461e10be78d02647ed961e73d5716b66bc\",\"urls\":[\"bzz-raw://8ba8c3fcd407da9691ad4e0c7f1d91b67cfe568aab8338c0a47f704b86fd12c6\",\"dweb:/ipfs/QmZLfsQrX9uyaRL1hFN1y6uzze1ZyyhQGTtbxuaCABqJYY\"]},\"/mnt/d/Richard/Projects/safe-contracts/contracts/interfaces/ISignatureValidator.sol\":{\"keccak256\":\"0xb75555e8e2bbbe38c55e164dde9761a016b0b4f1b0004b93d7ec2acd873faca4\",\"urls\":[\"bzz-raw://5985325d13e7aedb3036e9f342e740c14bf57b6202b11c2a36f95867f8c9ad5e\",\"dweb:/ipfs/QmTRKm25xk4jsTQHww3JtaU9fNp1BiM6SKoUNp5LrcLyo5\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b506001600481905550615de880620000296000396000f3fe6080604052600436106101cd5760003560e01c8063affed0e0116100f7578063e009cfde11610095578063f08a032311610064578063f08a032314611504578063f698da2514611555578063f8dc5dd914611580578063ffa1ad74146115fb576101cd565b8063e009cfde146111f6578063e318b52b14611267578063e75235b8146112f8578063e86637db14611323576101cd565b8063c4ca3a9c116100d1578063c4ca3a9c14610e8b578063cc2f845214610f5c578063d4d9bdcd1461103f578063d8d11f781461107a576101cd565b8063affed0e014610c84578063b2494df314610caf578063b63e800d14610d1b576101cd565b8063610b59251161016f5780637de7edef1161013e5780637de7edef14610ab157806385a5affe14610b02578063a0e67e2b14610b88578063a3f4df7e14610bf4576101cd565b8063610b59251461082d578063694e80c31461087e5780636a761202146108b95780637d83297414610a42576101cd565b80632f54bf6e116101ab5780632f54bf6e146104db578063468721a7146105445780635229073f1461065b5780635ae6bd37146107de576101cd565b80630a1028c4146102775780630d582f131461035357806320c13b0b146103ae575b60003411806101df5750600080369050145b156101e957610275565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b9050600081549050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461027257366000803760008036600080855af13d6000803e600081141561026d573d6000fd5b3d6000f35b50505b005b34801561028357600080fd5b5061033d6004803603602081101561029a57600080fd5b81019080803590602001906401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460018302840111640100000000831117156102eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061168b565b6040518082815260200191505060405180910390f35b34801561035f57600080fd5b506103ac6004803603604081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c2565b005b3480156103ba57600080fd5b50610487600480360360408110156103d157600080fd5b81019080803590602001906401000000008111156103ee57600080fd5b82018360208201111561040057600080fd5b8035906020019184600183028401116401000000008311171561042257600080fd5b90919293919293908035906020019064010000000081111561044357600080fd5b82018360208201111561045557600080fd5b8035906020019184600183028401116401000000008311171561047757600080fd5b9091929391929390505050611c0c565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156104e757600080fd5b5061052a600480360360208110156104fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da2565b604051808215151515815260200191505060405180910390f35b34801561055057600080fd5b506106416004803603608081101561056757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460018302840111640100000000831117156105e257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611e74565b604051808215151515815260200191505060405180910390f35b34801561066757600080fd5b506107586004803603608081101561067e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106c557600080fd5b8201836020820111156106d757600080fd5b803590602001918460018302840111640100000000831117156106f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919050505061203d565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107a2578082015181840152602081019050610787565b50505050905090810190601f1680156107cf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156107ea57600080fd5b506108176004803603602081101561080157600080fd5b8101908080359060200190929190505050612073565b6040518082815260200191505060405180910390f35b34801561083957600080fd5b5061087c6004803603602081101561085057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061208b565b005b34801561088a57600080fd5b506108b7600480360360208110156108a157600080fd5b81019080803590602001909291905050506124af565b005b3480156108c557600080fd5b50610a2860048036036101408110156108dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109e457600080fd5b8201836020820111156109f657600080fd5b80359060200191846001830284011164010000000083111715610a1857600080fd5b909192939192939050505061262b565b604051808215151515815260200191505060405180910390f35b348015610a4e57600080fd5b50610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b348015610abd57600080fd5b50610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128b9565b005b348015610b0e57600080fd5b50610b8660048036036020811015610b2557600080fd5b8101908080359060200190640100000000811115610b4257600080fd5b820183602082011115610b5457600080fd5b80359060200191846001830284011164010000000083111715610b7657600080fd5b9091929391929390505050612a69565b005b348015610b9457600080fd5b50610b9d612b89565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610be0578082015181840152602081019050610bc5565b505050509050019250505060405180910390f35b348015610c0057600080fd5b50610c09612d1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c49578082015181840152602081019050610c2e565b50505050905090810190601f168015610c765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c9057600080fd5b50610c99612d57565b6040518082815260200191505060405180910390f35b348015610cbb57600080fd5b50610cc4612d5d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d07578082015181840152602081019050610cec565b505050509050019250505060405180910390f35b348015610d2757600080fd5b50610e896004803603610100811015610d3f57600080fd5b8101908080359060200190640100000000811115610d5c57600080fd5b820183602082011115610d6e57600080fd5b80359060200191846020830284011164010000000083111715610d9057600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ddb57600080fd5b820183602082011115610ded57600080fd5b80359060200191846001830284011164010000000083111715610e0f57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d76565b005b348015610e9757600080fd5b50610f4660048036036080811015610eae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610ef557600080fd5b820183602082011115610f0757600080fd5b80359060200191846001830284011164010000000083111715610f2957600080fd5b9091929391929390803560ff169060200190929190505050612f71565b6040518082815260200191505060405180910390f35b348015610f6857600080fd5b50610fb560048036036040811015610f7f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061311e565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561102a57808201518184015260208101905061100f565b50505050905001935050505060405180910390f35b34801561104b57600080fd5b506110786004803603602081101561106257600080fd5b81019080803590602001909291905050506132fd565b005b34801561108657600080fd5b506111e0600480360361014081101561109e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110e557600080fd5b8201836020820111156110f757600080fd5b8035906020019184600183028401116401000000008311171561111957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061349c565b6040518082815260200191505060405180910390f35b34801561120257600080fd5b506112656004803603604081101561121957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134c7565b005b34801561127357600080fd5b506112f66004803603606081101561128a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138cd565b005b34801561130457600080fd5b5061130d613f92565b6040518082815260200191505060405180910390f35b34801561132f57600080fd5b50611489600480360361014081101561134757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561138e57600080fd5b8201836020820111156113a057600080fd5b803590602001918460018302840111640100000000831117156113c257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613f9c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156114c95780820151818401526020810190506114ae565b50505050905090810190601f1680156114f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561151057600080fd5b506115536004803603602081101561152757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141b0565b005b34801561156157600080fd5b5061156a614240565b6040518082815260200191505060405180910390f35b34801561158c57600080fd5b506115f9600480360360608110156115a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614246565b005b34801561160757600080fd5b506116106146d1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611650578082015181840152602081019050611635565b50505050905090810190601f16801561167d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118b05750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611c0857611c07816124af565b5b5050565b600080611c5c86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b90506000848490501415611cf957600060076000838152602001908152602001600020541415611cf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611d8f565b611d8e8187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600061470a565b5b6320c13b0b60e01b915050949350505050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611e6d5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611f3f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615d016030913960400191505060405180910390fd5b611fa1858585855a615038565b90508015611ff1573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2612035565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000606061204d86868686611e74565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60076020528060005260406000206000915090505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156121795750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6121eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6f64756c652068617320616c7265616479206265656e20616464656400000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b60035481111561258e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615ba46023913960400191505060405180910390fd5b60018110156125e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c7a6024913960400191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b60008060606126888f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8e8e8e8e600554613f9c565b9050600560008154809291906001019190505550808051906020012091506126f7828287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600161470a565b50885a1015612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d8a602a913960400191505060405180910390fd5b60005a90506127c28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008f1480156127b1575060008d145b6127bb578e6127bd565b5a5b615038565b92506127d75a826150aa90919063ffffffff16565b9050600080905060008911156127f7576127f4828b8b8b8b6150ca565b90505b8315612841577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8382604051808381526020018281526020019250505060405180910390a1612881565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238382604051808381526020018281526020019250505060405180910390a15b5050509c9b505050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615b106024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b6000612b3c83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a2505050565b606080600354604051908082528060200260200182016040528015612bbd5781602001602082028038833980820191505090505b5090506000809050600060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d155780838381518110612c6c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612c2b565b82935050505090565b6040518060400160405280600b81526020017f476e6f736973205361666500000000000000000000000000000000000000000081525081565b60055481565b606080612d6c6001600a61311e565b5090508091505090565b6000801b60065414612df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f446f6d61696e20536570617261746f7220616c7265616479207365742100000081525060200191505060405180910390fd5b7f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d474960001b30604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405160208183030381529060405280519060200120600681905550612ebf8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505089615296565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612efd57612efc846156ef565b5b612f4b8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061571e565b6000821115612f6557612f63826000600186856150ca565b505b50505050505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b60005a905061304d878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615038565b61305657600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130e35780820151818401526020810190506130c8565b50505050905090810190601f1680156131105780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606000826040519080825280602002602001820160405280156131515781602001602082028038833980820191505090505b50915060008090506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156132285750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561323357508482105b156132ee578084838151811061324557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506131be565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c79206f776e6572732063616e20617070726f766520612068617368000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006134b08b8b8b8b8b8b8b8b8b8b613f9c565b8051906020012090509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461354b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135b55750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461370a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615b7c6028913960400191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156139bb5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613b985750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c1e6026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8c8c8c805190602001208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561402c57fe5b60ff1681526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b61423d816156ef565b50565b60065481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b806001600354031015614328576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615bc76035913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143925750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c1e6026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600454146146cc576146cb816124af565b5b505050565b6040518060400160405280600581526020017f312e312e3100000000000000000000000000000000000000000000000000000081525081565b6000600454905060008111614787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5468726573686f6c64206e6565647320746f20626520646566696e656421000081525060200191505060405180910390fd5b61479b60418261593890919063ffffffff16565b83511015614811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5369676e617475726573206461746120746f6f2073686f72740000000000000081525060200191505060405180910390fd5b600080905060008060008060008090505b8681101561502b576148348982615972565b80945081955082965050505060008460ff161415614bc9578260001c945061486660418861593890919063ffffffff16565b8260001c10156148c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615c9e6037913960400191505060405180910390fd5b88516148da60208460001c6159a190919063ffffffff16565b1115614931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615d316037913960400191505060405180910390fd5b60006020838b010151905089516149678261495960208760001c6159a190919063ffffffff16565b6159a190919063ffffffff16565b11156149be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615c446036913960400191505060405180910390fd5b60606020848c010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8e846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015614a60578082015181840152602081019050614a45565b50505050905090810190601f168015614a8d5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614ac6578082015181840152602081019050614aab565b50505050905090810190601f168015614af35780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015614b1257600080fd5b505afa158015614b26573d6000803e3d6000fd5b505050506040513d6020811015614b3c57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614614bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615b596023913960400191505060405180910390fd5b5050614ea9565b60018460ff161415614d72578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614c6657506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d81526020019081526020016000205414155b614cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4861736820686173206e6f74206265656e20617070726f76656400000000000081525060200191505060405180910390fd5b878015614d1157508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15614d6d576000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020819055505b614ea8565b601e8460ff161115614e3d5760018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e2c573d6000803e3d6000fd5b505050602060405103519450614ea7565b60018b85858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e9a573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015614f705750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015614fa95750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61501b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f496e76616c6964206f776e65722070726f76696465640000000000000000000081525060200191505060405180910390fd5b8495508080600101915050614822565b5050505050505050505050565b600080600181111561504657fe5b83600181111561505257fe5b141561506b57615064868686856159c0565b90506150a1565b60018081111561507757fe5b83600181111561508357fe5b141561509b576150948685846159d9565b90506150a0565b600090505b5b95945050505050565b6000828211156150b957600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146151075782615109565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615204576151733a8610615150573a615152565b855b615165888a6159a190919063ffffffff16565b61593890919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506151ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d686022913960400191505060405180910390fd5b61528c565b6152298561521b888a6159a190919063ffffffff16565b61593890919063ffffffff16565b91506152368482846159f0565b61528b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615bfc6022913960400191505060405180910390fd5b5b5095945050505050565b60006004541461530e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f776e657273206861766520616c7265616479206265656e207365747570000081525060200191505060405180910390fd5b8151811115615368576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615ba46023913960400191505060405180910390fd5b60018110156153c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c7a6024913960400191505060405180910390fd5b60006001905060008090505b835181101561565b5760008482815181106153e557fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156154595750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6154cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4475706c6963617465206f776e657220616464726573732070726f766964656481525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506153ce565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615803576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b346025913960400191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614615934576158c182825a6159d9565b615933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f742066696e69736820696e697469616c697a6174696f6e0081525060200191505060405180910390fd5b5b5050565b60008083141561594b576000905061596c565b600082840290508284828161595c57fe5b041461596757600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b6000808284019050838110156159b657600080fd5b8091505092915050565b6000806000845160208601878987f19050949350505050565b60008060008451602086018786f490509392505050565b600060608383604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808251602084016000896127105a03f16040513d81016040523d6000823e3d60008114615af25760208114615afa5760009450615b04565b829450615b04565b8151158315171594505b50505050939250505056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6f64756c6573206861766520616c7265616479206265656e20696e697469616c697a6564496e76616c696420636f6e7472616374207369676e61747572652070726f7669646564496e76616c696420707265764d6f64756c652c206d6f64756c6520706169722070726f76696465645468726573686f6c642063616e6e6f7420657863656564206f776e657220636f756e744e6577206f776e657220636f756e74206e6565647320746f206265206c6172676572207468616e206e6577207468726573686f6c64436f756c64206e6f74207061792067617320636f737473207769746820746f6b656e496e76616c696420707265764f776e65722c206f776e657220706169722070726f7669646564496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a2064617461206e6f7420636f6d706c6574655468726573686f6c64206e6565647320746f2062652067726561746572207468616e2030496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a20696e736964652073746174696320706172744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207468697320636f6e74726163744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d20616e20656e61626c6564206d6f64756c65496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a206c656e677468206e6f742070726573656e74436f756c64206e6f74207061792067617320636f73747320776974682065746865724e6f7420656e6f7567682067617320746f20657865637574652073616665207472616e73616374696f6ea265627a7a72315820116e4e6802bb4e3fb39740b715dce7a0a6f267ae9d0a756a642191516fd1959164736f6c63430005100032",
  "deployedBytecode": "0x6080604052600436106101cd5760003560e01c8063affed0e0116100f7578063e009cfde11610095578063f08a032311610064578063f08a032314611504578063f698da2514611555578063f8dc5dd914611580578063ffa1ad74146115fb576101cd565b8063e009cfde146111f6578063e318b52b14611267578063e75235b8146112f8578063e86637db14611323576101cd565b8063c4ca3a9c116100d1578063c4ca3a9c14610e8b578063cc2f845214610f5c578063d4d9bdcd1461103f578063d8d11f781461107a576101cd565b8063affed0e014610c84578063b2494df314610caf578063b63e800d14610d1b576101cd565b8063610b59251161016f5780637de7edef1161013e5780637de7edef14610ab157806385a5affe14610b02578063a0e67e2b14610b88578063a3f4df7e14610bf4576101cd565b8063610b59251461082d578063694e80c31461087e5780636a761202146108b95780637d83297414610a42576101cd565b80632f54bf6e116101ab5780632f54bf6e146104db578063468721a7146105445780635229073f1461065b5780635ae6bd37146107de576101cd565b80630a1028c4146102775780630d582f131461035357806320c13b0b146103ae575b60003411806101df5750600080369050145b156101e957610275565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b9050600081549050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461027257366000803760008036600080855af13d6000803e600081141561026d573d6000fd5b3d6000f35b50505b005b34801561028357600080fd5b5061033d6004803603602081101561029a57600080fd5b81019080803590602001906401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460018302840111640100000000831117156102eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061168b565b6040518082815260200191505060405180910390f35b34801561035f57600080fd5b506103ac6004803603604081101561037657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c2565b005b3480156103ba57600080fd5b50610487600480360360408110156103d157600080fd5b81019080803590602001906401000000008111156103ee57600080fd5b82018360208201111561040057600080fd5b8035906020019184600183028401116401000000008311171561042257600080fd5b90919293919293908035906020019064010000000081111561044357600080fd5b82018360208201111561045557600080fd5b8035906020019184600183028401116401000000008311171561047757600080fd5b9091929391929390505050611c0c565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156104e757600080fd5b5061052a600480360360208110156104fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da2565b604051808215151515815260200191505060405180910390f35b34801561055057600080fd5b506106416004803603608081101561056757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460018302840111640100000000831117156105e257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611e74565b604051808215151515815260200191505060405180910390f35b34801561066757600080fd5b506107586004803603608081101561067e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106c557600080fd5b8201836020820111156106d757600080fd5b803590602001918460018302840111640100000000831117156106f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff16906020019092919050505061203d565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107a2578082015181840152602081019050610787565b50505050905090810190601f1680156107cf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156107ea57600080fd5b506108176004803603602081101561080157600080fd5b8101908080359060200190929190505050612073565b6040518082815260200191505060405180910390f35b34801561083957600080fd5b5061087c6004803603602081101561085057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061208b565b005b34801561088a57600080fd5b506108b7600480360360208110156108a157600080fd5b81019080803590602001909291905050506124af565b005b3480156108c557600080fd5b50610a2860048036036101408110156108dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109e457600080fd5b8201836020820111156109f657600080fd5b80359060200191846001830284011164010000000083111715610a1857600080fd5b909192939192939050505061262b565b604051808215151515815260200191505060405180910390f35b348015610a4e57600080fd5b50610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b348015610abd57600080fd5b50610b0060048036036020811015610ad457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128b9565b005b348015610b0e57600080fd5b50610b8660048036036020811015610b2557600080fd5b8101908080359060200190640100000000811115610b4257600080fd5b820183602082011115610b5457600080fd5b80359060200191846001830284011164010000000083111715610b7657600080fd5b9091929391929390505050612a69565b005b348015610b9457600080fd5b50610b9d612b89565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610be0578082015181840152602081019050610bc5565b505050509050019250505060405180910390f35b348015610c0057600080fd5b50610c09612d1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c49578082015181840152602081019050610c2e565b50505050905090810190601f168015610c765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c9057600080fd5b50610c99612d57565b6040518082815260200191505060405180910390f35b348015610cbb57600080fd5b50610cc4612d5d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d07578082015181840152602081019050610cec565b505050509050019250505060405180910390f35b348015610d2757600080fd5b50610e896004803603610100811015610d3f57600080fd5b8101908080359060200190640100000000811115610d5c57600080fd5b820183602082011115610d6e57600080fd5b80359060200191846020830284011164010000000083111715610d9057600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ddb57600080fd5b820183602082011115610ded57600080fd5b80359060200191846001830284011164010000000083111715610e0f57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d76565b005b348015610e9757600080fd5b50610f4660048036036080811015610eae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610ef557600080fd5b820183602082011115610f0757600080fd5b80359060200191846001830284011164010000000083111715610f2957600080fd5b9091929391929390803560ff169060200190929190505050612f71565b6040518082815260200191505060405180910390f35b348015610f6857600080fd5b50610fb560048036036040811015610f7f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061311e565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561102a57808201518184015260208101905061100f565b50505050905001935050505060405180910390f35b34801561104b57600080fd5b506110786004803603602081101561106257600080fd5b81019080803590602001909291905050506132fd565b005b34801561108657600080fd5b506111e0600480360361014081101561109e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110e557600080fd5b8201836020820111156110f757600080fd5b8035906020019184600183028401116401000000008311171561111957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061349c565b6040518082815260200191505060405180910390f35b34801561120257600080fd5b506112656004803603604081101561121957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134c7565b005b34801561127357600080fd5b506112f66004803603606081101561128a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138cd565b005b34801561130457600080fd5b5061130d613f92565b6040518082815260200191505060405180910390f35b34801561132f57600080fd5b50611489600480360361014081101561134757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561138e57600080fd5b8201836020820111156113a057600080fd5b803590602001918460018302840111640100000000831117156113c257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613f9c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156114c95780820151818401526020810190506114ae565b50505050905090810190601f1680156114f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561151057600080fd5b506115536004803603602081101561152757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141b0565b005b34801561156157600080fd5b5061156a614240565b6040518082815260200191505060405180910390f35b34801561158c57600080fd5b506115f9600480360360608110156115a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614246565b005b34801561160757600080fd5b506116106146d1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611650578082015181840152602081019050611635565b50505050905090810190601f16801561167d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118b05750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611c0857611c07816124af565b5b5050565b600080611c5c86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b90506000848490501415611cf957600060076000838152602001908152602001600020541415611cf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611d8f565b611d8e8187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600061470a565b5b6320c13b0b60e01b915050949350505050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611e6d5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611f3f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615d016030913960400191505060405180910390fd5b611fa1858585855a615038565b90508015611ff1573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2612035565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000606061204d86868686611e74565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60076020528060005260406000206000915090505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156121795750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6121eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6f64756c652068617320616c7265616479206265656e20616464656400000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b60035481111561258e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615ba46023913960400191505060405180910390fd5b60018110156125e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c7a6024913960400191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b60008060606126888f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8e8e8e8e600554613f9c565b9050600560008154809291906001019190505550808051906020012091506126f7828287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050600161470a565b50885a1015612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d8a602a913960400191505060405180910390fd5b60005a90506127c28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008f1480156127b1575060008d145b6127bb578e6127bd565b5a5b615038565b92506127d75a826150aa90919063ffffffff16565b9050600080905060008911156127f7576127f4828b8b8b8b6150ca565b90505b8315612841577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8382604051808381526020018281526020019250505060405180910390a1612881565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238382604051808381526020018281526020019250505060405180910390a15b5050509c9b505050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615b106024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b6000612b3c83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061168b565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a2505050565b606080600354604051908082528060200260200182016040528015612bbd5781602001602082028038833980820191505090505b5090506000809050600060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d155780838381518110612c6c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612c2b565b82935050505090565b6040518060400160405280600b81526020017f476e6f736973205361666500000000000000000000000000000000000000000081525081565b60055481565b606080612d6c6001600a61311e565b5090508091505090565b6000801b60065414612df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f446f6d61696e20536570617261746f7220616c7265616479207365742100000081525060200191505060405180910390fd5b7f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d474960001b30604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405160208183030381529060405280519060200120600681905550612ebf8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505089615296565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612efd57612efc846156ef565b5b612f4b8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061571e565b6000821115612f6557612f63826000600186856150ca565b505b50505050505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b60005a905061304d878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615038565b61305657600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130e35780820151818401526020810190506130c8565b50505050905090810190601f1680156131105780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606000826040519080825280602002602001820160405280156131515781602001602082028038833980820191505090505b50915060008090506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156132285750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561323357508482105b156132ee578084838151811061324557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506131be565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c79206f776e6572732063616e20617070726f766520612068617368000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006134b08b8b8b8b8b8b8b8b8b8b613f9c565b8051906020012090509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461354b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135b55750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461370a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615b7c6028913960400191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156139bb5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613b985750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c1e6026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8c8c8c805190602001208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561402c57fe5b60ff1681526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b61423d816156ef565b50565b60065481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cd5602c913960400191505060405180910390fd5b806001600354031015614328576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615bc76035913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143925750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c1e6026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180600454146146cc576146cb816124af565b5b505050565b6040518060400160405280600581526020017f312e312e3100000000000000000000000000000000000000000000000000000081525081565b6000600454905060008111614787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5468726573686f6c64206e6565647320746f20626520646566696e656421000081525060200191505060405180910390fd5b61479b60418261593890919063ffffffff16565b83511015614811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5369676e617475726573206461746120746f6f2073686f72740000000000000081525060200191505060405180910390fd5b600080905060008060008060008090505b8681101561502b576148348982615972565b80945081955082965050505060008460ff161415614bc9578260001c945061486660418861593890919063ffffffff16565b8260001c10156148c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615c9e6037913960400191505060405180910390fd5b88516148da60208460001c6159a190919063ffffffff16565b1115614931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615d316037913960400191505060405180910390fd5b60006020838b010151905089516149678261495960208760001c6159a190919063ffffffff16565b6159a190919063ffffffff16565b11156149be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615c446036913960400191505060405180910390fd5b60606020848c010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8e846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015614a60578082015181840152602081019050614a45565b50505050905090810190601f168015614a8d5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614ac6578082015181840152602081019050614aab565b50505050905090810190601f168015614af35780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015614b1257600080fd5b505afa158015614b26573d6000803e3d6000fd5b505050506040513d6020811015614b3c57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614614bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615b596023913960400191505060405180910390fd5b5050614ea9565b60018460ff161415614d72578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614c6657506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d81526020019081526020016000205414155b614cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4861736820686173206e6f74206265656e20617070726f76656400000000000081525060200191505060405180910390fd5b878015614d1157508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15614d6d576000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020819055505b614ea8565b601e8460ff161115614e3d5760018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e2c573d6000803e3d6000fd5b505050602060405103519450614ea7565b60018b85858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614e9a573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015614f705750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015614fa95750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61501b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f496e76616c6964206f776e65722070726f76696465640000000000000000000081525060200191505060405180910390fd5b8495508080600101915050614822565b5050505050505050505050565b600080600181111561504657fe5b83600181111561505257fe5b141561506b57615064868686856159c0565b90506150a1565b60018081111561507757fe5b83600181111561508357fe5b141561509b576150948685846159d9565b90506150a0565b600090505b5b95945050505050565b6000828211156150b957600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146151075782615109565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615204576151733a8610615150573a615152565b855b615165888a6159a190919063ffffffff16565b61593890919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050506151ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d686022913960400191505060405180910390fd5b61528c565b6152298561521b888a6159a190919063ffffffff16565b61593890919063ffffffff16565b91506152368482846159f0565b61528b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615bfc6022913960400191505060405180910390fd5b5b5095945050505050565b60006004541461530e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f776e657273206861766520616c7265616479206265656e207365747570000081525060200191505060405180910390fd5b8151811115615368576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615ba46023913960400191505060405180910390fd5b60018110156153c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c7a6024913960400191505060405180910390fd5b60006001905060008090505b835181101561565b5760008482815181106153e557fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156154595750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6154cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4475706c6963617465206f776e657220616464726573732070726f766964656481525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506153ce565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615803576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615b346025913960400191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614615934576158c182825a6159d9565b615933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f742066696e69736820696e697469616c697a6174696f6e0081525060200191505060405180910390fd5b5b5050565b60008083141561594b576000905061596c565b600082840290508284828161595c57fe5b041461596757600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b6000808284019050838110156159b657600080fd5b8091505092915050565b6000806000845160208601878987f19050949350505050565b60008060008451602086018786f490509392505050565b600060608383604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808251602084016000896127105a03f16040513d81016040523d6000823e3d60008114615af25760208114615afa5760009450615b04565b829450615b04565b8151158315171594505b50505050939250505056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6f64756c6573206861766520616c7265616479206265656e20696e697469616c697a6564496e76616c696420636f6e7472616374207369676e61747572652070726f7669646564496e76616c696420707265764d6f64756c652c206d6f64756c6520706169722070726f76696465645468726573686f6c642063616e6e6f7420657863656564206f776e657220636f756e744e6577206f776e657220636f756e74206e6565647320746f206265206c6172676572207468616e206e6577207468726573686f6c64436f756c64206e6f74207061792067617320636f737473207769746820746f6b656e496e76616c696420707265764f776e65722c206f776e657220706169722070726f7669646564496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a2064617461206e6f7420636f6d706c6574655468726573686f6c64206e6565647320746f2062652067726561746572207468616e2030496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a20696e736964652073746174696320706172744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207468697320636f6e74726163744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d20616e20656e61626c6564206d6f64756c65496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a206c656e677468206e6f742070726573656e74436f756c64206e6f74207061792067617320636f73747320776974682065746865724e6f7420656e6f7567682067617320746f20657865637574652073616665207472616e73616374696f6ea265627a7a72315820116e4e6802bb4e3fb39740b715dce7a0a6f267ae9d0a756a642191516fd1959164736f6c63430005100032",
  "sourceMap": "658:19119:0:-;;;2468:255;8:9:-1;5:2;;;30:1;27;20:12;5:2;2468:255:0;2715:1;2703:9;:13;;;;658:19119;;;;;;",
  "deployedSourceMap": "658:19119:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1251:1:3;1239:9;:13;:37;;;;1275:1;1256:8;;:15;;:20;1239:37;1235:74;;;1292:7;;1235:74;1318:12;376:66;1333:29;;1318:44;;1372:15;1501:4;1495:11;1484:22;;1549:1;1530:21;;:7;:21;;;1526:437;;1681:14;1678:1;1675;1662:34;1772:1;1769;1753:14;1750:1;1747;1738:7;1733:3;1728:46;1812:16;1809:1;1806;1791:38;1861:1;1852:7;1849:14;1846:2;;;1876:16;1873:1;1866:27;1846:2;1922:16;1919:1;1912:27;1644:309;1108:861;;;658:19119:0;16853:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16853:367:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16853:367:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16853:367:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16853:367:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16853:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16853:367:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2260:645:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2260:645:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2260:645:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16188:507:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16188:507:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16188:507:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16188:507:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16188:507:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16188:507:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16188:507:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16188:507:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16188:507:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6032:166:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6032:166:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6032:166:6;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3039:603:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3039:603:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3039:603:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3039:603:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3039:603:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3039:603:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3039:603:5;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3993:949;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3993:949:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3993:949:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3993:949:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3993:949:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2127:49:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2127:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2127:49:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1337:540:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1337:540:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1337:540:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;5464:441:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5464:441:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5464:441:6;;;;;;;;;;;;;;;;;:::i;:::-;;5491:1886:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5491:1886:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;5491:1886:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;5491:1886:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5491:1886:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5491:1886:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;5491:1886:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5491:1886:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5491:1886:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2287:69;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2287:69:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2287:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;804:302:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;804:302:9;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;804:302:9;;;;;;;;;;;;;;;;;;;:::i;:::-;;15365:207:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15365:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15365:207:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15365:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15365:207:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15365:207:0;;;;;;;;;;;;:::i;:::-;;6280:465:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6280:465:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6280:465:6;;;;;;;;;;;;;;;;;858:43:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;858:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;858:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1968:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1968:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5030:197:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5030:197:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5030:197:5;;;;;;;;;;;;;;;;;3339:1122:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3339:1122:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3339:1122:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3339:1122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3339:1122:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3339:1122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3339:1122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3339:1122:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3339:1122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14111:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14111:583:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14111:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14111:583:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14111:583:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14111:583:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5421:808:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5421:808:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5421:808:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5421:808:5;;;;;;;;;;;;;;;;;;14938:265:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14938:265:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14938:265:0;;;;;;;;;;;;;;;;;:::i;:::-;;19271:504;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19271:504:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19271:504:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19271:504:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19271:504:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19271:504:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19271:504:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2138:565:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2138:565:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2138:565:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4416:859:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4416:859:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4416:859:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5911:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5911:115:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17933:652:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17933:652:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;17933:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17933:652:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17933:652:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17933:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17933:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17933:652:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:135:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;967:135:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;967:135:3;;;;;;;;;;;;;;;;;;;:::i;:::-;;1994:30:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1994:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3247:835:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3247:835:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3247:835:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;907:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;907:40:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;907:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16853:367;16958:7;16981:23;1588:66;17041:17;;17070:7;17060:18;;;;;;17030:49;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17030::0;;;17007:82;;;;;;16981:108;;17151:4;17146:10;;17163:4;17158:10;;17170:15;;17187;17129:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17129:74:0;;;17106:107;;;;;;17099:114;;;16853:367;;;:::o;2260:645:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2440:1:6;2423:19;;:5;:19;;;;:47;;;;;479:3;2446:24;;:5;:24;;;;2423:47;2415:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2588:1;2563:27;;:6;:13;2570:5;2563:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;2555:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2648:6;:23;479:3;2648:23;;;;;;;;;;;;;;;;;;;;;;;;;2632:6;:13;2639:5;2632:13;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;2707:5;2681:6;:23;479:3;2681:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2722:10;;:12;;;;;;;;;;;;;2749:17;2760:5;2749:17;;;;;;;;;;;;;;;;;;;;;;2847:10;2834:9;;:23;2830:68;;2871:27;2887:10;2871:15;:27::i;:::-;2830:68;2260:645;;:::o;16188:507:0:-;16297:6;16319:19;16341:21;16356:5;;16341:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16341:21:0;;;;;;:14;:21::i;:::-;16319:43;;16397:1;16376:10;;:17;;:22;16372:281;;;16453:1;16422:14;:27;16437:11;16422:27;;;;;;;;;;;;:32;;16414:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16372:281;;;16588:54;16604:11;16617:5;;16588:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16588:54:0;;;;;;16624:10;;16588:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16588:54:0;;;;;;16636:5;16588:15;:54::i;:::-;16372:281;181:10:18;16669:19:0;;16662:26;;;16188:507;;;;;;:::o;6032:166:6:-;6109:4;479:3;6136:24;;:5;:24;;;;:55;;;;;6189:1;6164:27;;:6;:13;6171:5;6164:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;6136:55;6129:62;;6032:166;;;:::o;3039:603:5:-;3178:12;673:3;3263:30;;:10;:30;;;;:67;;;;;3328:1;3297:33;;:7;:19;3305:10;3297:19;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;3263:67;3255:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3465:46;3473:2;3477:5;3484:4;3490:9;3501;3465:7;:46::i;:::-;3455:56;;3525:7;3521:114;;;3566:10;3539:38;;;;;;;;;;;;3521:114;;;3624:10;3597:38;;;;;;;;;;;;3521:114;3039:603;;;;;;:::o;3993:949::-;4142:12;4156:23;4205:53;4231:2;4235:5;4242:4;4248:9;4205:25;:53::i;:::-;4195:63;;4413:4;4407:11;4655:4;4637:16;4633:27;4628:3;4624:37;4618:4;4611:51;4717:16;4712:3;4705:29;4811:16;4808:1;4801:4;4796:3;4792:14;4777:51;4923:3;4909:17;;4341:595;;;;;;;;:::o;2127:49:0:-;;;;;;;;;;;;;;;;;:::o;1337:540:5:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1511:1:5;1484:29;;1492:6;1484:29;;;;:68;;;;;673:3;1517:35;;1525:6;1517:35;;;;1484:68;1476:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1683:1;1647:38;;:7;:24;1663:6;1647:24;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;1639:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:7;:25;673:3;1756:25;;;;;;;;;;;;;;;;;;;;;;;;;1729:7;:24;1745:6;1729:24;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;1827:6;1791:7;:25;673:3;1791:25;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;1849:21;1863:6;1849:21;;;;;;;;;;;;;;;;;;;;;;1337:540;:::o;5464:441:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5648:10:6;;5634;:24;;5626:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5782:1;5768:10;:15;;5760:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5846:10;5834:9;:22;;;;5871:27;5888:9;;5871:27;;;;;;;;;;;;;;;;;;5464:441;:::o;5491:1886:0:-;5841:12;5869:14;5996:23;6022:210;6061:2;6065:5;6072:4;;6022:210;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6022:210:0;;;;;;6078:9;6125;6136:7;6145:8;6155;6165:14;6213:5;;6022:21;:210::i;:::-;5996:236;;6301:5;;:7;;;;;;;;;;;;;6341:10;6331:21;;;;;;6322:30;;6366:53;6382:6;6390:10;6402;;6366:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6366:53:0;;;;;;6414:4;6366:15;:53::i;:::-;5491:1886;6460:9;6447;:22;;6439:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6629:15;6647:9;6629:27;;6791:92;6799:2;6803:5;6810:4;;6791:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6791:92:0;;;;;;6816:9;6840:1;6827:9;:14;:31;;;;;6857:1;6845:8;:13;6827:31;:55;;6873:9;6827:55;;;6861:9;6827:55;6791:7;:92::i;:::-;6781:102;;6907:22;6919:9;6907:7;:11;;:22;;;;:::i;:::-;6897:32;;7078:15;7096:1;7078:19;;7126:1;7115:8;:12;7111:128;;;7157:67;7171:7;7180;7189:8;7199;7209:14;7157:13;:67::i;:::-;7147:77;;7111:128;7256:7;7252:108;;;7270:33;7287:6;7295:7;7270:33;;;;;;;;;;;;;;;;;;;;;;;;7252:108;;;7327:33;7344:6;7352:7;7327:33;;;;;;;;;;;;;;;;;;;;;;;;7252:108;5491:1886;;;;;;;;;;;;;;;;;:::o;2287:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;804:302:9:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;977:1:9;954:25;;:11;:25;;;;946:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1043:11;1030:10;;:24;;;;;;;;;;;;;;;;;;1069:30;1087:11;1069:30;;;;;;;;;;;;;;;;;;;;;;804:302;:::o;15365:207:0:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15458:15:0;15476:21;15491:5;;15476:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15476:21:0;;;;;;:14;:21::i;:::-;15458:39;;15533:1;15507:14;:23;15522:7;15507:23;;;;;;;;;;;:27;;;;15557:7;15549:16;;;;;;;;;;316:1:11;15365:207:0;;:::o;6280:465:6:-;6346:16;6378:22;6417:10;;6403:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;6403:25:6;;;;6378:50;;6472:13;6488:1;6472:17;;6499:20;6522:6;:23;479:3;6522:23;;;;;;;;;;;;;;;;;;;;;;;;;6499:46;;6555:162;479:3;6561:31;;:12;:31;;;6555:162;;6623:12;6608:5;6614;6608:12;;;;;;;;;;;;;:27;;;;;;;;;;;6664:6;:20;6671:12;6664:20;;;;;;;;;;;;;;;;;;;;;;;;;6649:35;;6698:8;;;;;;;6555:162;;;6733:5;6726:12;;;;;6280:465;:::o;858:43:0:-;;;;;;;;;;;;;;;;;;;:::o;1968:20::-;;;;:::o;5030:197:5:-;5097:16;5130:22;5157:41;673:3;5195:2;5157:19;:41::i;:::-;5129:69;;;5215:5;5208:12;;;5030:197;:::o;3339:1122:0:-;3660:1;3641:20;;:15;;:20;3633:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:66;3744:25;;3771:4;3733:43;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3733:43:0;;;3723:54;;;;;;3705:15;:72;;;;3787:32;3799:7;;3787:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3787:32:0;;;;;;3808:10;3787:11;:32::i;:::-;3860:1;3833:29;;:15;:29;;;3829:78;;3864:43;3891:15;3864:26;:43::i;:::-;3829:78;4042:22;4055:2;4059:4;;4042:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4042:22:0;;;;;;:12;:22::i;:::-;4089:1;4079:7;:11;4075:380;;;4385:59;4399:7;4408:1;4411;4414:12;4428:15;4385:13;:59::i;:::-;;4075:380;3339:1122;;;;;;;;;;:::o;14111:583::-;14261:7;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:16:0;14303:9;14284:28;;14466:46;14474:2;14478:5;14485:4;;14466:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14466:46:0;;;;;;14491:9;14502;14466:7;:46::i;:::-;14458:55;;;;;;14523:19;14556:9;14545:8;:20;14523:42;;14673:11;14656:29;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14656:29:0;;;14642:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14642:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5421:808:5;5528:22;5552:12;5643:8;5629:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5629:23:5;;;;5621:31;;5696:19;5718:1;5696:23;;5729:21;5753:7;:14;5761:5;5753:14;;;;;;;;;;;;;;;;;;;;;;;;;5729:38;;5777:238;5808:3;5783:29;;:13;:29;;;;:66;;;;;673:3;5816:33;;:13;:33;;;;5783:66;:92;;;;;5867:8;5853:11;:22;5783:92;5777:238;;;5912:13;5891:5;5897:11;5891:18;;;;;;;;;;;;;:34;;;;;;;;;;;5955:7;:22;5963:13;5955:22;;;;;;;;;;;;;;;;;;;;;;;;;5939:38;;5991:13;;;;;;;5777:238;;;6031:13;6024:20;;6201:11;6194:5;6187:26;6173:50;;;;;;;:::o;14938:265:0:-;15051:1;15021:32;;:6;:18;15028:10;15021:18;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;15013:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15142:1;15098:14;:26;15113:10;15098:26;;;;;;;;;;;;;;;:41;15125:13;15098:41;;;;;;;;;;;:45;;;;15185:10;15158:38;;15170:13;15158:38;;;;;;;;;;14938:265;:::o;19271:504::-;19614:7;19654:113;19676:2;19680:5;19687:4;19693:9;19704;19715:7;19724:8;19734;19744:14;19760:6;19654:21;:113::i;:::-;19644:124;;;;;;19637:131;;19271:504;;;;;;;;;;;;:::o;2138:565:5:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2360:1:5;2333:29;;2341:6;2333:29;;;;:68;;;;;673:3;2366:35;;2374:6;2366:35;;;;2333:68;2325:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2495:6;2455:47;;:7;:28;2471:10;2455:28;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;2447:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2588:7;:24;2604:6;2588:24;;;;;;;;;;;;;;;;;;;;;;;;;2557:7;:28;2573:10;2557:28;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;2657:1;2622:7;:24;2638:6;2622:24;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;2674:22;2689:6;2674:22;;;;;;;;;;;;;;;;;;;;;;2138:565;;:::o;4416:859:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4607:1:6;4587:22;;:8;:22;;;;:53;;;;;479:3;4613:27;;:8;:27;;;;4587:53;4579:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4761:1;4733:30;;:6;:16;4740:8;4733:16;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;4725:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4916:1;4896:22;;:8;:22;;;;:53;;;;;479:3;4922:27;;:8;:27;;;;4896:53;4888:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5023:8;5002:29;;:6;:17;5009:9;5002:17;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;4994:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5103:6;:16;5110:8;5103:16;;;;;;;;;;;;;;;;;;;;;;;;;5084:6;:16;5091:8;5084:16;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;5149:8;5129:6;:17;5136:9;5129:17;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;5194:1;5167:6;:16;5174:8;5167:16;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;5211:22;5224:8;5211:22;;;;;;;;;;;;;;;;;;;;;;5248:20;5259:8;5248:20;;;;;;;;;;;;;;;;;;;;;;4416:859;;;:::o;5911:115::-;5980:7;6010:9;;6003:16;;5911:115;:::o;17933:652:0:-;18279:12;18307:18;1405:66;18362:16;;18380:2;18384:5;18401:4;18391:15;;;;;;18408:9;18419;18430:7;18439:8;18449;18459:14;18475:6;18351:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18351:131:0;;;18328:164;;;;;;18307:185;;18531:4;18526:10;;18543:4;18538:10;;18550:15;;18567:10;18509:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18509:69:0;;;18502:76;;;17933:652;;;;;;;;;;;;:::o;967:135:3:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1060:35:3;1087:7;1060:26;:35::i;:::-;967:135;:::o;1994:30:0:-;;;;:::o;3247:835:6:-;252:4:11;230:27;;:10;:27;;;222:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3473:10:6;3468:1;3455:10;;:14;:28;;3447:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3656:1;3639:19;;:5;:19;;;;:47;;;;;479:3;3662:24;;:5;:24;;;;3639:47;3631:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3760:5;3739:26;;:6;:17;3746:9;3739:17;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;3731:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3838:6;:13;3845:5;3838:13;;;;;;;;;;;;;;;;;;;;;;;;;3818:6;:17;3825:9;3818:17;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;3885:1;3861:6;:13;3868:5;3861:13;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3897:10;;:12;;;;;;;;;;;;;;3924:19;3937:5;3924:19;;;;;;;;;;;;;;;;;;;;;;4024:10;4011:9;;:23;4007:68;;4048:27;4064:10;4048:15;:27::i;:::-;4007:68;3247:835;;;:::o;907:40:0:-;;;;;;;;;;;;;;;;;;;:::o;8890:4309::-;9084:18;9105:9;;9084:30;;9186:1;9173:10;:14;9165:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9328:18;9343:2;9328:10;:14;;:18;;;;:::i;:::-;9307:10;:17;:39;;9299:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9438:17;9466:1;9438:30;;9478:20;9508:7;9525:9;9544;9563;9591:1;9587:5;;9582:3611;9598:10;9594:1;:14;9582:3611;;;9641:29;9656:10;9668:1;9641:14;:29::i;:::-;9629:41;;;;;;;;;;;;9750:1;9745;:6;;;9741:3211;;;9901:1;9893:10;;9870:34;;10305:18;10320:2;10305:10;:14;;:18;;;;:::i;:::-;10299:1;10291:10;;:32;;10283:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10545:10;:17;10523:18;10538:2;10531:1;10523:10;;:14;;:18;;;;:::i;:::-;:39;;10515:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10766:28;10969:4;10965:1;10953:10;10949:18;10945:29;10939:36;10915:60;;11066:10;:17;11018:44;11041:20;11018:18;11033:2;11026:1;11018:10;;:14;;:18;;;;:::i;:::-;:22;;:44;;;;:::i;:::-;:65;;11010:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11196:30;11531:4;11527:1;11515:10;11511:18;11507:29;11486:50;;181:10:18;11658:19:0;;11579:98;;;11599:12;11579:50;;;11630:4;11636:17;11579:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11579:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11579:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11579:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11579:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11579:75:0;;;;;;;;;;;;;;;;:98;;;;11571:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9741:3211;;;;;11800:1;11795;:6;;;11791:1161;;;11947:1;11939:10;;11916:34;;12135:12;12121:26;;:10;:26;;;:73;;;;12193:1;12151:14;:28;12166:12;12151:28;;;;;;;;;;;;;;;:38;12180:8;12151:38;;;;;;;;;;;;:43;;12121:73;12113:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12347:11;:41;;;;;12376:12;12362:26;;:10;:26;;;;12347:41;12343:130;;;12453:1;12412:14;:28;12427:12;12412:28;;;;;;;;;;;;;;;:38;12441:8;12412:38;;;;;;;;;;;:42;;;;12343:130;11791:1161;;;12501:2;12497:1;:6;;;12493:459;;;12685:97;12758:8;12705:62;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12705:62:0;;;12695:73;;;;;;12774:1;12770;:5;12777:1;12780;12685:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12685:97:0;;;;;;;;12670:112;;12493:459;;;12909:28;12919:8;12929:1;12932;12935;12909:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12909:28:0;;;;;;;;12894:43;;12493:459;11791:1161;9741:3211;13006:9;12991:24;;:12;:24;;;:62;;;;;13051:1;13019:34;;:6;:20;13026:12;13019:20;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;12991:62;:97;;;;;479:3:6;13057:31:0;;:12;:31;;;;12991:97;12965:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13170:12;13158:24;;9610:3;;;;;;;9582:3611;;;8890:4309;;;;;;;;;;;:::o;202:429:2:-;340:12;385:19;372:32;;;;;;;;:9;:32;;;;;;;;;368:256;;;428:35;440:2;444:5;451:4;457:5;428:11;:35::i;:::-;418:45;;368:256;;;495:27;482:40;;;;;;;;:9;:40;;;;;;;;;478:146;;;546:36;566:2;570:4;576:5;546:19;:36::i;:::-;536:46;;478:146;;;619:5;609:15;;478:146;368:256;202:429;;;;;;;:::o;1215:131:13:-;1273:7;1301:1;1296;:6;;1288:15;;;;;;1309:9;1325:1;1321;:5;1309:17;;1340:1;1333:8;;;1215:131;;;;:::o;7383:952:0:-;7587:15;7676:24;7729:1;7703:28;;:14;:28;;;:57;;7746:14;7703:57;;;7734:9;7703:57;7676:84;;7794:1;7774:22;;:8;:22;;;7770:559;;;7927:73;7963:11;7952:8;:22;:47;;7988:11;7952:47;;;7977:8;7952:47;7927:20;7939:7;7927;:11;;:20;;;;:::i;:::-;:24;;:73;;;;:::i;:::-;7917:83;;8079:8;:13;;:22;8093:7;8079:22;;;;;;;;;;;;;;;;;;;;;;;8071:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7770:559;;;8181:34;8206:8;8181:20;8193:7;8181;:11;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;8171:44;;8237:42;8251:8;8261;8271:7;8237:13;:42::i;:::-;8229:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7770:559;7383:952;;;;;;;;:::o;785:1235:6:-;1028:1;1015:9;;:14;1007:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1171:7;:14;1157:10;:28;;1149:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1309:1;1295:10;:15;;1287:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1398:20;479:3;1398:38;;1451:9;1463:1;1451:13;;1446:451;1470:7;:14;1466:1;:18;1446:451;;;1550:13;1566:7;1574:1;1566:10;;;;;;;;;;;;;;1550:26;;1615:1;1598:19;;:5;:19;;;;:47;;;;;479:3;1621:24;;:5;:24;;;;1598:47;1590:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1771:1;1746:27;;:6;:13;1753:5;1746:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;1738:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1847:5;1824:6;:20;1831:12;1824:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;1881:5;1866:20;;1446:451;1486:3;;;;;;;1446:451;;;;479:3;1906:6;:20;1913:12;1906:20;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;1967:7;:14;1954:10;:27;;;;2003:10;1991:9;:22;;;;785:1235;;;:::o;449:250:3:-;521:12;376:66;536:29;;521:44;;675:7;669:4;662:21;648:45;;:::o;736:434:5:-;865:1;828:39;;:7;:25;673:3;828:25;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;820:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;673:3;919:7;:25;673:3;919:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;991:1;977:16;;:2;:16;;;973:190;;1087:40;1107:2;1111:4;1117:9;1087:19;:40::i;:::-;1079:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;973:190;736:434;;:::o;341:381:13:-;399:7;628:1;623;:6;619:35;;;646:1;639:8;;;;619:35;660:9;676:1;672;:5;660:17;;700:1;695;691;:5;;;;;;:10;683:19;;;;;;716:1;709:8;;;341:381;;;;;:::o;1223:921:12:-;1332:7;1341:9;1352;1652:3;1646:4;1642:14;1714:4;1700:12;1696:23;1684:10;1680:40;1674:47;1669:52;;1779:4;1765:12;1761:23;1749:10;1745:40;1739:47;1734:52;;2123:4;2114;2100:12;2096:23;2084:10;2080:40;2074:47;2070:58;2065:63;;1608:530;;;;;;:::o;1409:131:13:-;1467:7;1482:9;1498:1;1494;:5;1482:17;;1518:1;1513;:6;;1505:15;;;;;;1534:1;1527:8;;;1409:131;;;;:::o;637:316:2:-;753:12;935:1;932;925:4;919:11;912:4;906;902:15;895:5;891:2;884:5;879:58;868:69;;854:93;;;;;;:::o;959:310::-;1068:12;1251:1;1248;1241:4;1235:11;1228:4;1222;1218:15;1214:2;1207:5;1194:59;1183:70;;1169:94;;;;;:::o;438:807:10:-;575:16;607:17;680:8;690:6;627:70;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;627:70:10;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;627:70:10;607:90;;874:1;871;864:4;858:11;851:4;845;841:15;838:1;831:5;823;818:3;814:15;809:67;906:4;900:11;946:16;941:3;937:26;931:4;924:40;1000:16;997:1;992:3;977:40;1037:16;1071:1;1066:33;;;;1117:4;1112:76;;;;1226:1;1211:16;;1030:199;;1066:33;1090:7;1075:22;;1066:33;;1112:76;1179:3;1173:10;1166:18;1156:7;1149:15;1146:39;1139:47;1124:62;;1030:199;;780:459;;;;;;;;:::o",
  "source": "pragma solidity >=0.5.0 <0.7.0;\nimport \"./base/ModuleManager.sol\";\nimport \"./base/OwnerManager.sol\";\nimport \"./base/FallbackManager.sol\";\nimport \"./common/MasterCopy.sol\";\nimport \"./common/SignatureDecoder.sol\";\nimport \"./common/SecuredTokenTransfer.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\nimport \"./external/GnosisSafeMath.sol\";\n\n/// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.\n/// @author Stefan George - <stefan@gnosis.io>\n/// @author Richard Meissner - <richard@gnosis.io>\n/// @author Ricardo Guilherme Schmidt - (Status Research & Development GmbH) - Gas Token Payment\ncontract GnosisSafe\n    is MasterCopy, ModuleManager, OwnerManager, SignatureDecoder, SecuredTokenTransfer, ISignatureValidatorConstants, FallbackManager {\n\n    using GnosisSafeMath for uint256;\n\n    string public constant NAME = \"Gnosis Safe\";\n    string public constant VERSION = \"1.1.1\";\n\n    //keccak256(\n    //    \"EIP712Domain(address verifyingContract)\"\n    //);\n    bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749;\n\n    //keccak256(\n    //    \"SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)\"\n    //);\n    bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;\n\n    //keccak256(\n    //    \"SafeMessage(bytes message)\"\n    //);\n    bytes32 private constant SAFE_MSG_TYPEHASH = 0x60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca;\n\n    event ApproveHash(\n        bytes32 indexed approvedHash,\n        address indexed owner\n    );\n    event SignMsg(\n        bytes32 indexed msgHash\n    );\n    event ExecutionFailure(\n        bytes32 txHash, uint256 payment\n    );\n    event ExecutionSuccess(\n        bytes32 txHash, uint256 payment\n    );\n\n    uint256 public nonce;\n    bytes32 public domainSeparator;\n    // Mapping to keep track of all message hashes that have been approve by ALL REQUIRED owners\n    mapping(bytes32 => uint256) public signedMessages;\n    // Mapping to keep track of all hashes (message or transaction) that have been approve by ANY owners\n    mapping(address => mapping(bytes32 => uint256)) public approvedHashes;\n\n    // This constructor ensures that this contract can only be used as a master copy for Proxy contracts\n    constructor() public {\n        // By setting the threshold it is not possible to call setup anymore,\n        // so we create a Safe with 0 owners and threshold 1.\n        // This is an unusable Safe, perfect for the mastercopy\n        threshold = 1;\n    }\n\n    /// @dev Setup function sets initial storage of contract.\n    /// @param _owners List of Safe owners.\n    /// @param _threshold Number of required confirmations for a Safe transaction.\n    /// @param to Contract address for optional delegate call.\n    /// @param data Data payload for optional delegate call.\n    /// @param fallbackHandler Handler for fallback calls to this contract\n    /// @param paymentToken Token that should be used for the payment (0 is ETH)\n    /// @param payment Value that should be paid\n    /// @param paymentReceiver Adddress that should receive the payment (or 0 if tx.origin)\n    function setup(\n        address[] calldata _owners,\n        uint256 _threshold,\n        address to,\n        bytes calldata data,\n        address fallbackHandler,\n        address paymentToken,\n        uint256 payment,\n        address payable paymentReceiver\n    )\n        external\n    {\n        require(domainSeparator == 0, \"Domain Separator already set!\");\n        domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, this));\n        setupOwners(_owners, _threshold);\n        if (fallbackHandler != address(0)) internalSetFallbackHandler(fallbackHandler);\n        // As setupOwners can only be called if the contract has not been initialized we don't need a check for setupModules\n        setupModules(to, data);\n\n        if (payment > 0) {\n            // To avoid running into issues with EIP-170 we reuse the handlePayment function (to avoid adjusting code of that has been verified we do not adjust the method itself)\n            // baseGas = 0, gasPrice = 1 and gas = payment => amount = (payment + 0) * 1 = payment\n            handlePayment(payment, 0, 1, paymentToken, paymentReceiver);\n        }\n    }\n\n    /// @dev Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.\n    ///      Note: The fees are always transfered, even if the user transaction fails.\n    /// @param to Destination address of Safe transaction.\n    /// @param value Ether value of Safe transaction.\n    /// @param data Data payload of Safe transaction.\n    /// @param operation Operation type of Safe transaction.\n    /// @param safeTxGas Gas that should be used for the Safe transaction.\n    /// @param baseGas Gas costs for that are indipendent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)\n    /// @param gasPrice Gas price that should be used for the payment calculation.\n    /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n    /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n    /// @param signatures Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})\n    function execTransaction(\n        address to,\n        uint256 value,\n        bytes calldata data,\n        Enum.Operation operation,\n        uint256 safeTxGas,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address payable refundReceiver,\n        bytes calldata signatures\n    )\n        external\n        returns (bool success)\n    {\n        bytes32 txHash;\n        // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n        {\n            bytes memory txHashData = encodeTransactionData(\n                to, value, data, operation, // Transaction info\n                safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, // Payment info\n                nonce\n            );\n            // Increase nonce and execute transaction.\n            nonce++;\n            txHash = keccak256(txHashData);\n            checkSignatures(txHash, txHashData, signatures, true);\n        }\n        require(gasleft() >= safeTxGas, \"Not enough gas to execute safe transaction\");\n        // Use scope here to limit variable lifetime and prevent `stack too deep` errors\n        {\n            uint256 gasUsed = gasleft();\n            // If no safeTxGas has been set and the gasPrice is 0 we assume that all available gas can be used\n            success = execute(to, value, data, operation, safeTxGas == 0 && gasPrice == 0 ? gasleft() : safeTxGas);\n            gasUsed = gasUsed.sub(gasleft());\n            // We transfer the calculated tx costs to the tx.origin to avoid sending it to intermediate contracts that have made calls\n            uint256 payment = 0;\n            if (gasPrice > 0) {\n                payment = handlePayment(gasUsed, baseGas, gasPrice, gasToken, refundReceiver);\n            }\n            if (success) emit ExecutionSuccess(txHash, payment);\n            else emit ExecutionFailure(txHash, payment);\n        }\n    }\n\n    function handlePayment(\n        uint256 gasUsed,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address payable refundReceiver\n    )\n        private\n        returns (uint256 payment)\n    {\n        // solium-disable-next-line security/no-tx-origin\n        address payable receiver = refundReceiver == address(0) ? tx.origin : refundReceiver;\n        if (gasToken == address(0)) {\n            // For ETH we will only adjust the gas price to not be higher than the actual used gas price\n            payment = gasUsed.add(baseGas).mul(gasPrice < tx.gasprice ? gasPrice : tx.gasprice);\n            // solium-disable-next-line security/no-send\n            require(receiver.send(payment), \"Could not pay gas costs with ether\");\n        } else {\n            payment = gasUsed.add(baseGas).mul(gasPrice);\n            require(transferToken(gasToken, receiver, payment), \"Could not pay gas costs with token\");\n        }\n    }\n\n    /**\n    * @dev Checks whether the signature provided is valid for the provided data, hash. Will revert otherwise.\n    * @param dataHash Hash of the data (could be either a message hash or transaction hash)\n    * @param data That should be signed (this is passed to an external validator contract)\n    * @param signatures Signature data that should be verified. Can be ECDSA signature, contract signature (EIP-1271) or approved hash.\n    * @param consumeHash Indicates that in case of an approved hash the storage can be freed to save gas\n    */\n    function checkSignatures(bytes32 dataHash, bytes memory data, bytes memory signatures, bool consumeHash)\n        internal\n    {\n        // Load threshold to avoid multiple storage loads\n        uint256 _threshold = threshold;\n        // Check that a threshold is set\n        require(_threshold > 0, \"Threshold needs to be defined!\");\n        // Check that the provided signature data is not too short\n        require(signatures.length >= _threshold.mul(65), \"Signatures data too short\");\n        // There cannot be an owner with address 0.\n        address lastOwner = address(0);\n        address currentOwner;\n        uint8 v;\n        bytes32 r;\n        bytes32 s;\n        uint256 i;\n        for (i = 0; i < _threshold; i++) {\n            (v, r, s) = signatureSplit(signatures, i);\n            // If v is 0 then it is a contract signature\n            if (v == 0) {\n                // When handling contract signatures the address of the contract is encoded into r\n                currentOwner = address(uint256(r));\n\n                // Check that signature data pointer (s) is not pointing inside the static part of the signatures bytes\n                // This check is not completely accurate, since it is possible that more signatures than the threshold are send.\n                // Here we only check that the pointer is not pointing inside the part that is being processed\n                require(uint256(s) >= _threshold.mul(65), \"Invalid contract signature location: inside static part\");\n\n                // Check that signature data pointer (s) is in bounds (points to the length of data -> 32 bytes)\n                require(uint256(s).add(32) <= signatures.length, \"Invalid contract signature location: length not present\");\n\n                // Check if the contract signature is in bounds: start of data is s + 32 and end is start + signature length\n                uint256 contractSignatureLen;\n                // solium-disable-next-line security/no-inline-assembly\n                assembly {\n                    contractSignatureLen := mload(add(add(signatures, s), 0x20))\n                }\n                require(uint256(s).add(32).add(contractSignatureLen) <= signatures.length, \"Invalid contract signature location: data not complete\");\n\n                // Check signature\n                bytes memory contractSignature;\n                // solium-disable-next-line security/no-inline-assembly\n                assembly {\n                    // The signature data for contract signatures is appended to the concatenated signatures and the offset is stored in s\n                    contractSignature := add(add(signatures, s), 0x20)\n                }\n                require(ISignatureValidator(currentOwner).isValidSignature(data, contractSignature) == EIP1271_MAGIC_VALUE, \"Invalid contract signature provided\");\n            // If v is 1 then it is an approved hash\n            } else if (v == 1) {\n                // When handling approved hashes the address of the approver is encoded into r\n                currentOwner = address(uint256(r));\n                // Hashes are automatically approved by the sender of the message or when they have been pre-approved via a separate transaction\n                require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, \"Hash has not been approved\");\n                // Hash has been marked for consumption. If this hash was pre-approved free storage\n                if (consumeHash && msg.sender != currentOwner) {\n                    approvedHashes[currentOwner][dataHash] = 0;\n                }\n            } else if (v > 30) {\n                // To support eth_sign and similar we adjust v and hash the messageHash with the Ethereum message prefix before applying ecrecover\n                currentOwner = ecrecover(keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", dataHash)), v - 4, r, s);\n            } else {\n                // Use ecrecover with the messageHash for EOA signatures\n                currentOwner = ecrecover(dataHash, v, r, s);\n            }\n            require (\n                currentOwner > lastOwner && owners[currentOwner] != address(0) && currentOwner != SENTINEL_OWNERS,\n                \"Invalid owner provided\"\n            );\n            lastOwner = currentOwner;\n        }\n    }\n\n    /// @dev Allows to estimate a Safe transaction.\n    ///      This method is only meant for estimation purpose, therefore two different protection mechanism against execution in a transaction have been made:\n    ///      1.) The method can only be called from the safe itself\n    ///      2.) The response is returned with a revert\n    ///      When estimating set `from` to the address of the safe.\n    ///      Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`\n    /// @param to Destination address of Safe transaction.\n    /// @param value Ether value of Safe transaction.\n    /// @param data Data payload of Safe transaction.\n    /// @param operation Operation type of Safe transaction.\n    /// @return Estimate without refunds and overhead fees (base transaction and payload data gas costs).\n    function requiredTxGas(address to, uint256 value, bytes calldata data, Enum.Operation operation)\n        external\n        authorized\n        returns (uint256)\n    {\n        uint256 startGas = gasleft();\n        // We don't provide an error message here, as we use it to return the estimate\n        // solium-disable-next-line error-reason\n        require(execute(to, value, data, operation, gasleft()));\n        uint256 requiredGas = startGas - gasleft();\n        // Convert response to string and return via error message\n        revert(string(abi.encodePacked(requiredGas)));\n    }\n\n    /**\n    * @dev Marks a hash as approved. This can be used to validate a hash that is used by a signature.\n    * @param hashToApprove The hash that should be marked as approved for signatures that are verified by this contract.\n    */\n    function approveHash(bytes32 hashToApprove)\n        external\n    {\n        require(owners[msg.sender] != address(0), \"Only owners can approve a hash\");\n        approvedHashes[msg.sender][hashToApprove] = 1;\n        emit ApproveHash(hashToApprove, msg.sender);\n    }\n\n    /**\n    * @dev Marks a message as signed\n    * @param _data Arbitrary length data that should be marked as signed on the behalf of address(this)\n    */\n    function signMessage(bytes calldata _data)\n        external\n        authorized\n    {\n        bytes32 msgHash = getMessageHash(_data);\n        signedMessages[msgHash] = 1;\n        emit SignMsg(msgHash);\n    }\n\n    /**\n    * Implementation of ISignatureValidator (see `interfaces/ISignatureValidator.sol`)\n    * @dev Should return whether the signature provided is valid for the provided data.\n    *       The save does not implement the interface since `checkSignatures` is not a view method.\n    *       The method will not perform any state changes (see parameters of `checkSignatures`)\n    * @param _data Arbitrary length data signed on the behalf of address(this)\n    * @param _signature Signature byte array associated with _data\n    * @return a bool upon valid or invalid signature with corresponding _data\n    */\n    function isValidSignature(bytes calldata _data, bytes calldata _signature)\n        external\n        returns (bytes4)\n    {\n        bytes32 messageHash = getMessageHash(_data);\n        if (_signature.length == 0) {\n            require(signedMessages[messageHash] != 0, \"Hash not approved\");\n        } else {\n            // consumeHash needs to be false, as the state should not be changed\n            checkSignatures(messageHash, _data, _signature, false);\n        }\n        return EIP1271_MAGIC_VALUE;\n    }\n\n    /// @dev Returns hash of a message that can be signed by owners.\n    /// @param message Message that should be hashed\n    /// @return Message hash.\n    function getMessageHash(\n        bytes memory message\n    )\n        public\n        view\n        returns (bytes32)\n    {\n        bytes32 safeMessageHash = keccak256(\n            abi.encode(SAFE_MSG_TYPEHASH, keccak256(message))\n        );\n        return keccak256(\n            abi.encodePacked(byte(0x19), byte(0x01), domainSeparator, safeMessageHash)\n        );\n    }\n\n    /// @dev Returns the bytes that are hashed to be signed by owners.\n    /// @param to Destination address.\n    /// @param value Ether value.\n    /// @param data Data payload.\n    /// @param operation Operation type.\n    /// @param safeTxGas Fas that should be used for the safe transaction.\n    /// @param baseGas Gas costs for data used to trigger the safe transaction.\n    /// @param gasPrice Maximum gas price that should be used for this transaction.\n    /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n    /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n    /// @param _nonce Transaction nonce.\n    /// @return Transaction hash bytes.\n    function encodeTransactionData(\n        address to,\n        uint256 value,\n        bytes memory data,\n        Enum.Operation operation,\n        uint256 safeTxGas,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address refundReceiver,\n        uint256 _nonce\n    )\n        public\n        view\n        returns (bytes memory)\n    {\n        bytes32 safeTxHash = keccak256(\n            abi.encode(SAFE_TX_TYPEHASH, to, value, keccak256(data), operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce)\n        );\n        return abi.encodePacked(byte(0x19), byte(0x01), domainSeparator, safeTxHash);\n    }\n\n    /// @dev Returns hash to be signed by owners.\n    /// @param to Destination address.\n    /// @param value Ether value.\n    /// @param data Data payload.\n    /// @param operation Operation type.\n    /// @param safeTxGas Fas that should be used for the safe transaction.\n    /// @param baseGas Gas costs for data used to trigger the safe transaction.\n    /// @param gasPrice Maximum gas price that should be used for this transaction.\n    /// @param gasToken Token address (or 0 if ETH) that is used for the payment.\n    /// @param refundReceiver Address of receiver of gas payment (or 0 if tx.origin).\n    /// @param _nonce Transaction nonce.\n    /// @return Transaction hash.\n    function getTransactionHash(\n        address to,\n        uint256 value,\n        bytes memory data,\n        Enum.Operation operation,\n        uint256 safeTxGas,\n        uint256 baseGas,\n        uint256 gasPrice,\n        address gasToken,\n        address refundReceiver,\n        uint256 _nonce\n    )\n        public\n        view\n        returns (bytes32)\n    {\n        return keccak256(encodeTransactionData(to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce));\n    }\n}\n",
  "compiler": {
    "name": "solc",
    "version": "0.5.16+commit.9c3226ce.Emscripten.clang"
  },
  "networks": {
    "1": {
      "links": {},
      "events": {},
      "address": "0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F",
      "updated_at": 1587391878775
    },
    "4": {
      "links": {},
      "events": {},
      "address": "0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F",
      "updated_at": 1587391878875
    },
    "5": {
      "links": {},
      "events": {},
      "address": "0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F",
      "updated_at": 1587391879067
    },
    "42": {
      "links": {},
      "events": {},
      "address": "0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F",
      "updated_at": 1587391878968
    }
  },
  "schemaVersion": "3.1.0",
  "updatedAt": "2020-04-20T14:11:17.641Z",
  "devdoc": {
    "author": "Stefan George - <stefan@gnosis.io>Richard Meissner - <richard@gnosis.io>Ricardo Guilherme Schmidt - (Status Research & Development GmbH) - Gas Token Payment",
    "methods": {
      "addOwnerWithThreshold(address,uint256)": {
        "details": "Allows to add a new owner to the Safe and update the threshold at the same time.      This can only be done via a Safe transaction.",
        "params": {
          "_threshold": "New threshold.",
          "owner": "New owner address."
        }
      },
      "approveHash(bytes32)": {
        "details": "Marks a hash as approved. This can be used to validate a hash that is used by a signature.",
        "params": {
          "hashToApprove": "The hash that should be marked as approved for signatures that are verified by this contract."
        }
      },
      "changeMasterCopy(address)": {
        "details": "Allows to upgrade the contract. This can only be done via a Safe transaction.",
        "params": { "_masterCopy": "New contract address." }
      },
      "changeThreshold(uint256)": {
        "details": "Allows to update the number of required confirmations by Safe owners.      This can only be done via a Safe transaction.",
        "params": { "_threshold": "New threshold." }
      },
      "disableModule(address,address)": {
        "details": "Allows to remove a module from the whitelist.      This can only be done via a Safe transaction.",
        "params": {
          "module": "Module to be removed.",
          "prevModule": "Module that pointed to the module to be removed in the linked list"
        }
      },
      "enableModule(address)": {
        "details": "Allows to add a module to the whitelist.      This can only be done via a Safe transaction.",
        "params": { "module": "Module to be whitelisted." }
      },
      "encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)": {
        "details": "Returns the bytes that are hashed to be signed by owners.",
        "params": {
          "_nonce": "Transaction nonce.",
          "baseGas": "Gas costs for data used to trigger the safe transaction.",
          "data": "Data payload.",
          "gasPrice": "Maximum gas price that should be used for this transaction.",
          "gasToken": "Token address (or 0 if ETH) that is used for the payment.",
          "operation": "Operation type.",
          "refundReceiver": "Address of receiver of gas payment (or 0 if tx.origin).",
          "safeTxGas": "Fas that should be used for the safe transaction.",
          "to": "Destination address.",
          "value": "Ether value."
        },
        "return": "Transaction hash bytes."
      },
      "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)": {
        "details": "Allows to execute a Safe transaction confirmed by required number of owners and then pays the account that submitted the transaction.      Note: The fees are always transfered, even if the user transaction fails.",
        "params": {
          "baseGas": "Gas costs for that are indipendent of the transaction execution(e.g. base transaction fee, signature check, payment of the refund)",
          "data": "Data payload of Safe transaction.",
          "gasPrice": "Gas price that should be used for the payment calculation.",
          "gasToken": "Token address (or 0 if ETH) that is used for the payment.",
          "operation": "Operation type of Safe transaction.",
          "refundReceiver": "Address of receiver of gas payment (or 0 if tx.origin).",
          "safeTxGas": "Gas that should be used for the Safe transaction.",
          "signatures": "Packed signature data ({bytes32 r}{bytes32 s}{uint8 v})",
          "to": "Destination address of Safe transaction.",
          "value": "Ether value of Safe transaction."
        }
      },
      "execTransactionFromModule(address,uint256,bytes,uint8)": {
        "details": "Allows a Module to execute a Safe transaction without any further confirmations.",
        "params": {
          "data": "Data payload of module transaction.",
          "operation": "Operation type of module transaction.",
          "to": "Destination address of module transaction.",
          "value": "Ether value of module transaction."
        }
      },
      "execTransactionFromModuleReturnData(address,uint256,bytes,uint8)": {
        "details": "Allows a Module to execute a Safe transaction without any further confirmations and return data",
        "params": {
          "data": "Data payload of module transaction.",
          "operation": "Operation type of module transaction.",
          "to": "Destination address of module transaction.",
          "value": "Ether value of module transaction."
        }
      },
      "getMessageHash(bytes)": {
        "details": "Returns hash of a message that can be signed by owners.",
        "params": { "message": "Message that should be hashed" },
        "return": "Message hash."
      },
      "getModules()": {
        "details": "Returns array of first 10 modules.",
        "return": "Array of modules."
      },
      "getModulesPaginated(address,uint256)": {
        "details": "Returns array of modules.",
        "params": {
          "pageSize": "Maximum number of modules that should be returned.",
          "start": "Start of the page."
        },
        "return": "Array of modules."
      },
      "getOwners()": {
        "details": "Returns array of owners.",
        "return": "Array of Safe owners."
      },
      "getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)": {
        "details": "Returns hash to be signed by owners.",
        "params": {
          "_nonce": "Transaction nonce.",
          "baseGas": "Gas costs for data used to trigger the safe transaction.",
          "data": "Data payload.",
          "gasPrice": "Maximum gas price that should be used for this transaction.",
          "gasToken": "Token address (or 0 if ETH) that is used for the payment.",
          "operation": "Operation type.",
          "refundReceiver": "Address of receiver of gas payment (or 0 if tx.origin).",
          "safeTxGas": "Fas that should be used for the safe transaction.",
          "to": "Destination address.",
          "value": "Ether value."
        },
        "return": "Transaction hash."
      },
      "isValidSignature(bytes,bytes)": {
        "details": "Should return whether the signature provided is valid for the provided data.      The save does not implement the interface since `checkSignatures` is not a view method.      The method will not perform any state changes (see parameters of `checkSignatures`)",
        "params": {
          "_data": "Arbitrary length data signed on the behalf of address(this)",
          "_signature": "Signature byte array associated with _data"
        },
        "return": "a bool upon valid or invalid signature with corresponding _data"
      },
      "removeOwner(address,address,uint256)": {
        "details": "Allows to remove an owner from the Safe and update the threshold at the same time.      This can only be done via a Safe transaction.",
        "params": {
          "_threshold": "New threshold.",
          "owner": "Owner address to be removed.",
          "prevOwner": "Owner that pointed to the owner to be removed in the linked list"
        }
      },
      "requiredTxGas(address,uint256,bytes,uint8)": {
        "details": "Allows to estimate a Safe transaction.      This method is only meant for estimation purpose, therefore two different protection mechanism against execution in a transaction have been made:      1.) The method can only be called from the safe itself      2.) The response is returned with a revert      When estimating set `from` to the address of the safe.      Since the `estimateGas` function includes refunds, call this method to get an estimated of the costs that are deducted from the safe with `execTransaction`",
        "params": {
          "data": "Data payload of Safe transaction.",
          "operation": "Operation type of Safe transaction.",
          "to": "Destination address of Safe transaction.",
          "value": "Ether value of Safe transaction."
        },
        "return": "Estimate without refunds and overhead fees (base transaction and payload data gas costs)."
      },
      "setFallbackHandler(address)": {
        "details": "Allows to add a contract to handle fallback calls.      Only fallback calls without value and with data will be forwarded.      This can only be done via a Safe transaction.",
        "params": { "handler": "contract to handle fallbacks calls." }
      },
      "setup(address[],uint256,address,bytes,address,address,uint256,address)": {
        "details": "Setup function sets initial storage of contract.",
        "params": {
          "_owners": "List of Safe owners.",
          "_threshold": "Number of required confirmations for a Safe transaction.",
          "data": "Data payload for optional delegate call.",
          "fallbackHandler": "Handler for fallback calls to this contract",
          "payment": "Value that should be paid",
          "paymentReceiver": "Adddress that should receive the payment (or 0 if tx.origin)",
          "paymentToken": "Token that should be used for the payment (0 is ETH)",
          "to": "Contract address for optional delegate call."
        }
      },
      "signMessage(bytes)": {
        "details": "Marks a message as signed",
        "params": {
          "_data": "Arbitrary length data that should be marked as signed on the behalf of address(this)"
        }
      },
      "swapOwner(address,address,address)": {
        "details": "Allows to swap/replace an owner from the Safe with another address.      This can only be done via a Safe transaction.",
        "params": {
          "newOwner": "New owner address.",
          "oldOwner": "Owner address to be replaced.",
          "prevOwner": "Owner that pointed to the owner to be replaced in the linked list"
        }
      }
    },
    "title": "Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191."
  },
  "userdoc": {
    "methods": {
      "isValidSignature(bytes,bytes)": {
        "notice": "Implementation of ISignatureValidator (see `interfaces/ISignatureValidator.sol`)"
      }
    }
  }
}
