{
  "_format": "hh-sol-artifact-1",
  "contractName": "AccessManager",
  "sourceName": "@openzeppelin/contracts/access/manager/AccessManager.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "initialAdmin",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerAlreadyScheduled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AccessManagerBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerExpired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "initialAdmin",
          "type": "address"
        }
      ],
      "name": "AccessManagerInvalidInitialAdmin",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "AccessManagerLockedRole",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerNotReady",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerNotScheduled",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "msgsender",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "AccessManagerUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "AccessManagerUnauthorizedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "msgsender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "AccessManagerUnauthorizedCancel",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AccessManagerUnauthorizedConsume",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "bits",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintDowncast",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        }
      ],
      "name": "OperationCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        }
      ],
      "name": "OperationExecuted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "schedule",
          "type": "uint48"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "OperationScheduled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "admin",
          "type": "uint64"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        }
      ],
      "name": "RoleGrantDelayChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "newMember",
          "type": "bool"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "guardian",
          "type": "uint64"
        }
      ],
      "name": "RoleGuardianChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "label",
          "type": "string"
        }
      ],
      "name": "RoleLabel",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        }
      ],
      "name": "TargetAdminDelayUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "closed",
          "type": "bool"
        }
      ],
      "name": "TargetClosed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "TargetFunctionRoleUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PUBLIC_ROLE",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "canCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "immediate",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "cancel",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "consumeScheduledOp",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "execute",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "expiration",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getAccess",
      "outputs": [
        {
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        },
        {
          "internalType": "uint32",
          "name": "currentDelay",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "pendingDelay",
          "type": "uint32"
        },
        {
          "internalType": "uint48",
          "name": "effect",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "id",
          "type": "bytes32"
        }
      ],
      "name": "getNonce",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "getRoleGrantDelay",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "getRoleGuardian",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "id",
          "type": "bytes32"
        }
      ],
      "name": "getSchedule",
      "outputs": [
        {
          "internalType": "uint48",
          "name": "",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "getTargetAdminDelay",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "getTargetFunctionRole",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "executionDelay",
          "type": "uint32"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "isMember",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "executionDelay",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "hashOperation",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "isTargetClosed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "string",
          "name": "label",
          "type": "string"
        }
      ],
      "name": "labelRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minSetback",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "uint48",
          "name": "when",
          "type": "uint48"
        }
      ],
      "name": "schedule",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "uint32",
          "name": "newDelay",
          "type": "uint32"
        }
      ],
      "name": "setGrantDelay",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "admin",
          "type": "uint64"
        }
      ],
      "name": "setRoleAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "guardian",
          "type": "uint64"
        }
      ],
      "name": "setRoleGuardian",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "newDelay",
          "type": "uint32"
        }
      ],
      "name": "setTargetAdminDelay",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "closed",
          "type": "bool"
        }
      ],
      "name": "setTargetClosed",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4[]",
          "name": "selectors",
          "type": "bytes4[]"
        },
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "setTargetFunctionRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "newAuthority",
          "type": "address"
        }
      ],
      "name": "updateAuthority",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50604051612df9380380612df983398101604081905261002f91610451565b6001600160a01b03811661005e57604051630409d6d160e11b8152600060048201526024015b60405180910390fd5b61006b6000828180610072565b50506104d1565b60006002600160401b03196001600160401b038616016100b05760405163061c6a4360e21b81526001600160401b0386166004820152602401610055565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff16159081156101a75763ffffffff85166100fc6102bd565b6101069190610497565b905060405180604001604052808265ffffffffffff1681526020016101368663ffffffff166102cd60201b60201c565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c16845282529091208351815494909201519092166601000000000000026001600160a01b031990931665ffffffffffff9091161791909117905561024f565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546101f49166010000000000009091046001600160701b03169086906102d6565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316660100000000000002600160301b600160a01b03199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006102c84261037f565b905090565b63ffffffff1690565b600080806102ec6001600160701b0387166103b6565b905060006103298563ffffffff168763ffffffff168463ffffffff161161031457600061031e565b61031e88856104b5565b63ffffffff166103d5565b905063ffffffff811661033a6102bd565b6103449190610497565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600065ffffffffffff8211156103b2576040516306dfcc6560e41b81526030600482015260248101839052604401610055565b5090565b6000806103cb6001600160701b0384166103e5565b5090949350505050565b8082118183180281185b92915050565b600080806103fa846103f56102bd565b610407565b9250925092509193909250565b6001600160501b03602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561043f57828282610444565b816000805b9250925092509250925092565b60006020828403121561046357600080fd5b81516001600160a01b038116811461047a57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b65ffffffffffff81811683821601908111156103df576103df610481565b63ffffffff82811682821603908111156103df576103df610481565b612919806104e06000396000f3fe6080604052600436106101e35760003560e01c80636d5115bd11610102578063b700961311610095578063d22b598911610064578063d22b59891461065e578063d6bb62c61461067e578063f801a6981461069e578063fe0776f5146106d857600080fd5b8063b7009613146105cc578063b7d2b16214610608578063cc1b6c8114610628578063d1f856ee1461063e57600080fd5b8063a166aa89116100d1578063a166aa8914610521578063a64d95ce14610551578063abd9bd2a14610571578063ac9650d81461059f57600080fd5b80636d5115bd146104ac57806375b238fc146104cc578063853551b8146104e157806394c7d7ee1461050157600080fd5b806330cae1871161017a5780634665096d116101495780634665096d146104195780634c1da1e21461042f578063529629521461044f578063530dd4561461046f57600080fd5b806330cae1871461036d5780633adc277a1461038d5780633ca7c02a146103c45780634136a33c146103df57600080fd5b806318ff183c116101b657806318ff183c146102c05780631cff79cd146102e057806325c471a0146102f35780633078f1141461031357600080fd5b806308d6122d146101e85780630b0a93ba1461020a57806312be87271461026b578063167bd395146102a0575b600080fd5b3480156101f457600080fd5b5061020861020336600461217a565b6106f8565b005b34801561021657600080fd5b5061024e6102253660046121e0565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046121e0565b61074b565b60405163ffffffff9091168152602001610262565b3480156102ac57600080fd5b506102086102bb3660046121fb565b610786565b3480156102cc57600080fd5b506102086102db366004612239565b61079c565b61028b6102ee3660046122a8565b610803565b3480156102ff57600080fd5b5061020861030e366004612310565b610933565b34801561031f57600080fd5b5061033361032e366004612355565b610955565b604051610262949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561037957600080fd5b50610208610388366004612371565b6109ba565b34801561039957600080fd5b506103ad6103a83660046123a4565b6109cc565b60405165ffffffffffff9091168152602001610262565b3480156103d057600080fd5b5061024e6001600160401b0381565b3480156103eb57600080fd5b5061028b6103fa3660046123a4565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561042557600080fd5b5062093a8061028b565b34801561043b57600080fd5b5061028b61044a3660046123bd565b6109ff565b34801561045b57600080fd5b5061020861046a366004612371565b610a2d565b34801561047b57600080fd5b5061024e61048a3660046121e0565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104b857600080fd5b5061024e6104c73660046123f0565b610a3f565b3480156104d857600080fd5b5061024e600081565b3480156104ed57600080fd5b506102086104fc36600461241e565b610a7a565b34801561050d57600080fd5b5061020861051c3660046122a8565b610b11565b34801561052d57600080fd5b5061054161053c3660046123bd565b610bbd565b6040519015158152602001610262565b34801561055d57600080fd5b5061020861056c36600461243c565b610be5565b34801561057d57600080fd5b5061059161058c366004612466565b610bf7565b604051908152602001610262565b3480156105ab57600080fd5b506105bf6105ba3660046124ca565b610c30565b604051610262919061252f565b3480156105d857600080fd5b506105ec6105e73660046125af565b610d17565b60408051921515835263ffffffff909116602083015201610262565b34801561061457600080fd5b50610208610623366004612355565b610d9e565b34801561063457600080fd5b506206978061028b565b34801561064a57600080fd5b506105ec610659366004612355565b610db5565b34801561066a57600080fd5b506102086106793660046125fa565b610e32565b34801561068a57600080fd5b5061028b610699366004612466565b610e44565b3480156106aa57600080fd5b506106be6106b9366004612618565b610f9e565b6040805192835263ffffffff909116602083015201610262565b3480156106e457600080fd5b506102086106f3366004612355565b6110e3565b61070061110c565b60005b828110156107445761073c858585848181106107215761072161268a565b905060200201602081019061073691906126a0565b84611187565b600101610703565b5050505050565b6001600160401b03811660009081526001602081905260408220015461078090600160801b90046001600160701b0316611209565b92915050565b61078e61110c565b6107988282611228565b5050565b6107a461110c565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b505050505050565b60003381806108148388888861129a565b915091508115801561082a575063ffffffff8116155b1561087d57828761083b88886112ed565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061088b84898989610bf7565b9050600063ffffffff83161515806108b257506108a7826109cc565b65ffffffffffff1615155b156108c3576108c082611305565b90505b6003546108d98a6108d48b8b6112ed565b611405565b6003819055506109218a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250349250611447915050565b506003559450505050505b9392505050565b61093b61110c565b61094f83836109498661074b565b846114eb565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff8116929182918291906109ac90600160301b90046001600160701b0316611736565b969991985096509350505050565b6109c261110c565b6107988282611759565b60008181526002602052604081205465ffffffffffff166109ec816117fd565b6109f6578061092c565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610780906001600160701b0316611209565b610a3561110c565b610798828261182c565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610a8261110c565b6001600160401b0383161580610aa057506001600160401b03838116145b15610ac95760405163061c6a4360e21b81526001600160401b0384166004820152602401610874565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610b049291906126e6565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190612702565b6001600160e01b03191614610ba957604051630641fee960e31b81526001600160a01b0382166004820152602401610874565b610744610bb885838686610bf7565b611305565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b610bed61110c565b61079882826118de565b600084848484604051602001610c10949392919061271f565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610c5a57610c5a61278c565b604051908082528060200260200182016040528015610c8d57816020015b6060815260200190600190039081610c785790505b50915060005b83811015610d0f57610cea30868684818110610cb157610cb161268a565b9050602002810190610cc391906127a2565b85604051602001610cd6939291906127e8565b6040516020818303038152906040526119ef565b838281518110610cfc57610cfc61268a565b6020908102919091010152600101610c93565b505092915050565b600080610d2384610bbd565b15610d3357506000905080610d96565b306001600160a01b03861603610d5857610d4d8484611a65565b600091509150610d96565b6000610d648585610a3f565b9050600080610d738389610db5565b9150915081610d8457600080610d8e565b63ffffffff811615815b945094505050505b935093915050565b610da661110c565b610db08282611a7c565b505050565b60008067fffffffffffffffe196001600160401b03851601610ddd5750600190506000610e2b565b600080610dea8686610955565b5050915091508165ffffffffffff16600014158015610e205750610e0c611b69565b65ffffffffffff168265ffffffffffff1611155b93509150610e2b9050565b9250929050565b610e3a61110c565b6107988282611b79565b60003381610e5285856112ed565b90506000610e6288888888610bf7565b60008181526002602052604081205491925065ffffffffffff9091169003610ea05760405163060a299b60e41b815260048101829052602401610874565b826001600160a01b0316886001600160a01b031614610f3c576000610ec6600085610db5565b5090506000610ee1610edb6102258b87610a3f565b86610db5565b50905081158015610ef0575080155b15610f3957604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b031985166064820152608401610874565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6000803381610faf8289898961129a565b91505060008163ffffffff16610fc3611b69565b610fcd919061280f565b905063ffffffff82161580611004575060008665ffffffffffff1611801561100457508065ffffffffffff168665ffffffffffff16105b1561101557828961083b8a8a6112ed565b61102f8665ffffffffffff168265ffffffffffff16611c36565b955061103d838a8a8a610bf7565b945061104885611c46565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b4906110cf908a9088908f908f908f9061282d565b60405180910390a350505094509492505050565b6001600160a01b0381163314610da657604051635f159e6360e01b815260040160405180910390fd5b3360008061111b838236611c93565b9150915081610db0578063ffffffff1660000361117757600061113e8136611d5d565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b03821660248201529092506044019050610874565b61094f610bb88430600036610bf7565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b60008061121e836001600160701b0316611736565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb1389061128e90841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036112c1576112b8868585611c93565b915091506112e4565b600483106112dd576112d886866105e787876112ed565b6112b8565b5060009050805b94509492505050565b60006112fc6004828486612762565b61092c91612873565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff1681830361134e5760405163060a299b60e41b815260048101859052602401610874565b611356611b69565b65ffffffffffff168265ffffffffffff16111561138957604051630c65b5bd60e11b815260048101859052602401610874565b611392826117fd565b156113b357604051631e2975b960e21b815260048101859052602401610874565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156114735760405163cf47918160e01b815247600482015260248101839052604401610874565b600080856001600160a01b0316848660405161148f91906128ab565b60006040518083038185875af1925050503d80600081146114cc576040519150601f19603f3d011682016040523d82523d6000602084013e6114d1565b606091505b50915091506114e1868383611f4f565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161152a5760405163061c6a4360e21b81526001600160401b0386166004820152602401610874565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff161590811561161c578463ffffffff16611576611b69565b611580919061280f565b905060405180604001604052808265ffffffffffff1681526020016115ae8663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff909116179190911790556116c8565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a16845290915281205461166691600160301b9091046001600160701b0316908690611fab565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b600080600061174c84611747611b69565b612055565b9250925092509193909250565b6001600160401b038216158061177757506001600160401b03828116145b156117a05760405163061c6a4360e21b81526001600160401b0383166004820152602401610874565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611807611b69565b65ffffffffffff1661181c62093a808461280f565b65ffffffffffff16111592915050565b6001600160401b038216158061184a57506001600160401b03828116145b156118735760405163061c6a4360e21b81526001600160401b0383166004820152602401610874565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b67fffffffffffffffe196001600160401b0383160161191b5760405163061c6a4360e21b81526001600160401b0383166004820152602401610874565b6001600160401b03821660009081526001602081905260408220015461195590600160801b90046001600160701b03168362069780611fab565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610b04908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611a0c91906128ab565b600060405180830381855af49150503d8060008114611a47576040519150601f19603f3d011682016040523d82523d6000602084013e611a4c565b606091505b5091509150611a5c858383611f4f565b95945050505050565b6000611a718383611405565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611abb5760405163061c6a4360e21b81526001600160401b0384166004820152602401610874565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611afe57506000610780565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b6000611b74426120a2565b905090565b6001600160a01b038216600090815260208190526040812060010154611bac906001600160701b03168362069780611fab565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610b04565b600082821882841102821861092c565b60008181526002602052604090205465ffffffffffff168015801590611c725750611c70816117fd565b155b156107985760405163813e945960e01b815260048101839052602401610874565b6000806004831015611caa57506000905080610d96565b306001600160a01b03861603611ccd57610d4d30611cc886866112ed565b611a65565b6000806000611cdc8787611d5d565b92509250925082158015611cf45750611cf430610bbd565b15611d085760008094509450505050610d96565b600080611d15848b610db5565b9150915081611d2f57600080965096505050505050610d96565b611d458363ffffffff168263ffffffff16611c36565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611d7857506000915081905080611f48565b6000611d8486866112ed565b90506001600160e01b031981166310a6aa3760e31b1480611db557506001600160e01b031981166330cae18760e01b145b80611dd057506001600160e01b0319811663294b14a960e11b145b80611deb57506001600160e01b03198116635326cae760e11b145b80611e0657506001600160e01b0319811663d22b598960e01b145b15611e1c57600160008093509350935050611f48565b6001600160e01b0319811663063fc60f60e21b1480611e4b57506001600160e01b0319811663167bd39560e01b145b80611e6657506001600160e01b031981166308d6122d60e01b145b15611ea8576000611e7b60246004888a612762565b810190611e8891906123bd565b90506000611e95826109ff565b60019650600095509350611f4892505050565b6001600160e01b0319811663012e238d60e51b1480611ed757506001600160e01b03198116635be958b160e11b145b15611f32576000611eec60246004888a612762565b810190611ef991906121e0565b90506001611f23826001600160401b03908116600090815260016020819052604090912001541690565b60009450945094505050611f48565b6000611f3e3083610a3f565b6000935093509350505b9250925092565b606082611f6457611f5f826120d9565b61092c565b8151158015611f7b57506001600160a01b0384163b155b15611fa457604051639996b31560e01b81526001600160a01b0385166004820152602401610874565b508061092c565b6000806000611fc2866001600160701b0316611209565b90506000611fff8563ffffffff168763ffffffff168463ffffffff1611611fea576000611ff4565b611ff488856128c7565b63ffffffff16611c36565b90508063ffffffff16612010611b69565b61201a919061280f565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561209057828282612095565b816000805b9250925092509250925092565b600065ffffffffffff8211156120d5576040516306dfcc6560e41b81526030600482015260248101839052604401610874565b5090565b8051156120e95780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461210257600080fd5b60008083601f84011261212c57600080fd5b5081356001600160401b0381111561214357600080fd5b6020830191508360208260051b8501011115610e2b57600080fd5b80356001600160401b038116811461217557600080fd5b919050565b6000806000806060858703121561219057600080fd5b843561219b81612105565b935060208501356001600160401b038111156121b657600080fd5b6121c28782880161211a565b90945092506121d590506040860161215e565b905092959194509250565b6000602082840312156121f257600080fd5b61092c8261215e565b6000806040838503121561220e57600080fd5b823561221981612105565b91506020830135801515811461222e57600080fd5b809150509250929050565b6000806040838503121561224c57600080fd5b823561225781612105565b9150602083013561222e81612105565b60008083601f84011261227957600080fd5b5081356001600160401b0381111561229057600080fd5b602083019150836020828501011115610e2b57600080fd5b6000806000604084860312156122bd57600080fd5b83356122c881612105565b925060208401356001600160401b038111156122e357600080fd5b6122ef86828701612267565b9497909650939450505050565b803563ffffffff8116811461217557600080fd5b60008060006060848603121561232557600080fd5b61232e8461215e565b9250602084013561233e81612105565b915061234c604085016122fc565b90509250925092565b6000806040838503121561236857600080fd5b6122578361215e565b6000806040838503121561238457600080fd5b61238d8361215e565b915061239b6020840161215e565b90509250929050565b6000602082840312156123b657600080fd5b5035919050565b6000602082840312156123cf57600080fd5b813561092c81612105565b6001600160e01b03198116811461210257600080fd5b6000806040838503121561240357600080fd5b823561240e81612105565b9150602083013561222e816123da565b60008060006040848603121561243357600080fd5b6122c88461215e565b6000806040838503121561244f57600080fd5b6124588361215e565b915061239b602084016122fc565b6000806000806060858703121561247c57600080fd5b843561248781612105565b9350602085013561249781612105565b925060408501356001600160401b038111156124b257600080fd5b6124be87828801612267565b95989497509550505050565b600080602083850312156124dd57600080fd5b82356001600160401b038111156124f357600080fd5b6124ff8582860161211a565b90969095509350505050565b60005b8381101561252657818101518382015260200161250e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156125a357603f198786030184528151805180875261258081602089016020850161250b565b601f01601f19169590950160209081019550938401939190910190600101612557565b50929695505050505050565b6000806000606084860312156125c457600080fd5b83356125cf81612105565b925060208401356125df81612105565b915060408401356125ef816123da565b809150509250925092565b6000806040838503121561260d57600080fd5b823561245881612105565b6000806000806060858703121561262e57600080fd5b843561263981612105565b935060208501356001600160401b0381111561265457600080fd5b61266087828801612267565b909450925050604085013565ffffffffffff8116811461267f57600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156126b257600080fd5b813561092c816123da565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006126fa6020830184866126bd565b949350505050565b60006020828403121561271457600080fd5b815161092c816123da565b6001600160a01b038581168252841660208201526060604082018190526000906114e190830184866126bd565b634e487b7160e01b600052601160045260246000fd5b6000808585111561277257600080fd5b8386111561277f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e198436030181126127b957600080fd5b8301803591506001600160401b038211156127d357600080fd5b602001915036819003821315610e2b57600080fd5b82848237600083820160008152835161280581836020880161250b565b0195945050505050565b65ffffffffffff81811683821601908111156107805761078061274c565b65ffffffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009061286890830184866126bd565b979650505050505050565b80356001600160e01b031981169060048410156128a4576001600160e01b0319600485900360031b81901b82161691505b5092915050565b600082516128bd81846020870161250b565b9190910192915050565b63ffffffff82811682821603908111156107805761078061274c56fea26469706673582212201357d9f495d173195442897445525ffdf2cdec6e9cb2096a82383e4b4e764e0f64736f6c634300081c0033",
  "deployedBytecode": "0x6080604052600436106101e35760003560e01c80636d5115bd11610102578063b700961311610095578063d22b598911610064578063d22b59891461065e578063d6bb62c61461067e578063f801a6981461069e578063fe0776f5146106d857600080fd5b8063b7009613146105cc578063b7d2b16214610608578063cc1b6c8114610628578063d1f856ee1461063e57600080fd5b8063a166aa89116100d1578063a166aa8914610521578063a64d95ce14610551578063abd9bd2a14610571578063ac9650d81461059f57600080fd5b80636d5115bd146104ac57806375b238fc146104cc578063853551b8146104e157806394c7d7ee1461050157600080fd5b806330cae1871161017a5780634665096d116101495780634665096d146104195780634c1da1e21461042f578063529629521461044f578063530dd4561461046f57600080fd5b806330cae1871461036d5780633adc277a1461038d5780633ca7c02a146103c45780634136a33c146103df57600080fd5b806318ff183c116101b657806318ff183c146102c05780631cff79cd146102e057806325c471a0146102f35780633078f1141461031357600080fd5b806308d6122d146101e85780630b0a93ba1461020a57806312be87271461026b578063167bd395146102a0575b600080fd5b3480156101f457600080fd5b5061020861020336600461217a565b6106f8565b005b34801561021657600080fd5b5061024e6102253660046121e0565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561027757600080fd5b5061028b6102863660046121e0565b61074b565b60405163ffffffff9091168152602001610262565b3480156102ac57600080fd5b506102086102bb3660046121fb565b610786565b3480156102cc57600080fd5b506102086102db366004612239565b61079c565b61028b6102ee3660046122a8565b610803565b3480156102ff57600080fd5b5061020861030e366004612310565b610933565b34801561031f57600080fd5b5061033361032e366004612355565b610955565b604051610262949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561037957600080fd5b50610208610388366004612371565b6109ba565b34801561039957600080fd5b506103ad6103a83660046123a4565b6109cc565b60405165ffffffffffff9091168152602001610262565b3480156103d057600080fd5b5061024e6001600160401b0381565b3480156103eb57600080fd5b5061028b6103fa3660046123a4565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561042557600080fd5b5062093a8061028b565b34801561043b57600080fd5b5061028b61044a3660046123bd565b6109ff565b34801561045b57600080fd5b5061020861046a366004612371565b610a2d565b34801561047b57600080fd5b5061024e61048a3660046121e0565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104b857600080fd5b5061024e6104c73660046123f0565b610a3f565b3480156104d857600080fd5b5061024e600081565b3480156104ed57600080fd5b506102086104fc36600461241e565b610a7a565b34801561050d57600080fd5b5061020861051c3660046122a8565b610b11565b34801561052d57600080fd5b5061054161053c3660046123bd565b610bbd565b6040519015158152602001610262565b34801561055d57600080fd5b5061020861056c36600461243c565b610be5565b34801561057d57600080fd5b5061059161058c366004612466565b610bf7565b604051908152602001610262565b3480156105ab57600080fd5b506105bf6105ba3660046124ca565b610c30565b604051610262919061252f565b3480156105d857600080fd5b506105ec6105e73660046125af565b610d17565b60408051921515835263ffffffff909116602083015201610262565b34801561061457600080fd5b50610208610623366004612355565b610d9e565b34801561063457600080fd5b506206978061028b565b34801561064a57600080fd5b506105ec610659366004612355565b610db5565b34801561066a57600080fd5b506102086106793660046125fa565b610e32565b34801561068a57600080fd5b5061028b610699366004612466565b610e44565b3480156106aa57600080fd5b506106be6106b9366004612618565b610f9e565b6040805192835263ffffffff909116602083015201610262565b3480156106e457600080fd5b506102086106f3366004612355565b6110e3565b61070061110c565b60005b828110156107445761073c858585848181106107215761072161268a565b905060200201602081019061073691906126a0565b84611187565b600101610703565b5050505050565b6001600160401b03811660009081526001602081905260408220015461078090600160801b90046001600160701b0316611209565b92915050565b61078e61110c565b6107988282611228565b5050565b6107a461110c565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b505050505050565b60003381806108148388888861129a565b915091508115801561082a575063ffffffff8116155b1561087d57828761083b88886112ed565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061088b84898989610bf7565b9050600063ffffffff83161515806108b257506108a7826109cc565b65ffffffffffff1615155b156108c3576108c082611305565b90505b6003546108d98a6108d48b8b6112ed565b611405565b6003819055506109218a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250349250611447915050565b506003559450505050505b9392505050565b61093b61110c565b61094f83836109498661074b565b846114eb565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff8116929182918291906109ac90600160301b90046001600160701b0316611736565b969991985096509350505050565b6109c261110c565b6107988282611759565b60008181526002602052604081205465ffffffffffff166109ec816117fd565b6109f6578061092c565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610780906001600160701b0316611209565b610a3561110c565b610798828261182c565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610a8261110c565b6001600160401b0383161580610aa057506001600160401b03838116145b15610ac95760405163061c6a4360e21b81526001600160401b0384166004820152602401610874565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610b049291906126e6565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190612702565b6001600160e01b03191614610ba957604051630641fee960e31b81526001600160a01b0382166004820152602401610874565b610744610bb885838686610bf7565b611305565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b610bed61110c565b61079882826118de565b600084848484604051602001610c10949392919061271f565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610c5a57610c5a61278c565b604051908082528060200260200182016040528015610c8d57816020015b6060815260200190600190039081610c785790505b50915060005b83811015610d0f57610cea30868684818110610cb157610cb161268a565b9050602002810190610cc391906127a2565b85604051602001610cd6939291906127e8565b6040516020818303038152906040526119ef565b838281518110610cfc57610cfc61268a565b6020908102919091010152600101610c93565b505092915050565b600080610d2384610bbd565b15610d3357506000905080610d96565b306001600160a01b03861603610d5857610d4d8484611a65565b600091509150610d96565b6000610d648585610a3f565b9050600080610d738389610db5565b9150915081610d8457600080610d8e565b63ffffffff811615815b945094505050505b935093915050565b610da661110c565b610db08282611a7c565b505050565b60008067fffffffffffffffe196001600160401b03851601610ddd5750600190506000610e2b565b600080610dea8686610955565b5050915091508165ffffffffffff16600014158015610e205750610e0c611b69565b65ffffffffffff168265ffffffffffff1611155b93509150610e2b9050565b9250929050565b610e3a61110c565b6107988282611b79565b60003381610e5285856112ed565b90506000610e6288888888610bf7565b60008181526002602052604081205491925065ffffffffffff9091169003610ea05760405163060a299b60e41b815260048101829052602401610874565b826001600160a01b0316886001600160a01b031614610f3c576000610ec6600085610db5565b5090506000610ee1610edb6102258b87610a3f565b86610db5565b50905081158015610ef0575080155b15610f3957604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b031985166064820152608401610874565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6000803381610faf8289898961129a565b91505060008163ffffffff16610fc3611b69565b610fcd919061280f565b905063ffffffff82161580611004575060008665ffffffffffff1611801561100457508065ffffffffffff168665ffffffffffff16105b1561101557828961083b8a8a6112ed565b61102f8665ffffffffffff168265ffffffffffff16611c36565b955061103d838a8a8a610bf7565b945061104885611c46565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b4906110cf908a9088908f908f908f9061282d565b60405180910390a350505094509492505050565b6001600160a01b0381163314610da657604051635f159e6360e01b815260040160405180910390fd5b3360008061111b838236611c93565b9150915081610db0578063ffffffff1660000361117757600061113e8136611d5d565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b03821660248201529092506044019050610874565b61094f610bb88430600036610bf7565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b60008061121e836001600160701b0316611736565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb1389061128e90841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036112c1576112b8868585611c93565b915091506112e4565b600483106112dd576112d886866105e787876112ed565b6112b8565b5060009050805b94509492505050565b60006112fc6004828486612762565b61092c91612873565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff1681830361134e5760405163060a299b60e41b815260048101859052602401610874565b611356611b69565b65ffffffffffff168265ffffffffffff16111561138957604051630c65b5bd60e11b815260048101859052602401610874565b611392826117fd565b156113b357604051631e2975b960e21b815260048101859052602401610874565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156114735760405163cf47918160e01b815247600482015260248101839052604401610874565b600080856001600160a01b0316848660405161148f91906128ab565b60006040518083038185875af1925050503d80600081146114cc576040519150601f19603f3d011682016040523d82523d6000602084013e6114d1565b606091505b50915091506114e1868383611f4f565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161152a5760405163061c6a4360e21b81526001600160401b0386166004820152602401610874565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff161590811561161c578463ffffffff16611576611b69565b611580919061280f565b905060405180604001604052808265ffffffffffff1681526020016115ae8663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff909116179190911790556116c8565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a16845290915281205461166691600160301b9091046001600160701b0316908690611fab565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b600080600061174c84611747611b69565b612055565b9250925092509193909250565b6001600160401b038216158061177757506001600160401b03828116145b156117a05760405163061c6a4360e21b81526001600160401b0383166004820152602401610874565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611807611b69565b65ffffffffffff1661181c62093a808461280f565b65ffffffffffff16111592915050565b6001600160401b038216158061184a57506001600160401b03828116145b156118735760405163061c6a4360e21b81526001600160401b0383166004820152602401610874565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b67fffffffffffffffe196001600160401b0383160161191b5760405163061c6a4360e21b81526001600160401b0383166004820152602401610874565b6001600160401b03821660009081526001602081905260408220015461195590600160801b90046001600160701b03168362069780611fab565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610b04908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611a0c91906128ab565b600060405180830381855af49150503d8060008114611a47576040519150601f19603f3d011682016040523d82523d6000602084013e611a4c565b606091505b5091509150611a5c858383611f4f565b95945050505050565b6000611a718383611405565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611abb5760405163061c6a4360e21b81526001600160401b0384166004820152602401610874565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611afe57506000610780565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b6000611b74426120a2565b905090565b6001600160a01b038216600090815260208190526040812060010154611bac906001600160701b03168362069780611fab565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610b04565b600082821882841102821861092c565b60008181526002602052604090205465ffffffffffff168015801590611c725750611c70816117fd565b155b156107985760405163813e945960e01b815260048101839052602401610874565b6000806004831015611caa57506000905080610d96565b306001600160a01b03861603611ccd57610d4d30611cc886866112ed565b611a65565b6000806000611cdc8787611d5d565b92509250925082158015611cf45750611cf430610bbd565b15611d085760008094509450505050610d96565b600080611d15848b610db5565b9150915081611d2f57600080965096505050505050610d96565b611d458363ffffffff168263ffffffff16611c36565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611d7857506000915081905080611f48565b6000611d8486866112ed565b90506001600160e01b031981166310a6aa3760e31b1480611db557506001600160e01b031981166330cae18760e01b145b80611dd057506001600160e01b0319811663294b14a960e11b145b80611deb57506001600160e01b03198116635326cae760e11b145b80611e0657506001600160e01b0319811663d22b598960e01b145b15611e1c57600160008093509350935050611f48565b6001600160e01b0319811663063fc60f60e21b1480611e4b57506001600160e01b0319811663167bd39560e01b145b80611e6657506001600160e01b031981166308d6122d60e01b145b15611ea8576000611e7b60246004888a612762565b810190611e8891906123bd565b90506000611e95826109ff565b60019650600095509350611f4892505050565b6001600160e01b0319811663012e238d60e51b1480611ed757506001600160e01b03198116635be958b160e11b145b15611f32576000611eec60246004888a612762565b810190611ef991906121e0565b90506001611f23826001600160401b03908116600090815260016020819052604090912001541690565b60009450945094505050611f48565b6000611f3e3083610a3f565b6000935093509350505b9250925092565b606082611f6457611f5f826120d9565b61092c565b8151158015611f7b57506001600160a01b0384163b155b15611fa457604051639996b31560e01b81526001600160a01b0385166004820152602401610874565b508061092c565b6000806000611fc2866001600160701b0316611209565b90506000611fff8563ffffffff168763ffffffff168463ffffffff1611611fea576000611ff4565b611ff488856128c7565b63ffffffff16611c36565b90508063ffffffff16612010611b69565b61201a919061280f565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561209057828282612095565b816000805b9250925092509250925092565b600065ffffffffffff8211156120d5576040516306dfcc6560e41b81526030600482015260248101839052604401610874565b5090565b8051156120e95780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461210257600080fd5b60008083601f84011261212c57600080fd5b5081356001600160401b0381111561214357600080fd5b6020830191508360208260051b8501011115610e2b57600080fd5b80356001600160401b038116811461217557600080fd5b919050565b6000806000806060858703121561219057600080fd5b843561219b81612105565b935060208501356001600160401b038111156121b657600080fd5b6121c28782880161211a565b90945092506121d590506040860161215e565b905092959194509250565b6000602082840312156121f257600080fd5b61092c8261215e565b6000806040838503121561220e57600080fd5b823561221981612105565b91506020830135801515811461222e57600080fd5b809150509250929050565b6000806040838503121561224c57600080fd5b823561225781612105565b9150602083013561222e81612105565b60008083601f84011261227957600080fd5b5081356001600160401b0381111561229057600080fd5b602083019150836020828501011115610e2b57600080fd5b6000806000604084860312156122bd57600080fd5b83356122c881612105565b925060208401356001600160401b038111156122e357600080fd5b6122ef86828701612267565b9497909650939450505050565b803563ffffffff8116811461217557600080fd5b60008060006060848603121561232557600080fd5b61232e8461215e565b9250602084013561233e81612105565b915061234c604085016122fc565b90509250925092565b6000806040838503121561236857600080fd5b6122578361215e565b6000806040838503121561238457600080fd5b61238d8361215e565b915061239b6020840161215e565b90509250929050565b6000602082840312156123b657600080fd5b5035919050565b6000602082840312156123cf57600080fd5b813561092c81612105565b6001600160e01b03198116811461210257600080fd5b6000806040838503121561240357600080fd5b823561240e81612105565b9150602083013561222e816123da565b60008060006040848603121561243357600080fd5b6122c88461215e565b6000806040838503121561244f57600080fd5b6124588361215e565b915061239b602084016122fc565b6000806000806060858703121561247c57600080fd5b843561248781612105565b9350602085013561249781612105565b925060408501356001600160401b038111156124b257600080fd5b6124be87828801612267565b95989497509550505050565b600080602083850312156124dd57600080fd5b82356001600160401b038111156124f357600080fd5b6124ff8582860161211a565b90969095509350505050565b60005b8381101561252657818101518382015260200161250e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156125a357603f198786030184528151805180875261258081602089016020850161250b565b601f01601f19169590950160209081019550938401939190910190600101612557565b50929695505050505050565b6000806000606084860312156125c457600080fd5b83356125cf81612105565b925060208401356125df81612105565b915060408401356125ef816123da565b809150509250925092565b6000806040838503121561260d57600080fd5b823561245881612105565b6000806000806060858703121561262e57600080fd5b843561263981612105565b935060208501356001600160401b0381111561265457600080fd5b61266087828801612267565b909450925050604085013565ffffffffffff8116811461267f57600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156126b257600080fd5b813561092c816123da565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006126fa6020830184866126bd565b949350505050565b60006020828403121561271457600080fd5b815161092c816123da565b6001600160a01b038581168252841660208201526060604082018190526000906114e190830184866126bd565b634e487b7160e01b600052601160045260246000fd5b6000808585111561277257600080fd5b8386111561277f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e198436030181126127b957600080fd5b8301803591506001600160401b038211156127d357600080fd5b602001915036819003821315610e2b57600080fd5b82848237600083820160008152835161280581836020880161250b565b0195945050505050565b65ffffffffffff81811683821601908111156107805761078061274c565b65ffffffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009061286890830184866126bd565b979650505050505050565b80356001600160e01b031981169060048410156128a4576001600160e01b0319600485900360031b81901b82161691505b5092915050565b600082516128bd81846020870161250b565b9190910192915050565b63ffffffff82811682821603908111156107805761078061274c56fea26469706673582212201357d9f495d173195442897445525ffdf2cdec6e9cb2096a82383e4b4e764e0f64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
