{
  "_format": "hh-sol-artifact-1",
  "contractName": "Consensus",
  "sourceName": "contracts/core/Consensus.sol",
  "abi": [
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "GroupAlreadyAdded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "GroupDoesntExist",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "GroupIsNotEmpty",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidGroupId",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "OnlyGroupAdmin",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "voter",
          "type": "address"
        }
      ],
      "name": "OnlyVoter",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "voter",
          "type": "address"
        }
      ],
      "name": "VoterAlreadyAdded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "voter",
          "type": "address"
        }
      ],
      "name": "VoterAlreadyRemoved",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "voter",
          "type": "address"
        }
      ],
      "name": "VoterAlreadyVoted",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "VotingIsNotActive",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "merkleRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "prevMessageCollectEndTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "messageCollectEndTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "prevEpochStartTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "currEpochStartTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "nextVotingTime",
              "type": "uint64"
            }
          ],
          "indexed": false,
          "internalType": "struct EpochInfo",
          "name": "epochInfo",
          "type": "tuple"
        }
      ],
      "name": "ConsensusEpochStarted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "currEpochStartTime",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "merkleRoot",
          "type": "bytes32"
        }
      ],
      "name": "ConsensusReached",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "GroupAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "voterAddress",
          "type": "address"
        }
      ],
      "name": "VoterAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "voterAddress",
          "type": "address"
        }
      ],
      "name": "VoterRemoved",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ADMIN",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "EPOCH_MANAGER",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "_roots",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "validUntil",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "adminAddress",
          "type": "address"
        }
      ],
      "name": "addGroup",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "voterAddress",
          "type": "address"
        }
      ],
      "name": "addVoter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "merkleRoot",
          "type": "bytes32"
        }
      ],
      "name": "checkMerkleRoot",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "value",
          "type": "bytes"
        },
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "consensusVotesNumber",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "num",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableInitializers",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "forceEpoch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getCurrentEpochInfo",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "merkleRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "prevMessageCollectEndTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "messageCollectEndTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "prevEpochStartTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "currEpochStartTime",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "nextVotingTime",
              "type": "uint64"
            }
          ],
          "internalType": "struct EpochInfo",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getGroups",
      "outputs": [
        {
          "internalType": "bytes32[]",
          "name": "",
          "type": "bytes32[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getValue",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "groupsAdmins",
      "outputs": [
        {
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "value",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "hasVoted",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "inGroupVotersNum",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "num",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "adminAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "settingsAddress",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "name": "removeGroup",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "voterAddress",
          "type": "address"
        }
      ],
      "name": "removeVoter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "newAdminAddress",
          "type": "address"
        }
      ],
      "name": "setGroupAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalGroups",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalVoters",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "num",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "messageCollectEndTime",
          "type": "uint64"
        },
        {
          "internalType": "bytes32",
          "name": "newRoot",
          "type": "bytes32"
        }
      ],
      "name": "vote",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "voter",
          "type": "address"
        }
      ],
      "name": "voterToGroupId",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "groupId",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405230608052348015601357600080fd5b506080516128b361003d60003960008181611b1b01528181611b440152611c9501526128b36000f3fe6080604052600436106101ee5760003560e01c806352d1902d1161010d578063a217fddf116100a0578063c61163451161006f578063c611634514610624578063c72b517614610644578063c75f289314610666578063d547741f1461067b578063ef65792d1461069b57600080fd5b8063a217fddf14610564578063a278881c14610579578063ad3cb1cc146105c4578063babc394f1461060257600080fd5b806386c1ff68116100dc57806386c1ff681461048e57806391d14854146104ae5780639af37ad3146104ce5780639e031bec1461051657600080fd5b806352d1902d146104155780635f5300ff1461042a57806365d8dd341461043f578063814964f01461045f57600080fd5b80632a0acc6a1161018557806336568abe1161015457806336568abe146103a257806343273213146103c2578063485cc955146103e25780634f1ef2861461040257600080fd5b80632a0acc6a146103295780632f2ff15d1461034b578063304895f11461036b57806331f449001461038d57600080fd5b80631cc4ca7b116101c15780631cc4ca7b146102b257806320965255146102c7578063248a9ca3146102dc57806326678e5d146102fc57600080fd5b806301ffc9a7146101f357806304fab6e1146102285780630a514cf21461024a5780631477046614610285575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612352565b6106bb565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610248610243366004612398565b6106f2565b005b34801561025657600080fd5b506102776102653660046123c4565b60066020526000908152604090205481565b60405190815260200161021f565b34801561029157600080fd5b506102776102a03660046123df565b60076020526000908152604090205481565b3480156102be57600080fd5b50610248610788565b3480156102d357600080fd5b50600b54610277565b3480156102e857600080fd5b506102776102f73660046123df565b610862565b34801561030857600080fd5b506102776103173660046123df565b600a6020526000908152604090205481565b34801561033557600080fd5b5061027760008051602061281e83398151915281565b34801561035757600080fd5b50610248610366366004612398565b610884565b34801561037757600080fd5b506102776000805160206127de83398151915281565b34801561039957600080fd5b506102486108a6565b3480156103ae57600080fd5b506102486103bd366004612398565b6108e6565b3480156103ce57600080fd5b506102486103dd3660046123df565b61091e565b3480156103ee57600080fd5b506102486103fd3660046123f8565b610abb565b6102486104103660046124c5565b610c52565b34801561042157600080fd5b50610277610c71565b34801561043657600080fd5b50610277610c8e565b34801561044b57600080fd5b5061024861045a366004612398565b610ce6565b34801561046b57600080fd5b5061021361047a3660046123df565b6000908152600a6020526040902054421090565b34801561049a57600080fd5b506102486104a93660046123c4565b610e71565b3480156104ba57600080fd5b506102136104c9366004612398565b610fb5565b3480156104da57600080fd5b506102776104e9366004612512565b81516020818401810180516008825292820194820194909420919093529091526000908152604090205481565b34801561052257600080fd5b5061054c6105313660046123df565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561057057600080fd5b50610277600081565b34801561058557600080fd5b50610213610594366004612556565b81516020818401810180516009825292820194820194909420919093529091526000908152604090205460ff1681565b3480156105d057600080fd5b506105f5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161021f91906125be565b34801561060e57600080fd5b50610617610fed565b60405161021f91906125f1565b34801561063057600080fd5b5061024861063f366004612677565b61107c565b34801561065057600080fd5b50610659611398565b60405161021f91906126a3565b34801561067257600080fd5b50600354610277565b34801561068757600080fd5b50610248610696366004612398565b6113f0565b3480156106a757600080fd5b506102486106b6366004612398565b61140c565b60006001600160e01b03198216637965db0b60e01b14806106ec57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526002602052604090205482906001600160a01b031633146107325760405163798042a560e01b81523360048201526024015b60405180910390fd5b6001600160a01b0382166107595760405163d92e233d60e01b815260040160405180910390fd5b5060009182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000805160206127de8339815191526107a081611640565b600054604051630e31818560e11b81527f4f27e928da73627e3874c3712f79e2e58f25a77db3929917088d7d5014f08604600482015242916001600160a01b031690631c63030a90602401602060405180830381865afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c91906126e6565b600c546108499190600160c01b90046001600160401b0316612719565b6001600160401b03161161085f5761085f61164a565b50565b600090815260008051602061283e833981519152602052604090206001015490565b61088d82610862565b61089681611640565b6108a083836118e9565b50505050565b60008051602061285e833981519152546001600160401b0316156108dc5760405162dc149f60e41b815260040160405180910390fd5b6108e461198e565b565b6001600160a01b038116331461090f5760405163334bd91960e11b815260040160405180910390fd5b6109198282611a29565b505050565b60008051602061281e83398151915261093681611640565b8161095457604051631b47388560e11b815260040160405180910390fd5b6000828152600260205260409020546001600160a01b031661098c576040516349fa563160e11b815260048101839052602401610729565b600082815260076020526040902054156109bc576040516316809dd760e21b815260048101839052602401610729565b600082815260026020526040812080546001600160a01b03191690556003546001600160401b038111156109f2576109f2612422565b604051908082528060200260200182016040528015610a1b578160200160208202803683370190505b5090506000805b600354811015610aa1578460038281548110610a4057610a40612738565b906000526020600020015414610a995760038181548110610a6357610a63612738565b9060005260206000200154838380610a7a9061274e565b945081518110610a8c57610a8c612738565b6020026020010181815250505b600101610a22565b818352610ab360036020850184612294565b505050505050565b60008051602061285e8339815191528054600160401b810460ff1615906001600160401b0316600081158015610aee5750825b90506000826001600160401b03166001148015610b0a5750303b155b905081158015610b18575080155b15610b365760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b6057845460ff60401b1916600160401b1785555b610b68611aa5565b610b70611aa5565b600080546001600160a01b0319166001600160a01b038816179055610ba360008051602061281e83398151915280611aad565b610bc96000805160206127de83398151915260008051602061281e833981519152611aad565b610be160008051602061281e833981519152886118e9565b50610bfa6000805160206127de833981519152886118e9565b50610c0361164a565b8315610c4957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c5a611b10565b610c6382611bb5565b610c6d8282611bcd565b5050565b6000610c7b611c8a565b506000805160206127fe83398151915290565b6000805b600354811015610ce2576007600060038381548110610cb357610cb3612738565b906000526020600020015481526020019081526020016000205482610cd89190612767565b9150600101610c92565b5090565b60008051602061281e833981519152610cfe81611640565b82610d1c57604051631b47388560e11b815260040160405180910390fd5b6001600160a01b038216610d435760405163d92e233d60e01b815260040160405180910390fd5b6000838152600260205260409020546001600160a01b031615610d7c5760405163dfdfbc2d60e01b815260048101849052602401610729565b60005b600154811015610dd8578360018281548110610d9d57610d9d612738565b90600052602060002090600202016000015403610dd05760405163dfdfbc2d60e01b815260048101859052602401610729565b600101610d7f565b5050604080518082019091529182526001600160a01b039081166020830190815260018054808201825560009190915292517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6600290940293840155517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf790920180546001600160a01b03191692909116919091179055565b6001600160a01b038082166000908152600660209081526040808320548084526002909252909120549091163314610ebe5760405163798042a560e01b8152336004820152602401610729565b60005b600554811015610f2e57826001600160a01b031660058281548110610ee857610ee8612738565b6000918252602090912001546001600160a01b031603610f265760405163f9a5ac4b60e01b81526001600160a01b0384166004820152602401610729565b600101610ec1565b50600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384169081179091556040519081527fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d644906020015b60405180910390a15050565b600091825260008051602061283e833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600b548152600c546001600160401b038082166020840152600160401b8204811693830193909352600160801b810483166060830152600160c01b900482166080820152600d5490911660a082015290565b336000908152600660205260409020546110ab5760405163e051520960e01b8152336004820152602401610729565b600d546001600160401b0390811690831610610c6d57600d546001600160401b03164210156110ed5760405163179e70af60e21b815260040160405180910390fd5b6040516001600160c01b031960c084901b1660208201526028810182905260009060480160408051601f19818403018152908290529150339060099061113490849061277a565b90815260408051602092819003830190206001600160a01b0384166000908152925290205460ff1615611185576040516327ead06f60e01b81526001600160a01b0382166004820152602401610729565b6001600160a01b0381166000908152600660205260409020546111a9908390611cd3565b156111b45750505050565b6008826040516111c4919061277a565b90815260408051602092819003830190206001600160a01b038416600090815260068452828120548152925281208054916111fe8361274e565b91905055506001600983604051611215919061277a565b90815260408051602092819003830190206001600160a01b038516600090815292529020805460ff191691151591909117905561125182611dec565b156108a057600b839055600c8054600160401b8082046001600160401b039081166fffffffffffffffffffffffffffffffff199093169290921791871602179055600054604051630e31818560e11b81527f30d9b452ee51929ed46b0efac730a78ccd37a793a5acf24feda636390b21051660048201526001600160a01b0390911690631c63030a90602401602060405180830381865afa1580156112fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131e91906126e6565b611331906001600160401b031642612767565b6000848152600a602090815260409182902092909255600c548151600160c01b9091046001600160401b031681529182018590527fccdf41482c7267f877a85c0080dfcb5b0312bb8e08facbdf733b545447b0f9cc910160405180910390a16108a061164a565b606060038054806020026020016040519081016040528092919081815260200182805480156113e657602002820191906000526020600020905b8154815260200190600101908083116113d2575b5050505050905090565b6113f982610862565b61140281611640565b6108a08383611a29565b60008281526002602052604090205482906001600160a01b031633146114475760405163798042a560e01b8152336004820152602401610729565b6001600160a01b03821661146e5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038216600090815260066020526040902054156114cb576001600160a01b038216600081815260066020526040908190205490516329a0e73760e21b815260048101919091526024810191909152604401610729565b60005b60045481101561156f57826001600160a01b0316600482815481106114f5576114f5612738565b60009182526020909120600160029092020101546001600160a01b031603611567576004818154811061152a5761152a612738565b60009182526020909120600290910201546040516329a0e73760e21b815260048101919091526001600160a01b0384166024820152604401610729565b6001016114ce565b506040805180820182528481526001600160a01b0384811660208084018281526004805460018101825560009190915294517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600290960295860155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c90940180546001600160a01b03191694909316939093179091558251868152918201527ff2c5d250e7f5e3d0a00af1ab95adfe8fa8da11ad3c6bd195b6cd09688ba317bb910160405180910390a1505050565b61085f8133611f16565b60005b6001548110156116bc576116b46001828154811061166d5761166d612738565b9060005260206000209060020201600001546001838154811061169257611692612738565b60009182526020909120600160029092020101546001600160a01b0316611f4f565b60010161164d565b6116c8600160006122db565b5060005b60045481101561173b57611733600482815481106116ec576116ec612738565b9060005260206000209060020201600001546004838154811061171157611711612738565b60009182526020909120600160029092020101546001600160a01b0316611fce565b6001016116cc565b611747600460006122db565b5060005b60055481101561178d576117856005828154811061176b5761176b612738565b6000918252602090912001546001600160a01b031661202d565b60010161174b565b611799600560006122fc565b50600c80546fffffffffffffffffffffffffffffffff8116600160c01b918290046001600160401b03908116600160801b026001600160c01b03169190911742919091169190910217905560008054604051630e31818560e11b81527fb85db7dee54693d742881af46464432adde0803726a71dd9f6234a601792cf9a600482015282916001600160a01b031690631c63030a90602401602060405180830381865afa15801561184d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187191906126e6565b600c54909150611892908290600160c01b90046001600160401b0316612719565b600d805467ffffffffffffffff19166001600160401b03929092169190911790557f8972e12e089a1ae976976f71bea607670287871127b417136bf394b144082d346118dc610fed565b604051610fa991906125f1565b600060008051602061283e8339815191526119048484610fb5565b611984576000848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561193a3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106ec565b60009150506106ec565b60008051602061285e8339815191528054600160401b900460ff16156119c75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161461085f57805467ffffffffffffffff19166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150565b600060008051602061283e833981519152611a448484610fb5565b15611984576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106ec565b6108e4612085565b60008051602061283e8339815191526000611ac784610862565b600085815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b9757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b8b6000805160206127fe833981519152546001600160a01b031690565b6001600160a01b031614155b156108e45760405163703e46dd60e11b815260040160405180910390fd5b60008051602061281e833981519152610c6d81611640565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611c27575060408051601f3d908101601f19168201909252611c2491810190612796565b60015b611c4f57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610729565b6000805160206127fe8339815191528114611c8057604051632a87526960e21b815260048101829052602401610729565b61091983836120bc565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108e45760405163703e46dd60e11b815260040160405180910390fd5b6000818152600760205260408120548103611cf0575060006106ec565b6000828152600760205260408082205482549151630e31818560e11b81527f7f409c90678ce93e65834482eacce2014a08dd7ce43a3ec31af5320a72db7a62600482015290916001600160a01b031690631c63030a90602401602060405180830381865afa158015611d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8a91906126e6565b6001600160401b0316611d9d91906127af565b9050806103e8600886604051611db3919061277a565b9081526020016040518091039020600086815260200190815260200160002054611ddd91906127af565b106119845760019150506106ec565b60035460008054604051630e31818560e11b81527f4974a2122f752ac8bcaeec9beacd1bb419a4c873fda1aa7058360e08c5c9401c60048201529192839283926001600160a01b031690631c63030a90602401602060405180830381865afa158015611e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8091906126e6565b6001600160401b0316611e9391906127af565b905060005b600354811015611f0b57611ec98560038381548110611eb957611eb9612738565b9060005260206000200154611cd3565b611ed4576000611ed7565b60015b611ee49060ff1684612767565b925081611ef36103e8856127af565b10611f0357506001949350505050565b600101611e98565b506000949350505050565b611f208282610fb5565b610c6d5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610729565b6000828152600260205260409020546001600160a01b031615611f70575050565b600082815260026020526040812080546001600160a01b0319166001600160a01b0393909316929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0155565b6001600160a01b03811660009081526006602052604090205415611ff0575050565b6001600160a01b0381166000908152600660209081526040808320859055848352600790915281208054916120248361274e565b91905055505050565b6001600160a01b03811660009081526006602052604090205461204d5750565b6001600160a01b03811660009081526006602090815260408083208054908490558084526007909252822080549192612024836127c6565b60008051602061285e83398151915254600160401b900460ff166108e457604051631afcd79f60e31b815260040160405180910390fd5b6120c582612112565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561210a576109198282612177565b610c6d6121ed565b806001600160a01b03163b60000361214857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610729565b6000805160206127fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612194919061277a565b600060405180830381855af49150503d80600081146121cf576040519150601f19603f3d011682016040523d82523d6000602084013e6121d4565b606091505b50915091506121e485838361220c565b95945050505050565b34156108e45760405163b398979f60e01b815260040160405180910390fd5b6060826122215761221c8261226b565b612264565b815115801561223857506001600160a01b0384163b155b1561226157604051639996b31560e01b81526001600160a01b0385166004820152602401610729565b50805b9392505050565b80511561227b5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b8280548282559060005260206000209081019282156122cf579160200282015b828111156122cf5782518255916020019190600101906122b4565b50610ce2929150612316565b508054600082556002029060005260206000209081019061085f919061232b565b508054600082559060005260206000209081019061085f91905b5b80821115610ce25760008155600101612317565b5b80821115610ce257600081556001810180546001600160a01b031916905560020161232c565b60006020828403121561236457600080fd5b81356001600160e01b03198116811461226457600080fd5b80356001600160a01b038116811461239357600080fd5b919050565b600080604083850312156123ab57600080fd5b823591506123bb6020840161237c565b90509250929050565b6000602082840312156123d657600080fd5b6122648261237c565b6000602082840312156123f157600080fd5b5035919050565b6000806040838503121561240b57600080fd5b6124148361237c565b91506123bb6020840161237c565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261244957600080fd5b81356001600160401b0381111561246257612462612422565b604051601f8201601f19908116603f011681016001600160401b038111828210171561249057612490612422565b6040528181528382016020018510156124a857600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156124d857600080fd5b6124e18361237c565b915060208301356001600160401b038111156124fc57600080fd5b61250885828601612438565b9150509250929050565b6000806040838503121561252557600080fd5b82356001600160401b0381111561253b57600080fd5b61254785828601612438565b95602094909401359450505050565b6000806040838503121561256957600080fd5b82356001600160401b0381111561257f57600080fd5b61258b85828601612438565b9250506123bb6020840161237c565b60005b838110156125b557818101518382015260200161259d565b50506000910152565b60208152600082518060208401526125dd81604085016020870161259a565b601f01601f19169190910160400192915050565b600060c082019050825182526001600160401b0360208401511660208301526001600160401b0360408401511660408301526001600160401b0360608401511660608301526001600160401b0360808401511660808301526001600160401b0360a08401511660a083015292915050565b6001600160401b038116811461085f57600080fd5b6000806040838503121561268a57600080fd5b823561269581612662565b946020939093013593505050565b602080825282518282018190526000918401906040840190835b818110156126db5783518352602093840193909201916001016126bd565b509095945050505050565b6000602082840312156126f857600080fd5b815161226481612662565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908111156106ec576106ec612703565b634e487b7160e01b600052603260045260246000fd5b60006001820161276057612760612703565b5060010190565b808201808211156106ec576106ec612703565b6000825161278c81846020870161259a565b9190910192915050565b6000602082840312156127a857600080fd5b5051919050565b80820281158282048414176106ec576106ec612703565b6000816127d5576127d5612703565b50600019019056febb98d3582351a85c7e45e5d913a683b101fd521ef4e097faf6539a7475de6f4d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4202dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212204194dd6cca33318b1ea5262712db0104e76eb4563553fff422bd6f80f656876664736f6c634300081c0033",
  "deployedBytecode": "0x6080604052600436106101ee5760003560e01c806352d1902d1161010d578063a217fddf116100a0578063c61163451161006f578063c611634514610624578063c72b517614610644578063c75f289314610666578063d547741f1461067b578063ef65792d1461069b57600080fd5b8063a217fddf14610564578063a278881c14610579578063ad3cb1cc146105c4578063babc394f1461060257600080fd5b806386c1ff68116100dc57806386c1ff681461048e57806391d14854146104ae5780639af37ad3146104ce5780639e031bec1461051657600080fd5b806352d1902d146104155780635f5300ff1461042a57806365d8dd341461043f578063814964f01461045f57600080fd5b80632a0acc6a1161018557806336568abe1161015457806336568abe146103a257806343273213146103c2578063485cc955146103e25780634f1ef2861461040257600080fd5b80632a0acc6a146103295780632f2ff15d1461034b578063304895f11461036b57806331f449001461038d57600080fd5b80631cc4ca7b116101c15780631cc4ca7b146102b257806320965255146102c7578063248a9ca3146102dc57806326678e5d146102fc57600080fd5b806301ffc9a7146101f357806304fab6e1146102285780630a514cf21461024a5780631477046614610285575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612352565b6106bb565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b50610248610243366004612398565b6106f2565b005b34801561025657600080fd5b506102776102653660046123c4565b60066020526000908152604090205481565b60405190815260200161021f565b34801561029157600080fd5b506102776102a03660046123df565b60076020526000908152604090205481565b3480156102be57600080fd5b50610248610788565b3480156102d357600080fd5b50600b54610277565b3480156102e857600080fd5b506102776102f73660046123df565b610862565b34801561030857600080fd5b506102776103173660046123df565b600a6020526000908152604090205481565b34801561033557600080fd5b5061027760008051602061281e83398151915281565b34801561035757600080fd5b50610248610366366004612398565b610884565b34801561037757600080fd5b506102776000805160206127de83398151915281565b34801561039957600080fd5b506102486108a6565b3480156103ae57600080fd5b506102486103bd366004612398565b6108e6565b3480156103ce57600080fd5b506102486103dd3660046123df565b61091e565b3480156103ee57600080fd5b506102486103fd3660046123f8565b610abb565b6102486104103660046124c5565b610c52565b34801561042157600080fd5b50610277610c71565b34801561043657600080fd5b50610277610c8e565b34801561044b57600080fd5b5061024861045a366004612398565b610ce6565b34801561046b57600080fd5b5061021361047a3660046123df565b6000908152600a6020526040902054421090565b34801561049a57600080fd5b506102486104a93660046123c4565b610e71565b3480156104ba57600080fd5b506102136104c9366004612398565b610fb5565b3480156104da57600080fd5b506102776104e9366004612512565b81516020818401810180516008825292820194820194909420919093529091526000908152604090205481565b34801561052257600080fd5b5061054c6105313660046123df565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561057057600080fd5b50610277600081565b34801561058557600080fd5b50610213610594366004612556565b81516020818401810180516009825292820194820194909420919093529091526000908152604090205460ff1681565b3480156105d057600080fd5b506105f5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161021f91906125be565b34801561060e57600080fd5b50610617610fed565b60405161021f91906125f1565b34801561063057600080fd5b5061024861063f366004612677565b61107c565b34801561065057600080fd5b50610659611398565b60405161021f91906126a3565b34801561067257600080fd5b50600354610277565b34801561068757600080fd5b50610248610696366004612398565b6113f0565b3480156106a757600080fd5b506102486106b6366004612398565b61140c565b60006001600160e01b03198216637965db0b60e01b14806106ec57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526002602052604090205482906001600160a01b031633146107325760405163798042a560e01b81523360048201526024015b60405180910390fd5b6001600160a01b0382166107595760405163d92e233d60e01b815260040160405180910390fd5b5060009182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000805160206127de8339815191526107a081611640565b600054604051630e31818560e11b81527f4f27e928da73627e3874c3712f79e2e58f25a77db3929917088d7d5014f08604600482015242916001600160a01b031690631c63030a90602401602060405180830381865afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c91906126e6565b600c546108499190600160c01b90046001600160401b0316612719565b6001600160401b03161161085f5761085f61164a565b50565b600090815260008051602061283e833981519152602052604090206001015490565b61088d82610862565b61089681611640565b6108a083836118e9565b50505050565b60008051602061285e833981519152546001600160401b0316156108dc5760405162dc149f60e41b815260040160405180910390fd5b6108e461198e565b565b6001600160a01b038116331461090f5760405163334bd91960e11b815260040160405180910390fd5b6109198282611a29565b505050565b60008051602061281e83398151915261093681611640565b8161095457604051631b47388560e11b815260040160405180910390fd5b6000828152600260205260409020546001600160a01b031661098c576040516349fa563160e11b815260048101839052602401610729565b600082815260076020526040902054156109bc576040516316809dd760e21b815260048101839052602401610729565b600082815260026020526040812080546001600160a01b03191690556003546001600160401b038111156109f2576109f2612422565b604051908082528060200260200182016040528015610a1b578160200160208202803683370190505b5090506000805b600354811015610aa1578460038281548110610a4057610a40612738565b906000526020600020015414610a995760038181548110610a6357610a63612738565b9060005260206000200154838380610a7a9061274e565b945081518110610a8c57610a8c612738565b6020026020010181815250505b600101610a22565b818352610ab360036020850184612294565b505050505050565b60008051602061285e8339815191528054600160401b810460ff1615906001600160401b0316600081158015610aee5750825b90506000826001600160401b03166001148015610b0a5750303b155b905081158015610b18575080155b15610b365760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b6057845460ff60401b1916600160401b1785555b610b68611aa5565b610b70611aa5565b600080546001600160a01b0319166001600160a01b038816179055610ba360008051602061281e83398151915280611aad565b610bc96000805160206127de83398151915260008051602061281e833981519152611aad565b610be160008051602061281e833981519152886118e9565b50610bfa6000805160206127de833981519152886118e9565b50610c0361164a565b8315610c4957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c5a611b10565b610c6382611bb5565b610c6d8282611bcd565b5050565b6000610c7b611c8a565b506000805160206127fe83398151915290565b6000805b600354811015610ce2576007600060038381548110610cb357610cb3612738565b906000526020600020015481526020019081526020016000205482610cd89190612767565b9150600101610c92565b5090565b60008051602061281e833981519152610cfe81611640565b82610d1c57604051631b47388560e11b815260040160405180910390fd5b6001600160a01b038216610d435760405163d92e233d60e01b815260040160405180910390fd5b6000838152600260205260409020546001600160a01b031615610d7c5760405163dfdfbc2d60e01b815260048101849052602401610729565b60005b600154811015610dd8578360018281548110610d9d57610d9d612738565b90600052602060002090600202016000015403610dd05760405163dfdfbc2d60e01b815260048101859052602401610729565b600101610d7f565b5050604080518082019091529182526001600160a01b039081166020830190815260018054808201825560009190915292517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6600290940293840155517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf790920180546001600160a01b03191692909116919091179055565b6001600160a01b038082166000908152600660209081526040808320548084526002909252909120549091163314610ebe5760405163798042a560e01b8152336004820152602401610729565b60005b600554811015610f2e57826001600160a01b031660058281548110610ee857610ee8612738565b6000918252602090912001546001600160a01b031603610f265760405163f9a5ac4b60e01b81526001600160a01b0384166004820152602401610729565b600101610ec1565b50600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384169081179091556040519081527fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d644906020015b60405180910390a15050565b600091825260008051602061283e833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600b548152600c546001600160401b038082166020840152600160401b8204811693830193909352600160801b810483166060830152600160c01b900482166080820152600d5490911660a082015290565b336000908152600660205260409020546110ab5760405163e051520960e01b8152336004820152602401610729565b600d546001600160401b0390811690831610610c6d57600d546001600160401b03164210156110ed5760405163179e70af60e21b815260040160405180910390fd5b6040516001600160c01b031960c084901b1660208201526028810182905260009060480160408051601f19818403018152908290529150339060099061113490849061277a565b90815260408051602092819003830190206001600160a01b0384166000908152925290205460ff1615611185576040516327ead06f60e01b81526001600160a01b0382166004820152602401610729565b6001600160a01b0381166000908152600660205260409020546111a9908390611cd3565b156111b45750505050565b6008826040516111c4919061277a565b90815260408051602092819003830190206001600160a01b038416600090815260068452828120548152925281208054916111fe8361274e565b91905055506001600983604051611215919061277a565b90815260408051602092819003830190206001600160a01b038516600090815292529020805460ff191691151591909117905561125182611dec565b156108a057600b839055600c8054600160401b8082046001600160401b039081166fffffffffffffffffffffffffffffffff199093169290921791871602179055600054604051630e31818560e11b81527f30d9b452ee51929ed46b0efac730a78ccd37a793a5acf24feda636390b21051660048201526001600160a01b0390911690631c63030a90602401602060405180830381865afa1580156112fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131e91906126e6565b611331906001600160401b031642612767565b6000848152600a602090815260409182902092909255600c548151600160c01b9091046001600160401b031681529182018590527fccdf41482c7267f877a85c0080dfcb5b0312bb8e08facbdf733b545447b0f9cc910160405180910390a16108a061164a565b606060038054806020026020016040519081016040528092919081815260200182805480156113e657602002820191906000526020600020905b8154815260200190600101908083116113d2575b5050505050905090565b6113f982610862565b61140281611640565b6108a08383611a29565b60008281526002602052604090205482906001600160a01b031633146114475760405163798042a560e01b8152336004820152602401610729565b6001600160a01b03821661146e5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038216600090815260066020526040902054156114cb576001600160a01b038216600081815260066020526040908190205490516329a0e73760e21b815260048101919091526024810191909152604401610729565b60005b60045481101561156f57826001600160a01b0316600482815481106114f5576114f5612738565b60009182526020909120600160029092020101546001600160a01b031603611567576004818154811061152a5761152a612738565b60009182526020909120600290910201546040516329a0e73760e21b815260048101919091526001600160a01b0384166024820152604401610729565b6001016114ce565b506040805180820182528481526001600160a01b0384811660208084018281526004805460018101825560009190915294517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600290960295860155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c90940180546001600160a01b03191694909316939093179091558251868152918201527ff2c5d250e7f5e3d0a00af1ab95adfe8fa8da11ad3c6bd195b6cd09688ba317bb910160405180910390a1505050565b61085f8133611f16565b60005b6001548110156116bc576116b46001828154811061166d5761166d612738565b9060005260206000209060020201600001546001838154811061169257611692612738565b60009182526020909120600160029092020101546001600160a01b0316611f4f565b60010161164d565b6116c8600160006122db565b5060005b60045481101561173b57611733600482815481106116ec576116ec612738565b9060005260206000209060020201600001546004838154811061171157611711612738565b60009182526020909120600160029092020101546001600160a01b0316611fce565b6001016116cc565b611747600460006122db565b5060005b60055481101561178d576117856005828154811061176b5761176b612738565b6000918252602090912001546001600160a01b031661202d565b60010161174b565b611799600560006122fc565b50600c80546fffffffffffffffffffffffffffffffff8116600160c01b918290046001600160401b03908116600160801b026001600160c01b03169190911742919091169190910217905560008054604051630e31818560e11b81527fb85db7dee54693d742881af46464432adde0803726a71dd9f6234a601792cf9a600482015282916001600160a01b031690631c63030a90602401602060405180830381865afa15801561184d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187191906126e6565b600c54909150611892908290600160c01b90046001600160401b0316612719565b600d805467ffffffffffffffff19166001600160401b03929092169190911790557f8972e12e089a1ae976976f71bea607670287871127b417136bf394b144082d346118dc610fed565b604051610fa991906125f1565b600060008051602061283e8339815191526119048484610fb5565b611984576000848152602082815260408083206001600160a01b03871684529091529020805460ff1916600117905561193a3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106ec565b60009150506106ec565b60008051602061285e8339815191528054600160401b900460ff16156119c75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161461085f57805467ffffffffffffffff19166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150565b600060008051602061283e833981519152611a448484610fb5565b15611984576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106ec565b6108e4612085565b60008051602061283e8339815191526000611ac784610862565b600085815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611b9757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b8b6000805160206127fe833981519152546001600160a01b031690565b6001600160a01b031614155b156108e45760405163703e46dd60e11b815260040160405180910390fd5b60008051602061281e833981519152610c6d81611640565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611c27575060408051601f3d908101601f19168201909252611c2491810190612796565b60015b611c4f57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610729565b6000805160206127fe8339815191528114611c8057604051632a87526960e21b815260048101829052602401610729565b61091983836120bc565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108e45760405163703e46dd60e11b815260040160405180910390fd5b6000818152600760205260408120548103611cf0575060006106ec565b6000828152600760205260408082205482549151630e31818560e11b81527f7f409c90678ce93e65834482eacce2014a08dd7ce43a3ec31af5320a72db7a62600482015290916001600160a01b031690631c63030a90602401602060405180830381865afa158015611d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8a91906126e6565b6001600160401b0316611d9d91906127af565b9050806103e8600886604051611db3919061277a565b9081526020016040518091039020600086815260200190815260200160002054611ddd91906127af565b106119845760019150506106ec565b60035460008054604051630e31818560e11b81527f4974a2122f752ac8bcaeec9beacd1bb419a4c873fda1aa7058360e08c5c9401c60048201529192839283926001600160a01b031690631c63030a90602401602060405180830381865afa158015611e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8091906126e6565b6001600160401b0316611e9391906127af565b905060005b600354811015611f0b57611ec98560038381548110611eb957611eb9612738565b9060005260206000200154611cd3565b611ed4576000611ed7565b60015b611ee49060ff1684612767565b925081611ef36103e8856127af565b10611f0357506001949350505050565b600101611e98565b506000949350505050565b611f208282610fb5565b610c6d5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610729565b6000828152600260205260409020546001600160a01b031615611f70575050565b600082815260026020526040812080546001600160a01b0319166001600160a01b0393909316929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0155565b6001600160a01b03811660009081526006602052604090205415611ff0575050565b6001600160a01b0381166000908152600660209081526040808320859055848352600790915281208054916120248361274e565b91905055505050565b6001600160a01b03811660009081526006602052604090205461204d5750565b6001600160a01b03811660009081526006602090815260408083208054908490558084526007909252822080549192612024836127c6565b60008051602061285e83398151915254600160401b900460ff166108e457604051631afcd79f60e31b815260040160405180910390fd5b6120c582612112565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561210a576109198282612177565b610c6d6121ed565b806001600160a01b03163b60000361214857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610729565b6000805160206127fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612194919061277a565b600060405180830381855af49150503d80600081146121cf576040519150601f19603f3d011682016040523d82523d6000602084013e6121d4565b606091505b50915091506121e485838361220c565b95945050505050565b34156108e45760405163b398979f60e01b815260040160405180910390fd5b6060826122215761221c8261226b565b612264565b815115801561223857506001600160a01b0384163b155b1561226157604051639996b31560e01b81526001600160a01b0385166004820152602401610729565b50805b9392505050565b80511561227b5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b8280548282559060005260206000209081019282156122cf579160200282015b828111156122cf5782518255916020019190600101906122b4565b50610ce2929150612316565b508054600082556002029060005260206000209081019061085f919061232b565b508054600082559060005260206000209081019061085f91905b5b80821115610ce25760008155600101612317565b5b80821115610ce257600081556001810180546001600160a01b031916905560020161232c565b60006020828403121561236457600080fd5b81356001600160e01b03198116811461226457600080fd5b80356001600160a01b038116811461239357600080fd5b919050565b600080604083850312156123ab57600080fd5b823591506123bb6020840161237c565b90509250929050565b6000602082840312156123d657600080fd5b6122648261237c565b6000602082840312156123f157600080fd5b5035919050565b6000806040838503121561240b57600080fd5b6124148361237c565b91506123bb6020840161237c565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261244957600080fd5b81356001600160401b0381111561246257612462612422565b604051601f8201601f19908116603f011681016001600160401b038111828210171561249057612490612422565b6040528181528382016020018510156124a857600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156124d857600080fd5b6124e18361237c565b915060208301356001600160401b038111156124fc57600080fd5b61250885828601612438565b9150509250929050565b6000806040838503121561252557600080fd5b82356001600160401b0381111561253b57600080fd5b61254785828601612438565b95602094909401359450505050565b6000806040838503121561256957600080fd5b82356001600160401b0381111561257f57600080fd5b61258b85828601612438565b9250506123bb6020840161237c565b60005b838110156125b557818101518382015260200161259d565b50506000910152565b60208152600082518060208401526125dd81604085016020870161259a565b601f01601f19169190910160400192915050565b600060c082019050825182526001600160401b0360208401511660208301526001600160401b0360408401511660408301526001600160401b0360608401511660608301526001600160401b0360808401511660808301526001600160401b0360a08401511660a083015292915050565b6001600160401b038116811461085f57600080fd5b6000806040838503121561268a57600080fd5b823561269581612662565b946020939093013593505050565b602080825282518282018190526000918401906040840190835b818110156126db5783518352602093840193909201916001016126bd565b509095945050505050565b6000602082840312156126f857600080fd5b815161226481612662565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908111156106ec576106ec612703565b634e487b7160e01b600052603260045260246000fd5b60006001820161276057612760612703565b5060010190565b808201808211156106ec576106ec612703565b6000825161278c81846020870161259a565b9190910192915050565b6000602082840312156127a857600080fd5b5051919050565b80820281158282048414176106ec576106ec612703565b6000816127d5576127d5612703565b50600019019056febb98d3582351a85c7e45e5d913a683b101fd521ef4e097faf6539a7475de6f4d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4202dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212204194dd6cca33318b1ea5262712db0104e76eb4563553fff422bd6f80f656876664736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
