{
  "_format": "hh-sol-artifact-1",
  "contractName": "OptimismSpokeConnector",
  "sourceName": "contracts/messaging/connectors/optimism/OptimismSpokeConnector.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_domain",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_mirrorDomain",
          "type": "uint32"
        },
        {
          "internalType": "address",
          "name": "_amb",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_rootManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_mirrorConnector",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_processGas",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_reserveGas",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_delayBlocks",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_merkle",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_watcherManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasCap",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "Connector__processMessage_notUsed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__onlyOwner_notOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__onlyProposed_notProposedOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__ownershipDelayElapsed_delayNotElapsed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__proposeNewOwner_invalidProposal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__proposeNewOwner_noOwnershipChange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__renounceOwnership_invalidProposal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__renounceOwnership_noProposal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RateLimited__rateLimited_messageSendRateExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__index_indexMoreThan32Bytes",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "loc",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "len",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "slice",
          "type": "uint256"
        }
      ],
      "name": "TypedMemView__index_overrun",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__unsafeCopyTo_identityOOG",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__unsafeCopyTo_invalidPointer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__unsafeCopyTo_nullPointer",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "AggregateRootReceived",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "AggregateRootRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "AggregateRootVerified",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updated",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "DelayBlocksUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "leaf",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "message",
          "type": "bytes"
        }
      ],
      "name": "Dispatch",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "FundsWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_previous",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_updated",
          "type": "uint256"
        }
      ],
      "name": "GasCapUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "MessageProcessed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "leaf",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "aggregateRoot",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "aggregateIndex",
          "type": "uint256"
        }
      ],
      "name": "MessageProven",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "encodedData",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "MessageSent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previous",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "current",
          "type": "address"
        }
      ],
      "name": "MirrorConnectorUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "domain",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "mirrorDomain",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "amb",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "rootManager",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "mirrorConnector",
          "type": "address"
        }
      ],
      "name": "NewConnector",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "proposedOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipProposed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "leaf",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "returnData",
          "type": "bytes"
        }
      ],
      "name": "Process",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "updater",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newRateLimit",
          "type": "uint256"
        }
      ],
      "name": "SendRateLimitUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SenderAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SenderRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "watcherManager",
          "type": "address"
        }
      ],
      "name": "WatcherManagerChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "AMB",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DOMAIN",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MERKLE",
      "outputs": [
        {
          "internalType": "contract MerkleTreeManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIRROR_DOMAIN",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PROCESS_GAS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RESERVE_GAS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROOT_MANAGER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptProposedOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "addSender",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "allowlistedSenders",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "delay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "delayBlocks",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_destinationDomain",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_recipientAddress",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_messageBody",
          "type": "bytes"
        }
      ],
      "name": "dispatch",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "home",
      "outputs": [
        {
          "internalType": "contract IOutbox",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_potentialReplica",
          "type": "address"
        }
      ],
      "name": "isReplica",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastSentBlock",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "localDomain",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "messages",
      "outputs": [
        {
          "internalType": "enum SpokeConnector.MessageStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "mirrorConnector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "outboundRoot",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "pendingAggregateRoots",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "processMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newlyProposed",
          "type": "address"
        }
      ],
      "name": "proposeNewOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proposed",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proposedTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "message",
              "type": "bytes"
            },
            {
              "internalType": "bytes32[32]",
              "name": "path",
              "type": "bytes32[32]"
            },
            {
              "internalType": "uint256",
              "name": "index",
              "type": "uint256"
            }
          ],
          "internalType": "struct SpokeConnector.Proof[]",
          "name": "_proofs",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes32",
          "name": "_aggregateRoot",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32[32]",
          "name": "_aggregatePath",
          "type": "bytes32[32]"
        },
        {
          "internalType": "uint256",
          "name": "_aggregateIndex",
          "type": "uint256"
        }
      ],
      "name": "proveAndProcess",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "provenAggregateRoots",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "provenMessageRoots",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rateLimitBlocks",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_fraudulentRoot",
          "type": "bytes32"
        }
      ],
      "name": "removePendingAggregateRoot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "removeSender",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounced",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_encodedData",
          "type": "bytes"
        }
      ],
      "name": "send",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "sentMessageRoots",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_delayBlocks",
          "type": "uint256"
        }
      ],
      "name": "setDelayBlocks",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_gasCap",
          "type": "uint256"
        }
      ],
      "name": "setGasCap",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_mirrorConnector",
          "type": "address"
        }
      ],
      "name": "setMirrorConnector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_rateLimit",
          "type": "uint256"
        }
      ],
      "name": "setRateLimitBlocks",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_watcherManager",
          "type": "address"
        }
      ],
      "name": "setWatcherManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_expected",
          "type": "address"
        }
      ],
      "name": "verifySender",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "watcherManager",
      "outputs": [
        {
          "internalType": "contract WatcherManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "withdrawFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x6101606040523480156200001257600080fd5b5060405162003b8a38038062003b8a833981016040819052620000359162000403565b80808c8c8c8c8c8c8c8c8c8c808a8a8a8a8a6200005233620002c2565b8463ffffffff166000036200009d5760405162461bcd60e51b815260206004820152600c60248201526b32b6b83a3c903237b6b0b4b760a11b60448201526064015b60405180910390fd5b6001600160a01b038216620000e95760405162461bcd60e51b815260206004820152601160248201527032b6b83a3c903937b7ba26b0b730b3b2b960791b604482015260640162000094565b63ffffffff8086166080526001600160a01b0380851660a05283811660c05290851660e0528116156200012157620001218162000327565b604080516001600160a01b0385811682528481166020830152831681830152905163ffffffff86811692908816917f4f9c27c2fe3f84576ea469d367d044da53c45e951617e8389f2b5ed8db9d25f09181900360600190a350506003805460ff60a01b191690555050600480546001600160a01b0319166001600160a01b039390931692909217909155506001600755620cf84f8511620001f45760405162461bcd60e51b815260206004820152600c60248201526b2170726f636573732067617360a01b604482015260640162000094565b613a978411620002365760405162461bcd60e51b815260206004820152600c60248201526b21726573657276652067617360a01b604482015260640162000094565b6101208590526101408490526001600160a01b038216620002895760405162461bcd60e51b815260206004820152600c60248201526b217a65726f206d65726b6c6560a01b604482015260640162000094565b506001600160a01b03166101005260085550620002af9550869450506200039092505050565b50505050505050505050505050620004c2565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316178155600255600180549091169055565b600354604080516001600160a01b03928316815291831660208301527fc77bec288fc88f168427f2f7da682eadb26cac89d8d591af6e443da98dff2bbc910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b60105460408051918252602082018390527f877a02cb809da0364d23adca3cd50c451b53f279d3df632e1fc11eb66335bce5910160405180910390a1601055565b805163ffffffff81168114620003e657600080fd5b919050565b80516001600160a01b0381168114620003e657600080fd5b60008060008060008060008060008060006101608c8e0312156200042657600080fd5b620004318c620003d1565b9a506200044160208d01620003d1565b99506200045160408d01620003eb565b98506200046160608d01620003eb565b97506200047160808d01620003eb565b965060a08c0151955060c08c0151945060e08c01519350620004976101008d01620003eb565b9250620004a86101208d01620003eb565b91506101408c015190509295989b509295989b9093969950565b60805160a05160c05160e05161010051610120516101405161361962000571600039600081816103250152611d6701526000818161090e01528181611d880152611e1501526000818161073501528181610a8b01528181610fcb01526116cf015260006102b5015260006105430152600081816108c401528181610c330152818161188901526121f301526000818161048a01528181610671015281816116710152611c6701526136196000f3fe6080604052600436106102975760003560e01c80638456cb591161015a578063b95a2001116100c1578063d69f9d611161007a578063d69f9d61146108b2578063d7d317b3146108e6578063d88beda2146108fc578063db1b765914610930578063e0fed01014610950578063fa31de011461097057600080fd5b8063b95a2001146107ed578063c5b350df14610820578063cc39428314610835578063d1851c9214610855578063d232c22014610873578063d2a3cc711461089257600080fd5b8063a01892a511610113578063a01892a514610723578063a792c29b14610757578063ad9c0c2e14610777578063b1f8100d1461078d578063b2f87643146107ad578063b697f531146107cd57600080fd5b80638456cb591461064d5780638d3638f4146106625780638da5cb5b1461069557806398c9f2b9146106b35780639d3117c7146106e35780639fa92f9d1461071057600080fd5b8063572386ca116101fe57806365eaf11b116101b757806365eaf11b146105ad57806368742da6146105c25780636a42b8f8146105e25780636b04a933146105f8578063715018a6146106185780637850b0201461062d57600080fd5b8063572386ca146104ac578063579c1618146104dc5780635bd11efc146104f25780635c975abb146105125780635f61e3ec146105315780636159ada11461057d57600080fd5b80633cf52ffb116102505780633cf52ffb146103e55780633f4ba83a146103fa5780634ff746f61461040f578063508a109b1461042f5780635190bc531461044f57806352a9674b1461047857600080fd5b806314168416146102a35780631eeaabea146102f157806325e3beda146103135780632bb1ae7c146103555780632bbd59ca14610368578063301f07c3146103a557600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102d77f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020015b60405180910390f35b3480156102fd57600080fd5b5061031161030c366004612f91565b61099e565b005b34801561031f57600080fd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016102e8565b61031161036336600461304d565b610a48565b34801561037457600080fd5b50610398610383366004612f91565b600f6020526000908152604090205460ff1681565b6040516102e89190613098565b3480156103b157600080fd5b506103d56103c0366004612f91565b600a6020526000908152604090205460ff1681565b60405190151581526020016102e8565b3480156103f157600080fd5b50600254610347565b34801561040657600080fd5b50610311610beb565b34801561041b57600080fd5b5061031161042a36600461304d565b610c28565b34801561043b57600080fd5b5061031161044a3660046130c0565b610cce565b34801561045b57600080fd5b506103d561046a366004613171565b6001600160a01b0316301490565b34801561048457600080fd5b506102d77f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b857600080fd5b506103d56104c7366004612f91565b600c6020526000908152604090205460ff1681565b3480156104e857600080fd5b5061034760055481565b3480156104fe57600080fd5b5061031161050d366004613171565b610f90565b34801561051e57600080fd5b50600354600160a01b900460ff166103d5565b34801561053d57600080fd5b506105657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102e8565b34801561058957600080fd5b506103d5610598366004613171565b600d6020526000908152604090205460ff1681565b3480156105b957600080fd5b50610347610fc7565b3480156105ce57600080fd5b506103116105dd366004613171565b611050565b3480156105ee57600080fd5b5062093a80610347565b34801561060457600080fd5b50610311610613366004612f91565b6110cd565b34801561062457600080fd5b50610311611198565b34801561063957600080fd5b50610311610648366004612f91565b6111c3565b34801561065957600080fd5b506103116111f7565b34801561066e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102d7565b3480156106a157600080fd5b506000546001600160a01b0316610565565b3480156106bf57600080fd5b506103d56106ce366004612f91565b600b6020526000908152604090205460ff1681565b3480156106ef57600080fd5b506103476106fe366004612f91565b60096020526000908152604090205481565b34801561071c57600080fd5b5030610565565b34801561072f57600080fd5b506105657f000000000000000000000000000000000000000000000000000000000000000081565b34801561076357600080fd5b50600454610565906001600160a01b031681565b34801561078357600080fd5b5061034760085481565b34801561079957600080fd5b506103116107a8366004613171565b6112ab565b3480156107b957600080fd5b506103116107c8366004613171565b611349565b3480156107d957600080fd5b506103116107e8366004613171565b6113c5565b3480156107f957600080fd5b506102d76108083660046131a7565b600e6020526000908152604090205463ffffffff1681565b34801561082c57600080fd5b50610311611444565b34801561084157600080fd5b50600354610565906001600160a01b031681565b34801561086157600080fd5b506001546001600160a01b0316610565565b34801561087f57600080fd5b506000546001600160a01b0316156103d5565b34801561089e57600080fd5b506103116108ad366004613171565b6114b4565b3480156108be57600080fd5b506105657f000000000000000000000000000000000000000000000000000000000000000081565b3480156108f257600080fd5b5061034760065481565b34801561090857600080fd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b34801561093c57600080fd5b506103d561094b366004613171565b61158b565b34801561095c57600080fd5b5061031161096b366004612f91565b61159c565b34801561097c57600080fd5b5061099061098b3660046131c2565b6115d0565b6040516102e8929190613269565b6000546001600160a01b031633146109c9576040516311a8a1bb60e31b815260040160405180910390fd5b6008548103610a0e5760405162461bcd60e51b815260206004820152600c60248201526b2164656c6179426c6f636b7360a01b60448201526064015b60405180910390fd5b60405133815281907f8bd16320f3b60336ed5fd2a770eb7453e7e71cfef4462addffd7ae9dfe201c8e9060200160405180910390a2600855565b610a5061179f565b43600554600654610a619190613298565b1115610a80576040516346cf2af160e11b815260040160405180910390fd5b4360068190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b91906132ab565b6000818152600c602052604090205490915060ff1615610b615760405162461bcd60e51b81526020600482015260116024820152701c9bdbdd08185b1c9958591e481cd95b9d607a1b6044820152606401610a05565b600081604051602001610b7691815260200190565b6040516020818303038152906040529050610b9181846117ec565b6000828152600c602052604090819020805460ff19166001179055517fdcaa37a042a0087de79018c629bbd29cee82ca80bd9be394e1696bf9e935507790610bde908390869033906132c4565b60405180910390a1505050565b6000546001600160a01b03163314610c16576040516311a8a1bb60e31b815260040160405180910390fd5b610c1e611911565b610c26611961565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c895760405162461bcd60e51b8152600401610a059060208082526004908201526310a0a6a160e11b604082015260600190565b610c92816119b6565b7fb3abc57bfeebd2cac918901db582f71972a8e628bccf19f5ae3e3482b98a5ced8133604051610cc3929190613302565b60405180910390a150565b610cd661179f565b610cde611a56565b83610d155760405162461bcd60e51b81526020600482015260076024820152662170726f6f667360c81b6044820152606401610a05565b600085856000818110610d2a57610d2a61332c565b9050602002810190610d3c9190613342565b610d469080613363565b604051610d549291906133b1565b604051809103902090506000610dbb8288886000818110610d7757610d7761332c565b9050602002810190610d899190613342565b60200189896000818110610d9f57610d9f61332c565b9050602002810190610db19190613342565b6104200135611aaf565b9050610dc981868686611b56565b6000828152600f60205260409020805460ff1916600190811790915586905b818163ffffffff161015610eef5788888263ffffffff16818110610e0e57610e0e61332c565b9050602002810190610e209190613342565b610e2a9080613363565b604051610e389291906133b1565b604051809103902093506000610e8d858b8b8563ffffffff16818110610e6057610e6061332c565b9050602002810190610e729190613342565b6020018c8c8663ffffffff16818110610d9f57610d9f61332c565b9050838114610ecc5760405162461bcd60e51b815260206004820152600b60248201526a085cda185c9959149bdbdd60aa1b6044820152606401610a05565b506000848152600f60205260409020805460ff1916600190811790915501610de8565b5060005b818163ffffffff161015610f7b57610f7289898363ffffffff16818110610f1c57610f1c61332c565b9050602002810190610f2e9190613342565b610f389080613363565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5192505050565b50600101610ef3565b50505050610f896001600755565b5050505050565b6000546001600160a01b03163314610fbb576040516311a8a1bb60e31b815260040160405180910390fd5b610fc481611f2e565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b91906132ab565b905090565b6000546001600160a01b0316331461107b576040516311a8a1bb60e31b815260040160405180910390fd5b476110868282611f97565b816001600160a01b03167feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d826040516110c191815260200190565b60405180910390a25050565b6000546001600160a01b031633146110f8576040516311a8a1bb60e31b815260040160405180910390fd5b611100611911565b60008181526009602052604081205490036111555760405162461bcd60e51b8152602060048201526015602482015274616767726567617465526f6f74202165786973747360581b6044820152606401610a05565b60008181526009602052604080822091909155517ff51534ecf10a58db36ce4f5180f59deddf3b3eb7c5e7454e602c2f80a40cc73990610cc39083815260200190565b6000546001600160a01b03163314610c26576040516311a8a1bb60e31b815260040160405180910390fd5b6000546001600160a01b031633146111ee576040516311a8a1bb60e31b815260040160405180910390fd5b610fc4816120b5565b600480546040516384785ecd60e01b815233928101929092526001600160a01b0316906384785ecd90602401602060405180830381865afa158015611240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126491906133c1565b61129b5760405162461bcd60e51b815260206004820152600860248201526710bbb0ba31b432b960c11b6044820152606401610a05565b6112a361179f565b610c266120f6565b6000546001600160a01b031633146112d6576040516311a8a1bb60e31b815260040160405180910390fd5b6001546001600160a01b0382811691161480156112f4575060025415155b15611312576040516311bc066560e11b815260040160405180910390fd5b6000546001600160a01b0380831691160361134057604051634a2fb73f60e11b815260040160405180910390fd5b610fc481612139565b6000546001600160a01b03163314611374576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916905590519182527f384859c5ef5fafac31e8bc92ce7fb48b1f2c74c4dd5e212eb84ec202fa5d9fad9101610cc3565b6000546001600160a01b031633146113f0576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916600117905590519182527fd65eca5d561d3a4568c87b9b13ced4ab52a69edadfdfdb22d76bc595f36d7d879101610cc3565b6001546001600160a01b0316331461146f576040516311a7f27160e11b815260040160405180910390fd5b62093a806002544261148191906133e3565b1161149f576040516324e0285f60e21b815260040160405180910390fd5b600154610c26906001600160a01b0316612187565b6000546001600160a01b031633146114df576040516311a8a1bb60e31b815260040160405180910390fd5b6004546001600160a01b039081169082160361153d5760405162461bcd60e51b815260206004820152601760248201527f616c72656164792077617463686572206d616e616765720000000000000000006044820152606401610a05565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc16d059e43d7f8e29ccb4e001a2f249d3c59e274925d6a6bc3912943441d9f6c90602001610cc3565b6000611596826121ec565b92915050565b6000546001600160a01b031633146115c7576040516311a8a1bb60e31b815260040160405180910390fd5b610fc481612218565b336000908152600d602052604081205460609060ff166116215760405162461bcd60e51b815260206004820152600c60248201526b08585b1b1bdddb1a5cdd195960a21b6044820152606401610a05565b63ffffffff8086166000908152600e602052604081208054919291909116908261164a836133f6565b91906101000a81548163ffffffff021916908363ffffffff160217905550905060006116a97f00000000000000000000000000000000000000000000000000000000000000006116a0336001600160a01b031690565b848a8a8a612296565b80516020820120604051632d287e4360e01b8152600481018290529192509060009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d287e439060240160408051808303816000875af115801561171f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117439190613419565b90925090507f40f08ee347fc927ae45902edc87debb024aab1a311943731968607f603f2152f836117756001846133e3565b8487604051611787949392919061343d565b60405180910390a15090989197509095505050505050565b600354600160a01b900460ff1615610c265760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a05565b815160201461182c5760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a05565b6000634ff746f660e01b83604051602401611847919061346c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526003549091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691633dbb202b9116836118bc866122ce565b6040518463ffffffff1660e01b81526004016118da9392919061347f565b600060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b50505050505050565b600354600160a01b900460ff16610c265760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a05565b611969611911565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6003546119cb906001600160a01b03166121ec565b611a0a5760405162461bcd60e51b815260206004820152601060248201526f10b6b4b93937b921b7b73732b1ba37b960811b6044820152606401610a05565b8051602014611a455760405162461bcd60e51b8152602060048201526007602482015266042d8cadccee8d60cb1b6044820152606401610a05565b610fc4611a51826134b9565b61232c565b600260075403611aa85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a05565b6002600755565b6000806000858152600f602052604090205460ff166002811115611ad557611ad5613082565b14611b185760405162461bcd60e51b8152602060048201526013602482015272214d6573736167655374617475732e4e6f6e6560681b6044820152606401610a05565b611b4c8484602080602002604051908101604052809291908260208002808284376000920191909152508691506124559050565b90505b9392505050565b6000848152600b602052604090205460ff16611c4b57611b75836127a3565b6000611bab8584602080602002604051908101604052809291908260208002808284376000920191909152508691506124559050565b9050838114611bf25760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081a5b989bdd5b99149bdbdd606a1b6044820152606401610a05565b6000858152600b602052604090819020805460ff1916600117905551849086907f7ec1ea51fe3db53e55ed9d922854bc2156f467ff2f87d74e2086dae2c84a88a890611c419086815260200190565b60405180910390a3505b50505050565b600080611c5e8382612903565b905063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611c9662ffffff198316612927565b63ffffffff1614611cd85760405162461bcd60e51b815260206004820152600c60248201526b10b232b9ba34b730ba34b7b760a11b6044820152606401610a05565b6000611ce962ffffff19831661293c565b905060016000828152600f602052604090205460ff166002811115611d1057611d10613082565b14611d475760405162461bcd60e51b815260206004820152600760248201526610b83937bb32b760c91b6044820152606401610a05565b6000818152600f60205260409020805460ff191660021790556001611dac7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613298565b611db691906133e3565b5a11611ded5760405162461bcd60e51b8152600401610a05906020808252600490820152632167617360e01b604082015260600190565b6000611dfe62ffffff198416612985565b6040805161010080825261012082019092529192507f000000000000000000000000000000000000000000000000000000000000000091600090826020820181803683370190505090506000611e5962ffffff198816612996565b611e6862ffffff1989166129aa565b611e7762ffffff198a166129bf565b611e94611e8962ffffff198c166129d4565b62ffffff1916612a02565b604051602401611ea794939291906134e0565b60408051601f198184030181529190526020810180516001600160e01b031663ab2dc3f560e01b1790529050611ee1858560008685612a4b565b60405191995092507fd42de95a9b26f1be134c8ecce389dc4fcfa18753d01661b7b361233569e8fe4890611f1a9088908b90869061350f565b60405180910390a150505050505050919050565b600354604080516001600160a01b03928316815291831660208301527fc77bec288fc88f168427f2f7da682eadb26cac89d8d591af6e443da98dff2bbc910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b80471015611fe75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a05565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612034576040519150601f19603f3d011682016040523d82523d6000602084013e612039565b606091505b50509050806120b05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a05565b505050565b60105460408051918252602082018390527f877a02cb809da0364d23adca3cd50c451b53f279d3df632e1fc11eb66335bce5910160405180910390a1601055565b6120fe61179f565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119993390565b42600255600180546001600160a01b0319166001600160a01b0383169081179091556040517f6ab4d119f23076e8ad491bc65ce85f017fb0591dce08755ba8591059cc51737a90600090a250565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316178155600255600180549091169055565b60006115967f000000000000000000000000000000000000000000000000000000000000000083612ad6565b600554810361225b5760405162461bcd60e51b815260206004820152600f60248201526e085b995dc81c985d19481b1a5b5a5d608a1b6044820152606401610a05565b600581905560408051338152602081018390527f8e7fa5e406cb856aab05575e45ea011c6748376cc1b5229e3d67b92986406a159101610cc3565b60608686868686866040516020016122b396959493929190613530565b60405160208183030381529060405290509695505050505050565b600081516020146123105760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a05565b6115968280602001905181019061232791906132ab565b612b97565b8061236a5760405162461bcd60e51b815260206004820152600e60248201526d6e657720726f6f7420656d70747960901b6044820152606401610a05565b600081815260096020526040902054156123bd5760405162461bcd60e51b8152602060048201526014602482015273726f6f7420616c72656164792070656e64696e6760601b6044820152606401610a05565b6000818152600a602052604090205460ff16156124125760405162461bcd60e51b81526020600482015260136024820152723937b7ba1030b63932b0b23c90383937bb32b760691b6044820152606401610a05565b60008181526009602052604090819020439055517f84ef18531155afdb0e64ff905d67044ae3aac63a6fba4661cfd9c4c14f289bc890610cc39083815260200190565b6020600582811b8216948552835194820394909452604060008181206002851615871b808503919091528386015190528181206004851615871b808503919091528286015190528181206008851615871b80850391909152606086015190528181206010851615871b8085039190915260808087015190915282822084861615881b8086039190915260a0870151905282822083861615881b8086039190915260c0870151905282822090851615871b8085039190915260e0860151905281812061010080861615881b80860392909252860151905281812061020080861615881b80860392909252610120870151909152828220610400861615881b808603919091526101408701519052828220610800861615881b808603919091526101608701519052828220611000861615881b808603919091526101808701519052828220612000861615881b808603919091526101a08701519052828220614000861615881b808603919091526101c08701519052828220618000861615881b808603919091526101e0870151905282822062010000861615881b8086039190915290860151905281812062020000851615871b80850391909152610220860151905281812062040000851615871b80850391909152610240860151905281812062080000851615871b80850391909152610260860151905281812062100000851615871b80850391909152610280860151905281812062200000851615871b808503919091526102a0860151905281812062400000851615871b808503919091526102c0860151905281812062800000851615871b808503919091526102e086015190528181206301000000851615871b8085039190915261030086015190528181206302000000851615871b8085039190915261032086015190528181206304000000851615871b8085039190915261034086015190528181206308000000851615871b8085039190915261036086015190528181206310000000851615871b8085039190915261038086015190528181206320000000851615871b808503919091526103a086015190528181206340000000851615871b808503919091526103c0860151905281812063800000009094161590951b91829003929092526103e090920151909152902090565b806127e65760405162461bcd60e51b8152602060048201526013602482015272616767726567617465526f6f7420656d70747960681b6044820152606401610a05565b6000818152600a602052604090205460ff16156128005750565b600081815260096020526040812054908190036128565760405162461bcd60e51b81526020600482015260146024820152731859d9dc9959d85d19549bdbdd0808595e1a5cdd60621b6044820152606401610a05565b60085461286382436133e3565b10156128b15760405162461bcd60e51b815260206004820152601760248201527f616767726567617465526f6f74202176657269666965640000000000000000006044820152606401610a05565b6000828152600a6020526040808220805460ff191660011790555183917f36b314aba9f663b4d3ef3288ae489341cc5e6a2725a05fa2b72df7a27e03f42a91a250600090815260096020526040812055565b81516000906020840161291e64ffffffffff85168284612bad565b95945050505050565b600061159662ffffff19831660286004612bea565b6000806129528360781c6001600160601b031690565b6001600160601b0316905060006129728460181c6001600160601b031690565b6001600160601b03169091209392505050565b600061159661299383612c1a565b90565b600061159662ffffff198316826004612bea565b600061159662ffffff19831660246004612bea565b600061159662ffffff19831660046020612c2b565b6000611596604c6129f281601886901c6001600160601b03166133e3565b62ffffff19851691906000612d36565b6060600080612a1a8460181c6001600160601b031690565b6001600160601b031690506040519150819250612a3a8483602001612db2565b508181016020016040529052919050565b6000606060008060008661ffff1667ffffffffffffffff811115612a7157612a71612faa565b6040519080825280601f01601f191660200182016040528015612a9b576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115612abc578692505b828152826000602083013e90999098509650505050505050565b6000336001600160a01b03841614612b1a5760405162461bcd60e51b81526020600482015260076024820152662162726964676560c81b6044820152606401610a05565b816001600160a01b0316836001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b86919061358a565b6001600160a01b0316149392505050565b6000601054821115612ba95760105491505b5090565b600080612bba8385613298565b9050604051811115612bca575060005b80600003612bdf5762ffffff19915050611b4f565b61291e858585612ea5565b6000612bf78260206135a7565b612c029060086135c0565b60ff16612c10858585612c2b565b901c949350505050565b600061159662ffffff198316602c60205b60008160ff16600003612c4057506000611b4f565b612c538460181c6001600160601b031690565b6001600160601b0316612c6960ff841685613298565b1115612cd157612c828460781c6001600160601b031690565b612c958560181c6001600160601b031690565b6040516378218d2960e01b81526001600160601b039283166004820152911660248201526044810184905260ff83166064820152608401610a05565b60208260ff161115612cf65760405163045df3f960e01b815260040160405180910390fd5b600882026000612d0f8660781c6001600160601b031690565b6001600160601b031690506000600160ff1b60001984011d91909501511695945050505050565b600080612d4c8660781c6001600160601b031690565b6001600160601b03169050612d6086612f1c565b84612d6b8784613298565b612d759190613298565b1115612d885762ffffff19915050612daa565b612d928582613298565b9050612da68364ffffffffff168286612bad565b9150505b949350505050565b600062ffffff1980841603612dda5760405163148d513360e21b815260040160405180910390fd5b612de383612f55565b15612e0157604051632ee0949160e11b815260040160405180910390fd5b6000612e168460181c6001600160601b031690565b6001600160601b031690506000612e368560781c6001600160601b031690565b6001600160601b03169050600080604051915085821115612e575760206060fd5b8386858560045afa905080612e7f57604051632af1bd9b60e21b815260040160405180910390fd5b612e9a612e8c8860d81c90565b64ffffffffff168786612ea5565b979650505050505050565b60006060601883856001600160601b03821682148015612ecd575086816001600160601b0316145b612f065760405162461bcd60e51b815260206004820152600a602482015269085d1c9d5b98d85d195960b21b6044820152606401610a05565b96831b90961790911b90941790931b9392505050565b6000612f318260181c6001600160601b031690565b612f448360781c6001600160601b031690565b016001600160601b03169050919050565b6000612f618260d81c90565b64ffffffffff1664ffffffffff03612f7b57506001919050565b6000612f8683612f1c565b604051109392505050565b600060208284031215612fa357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612fd157600080fd5b813567ffffffffffffffff80821115612fec57612fec612faa565b604051601f8301601f19908116603f0116810190828211818310171561301457613014612faa565b8160405283815286602085880101111561302d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561305f57600080fd5b813567ffffffffffffffff81111561307657600080fd5b612daa84828501612fc0565b634e487b7160e01b600052602160045260246000fd5b60208101600383106130ba57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600061046086880312156130d957600080fd5b853567ffffffffffffffff808211156130f157600080fd5b818801915088601f83011261310557600080fd5b81358181111561311457600080fd5b8960208260051b850101111561312957600080fd5b60209283019750955050860135925061044086018781111561314a57600080fd5b94979396509194604001933592915050565b6001600160a01b0381168114610fc457600080fd5b60006020828403121561318357600080fd5b8135611b4f8161315c565b803563ffffffff811681146131a257600080fd5b919050565b6000602082840312156131b957600080fd5b611b4f8261318e565b6000806000606084860312156131d757600080fd5b6131e08461318e565b925060208401359150604084013567ffffffffffffffff81111561320357600080fd5b61320f86828701612fc0565b9150509250925092565b60005b8381101561323457818101518382015260200161321c565b50506000910152565b60008151808452613255816020860160208601613219565b601f01601f19169290920160200192915050565b828152604060208201526000611b4c604083018461323d565b634e487b7160e01b600052601160045260246000fd5b8082018082111561159657611596613282565b6000602082840312156132bd57600080fd5b5051919050565b6060815260006132d7606083018661323d565b82810360208401526132e9818661323d565b91505060018060a01b0383166040830152949350505050565b604081526000613315604083018561323d565b905060018060a01b03831660208301529392505050565b634e487b7160e01b600052603260045260246000fd5b6000823561043e1983360301811261335957600080fd5b9190910192915050565b6000808335601e1984360301811261337a57600080fd5b83018035915067ffffffffffffffff82111561339557600080fd5b6020019150368190038213156133aa57600080fd5b9250929050565b8183823760009101908152919050565b6000602082840312156133d357600080fd5b81518015158114611b4f57600080fd5b8181038181111561159657611596613282565b600063ffffffff80831681810361340f5761340f613282565b6001019392505050565b6000806040838503121561342c57600080fd5b505080516020909101519092909150565b848152836020820152826040820152608060608201526000613462608083018461323d565b9695505050505050565b602081526000611b4f602083018461323d565b6001600160a01b03841681526060602082018190526000906134a39083018561323d565b905063ffffffff83166040830152949350505050565b805160208083015191908110156134da576000198160200360031b1b821691505b50919050565b600063ffffffff808716835280861660208401525083604083015260806060830152613462608083018461323d565b838152821515602082015260606040820152600061291e606083018461323d565b600063ffffffff60e01b808960e01b168352876004840152808760e01b166024840152808660e01b1660288401525083602c830152825161357881604c850160208701613219565b91909101604c01979650505050505050565b60006020828403121561359c57600080fd5b8151611b4f8161315c565b60ff828116828216039081111561159657611596613282565b60ff81811683821602908116908181146135dc576135dc613282565b509291505056fea2646970667358221220f02d2fe9b92aba6ab368fdc34506d2339c45cd80325d4a1d967312b89967484464736f6c63430008110033",
  "deployedBytecode": "0x6080604052600436106102975760003560e01c80638456cb591161015a578063b95a2001116100c1578063d69f9d611161007a578063d69f9d61146108b2578063d7d317b3146108e6578063d88beda2146108fc578063db1b765914610930578063e0fed01014610950578063fa31de011461097057600080fd5b8063b95a2001146107ed578063c5b350df14610820578063cc39428314610835578063d1851c9214610855578063d232c22014610873578063d2a3cc711461089257600080fd5b8063a01892a511610113578063a01892a514610723578063a792c29b14610757578063ad9c0c2e14610777578063b1f8100d1461078d578063b2f87643146107ad578063b697f531146107cd57600080fd5b80638456cb591461064d5780638d3638f4146106625780638da5cb5b1461069557806398c9f2b9146106b35780639d3117c7146106e35780639fa92f9d1461071057600080fd5b8063572386ca116101fe57806365eaf11b116101b757806365eaf11b146105ad57806368742da6146105c25780636a42b8f8146105e25780636b04a933146105f8578063715018a6146106185780637850b0201461062d57600080fd5b8063572386ca146104ac578063579c1618146104dc5780635bd11efc146104f25780635c975abb146105125780635f61e3ec146105315780636159ada11461057d57600080fd5b80633cf52ffb116102505780633cf52ffb146103e55780633f4ba83a146103fa5780634ff746f61461040f578063508a109b1461042f5780635190bc531461044f57806352a9674b1461047857600080fd5b806314168416146102a35780631eeaabea146102f157806325e3beda146103135780632bb1ae7c146103555780632bbd59ca14610368578063301f07c3146103a557600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102d77f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020015b60405180910390f35b3480156102fd57600080fd5b5061031161030c366004612f91565b61099e565b005b34801561031f57600080fd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016102e8565b61031161036336600461304d565b610a48565b34801561037457600080fd5b50610398610383366004612f91565b600f6020526000908152604090205460ff1681565b6040516102e89190613098565b3480156103b157600080fd5b506103d56103c0366004612f91565b600a6020526000908152604090205460ff1681565b60405190151581526020016102e8565b3480156103f157600080fd5b50600254610347565b34801561040657600080fd5b50610311610beb565b34801561041b57600080fd5b5061031161042a36600461304d565b610c28565b34801561043b57600080fd5b5061031161044a3660046130c0565b610cce565b34801561045b57600080fd5b506103d561046a366004613171565b6001600160a01b0316301490565b34801561048457600080fd5b506102d77f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b857600080fd5b506103d56104c7366004612f91565b600c6020526000908152604090205460ff1681565b3480156104e857600080fd5b5061034760055481565b3480156104fe57600080fd5b5061031161050d366004613171565b610f90565b34801561051e57600080fd5b50600354600160a01b900460ff166103d5565b34801561053d57600080fd5b506105657f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102e8565b34801561058957600080fd5b506103d5610598366004613171565b600d6020526000908152604090205460ff1681565b3480156105b957600080fd5b50610347610fc7565b3480156105ce57600080fd5b506103116105dd366004613171565b611050565b3480156105ee57600080fd5b5062093a80610347565b34801561060457600080fd5b50610311610613366004612f91565b6110cd565b34801561062457600080fd5b50610311611198565b34801561063957600080fd5b50610311610648366004612f91565b6111c3565b34801561065957600080fd5b506103116111f7565b34801561066e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102d7565b3480156106a157600080fd5b506000546001600160a01b0316610565565b3480156106bf57600080fd5b506103d56106ce366004612f91565b600b6020526000908152604090205460ff1681565b3480156106ef57600080fd5b506103476106fe366004612f91565b60096020526000908152604090205481565b34801561071c57600080fd5b5030610565565b34801561072f57600080fd5b506105657f000000000000000000000000000000000000000000000000000000000000000081565b34801561076357600080fd5b50600454610565906001600160a01b031681565b34801561078357600080fd5b5061034760085481565b34801561079957600080fd5b506103116107a8366004613171565b6112ab565b3480156107b957600080fd5b506103116107c8366004613171565b611349565b3480156107d957600080fd5b506103116107e8366004613171565b6113c5565b3480156107f957600080fd5b506102d76108083660046131a7565b600e6020526000908152604090205463ffffffff1681565b34801561082c57600080fd5b50610311611444565b34801561084157600080fd5b50600354610565906001600160a01b031681565b34801561086157600080fd5b506001546001600160a01b0316610565565b34801561087f57600080fd5b506000546001600160a01b0316156103d5565b34801561089e57600080fd5b506103116108ad366004613171565b6114b4565b3480156108be57600080fd5b506105657f000000000000000000000000000000000000000000000000000000000000000081565b3480156108f257600080fd5b5061034760065481565b34801561090857600080fd5b506103477f000000000000000000000000000000000000000000000000000000000000000081565b34801561093c57600080fd5b506103d561094b366004613171565b61158b565b34801561095c57600080fd5b5061031161096b366004612f91565b61159c565b34801561097c57600080fd5b5061099061098b3660046131c2565b6115d0565b6040516102e8929190613269565b6000546001600160a01b031633146109c9576040516311a8a1bb60e31b815260040160405180910390fd5b6008548103610a0e5760405162461bcd60e51b815260206004820152600c60248201526b2164656c6179426c6f636b7360a01b60448201526064015b60405180910390fd5b60405133815281907f8bd16320f3b60336ed5fd2a770eb7453e7e71cfef4462addffd7ae9dfe201c8e9060200160405180910390a2600855565b610a5061179f565b43600554600654610a619190613298565b1115610a80576040516346cf2af160e11b815260040160405180910390fd5b4360068190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b91906132ab565b6000818152600c602052604090205490915060ff1615610b615760405162461bcd60e51b81526020600482015260116024820152701c9bdbdd08185b1c9958591e481cd95b9d607a1b6044820152606401610a05565b600081604051602001610b7691815260200190565b6040516020818303038152906040529050610b9181846117ec565b6000828152600c602052604090819020805460ff19166001179055517fdcaa37a042a0087de79018c629bbd29cee82ca80bd9be394e1696bf9e935507790610bde908390869033906132c4565b60405180910390a1505050565b6000546001600160a01b03163314610c16576040516311a8a1bb60e31b815260040160405180910390fd5b610c1e611911565b610c26611961565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c895760405162461bcd60e51b8152600401610a059060208082526004908201526310a0a6a160e11b604082015260600190565b610c92816119b6565b7fb3abc57bfeebd2cac918901db582f71972a8e628bccf19f5ae3e3482b98a5ced8133604051610cc3929190613302565b60405180910390a150565b610cd661179f565b610cde611a56565b83610d155760405162461bcd60e51b81526020600482015260076024820152662170726f6f667360c81b6044820152606401610a05565b600085856000818110610d2a57610d2a61332c565b9050602002810190610d3c9190613342565b610d469080613363565b604051610d549291906133b1565b604051809103902090506000610dbb8288886000818110610d7757610d7761332c565b9050602002810190610d899190613342565b60200189896000818110610d9f57610d9f61332c565b9050602002810190610db19190613342565b6104200135611aaf565b9050610dc981868686611b56565b6000828152600f60205260409020805460ff1916600190811790915586905b818163ffffffff161015610eef5788888263ffffffff16818110610e0e57610e0e61332c565b9050602002810190610e209190613342565b610e2a9080613363565b604051610e389291906133b1565b604051809103902093506000610e8d858b8b8563ffffffff16818110610e6057610e6061332c565b9050602002810190610e729190613342565b6020018c8c8663ffffffff16818110610d9f57610d9f61332c565b9050838114610ecc5760405162461bcd60e51b815260206004820152600b60248201526a085cda185c9959149bdbdd60aa1b6044820152606401610a05565b506000848152600f60205260409020805460ff1916600190811790915501610de8565b5060005b818163ffffffff161015610f7b57610f7289898363ffffffff16818110610f1c57610f1c61332c565b9050602002810190610f2e9190613342565b610f389080613363565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5192505050565b50600101610ef3565b50505050610f896001600755565b5050505050565b6000546001600160a01b03163314610fbb576040516311a8a1bb60e31b815260040160405180910390fd5b610fc481611f2e565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b91906132ab565b905090565b6000546001600160a01b0316331461107b576040516311a8a1bb60e31b815260040160405180910390fd5b476110868282611f97565b816001600160a01b03167feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d826040516110c191815260200190565b60405180910390a25050565b6000546001600160a01b031633146110f8576040516311a8a1bb60e31b815260040160405180910390fd5b611100611911565b60008181526009602052604081205490036111555760405162461bcd60e51b8152602060048201526015602482015274616767726567617465526f6f74202165786973747360581b6044820152606401610a05565b60008181526009602052604080822091909155517ff51534ecf10a58db36ce4f5180f59deddf3b3eb7c5e7454e602c2f80a40cc73990610cc39083815260200190565b6000546001600160a01b03163314610c26576040516311a8a1bb60e31b815260040160405180910390fd5b6000546001600160a01b031633146111ee576040516311a8a1bb60e31b815260040160405180910390fd5b610fc4816120b5565b600480546040516384785ecd60e01b815233928101929092526001600160a01b0316906384785ecd90602401602060405180830381865afa158015611240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126491906133c1565b61129b5760405162461bcd60e51b815260206004820152600860248201526710bbb0ba31b432b960c11b6044820152606401610a05565b6112a361179f565b610c266120f6565b6000546001600160a01b031633146112d6576040516311a8a1bb60e31b815260040160405180910390fd5b6001546001600160a01b0382811691161480156112f4575060025415155b15611312576040516311bc066560e11b815260040160405180910390fd5b6000546001600160a01b0380831691160361134057604051634a2fb73f60e11b815260040160405180910390fd5b610fc481612139565b6000546001600160a01b03163314611374576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916905590519182527f384859c5ef5fafac31e8bc92ce7fb48b1f2c74c4dd5e212eb84ec202fa5d9fad9101610cc3565b6000546001600160a01b031633146113f0576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916600117905590519182527fd65eca5d561d3a4568c87b9b13ced4ab52a69edadfdfdb22d76bc595f36d7d879101610cc3565b6001546001600160a01b0316331461146f576040516311a7f27160e11b815260040160405180910390fd5b62093a806002544261148191906133e3565b1161149f576040516324e0285f60e21b815260040160405180910390fd5b600154610c26906001600160a01b0316612187565b6000546001600160a01b031633146114df576040516311a8a1bb60e31b815260040160405180910390fd5b6004546001600160a01b039081169082160361153d5760405162461bcd60e51b815260206004820152601760248201527f616c72656164792077617463686572206d616e616765720000000000000000006044820152606401610a05565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc16d059e43d7f8e29ccb4e001a2f249d3c59e274925d6a6bc3912943441d9f6c90602001610cc3565b6000611596826121ec565b92915050565b6000546001600160a01b031633146115c7576040516311a8a1bb60e31b815260040160405180910390fd5b610fc481612218565b336000908152600d602052604081205460609060ff166116215760405162461bcd60e51b815260206004820152600c60248201526b08585b1b1bdddb1a5cdd195960a21b6044820152606401610a05565b63ffffffff8086166000908152600e602052604081208054919291909116908261164a836133f6565b91906101000a81548163ffffffff021916908363ffffffff160217905550905060006116a97f00000000000000000000000000000000000000000000000000000000000000006116a0336001600160a01b031690565b848a8a8a612296565b80516020820120604051632d287e4360e01b8152600481018290529192509060009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d287e439060240160408051808303816000875af115801561171f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117439190613419565b90925090507f40f08ee347fc927ae45902edc87debb024aab1a311943731968607f603f2152f836117756001846133e3565b8487604051611787949392919061343d565b60405180910390a15090989197509095505050505050565b600354600160a01b900460ff1615610c265760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a05565b815160201461182c5760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a05565b6000634ff746f660e01b83604051602401611847919061346c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526003549091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691633dbb202b9116836118bc866122ce565b6040518463ffffffff1660e01b81526004016118da9392919061347f565b600060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b50505050505050565b600354600160a01b900460ff16610c265760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a05565b611969611911565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6003546119cb906001600160a01b03166121ec565b611a0a5760405162461bcd60e51b815260206004820152601060248201526f10b6b4b93937b921b7b73732b1ba37b960811b6044820152606401610a05565b8051602014611a455760405162461bcd60e51b8152602060048201526007602482015266042d8cadccee8d60cb1b6044820152606401610a05565b610fc4611a51826134b9565b61232c565b600260075403611aa85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a05565b6002600755565b6000806000858152600f602052604090205460ff166002811115611ad557611ad5613082565b14611b185760405162461bcd60e51b8152602060048201526013602482015272214d6573736167655374617475732e4e6f6e6560681b6044820152606401610a05565b611b4c8484602080602002604051908101604052809291908260208002808284376000920191909152508691506124559050565b90505b9392505050565b6000848152600b602052604090205460ff16611c4b57611b75836127a3565b6000611bab8584602080602002604051908101604052809291908260208002808284376000920191909152508691506124559050565b9050838114611bf25760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081a5b989bdd5b99149bdbdd606a1b6044820152606401610a05565b6000858152600b602052604090819020805460ff1916600117905551849086907f7ec1ea51fe3db53e55ed9d922854bc2156f467ff2f87d74e2086dae2c84a88a890611c419086815260200190565b60405180910390a3505b50505050565b600080611c5e8382612903565b905063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611c9662ffffff198316612927565b63ffffffff1614611cd85760405162461bcd60e51b815260206004820152600c60248201526b10b232b9ba34b730ba34b7b760a11b6044820152606401610a05565b6000611ce962ffffff19831661293c565b905060016000828152600f602052604090205460ff166002811115611d1057611d10613082565b14611d475760405162461bcd60e51b815260206004820152600760248201526610b83937bb32b760c91b6044820152606401610a05565b6000818152600f60205260409020805460ff191660021790556001611dac7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613298565b611db691906133e3565b5a11611ded5760405162461bcd60e51b8152600401610a05906020808252600490820152632167617360e01b604082015260600190565b6000611dfe62ffffff198416612985565b6040805161010080825261012082019092529192507f000000000000000000000000000000000000000000000000000000000000000091600090826020820181803683370190505090506000611e5962ffffff198816612996565b611e6862ffffff1989166129aa565b611e7762ffffff198a166129bf565b611e94611e8962ffffff198c166129d4565b62ffffff1916612a02565b604051602401611ea794939291906134e0565b60408051601f198184030181529190526020810180516001600160e01b031663ab2dc3f560e01b1790529050611ee1858560008685612a4b565b60405191995092507fd42de95a9b26f1be134c8ecce389dc4fcfa18753d01661b7b361233569e8fe4890611f1a9088908b90869061350f565b60405180910390a150505050505050919050565b600354604080516001600160a01b03928316815291831660208301527fc77bec288fc88f168427f2f7da682eadb26cac89d8d591af6e443da98dff2bbc910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b80471015611fe75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a05565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612034576040519150601f19603f3d011682016040523d82523d6000602084013e612039565b606091505b50509050806120b05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a05565b505050565b60105460408051918252602082018390527f877a02cb809da0364d23adca3cd50c451b53f279d3df632e1fc11eb66335bce5910160405180910390a1601055565b6120fe61179f565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119993390565b42600255600180546001600160a01b0319166001600160a01b0383169081179091556040517f6ab4d119f23076e8ad491bc65ce85f017fb0591dce08755ba8591059cc51737a90600090a250565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316178155600255600180549091169055565b60006115967f000000000000000000000000000000000000000000000000000000000000000083612ad6565b600554810361225b5760405162461bcd60e51b815260206004820152600f60248201526e085b995dc81c985d19481b1a5b5a5d608a1b6044820152606401610a05565b600581905560408051338152602081018390527f8e7fa5e406cb856aab05575e45ea011c6748376cc1b5229e3d67b92986406a159101610cc3565b60608686868686866040516020016122b396959493929190613530565b60405160208183030381529060405290509695505050505050565b600081516020146123105760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a05565b6115968280602001905181019061232791906132ab565b612b97565b8061236a5760405162461bcd60e51b815260206004820152600e60248201526d6e657720726f6f7420656d70747960901b6044820152606401610a05565b600081815260096020526040902054156123bd5760405162461bcd60e51b8152602060048201526014602482015273726f6f7420616c72656164792070656e64696e6760601b6044820152606401610a05565b6000818152600a602052604090205460ff16156124125760405162461bcd60e51b81526020600482015260136024820152723937b7ba1030b63932b0b23c90383937bb32b760691b6044820152606401610a05565b60008181526009602052604090819020439055517f84ef18531155afdb0e64ff905d67044ae3aac63a6fba4661cfd9c4c14f289bc890610cc39083815260200190565b6020600582811b8216948552835194820394909452604060008181206002851615871b808503919091528386015190528181206004851615871b808503919091528286015190528181206008851615871b80850391909152606086015190528181206010851615871b8085039190915260808087015190915282822084861615881b8086039190915260a0870151905282822083861615881b8086039190915260c0870151905282822090851615871b8085039190915260e0860151905281812061010080861615881b80860392909252860151905281812061020080861615881b80860392909252610120870151909152828220610400861615881b808603919091526101408701519052828220610800861615881b808603919091526101608701519052828220611000861615881b808603919091526101808701519052828220612000861615881b808603919091526101a08701519052828220614000861615881b808603919091526101c08701519052828220618000861615881b808603919091526101e0870151905282822062010000861615881b8086039190915290860151905281812062020000851615871b80850391909152610220860151905281812062040000851615871b80850391909152610240860151905281812062080000851615871b80850391909152610260860151905281812062100000851615871b80850391909152610280860151905281812062200000851615871b808503919091526102a0860151905281812062400000851615871b808503919091526102c0860151905281812062800000851615871b808503919091526102e086015190528181206301000000851615871b8085039190915261030086015190528181206302000000851615871b8085039190915261032086015190528181206304000000851615871b8085039190915261034086015190528181206308000000851615871b8085039190915261036086015190528181206310000000851615871b8085039190915261038086015190528181206320000000851615871b808503919091526103a086015190528181206340000000851615871b808503919091526103c0860151905281812063800000009094161590951b91829003929092526103e090920151909152902090565b806127e65760405162461bcd60e51b8152602060048201526013602482015272616767726567617465526f6f7420656d70747960681b6044820152606401610a05565b6000818152600a602052604090205460ff16156128005750565b600081815260096020526040812054908190036128565760405162461bcd60e51b81526020600482015260146024820152731859d9dc9959d85d19549bdbdd0808595e1a5cdd60621b6044820152606401610a05565b60085461286382436133e3565b10156128b15760405162461bcd60e51b815260206004820152601760248201527f616767726567617465526f6f74202176657269666965640000000000000000006044820152606401610a05565b6000828152600a6020526040808220805460ff191660011790555183917f36b314aba9f663b4d3ef3288ae489341cc5e6a2725a05fa2b72df7a27e03f42a91a250600090815260096020526040812055565b81516000906020840161291e64ffffffffff85168284612bad565b95945050505050565b600061159662ffffff19831660286004612bea565b6000806129528360781c6001600160601b031690565b6001600160601b0316905060006129728460181c6001600160601b031690565b6001600160601b03169091209392505050565b600061159661299383612c1a565b90565b600061159662ffffff198316826004612bea565b600061159662ffffff19831660246004612bea565b600061159662ffffff19831660046020612c2b565b6000611596604c6129f281601886901c6001600160601b03166133e3565b62ffffff19851691906000612d36565b6060600080612a1a8460181c6001600160601b031690565b6001600160601b031690506040519150819250612a3a8483602001612db2565b508181016020016040529052919050565b6000606060008060008661ffff1667ffffffffffffffff811115612a7157612a71612faa565b6040519080825280601f01601f191660200182016040528015612a9b576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115612abc578692505b828152826000602083013e90999098509650505050505050565b6000336001600160a01b03841614612b1a5760405162461bcd60e51b81526020600482015260076024820152662162726964676560c81b6044820152606401610a05565b816001600160a01b0316836001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b86919061358a565b6001600160a01b0316149392505050565b6000601054821115612ba95760105491505b5090565b600080612bba8385613298565b9050604051811115612bca575060005b80600003612bdf5762ffffff19915050611b4f565b61291e858585612ea5565b6000612bf78260206135a7565b612c029060086135c0565b60ff16612c10858585612c2b565b901c949350505050565b600061159662ffffff198316602c60205b60008160ff16600003612c4057506000611b4f565b612c538460181c6001600160601b031690565b6001600160601b0316612c6960ff841685613298565b1115612cd157612c828460781c6001600160601b031690565b612c958560181c6001600160601b031690565b6040516378218d2960e01b81526001600160601b039283166004820152911660248201526044810184905260ff83166064820152608401610a05565b60208260ff161115612cf65760405163045df3f960e01b815260040160405180910390fd5b600882026000612d0f8660781c6001600160601b031690565b6001600160601b031690506000600160ff1b60001984011d91909501511695945050505050565b600080612d4c8660781c6001600160601b031690565b6001600160601b03169050612d6086612f1c565b84612d6b8784613298565b612d759190613298565b1115612d885762ffffff19915050612daa565b612d928582613298565b9050612da68364ffffffffff168286612bad565b9150505b949350505050565b600062ffffff1980841603612dda5760405163148d513360e21b815260040160405180910390fd5b612de383612f55565b15612e0157604051632ee0949160e11b815260040160405180910390fd5b6000612e168460181c6001600160601b031690565b6001600160601b031690506000612e368560781c6001600160601b031690565b6001600160601b03169050600080604051915085821115612e575760206060fd5b8386858560045afa905080612e7f57604051632af1bd9b60e21b815260040160405180910390fd5b612e9a612e8c8860d81c90565b64ffffffffff168786612ea5565b979650505050505050565b60006060601883856001600160601b03821682148015612ecd575086816001600160601b0316145b612f065760405162461bcd60e51b815260206004820152600a602482015269085d1c9d5b98d85d195960b21b6044820152606401610a05565b96831b90961790911b90941790931b9392505050565b6000612f318260181c6001600160601b031690565b612f448360781c6001600160601b031690565b016001600160601b03169050919050565b6000612f618260d81c90565b64ffffffffff1664ffffffffff03612f7b57506001919050565b6000612f8683612f1c565b604051109392505050565b600060208284031215612fa357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612fd157600080fd5b813567ffffffffffffffff80821115612fec57612fec612faa565b604051601f8301601f19908116603f0116810190828211818310171561301457613014612faa565b8160405283815286602085880101111561302d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561305f57600080fd5b813567ffffffffffffffff81111561307657600080fd5b612daa84828501612fc0565b634e487b7160e01b600052602160045260246000fd5b60208101600383106130ba57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600080600061046086880312156130d957600080fd5b853567ffffffffffffffff808211156130f157600080fd5b818801915088601f83011261310557600080fd5b81358181111561311457600080fd5b8960208260051b850101111561312957600080fd5b60209283019750955050860135925061044086018781111561314a57600080fd5b94979396509194604001933592915050565b6001600160a01b0381168114610fc457600080fd5b60006020828403121561318357600080fd5b8135611b4f8161315c565b803563ffffffff811681146131a257600080fd5b919050565b6000602082840312156131b957600080fd5b611b4f8261318e565b6000806000606084860312156131d757600080fd5b6131e08461318e565b925060208401359150604084013567ffffffffffffffff81111561320357600080fd5b61320f86828701612fc0565b9150509250925092565b60005b8381101561323457818101518382015260200161321c565b50506000910152565b60008151808452613255816020860160208601613219565b601f01601f19169290920160200192915050565b828152604060208201526000611b4c604083018461323d565b634e487b7160e01b600052601160045260246000fd5b8082018082111561159657611596613282565b6000602082840312156132bd57600080fd5b5051919050565b6060815260006132d7606083018661323d565b82810360208401526132e9818661323d565b91505060018060a01b0383166040830152949350505050565b604081526000613315604083018561323d565b905060018060a01b03831660208301529392505050565b634e487b7160e01b600052603260045260246000fd5b6000823561043e1983360301811261335957600080fd5b9190910192915050565b6000808335601e1984360301811261337a57600080fd5b83018035915067ffffffffffffffff82111561339557600080fd5b6020019150368190038213156133aa57600080fd5b9250929050565b8183823760009101908152919050565b6000602082840312156133d357600080fd5b81518015158114611b4f57600080fd5b8181038181111561159657611596613282565b600063ffffffff80831681810361340f5761340f613282565b6001019392505050565b6000806040838503121561342c57600080fd5b505080516020909101519092909150565b848152836020820152826040820152608060608201526000613462608083018461323d565b9695505050505050565b602081526000611b4f602083018461323d565b6001600160a01b03841681526060602082018190526000906134a39083018561323d565b905063ffffffff83166040830152949350505050565b805160208083015191908110156134da576000198160200360031b1b821691505b50919050565b600063ffffffff808716835280861660208401525083604083015260806060830152613462608083018461323d565b838152821515602082015260606040820152600061291e606083018461323d565b600063ffffffff60e01b808960e01b168352876004840152808760e01b166024840152808660e01b1660288401525083602c830152825161357881604c850160208701613219565b91909101604c01979650505050505050565b60006020828403121561359c57600080fd5b8151611b4f8161315c565b60ff828116828216039081111561159657611596613282565b60ff81811683821602908116908181146135dc576135dc613282565b509291505056fea2646970667358221220f02d2fe9b92aba6ab368fdc34506d2339c45cd80325d4a1d967312b89967484464736f6c63430008110033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
