{
  "_format": "hh-sol-artifact-1",
  "contractName": "AccessManager",
  "sourceName": "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": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "AccessManagerLockedFunction",
      "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": "0x6080604052346102ef57d36102ef57d26102ef57604051601f6128df38819003918201601f19168301916001600160401b0383118484101761017e578084926020946040528339810103126102ef57516001600160a81b03811681036102ef576001600160a01b031680156102dc576001600160a01b0381165f9081525f8051602061289f833981519152602052604090205465ffffffffffff161580156101a65765ffffffffffff6100b1426102f3565b1665ffffffffffff8111610192578060405191604083019383851060018060401b0386111761017e5760409485529183525f60208085018281526001600160a01b03881683525f8051602061289f8339815191529091529481209351845495516001600160a01b031990961665ffffffffffff919091161760309590951b600160301b600160a01b0316949094179092555f805160206128bf833981519152916060915b65ffffffffffff604051928684521660208301526040820152a360405161257c90816103238239f35b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b0382165f9081525f8051602061289f8339815191526020526040902054906101d4426102f3565b63ffffffff8360301c169265ffffffffffff808260701c1692168211155f146102ca5750505b63ffffffff821680156102c35763ffffffff8111610192575b65ffffffffffff63ffffffff610228426102f3565b921691160165ffffffffffff8111610192576001600160a01b0384165f9081525f8051602061289f833981519152602090815260408083208054600160301b600160a01b0319169185901b6dffffffffffff0000000000000000169690921b67ffffffff00000000169590951760301b600160301b600160a01b0316949094179093555f805160206128bf8339815191529160609190610155565b505f610213565b63ffffffff9060501c169250506101fa565b630409d6d160e11b5f525f60045260245ffd5b5f80fd5b65ffffffffffff811161030b5765ffffffffffff1690565b6306dfcc6560e41b5f52603060045260245260445ffdfe60806040526004361015610011575f80fd5b5f803560e01c806308d6122d1461159b5780630b0a93ba1461154c57806312be87271461151f578063167bd3951461148a57806318ff183c146113ee5780631cff79cd146112af57806325c471a014610f9c5780633078f11414610f3757806330cae18714610e8f5780633adc277a14610e565780633ca7c02a14610e2a5780634136a33c14610ded5780634665096d14610dc55780634c1da1e214610d895780635296295214610cc7578063530dd45614610c695780636d5115bd14610bff57806375b238fc14610bd9578063853551b814610b1557806394c7d7ee14610a45578063a166aa89146109ef578063a64d95ce146108d9578063abd9bd2a146108aa578063ac9650d8146106f3578063b7009613146106a4578063b7d2b16214610667578063cc1b6c811461063f578063d1f856ee146105f0578063d22b598914610517578063d6bb62c614610403578063f801a698146101d65763fe0776f51461017a575f80fd5b346101d357d36101d357d26101d35760403660031901126101d35761019d611714565b6101a56116c5565b90336001600160a01b038316036101c457906101c091611e85565b5080f35b635f159e6360e01b8352600483fd5b80fd5b50346101d357d36101d357d26101d35760603660031901126101d3576101fa6116a6565b906024356001600160401b0381116103ff5761021a903690600401611740565b919060443565ffffffffffff81168091036103fb5761023b84838733611c2d565b905061025763ffffffff61024e42612509565b92168092611b5c565b901580156103e0575b6103a7579065ffffffffffff80921690818082119118021816906102868482873361195a565b93848452600260205265ffffffffffff6040852054168015159081610396575b5061038257604095849361037387947f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b494868b99526002602052600163ffffffff8a8a205460301c160163ffffffff81169989898c9b52600260205281812065ffffffffffff881665ffffffffffff198254161790558981526002602052209069ffffffff00000000000082549160301b169069ffffffff00000000000019161790558a51948594855233602086015260018060a01b03168b85015260806060850152608084019161193a565b0390a382519182526020820152f35b63813e945960e01b84526004859052602484fd5b6103a09150611e2f565b155f6102a6565b606484876103b58887611c74565b6381c6f24b60e01b8352336004526001600160a01b039091166024526001600160e01b031916604452fd5b508115158015610260575065ffffffffffff81168210610260565b8280fd5b5080fd5b50346101d357d36101d357d26101d35761041c366117cc565b61042a818394969593611c74565b906104378185888661195a565b93848652600260205265ffffffffffff604087205416155f146104685763060a299b60e41b86526004859052602486fd5b90610474918785611f34565b156104d75760208484808252600283526040822065ffffffffffff1981541690558082526002835263ffffffff604083205460301c1680917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f76040519480a38152f35b604051630ff89d4760e21b81523360048201526001600160a01b03928316602482015291851660448301526001600160e01b031916606482015260849150fd5b50346101d357d36101d357d26101d35760403660031901126101d35761053b6116a6565b7fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c6105646117b9565b9161056d611b8e565b60018060a01b03169182845283602052610597816001600160701b03600160408820015416612476565b9190848652856020526001600160701b036001604088200191166001600160701b03198254161790556105ea6040519283928390929165ffffffffffff60209163ffffffff604085019616845216910152565b0390a280f35b50346101d357d36101d357d26101d35760403660031901126101d357610625610617611714565b61061f6116c5565b90611b31565b60408051921515835263ffffffff91909116602083015290f35b50346101d357d36101d357d26101d357806003193601126101d3576020604051620697808152f35b50346101d357d36101d357d26101d35760403660031901126101d3576101c061068e611714565b6106966116c5565b9061069f611b8e565b611e85565b50346101d357d36101d357d26101d35760603660031901126101d3576106c86116a6565b6106d06116c5565b604435916001600160e01b0319831683036106ef5761062593506119e8565b8380fd5b50346101d357d36101d357d26101d35760203660031901126101d3576004356001600160401b0381116103ff5761072e9036906004016116e4565b90602060405161073e8282611861565b84815281810191601f198101368437610756856119a9565b936107646040519586611861565b858552601f19610773876119a9565b01875b81811061089b57505036819003601e190190875b87811015610823578060051b8201358381121561081f578201908135916001600160401b03831161081b578501823603811361081b57826107f96107ff928d898c6001986040519687958487013784018281018481528e519283915e010190815203601f198101835282611861565b30611e63565b610809828a6119c0565b5261081481896119c0565b500161078a565b8a80fd5b8980fd5b88848860405191808301818452825180915260408401918060408360051b870101940192865b8388106108565786860387f35b9091929394838080600193603f198b8203018752818a518051918291828552018484015e86838284010152601f80199101160101970193019701969093929193610849565b60608782018501528301610776565b50346101d357d36101d357d26101d35760206108d16108c8366117cc565b9291909161195a565b604051908152f35b50346101d357d36101d357d26101d35760403660031901126101d3576108fd611714565b6001600160401b0361090d6117b9565b91610916611b8e565b16906001600160401b0382146109db577ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890828452600160205261096d816001600160701b03600160408820015460801c16612476565b84865260016020818152604080892090920180546dffffffffffffffffffffffffffff60801b191660809590951b6dffffffffffffffffffffffffffff60801b1694909417909355805163ffffffff909416845265ffffffffffff90911691830191909152819081016105ea565b63061c6a4360e21b83526004829052602483fd5b50346101d357d36101d357d26101d35760203660031901126101d3576020610a3b610a186116a6565b6001600160a01b03165f9081526020819052604090206001015460701c60ff1690565b6040519015158152f35b50346101d357d36101d357d26101d357610a5e3661176d565b91604051638fb3603760e01b8152602081600481335afa908115610b0a578591610ac3575b506001600160e01b03191663704c9fc960e01b01610ab05791610aab916101c093339061195a565b611c8a565b630641fee960e31b845233600452602484fd5b90506020813d602011610b02575b81610ade60209383611861565b81010312610afe57516001600160e01b031981168103610afe575f610a83565b8480fd5b3d9150610ad1565b6040513d87823e3d90fd5b50346101d357d36101d357d26101d35760403660031901126101d357610b39611714565b602435906001600160401b0382116103fb57610b616001600160401b03923690600401611740565b929091610b6c611b8e565b169182158015610bc9575b610bb557907f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a450916105ea60405192839260208452602084019161193a565b63061c6a4360e21b84526004839052602484fd5b506001600160401b038314610b77565b50346101d357d36101d357d26101d357806003193601126101d357602090604051908152f35b50346101d357d36101d357d26101d35760403660031901126101d357610c236116a6565b6024359063ffffffff60e01b82168092036103fb576001600160a01b0316825260208281526040808420928452918152918190205490516001600160401b039091168152f35b50346101d357d36101d357d26101d35760203660031901126101d3576020610cb6610c92611714565b6001600160401b03165f5260016020526001600160401b03600160405f2001541690565b6001600160401b0360405191168152f35b50346101d357d36101d357d26101d35760403660031901126101d357610ceb611714565b6001600160401b03610cfb61172a565b91610d04611b8e565b169081158015610d79575b6109db576001600160401b0390828452600160205260016040852001805467ffffffffffffffff60401b8360401b169067ffffffffffffffff60401b191617905516907f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae28380a380f35b506001600160401b038214610d0f565b50346101d357d36101d357d26101d35760203660031901126101d3576020610db7610db26116a6565b611913565b63ffffffff60405191168152f35b50346101d357d36101d357d26101d357806003193601126101d357602060405162093a808152f35b50346101d357d36101d357d26101d35760203660031901126101d35763ffffffff6040602092600435815260028452205460301c16604051908152f35b50346101d357d36101d357d26101d357806003193601126101d35760206040516001600160401b038152f35b50346101d357d36101d357d26101d35760203660031901126101d3576020610e7f6004356118e9565b65ffffffffffff60405191168152f35b50346101d357d36101d357d26101d35760403660031901126101d357610eb3611714565b6001600160401b03610ec361172a565b91610ecc611b8e565b169081158015610f27575b6109db576001600160401b0390828452600160205260016040852001828216831982541617905516907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408380a380f35b506001600160401b038214610ed7565b50346101d357d36101d357d26101d35760403660031901126101d357608063ffffffff65ffffffffffff81610f7b610f6d611714565b610f756116c5565b90611896565b93929590918560405197168752166020860152166040840152166060820152f35b50346101d357d36101d357d26101d35760603660031901126101d357610fc0611714565b610fc86116c5565b906044359163ffffffff83168093036106ef57610fe3611b8e565b6001600160401b03610ff483611830565b9216916001600160401b03831461129b578285526001602090815260408087206001600160a01b0385165f908152925290205465ffffffffffff1615908115611139576110519063ffffffff61104942612509565b911690611b5c565b604051604081018181106001600160401b03821117611125577ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf94926111066060959365ffffffffffff9360405283831681526001600160701b03602082018b81528a8d52600160205260408d2060018060a01b0389165f52602052858060405f209451161686198454161783555116600160301b600160a01b0382549160301b1690600160301b600160a01b031916179055565b60408051988952911660208801528601526001600160a01b031693a380f35b634e487b7160e01b88526041600452602488fd5b5082855260016020526040852060018060a01b0383165f5260205261116d6001600160701b0360405f205460301c16611df2565b50508463ffffffff82168181115f14611252570363ffffffff811161123e579165ffffffffffff7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf949261123967ffffffff000000006111de63ffffffff6060985b166111d942612509565b611b5c565b9260201b1665ffffffffffff60401b8360401b16178917888b52600160205260408b2060018060a01b0387165f5260205260405f2090600160301b600160a01b0382549160301b1690600160301b600160a01b031916179055565b611106565b634e487b7160e01b87526011600452602487fd5b50509160609165ffffffffffff7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9461123967ffffffff000000006111de63ffffffff8c6111cf565b63061c6a4360e21b85526004839052602485fd5b506112b93661176d565b90916112c782848333611c2d565b939015806113e0575b6113d2576112e08382843361195a565b63ffffffff869516158015906113b9575b6113a7575b506003549261132d6113088284611c74565b6001600160a01b0385165f9081526001600160e01b0319919091166020526040902090565b6003556001600160401b0381116113935760405191611356601f8301601f191660200184611861565b818352368282011161138f5795602082849382998361137d98970137830101523491611d57565b5060035563ffffffff60405191168152f35b8680fd5b634e487b7160e01b86526041600452602486fd5b6113b2919450611c8a565b925f6112f6565b5065ffffffffffff6113ca826118e9565b1615156112f1565b906103b56064938693611c74565b5063ffffffff8416156112d0565b503461148657d361148657d2611486576040366003190112611486576114126116a6565b61141a6116c5565b90611423611b8e565b6001600160a01b031690813b1561148657604051637a9e5e4b60e01b81526001600160a01b039091166004820152905f908290602490829084905af1801561147b5761146d575080f35b61147991505f90611861565b005b6040513d5f823e3d90fd5b5f80fd5b3461148657d361148657d2611486576040366003190112611486576114ad6116a6565b602435908115158092036114865760207f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138916114e7611b8e565b6001600160a01b03165f818152808352604090819020600101805460ff60701b1916607087901b60ff60701b161790555193845292a2005b3461148657d361148657d2611486576020366003190112611486576020610db7611547611714565b611830565b3461148657d361148657d2611486576020366003190112611486576020610cb6611574611714565b6001600160401b03165f5260016020526001600160401b03600160405f20015460401c1690565b3461148657d361148657d2611486576060366003190112611486576115be6116a6565b6024356001600160401b038111611486576115dd9036906004016116e4565b9190604435906001600160401b038216809203611486576115ff939293611b8e565b6001600160a01b03909316925f5b83811015611479578060051b82013563ffffffff60e01b811680910361148657637a9e5e4b60e01b8114611694579083867f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde9491516020600195835f525f825260405f20815f52825260405f20856001600160401b0319825416179055604051908152a30161160d565b637a3a272560e11b5f5260045260245ffd5b6004356001600160a81b0381168103611486576001600160a01b031690565b6024356001600160a81b0381168103611486576001600160a01b031690565b9181601f84011215611486578235916001600160401b038311611486576020808501948460051b01011161148657565b600435906001600160401b038216820361148657565b602435906001600160401b038216820361148657565b9181601f84011215611486578235916001600160401b038311611486576020838186019501011161148657565b906040600319830112611486576004356001600160a81b0381168103611486576001600160a01b031691602435906001600160401b038211611486576117b591600401611740565b9091565b6024359063ffffffff8216820361148657565b6060600319820112611486576004356001600160a81b0381168103611486576001600160a01b0316916024356001600160a81b0381168103611486576001600160a01b031691604435906001600160401b038211611486576117b591600401611740565b6001600160401b03165f52600160205261185c6001600160701b03600160405f20015460801c16611df2565b505090565b90601f801991011681019081106001600160401b0382111761188257604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03165f9081526001602090815260408083206001600160a01b039094168352929052205465ffffffffffff916118df603083901c6001600160701b0316611df2565b9490931693909291565b5f52600260205265ffffffffffff60405f20541661190681611e2f565b1561191057505f90565b90565b60018060a01b03165f525f60205261185c6001600160701b03600160405f20015416611df2565b908060209392818452848401375f828201840152601f01601f1916010190565b604080516001600160a01b039283166020820190815292909316908301526060808301529290916119a391839161199591608084019161193a565b03601f198101835282611861565b51902090565b6001600160401b0381116118825760051b60200190565b80518210156119d45760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0382165f9081526020819052604090206001015491929160701c60ff1615611a1a575050505f905f90565b6001600160a01b0381163003611a5757506003546001600160a01b039092165f9081526001600160e01b0319909116602052604090205b14905f90565b919291906001600160e01b031916637a9e5e4b60e01b8103611ab15750611a8f63ffffffff80611a878194611af4565b939096611913565b9216911690818082119118021816915f14611aaa5781159190565b5f91508190565b611ae1929360018060a01b03165f525f60205260405f20905f526020526001600160401b0360405f205416611b31565b919015611aaa5763ffffffff8216159190565b90611b0665ffffffffffff925f611896565b505092168015159081611b1857509190565b905065ffffffffffff611b2a42612509565b1610159190565b6001600160401b0381811603611b4a5750506001905f90565b65ffffffffffff9291611b0691611896565b9065ffffffffffff8091169116019065ffffffffffff8211611b7a57565b634e487b7160e01b5f52601160045260245ffd5b611b983633612024565b9015611ba15750565b63ffffffff16611bd6576001600160401b03611bbc36612127565b50905063f07e038f60e01b5f52336004521660245260445ffd5b611c2a6040516020810190338252306040820152606080820152611c2281602060808201368152365f838301375f823683010152601f19601f360116010103601f198101835282611861565b519020611c8a565b50565b909291906001600160a01b0384163003611c4b576117b593506120d8565b9192906004841015611c6157505050505f905f90565b6117b593611c6e91611c74565b916119e8565b9060041161148657356001600160e01b03191690565b5f81815260026020526040902054909190603081901c63ffffffff169065ffffffffffff1680611cc7578363060a299b60e41b5f5260045260245ffd5b65ffffffffffff611cd742612509565b16811115611cf25783630c65b5bd60e11b5f5260045260245ffd5b611cff9093919293611e2f565b611d45578190805f52600260205260405f2065ffffffffffff1981541690557f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d5f80a390565b631e2975b960e21b5f5260045260245ffd5b91804710611ddc57815f92916020849351920190855af18080611dc9575b15611d8457505061191061245d565b15611da957639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b3d15611dba576040513d5f823e3d90fd5b63d6bda27560e01b5f5260045ffd5b503d151580611d755750813b1515611d75565b4763cf47918160e01b5f5260045260245260445ffd5b611dfb42612509565b63ffffffff82169165ffffffffffff604082901c811692168211611e23575090915f91508190565b60201c63ffffffff1692565b65ffffffffffff62093a8091160165ffffffffffff8111611b7a5765ffffffffffff80611e5b42612509565b169116111590565b905f8091602081519101845af48080611dc95715611d8457505061191061245d565b6001600160401b0316906001600160401b038214611f2157815f52600160205260405f2060018060a01b0382165f5260205265ffffffffffff60405f20541615611f1b57815f52600160205260405f2060018060a01b0382165f526020525f604081205560018060a01b0316907ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c1665f80a3600190565b50505f90565b5063061c6a4360e21b5f5260045260245ffd5b9192916001600160a01b0316331461201457611f4f33611af4565b50611f5a8385611c74565b9160018060a01b031691825f525f60205260405f209063ffffffff60e01b165f52602052611fbf33611fba6001600160401b0360405f2054166001600160401b03165f5260016020526001600160401b03600160405f20015460401c1690565b611b31565b50811561201c575b50612014573014611fd85750505f90565b611fe1916122d6565b509080612002575b611ff35780611f1b565b611ffe903390611b31565b5090565b506001600160401b0381161515611fe9565b505050600190565b90505f611fc7565b9060048110612080576001600160a01b03821630146120af57612047905f6122d6565b9290911580612091575b6120885761205e91611b31565b90156120805763ffffffff808093169116908180821191180218169081159190565b50505f905f90565b5050505f905f90565b50305f9081526020819052604090206001015460701c60ff16612051565b905060041161148657600354305f90815280356001600160e01b03191660205260409020611a51565b919060048210612088576001600160a01b03831630146120fc5790612047916122d6565b6121069250611c74565b600354305f9081526001600160e01b03199092166020526040909120611a51565b5f90600481106122cc5780600411611486575f356001600160e01b031916906310a6aa3760e31b821480156122bc575b80156122ac575b801561229c575b801561228c575b6122805763063fc60f60e21b82148015612270575b8015612260575b6122295763012e238d60e51b82148015612219575b6121c8575030825281602052604082209082526020526001600160401b036040822054169181929190565b90506024116101d357806101d357506004356001600160401b038116810361148657612212906001600160401b03165f5260016020526001600160401b03600160405f2001541690565b6001915f90565b50635be958b160e11b821461219d565b915050602411611486576004356001600160a81b038116810361148657612258906001600160a01b0316611913565b6001915f9190565b506308d6122d60e01b8214612188565b5063167bd39560e01b8214612181565b5050506001905f905f90565b5063d22b598960e01b821461216c565b50635326cae760e11b8214612165565b5063294b14a960e11b821461215e565b506330cae18760e01b8214612157565b50505f905f905f90565b600482106122cc576001600160e01b03196122f18383611c74565b16916310a6aa3760e31b8314801561244d575b801561243d575b801561242d575b801561241d575b6122805763063fc60f60e21b8314801561240d575b80156123fd575b6123cd5763012e238d60e51b831480156123bd575b612377575050305f525f60205260405f20905f526020526001600160401b0360405f205416905f91905f90565b90915060241161148657600401356001600160401b038116810361148657612212906001600160401b03165f5260016020526001600160401b03600160405f2001541690565b50635be958b160e11b831461234a565b90915060241161148657600401356001600160a81b038116810361148657612258906001600160a01b0316611913565b506308d6122d60e01b8314612335565b5063167bd39560e01b831461232e565b5063d22b598960e01b8314612319565b50635326cae760e11b8314612312565b5063294b14a960e11b831461230b565b506330cae18760e01b8314612304565b604051903d82523d5f602084013e60203d830101604052565b61248763ffffffff91939293611df2565b505092168063ffffffff84168181115f146124ef570363ffffffff8111611b7a576124d563ffffffff8067ffffffff00000000935b168062069780118162069780180218166111d942612509565b9360201b1665ffffffffffff60401b8460401b1617179190565b505067ffffffff000000006124d563ffffffff805f6124bc565b65ffffffffffff81116125215765ffffffffffff1690565b6306dfcc6560e41b5f52603060045260245260445ffdfea36474726f6e582212209ecac63715d618c945447bc779e941430fd0b1c39c547f3830bc00e48f1610536c6578706572696d656e74616cf564736f6c634300081a0041a6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49f98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf",
  "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f803560e01c806308d6122d1461159b5780630b0a93ba1461154c57806312be87271461151f578063167bd3951461148a57806318ff183c146113ee5780631cff79cd146112af57806325c471a014610f9c5780633078f11414610f3757806330cae18714610e8f5780633adc277a14610e565780633ca7c02a14610e2a5780634136a33c14610ded5780634665096d14610dc55780634c1da1e214610d895780635296295214610cc7578063530dd45614610c695780636d5115bd14610bff57806375b238fc14610bd9578063853551b814610b1557806394c7d7ee14610a45578063a166aa89146109ef578063a64d95ce146108d9578063abd9bd2a146108aa578063ac9650d8146106f3578063b7009613146106a4578063b7d2b16214610667578063cc1b6c811461063f578063d1f856ee146105f0578063d22b598914610517578063d6bb62c614610403578063f801a698146101d65763fe0776f51461017a575f80fd5b346101d357d36101d357d26101d35760403660031901126101d35761019d611714565b6101a56116c5565b90336001600160a01b038316036101c457906101c091611e85565b5080f35b635f159e6360e01b8352600483fd5b80fd5b50346101d357d36101d357d26101d35760603660031901126101d3576101fa6116a6565b906024356001600160401b0381116103ff5761021a903690600401611740565b919060443565ffffffffffff81168091036103fb5761023b84838733611c2d565b905061025763ffffffff61024e42612509565b92168092611b5c565b901580156103e0575b6103a7579065ffffffffffff80921690818082119118021816906102868482873361195a565b93848452600260205265ffffffffffff6040852054168015159081610396575b5061038257604095849361037387947f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b494868b99526002602052600163ffffffff8a8a205460301c160163ffffffff81169989898c9b52600260205281812065ffffffffffff881665ffffffffffff198254161790558981526002602052209069ffffffff00000000000082549160301b169069ffffffff00000000000019161790558a51948594855233602086015260018060a01b03168b85015260806060850152608084019161193a565b0390a382519182526020820152f35b63813e945960e01b84526004859052602484fd5b6103a09150611e2f565b155f6102a6565b606484876103b58887611c74565b6381c6f24b60e01b8352336004526001600160a01b039091166024526001600160e01b031916604452fd5b508115158015610260575065ffffffffffff81168210610260565b8280fd5b5080fd5b50346101d357d36101d357d26101d35761041c366117cc565b61042a818394969593611c74565b906104378185888661195a565b93848652600260205265ffffffffffff604087205416155f146104685763060a299b60e41b86526004859052602486fd5b90610474918785611f34565b156104d75760208484808252600283526040822065ffffffffffff1981541690558082526002835263ffffffff604083205460301c1680917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f76040519480a38152f35b604051630ff89d4760e21b81523360048201526001600160a01b03928316602482015291851660448301526001600160e01b031916606482015260849150fd5b50346101d357d36101d357d26101d35760403660031901126101d35761053b6116a6565b7fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c6105646117b9565b9161056d611b8e565b60018060a01b03169182845283602052610597816001600160701b03600160408820015416612476565b9190848652856020526001600160701b036001604088200191166001600160701b03198254161790556105ea6040519283928390929165ffffffffffff60209163ffffffff604085019616845216910152565b0390a280f35b50346101d357d36101d357d26101d35760403660031901126101d357610625610617611714565b61061f6116c5565b90611b31565b60408051921515835263ffffffff91909116602083015290f35b50346101d357d36101d357d26101d357806003193601126101d3576020604051620697808152f35b50346101d357d36101d357d26101d35760403660031901126101d3576101c061068e611714565b6106966116c5565b9061069f611b8e565b611e85565b50346101d357d36101d357d26101d35760603660031901126101d3576106c86116a6565b6106d06116c5565b604435916001600160e01b0319831683036106ef5761062593506119e8565b8380fd5b50346101d357d36101d357d26101d35760203660031901126101d3576004356001600160401b0381116103ff5761072e9036906004016116e4565b90602060405161073e8282611861565b84815281810191601f198101368437610756856119a9565b936107646040519586611861565b858552601f19610773876119a9565b01875b81811061089b57505036819003601e190190875b87811015610823578060051b8201358381121561081f578201908135916001600160401b03831161081b578501823603811361081b57826107f96107ff928d898c6001986040519687958487013784018281018481528e519283915e010190815203601f198101835282611861565b30611e63565b610809828a6119c0565b5261081481896119c0565b500161078a565b8a80fd5b8980fd5b88848860405191808301818452825180915260408401918060408360051b870101940192865b8388106108565786860387f35b9091929394838080600193603f198b8203018752818a518051918291828552018484015e86838284010152601f80199101160101970193019701969093929193610849565b60608782018501528301610776565b50346101d357d36101d357d26101d35760206108d16108c8366117cc565b9291909161195a565b604051908152f35b50346101d357d36101d357d26101d35760403660031901126101d3576108fd611714565b6001600160401b0361090d6117b9565b91610916611b8e565b16906001600160401b0382146109db577ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890828452600160205261096d816001600160701b03600160408820015460801c16612476565b84865260016020818152604080892090920180546dffffffffffffffffffffffffffff60801b191660809590951b6dffffffffffffffffffffffffffff60801b1694909417909355805163ffffffff909416845265ffffffffffff90911691830191909152819081016105ea565b63061c6a4360e21b83526004829052602483fd5b50346101d357d36101d357d26101d35760203660031901126101d3576020610a3b610a186116a6565b6001600160a01b03165f9081526020819052604090206001015460701c60ff1690565b6040519015158152f35b50346101d357d36101d357d26101d357610a5e3661176d565b91604051638fb3603760e01b8152602081600481335afa908115610b0a578591610ac3575b506001600160e01b03191663704c9fc960e01b01610ab05791610aab916101c093339061195a565b611c8a565b630641fee960e31b845233600452602484fd5b90506020813d602011610b02575b81610ade60209383611861565b81010312610afe57516001600160e01b031981168103610afe575f610a83565b8480fd5b3d9150610ad1565b6040513d87823e3d90fd5b50346101d357d36101d357d26101d35760403660031901126101d357610b39611714565b602435906001600160401b0382116103fb57610b616001600160401b03923690600401611740565b929091610b6c611b8e565b169182158015610bc9575b610bb557907f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a450916105ea60405192839260208452602084019161193a565b63061c6a4360e21b84526004839052602484fd5b506001600160401b038314610b77565b50346101d357d36101d357d26101d357806003193601126101d357602090604051908152f35b50346101d357d36101d357d26101d35760403660031901126101d357610c236116a6565b6024359063ffffffff60e01b82168092036103fb576001600160a01b0316825260208281526040808420928452918152918190205490516001600160401b039091168152f35b50346101d357d36101d357d26101d35760203660031901126101d3576020610cb6610c92611714565b6001600160401b03165f5260016020526001600160401b03600160405f2001541690565b6001600160401b0360405191168152f35b50346101d357d36101d357d26101d35760403660031901126101d357610ceb611714565b6001600160401b03610cfb61172a565b91610d04611b8e565b169081158015610d79575b6109db576001600160401b0390828452600160205260016040852001805467ffffffffffffffff60401b8360401b169067ffffffffffffffff60401b191617905516907f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae28380a380f35b506001600160401b038214610d0f565b50346101d357d36101d357d26101d35760203660031901126101d3576020610db7610db26116a6565b611913565b63ffffffff60405191168152f35b50346101d357d36101d357d26101d357806003193601126101d357602060405162093a808152f35b50346101d357d36101d357d26101d35760203660031901126101d35763ffffffff6040602092600435815260028452205460301c16604051908152f35b50346101d357d36101d357d26101d357806003193601126101d35760206040516001600160401b038152f35b50346101d357d36101d357d26101d35760203660031901126101d3576020610e7f6004356118e9565b65ffffffffffff60405191168152f35b50346101d357d36101d357d26101d35760403660031901126101d357610eb3611714565b6001600160401b03610ec361172a565b91610ecc611b8e565b169081158015610f27575b6109db576001600160401b0390828452600160205260016040852001828216831982541617905516907f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63408380a380f35b506001600160401b038214610ed7565b50346101d357d36101d357d26101d35760403660031901126101d357608063ffffffff65ffffffffffff81610f7b610f6d611714565b610f756116c5565b90611896565b93929590918560405197168752166020860152166040840152166060820152f35b50346101d357d36101d357d26101d35760603660031901126101d357610fc0611714565b610fc86116c5565b906044359163ffffffff83168093036106ef57610fe3611b8e565b6001600160401b03610ff483611830565b9216916001600160401b03831461129b578285526001602090815260408087206001600160a01b0385165f908152925290205465ffffffffffff1615908115611139576110519063ffffffff61104942612509565b911690611b5c565b604051604081018181106001600160401b03821117611125577ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf94926111066060959365ffffffffffff9360405283831681526001600160701b03602082018b81528a8d52600160205260408d2060018060a01b0389165f52602052858060405f209451161686198454161783555116600160301b600160a01b0382549160301b1690600160301b600160a01b031916179055565b60408051988952911660208801528601526001600160a01b031693a380f35b634e487b7160e01b88526041600452602488fd5b5082855260016020526040852060018060a01b0383165f5260205261116d6001600160701b0360405f205460301c16611df2565b50508463ffffffff82168181115f14611252570363ffffffff811161123e579165ffffffffffff7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf949261123967ffffffff000000006111de63ffffffff6060985b166111d942612509565b611b5c565b9260201b1665ffffffffffff60401b8360401b16178917888b52600160205260408b2060018060a01b0387165f5260205260405f2090600160301b600160a01b0382549160301b1690600160301b600160a01b031916179055565b611106565b634e487b7160e01b87526011600452602487fd5b50509160609165ffffffffffff7ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9461123967ffffffff000000006111de63ffffffff8c6111cf565b63061c6a4360e21b85526004839052602485fd5b506112b93661176d565b90916112c782848333611c2d565b939015806113e0575b6113d2576112e08382843361195a565b63ffffffff869516158015906113b9575b6113a7575b506003549261132d6113088284611c74565b6001600160a01b0385165f9081526001600160e01b0319919091166020526040902090565b6003556001600160401b0381116113935760405191611356601f8301601f191660200184611861565b818352368282011161138f5795602082849382998361137d98970137830101523491611d57565b5060035563ffffffff60405191168152f35b8680fd5b634e487b7160e01b86526041600452602486fd5b6113b2919450611c8a565b925f6112f6565b5065ffffffffffff6113ca826118e9565b1615156112f1565b906103b56064938693611c74565b5063ffffffff8416156112d0565b503461148657d361148657d2611486576040366003190112611486576114126116a6565b61141a6116c5565b90611423611b8e565b6001600160a01b031690813b1561148657604051637a9e5e4b60e01b81526001600160a01b039091166004820152905f908290602490829084905af1801561147b5761146d575080f35b61147991505f90611861565b005b6040513d5f823e3d90fd5b5f80fd5b3461148657d361148657d2611486576040366003190112611486576114ad6116a6565b602435908115158092036114865760207f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138916114e7611b8e565b6001600160a01b03165f818152808352604090819020600101805460ff60701b1916607087901b60ff60701b161790555193845292a2005b3461148657d361148657d2611486576020366003190112611486576020610db7611547611714565b611830565b3461148657d361148657d2611486576020366003190112611486576020610cb6611574611714565b6001600160401b03165f5260016020526001600160401b03600160405f20015460401c1690565b3461148657d361148657d2611486576060366003190112611486576115be6116a6565b6024356001600160401b038111611486576115dd9036906004016116e4565b9190604435906001600160401b038216809203611486576115ff939293611b8e565b6001600160a01b03909316925f5b83811015611479578060051b82013563ffffffff60e01b811680910361148657637a9e5e4b60e01b8114611694579083867f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde9491516020600195835f525f825260405f20815f52825260405f20856001600160401b0319825416179055604051908152a30161160d565b637a3a272560e11b5f5260045260245ffd5b6004356001600160a81b0381168103611486576001600160a01b031690565b6024356001600160a81b0381168103611486576001600160a01b031690565b9181601f84011215611486578235916001600160401b038311611486576020808501948460051b01011161148657565b600435906001600160401b038216820361148657565b602435906001600160401b038216820361148657565b9181601f84011215611486578235916001600160401b038311611486576020838186019501011161148657565b906040600319830112611486576004356001600160a81b0381168103611486576001600160a01b031691602435906001600160401b038211611486576117b591600401611740565b9091565b6024359063ffffffff8216820361148657565b6060600319820112611486576004356001600160a81b0381168103611486576001600160a01b0316916024356001600160a81b0381168103611486576001600160a01b031691604435906001600160401b038211611486576117b591600401611740565b6001600160401b03165f52600160205261185c6001600160701b03600160405f20015460801c16611df2565b505090565b90601f801991011681019081106001600160401b0382111761188257604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03165f9081526001602090815260408083206001600160a01b039094168352929052205465ffffffffffff916118df603083901c6001600160701b0316611df2565b9490931693909291565b5f52600260205265ffffffffffff60405f20541661190681611e2f565b1561191057505f90565b90565b60018060a01b03165f525f60205261185c6001600160701b03600160405f20015416611df2565b908060209392818452848401375f828201840152601f01601f1916010190565b604080516001600160a01b039283166020820190815292909316908301526060808301529290916119a391839161199591608084019161193a565b03601f198101835282611861565b51902090565b6001600160401b0381116118825760051b60200190565b80518210156119d45760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0382165f9081526020819052604090206001015491929160701c60ff1615611a1a575050505f905f90565b6001600160a01b0381163003611a5757506003546001600160a01b039092165f9081526001600160e01b0319909116602052604090205b14905f90565b919291906001600160e01b031916637a9e5e4b60e01b8103611ab15750611a8f63ffffffff80611a878194611af4565b939096611913565b9216911690818082119118021816915f14611aaa5781159190565b5f91508190565b611ae1929360018060a01b03165f525f60205260405f20905f526020526001600160401b0360405f205416611b31565b919015611aaa5763ffffffff8216159190565b90611b0665ffffffffffff925f611896565b505092168015159081611b1857509190565b905065ffffffffffff611b2a42612509565b1610159190565b6001600160401b0381811603611b4a5750506001905f90565b65ffffffffffff9291611b0691611896565b9065ffffffffffff8091169116019065ffffffffffff8211611b7a57565b634e487b7160e01b5f52601160045260245ffd5b611b983633612024565b9015611ba15750565b63ffffffff16611bd6576001600160401b03611bbc36612127565b50905063f07e038f60e01b5f52336004521660245260445ffd5b611c2a6040516020810190338252306040820152606080820152611c2281602060808201368152365f838301375f823683010152601f19601f360116010103601f198101835282611861565b519020611c8a565b50565b909291906001600160a01b0384163003611c4b576117b593506120d8565b9192906004841015611c6157505050505f905f90565b6117b593611c6e91611c74565b916119e8565b9060041161148657356001600160e01b03191690565b5f81815260026020526040902054909190603081901c63ffffffff169065ffffffffffff1680611cc7578363060a299b60e41b5f5260045260245ffd5b65ffffffffffff611cd742612509565b16811115611cf25783630c65b5bd60e11b5f5260045260245ffd5b611cff9093919293611e2f565b611d45578190805f52600260205260405f2065ffffffffffff1981541690557f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d5f80a390565b631e2975b960e21b5f5260045260245ffd5b91804710611ddc57815f92916020849351920190855af18080611dc9575b15611d8457505061191061245d565b15611da957639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b3d15611dba576040513d5f823e3d90fd5b63d6bda27560e01b5f5260045ffd5b503d151580611d755750813b1515611d75565b4763cf47918160e01b5f5260045260245260445ffd5b611dfb42612509565b63ffffffff82169165ffffffffffff604082901c811692168211611e23575090915f91508190565b60201c63ffffffff1692565b65ffffffffffff62093a8091160165ffffffffffff8111611b7a5765ffffffffffff80611e5b42612509565b169116111590565b905f8091602081519101845af48080611dc95715611d8457505061191061245d565b6001600160401b0316906001600160401b038214611f2157815f52600160205260405f2060018060a01b0382165f5260205265ffffffffffff60405f20541615611f1b57815f52600160205260405f2060018060a01b0382165f526020525f604081205560018060a01b0316907ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c1665f80a3600190565b50505f90565b5063061c6a4360e21b5f5260045260245ffd5b9192916001600160a01b0316331461201457611f4f33611af4565b50611f5a8385611c74565b9160018060a01b031691825f525f60205260405f209063ffffffff60e01b165f52602052611fbf33611fba6001600160401b0360405f2054166001600160401b03165f5260016020526001600160401b03600160405f20015460401c1690565b611b31565b50811561201c575b50612014573014611fd85750505f90565b611fe1916122d6565b509080612002575b611ff35780611f1b565b611ffe903390611b31565b5090565b506001600160401b0381161515611fe9565b505050600190565b90505f611fc7565b9060048110612080576001600160a01b03821630146120af57612047905f6122d6565b9290911580612091575b6120885761205e91611b31565b90156120805763ffffffff808093169116908180821191180218169081159190565b50505f905f90565b5050505f905f90565b50305f9081526020819052604090206001015460701c60ff16612051565b905060041161148657600354305f90815280356001600160e01b03191660205260409020611a51565b919060048210612088576001600160a01b03831630146120fc5790612047916122d6565b6121069250611c74565b600354305f9081526001600160e01b03199092166020526040909120611a51565b5f90600481106122cc5780600411611486575f356001600160e01b031916906310a6aa3760e31b821480156122bc575b80156122ac575b801561229c575b801561228c575b6122805763063fc60f60e21b82148015612270575b8015612260575b6122295763012e238d60e51b82148015612219575b6121c8575030825281602052604082209082526020526001600160401b036040822054169181929190565b90506024116101d357806101d357506004356001600160401b038116810361148657612212906001600160401b03165f5260016020526001600160401b03600160405f2001541690565b6001915f90565b50635be958b160e11b821461219d565b915050602411611486576004356001600160a81b038116810361148657612258906001600160a01b0316611913565b6001915f9190565b506308d6122d60e01b8214612188565b5063167bd39560e01b8214612181565b5050506001905f905f90565b5063d22b598960e01b821461216c565b50635326cae760e11b8214612165565b5063294b14a960e11b821461215e565b506330cae18760e01b8214612157565b50505f905f905f90565b600482106122cc576001600160e01b03196122f18383611c74565b16916310a6aa3760e31b8314801561244d575b801561243d575b801561242d575b801561241d575b6122805763063fc60f60e21b8314801561240d575b80156123fd575b6123cd5763012e238d60e51b831480156123bd575b612377575050305f525f60205260405f20905f526020526001600160401b0360405f205416905f91905f90565b90915060241161148657600401356001600160401b038116810361148657612212906001600160401b03165f5260016020526001600160401b03600160405f2001541690565b50635be958b160e11b831461234a565b90915060241161148657600401356001600160a81b038116810361148657612258906001600160a01b0316611913565b506308d6122d60e01b8314612335565b5063167bd39560e01b831461232e565b5063d22b598960e01b8314612319565b50635326cae760e11b8314612312565b5063294b14a960e11b831461230b565b506330cae18760e01b8314612304565b604051903d82523d5f602084013e60203d830101604052565b61248763ffffffff91939293611df2565b505092168063ffffffff84168181115f146124ef570363ffffffff8111611b7a576124d563ffffffff8067ffffffff00000000935b168062069780118162069780180218166111d942612509565b9360201b1665ffffffffffff60401b8460401b1617179190565b505067ffffffff000000006124d563ffffffff805f6124bc565b65ffffffffffff81116125215765ffffffffffff1690565b6306dfcc6560e41b5f52603060045260245260445ffdfea36474726f6e582212209ecac63715d618c945447bc779e941430fd0b1c39c547f3830bc00e48f1610536c6578706572696d656e74616cf564736f6c634300081a0041",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
