{
  "_format": "hh-sol-artifact-1",
  "contractName": "Cooler",
  "sourceName": "contracts/Cooler.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IPolicyPool",
          "name": "policyPool_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotDoZeroWithdrawals",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "ERC721IncorrectOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ERC721InsufficientApproval",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidOperator",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC721InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ERC721NonexistentToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        }
      ],
      "name": "InvalidEToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "InvalidWithdrawalRequest",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoZeroPolicyPool",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyPolicyPool",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "bits",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintDowncast",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UpgradeCannotChangePolicyPool",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint40",
          "name": "expiration",
          "type": "uint40"
        }
      ],
      "name": "WithdrawalNotReady",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint40",
          "name": "minRequestTime",
          "type": "uint40"
        },
        {
          "internalType": "uint40",
          "name": "timeRequested",
          "type": "uint40"
        }
      ],
      "name": "WithdrawalRequestEarlierThanMin",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "oldCooldownPeriod",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "newCooldownPeriod",
          "type": "uint40"
        }
      ],
      "name": "CooldownPeriodChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountRequested",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountWithdrawn",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalExecuted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "when",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "ETKLib.Scale",
          "name": "scaleAtRequest",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalRequested",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "cooldownPeriod",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currency",
      "outputs": [
        {
          "internalType": "contract IERC20Metadata",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "executeWithdrawal",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getCurrentValue",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getWithdrawalRequestInfo",
      "outputs": [
        {
          "components": [
            {
              "internalType": "ETKLib.Scale",
              "name": "scaleAtRequest",
              "type": "uint96"
            },
            {
              "internalType": "contract IEToken",
              "name": "etk",
              "type": "address"
            },
            {
              "internalType": "uint128",
              "name": "requestedAmount",
              "type": "uint128"
            },
            {
              "internalType": "uint40",
              "name": "requestedAt",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Cooler.WithdrawalRequest",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        }
      ],
      "name": "pendingWithdrawals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "policyPool",
      "outputs": [
        {
          "internalType": "contract IPolicyPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "uint40",
          "name": "when",
          "type": "uint40"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "scheduleWithdrawal",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "uint40",
          "name": "when",
          "type": "uint40"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "scheduleWithdrawalWithPermit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IEToken",
          "name": "eToken",
          "type": "address"
        },
        {
          "internalType": "uint40",
          "name": "newCooldownPeriod",
          "type": "uint40"
        }
      ],
      "name": "setCooldownPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405230608052348015610013575f5ffd5b50604051612c29380380612c2983398101604081905261003291610126565b806001600160a01b03811661005a57604051636b23cf0160e01b815260040160405180910390fd5b610062610074565b6001600160a01b031660a05250610153565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100c45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101235780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610136575f5ffd5b81516001600160a01b038116811461014c575f5ffd5b9392505050565b60805160a051612a926101975f395f81816102fd0152818161095301528181610ea60152611e3a01525f81816113340152818161135d01526114a20152612a925ff3fe608060405260043610610195575f3560e01c80636352211e116100e7578063b88d4fde11610087578063e5a6b10f11610062578063e5a6b10f146105e1578063e985e9c5146105f5578063f3f4370314610614578063f630ffe714610648575f5ffd5b8063b88d4fde14610584578063c87b56dd146105a3578063d3b59bf4146105c2575f5ffd5b806399a904b5116100c257806399a904b5146103ed578063a035807714610516578063a22cb46514610535578063ad3cb1cc14610554575f5ffd5b80636352211e1461039b57806370a08231146103ba57806395d89b41146103d9575f5ffd5b80633fcad964116101525780634d15eb031161012d5780634d15eb03146102ef5780634f1ef2861461032157806352d1902d146103345780635ce095ee14610348575f5ffd5b80633fcad9641461028457806342842e0e146102b15780634cd88b76146102d0575f5ffd5b806301ffc9a71461019957806306fdde03146101cd578063081812fc146101ee578063095ea7b31461022557806323b872dd1461024657806324f13a7614610265575b5f5ffd5b3480156101a4575f5ffd5b506101b86101b33660046123af565b610667565b60405190151581526020015b60405180910390f35b3480156101d8575f5ffd5b506101e16106a1565b6040516101c491906123f8565b3480156101f9575f5ffd5b5061020d61020836600461240a565b610742565b6040516001600160a01b0390911681526020016101c4565b348015610230575f5ffd5b5061024461023f366004612435565b610756565b005b348015610251575f5ffd5b5061024461026036600461245f565b610765565b348015610270575f5ffd5b5061024461027f36600461240a565b6107f3565b34801561028f575f5ffd5b506102a361029e36600461240a565b610b15565b6040519081526020016101c4565b3480156102bc575f5ffd5b506102446102cb36600461245f565b610b69565b3480156102db575f5ffd5b506102446102ea366004612542565b610b88565b3480156102fa575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061020d565b61024461032f3660046125a7565b610c83565b34801561033f575f5ffd5b506102a3610c9e565b348015610353575f5ffd5b5061038561036236600461245f565b50506001600160a01b03165f9081526033602052604090205464ffffffffff1690565b60405164ffffffffff90911681526020016101c4565b3480156103a6575f5ffd5b5061020d6103b536600461240a565b610cb9565b3480156103c5575f5ffd5b506102a36103d43660046125de565b610cc3565b3480156103e4575f5ffd5b506101e1610d1b565b3480156103f8575f5ffd5b506104ad61040736600461240a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f90815260326020908152604091829020825160a08101845281546001600160601b03811682526001600160a01b03600160601b9091041692810192909252600101546001600160801b0381169282019290925264ffffffffff600160801b830481166060830152600160a81b909204909116608082015290565b6040516101c491905f60a0820190506001600160601b03835116825260018060a01b0360208401511660208301526001600160801b03604084015116604083015264ffffffffff606084015116606083015264ffffffffff608084015116608083015292915050565b348015610521575f5ffd5b506102a3610530366004612612565b610d59565b348015610540575f5ffd5b5061024461054f36600461263d565b610d6d565b34801561055f575f5ffd5b506101e1604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561058f575f5ffd5b5061024461059e366004612678565b610d78565b3480156105ae575f5ffd5b506101e16105bd36600461240a565b610d90565b3480156105cd575f5ffd5b506102a36105dc3660046126e0565b610e00565b3480156105ec575f5ffd5b5061020d610ea3565b348015610600575f5ffd5b506101b861060f36600461274f565b610f29565b34801561061f575f5ffd5b506102a361062e3660046125de565b6001600160a01b03165f9081526034602052604090205490565b348015610653575f5ffd5b5061024461066236600461277b565b610f75565b5f61067182611007565b80610680575061068082611056565b8061069b57506001600160e01b0319821663af14a2ed60e01b145b92915050565b5f516020612a1d5f395f51905f5280546060919081906106c0906127ae565b80601f01602080910402602001604051908101604052809291908181526020018280546106ec906127ae565b80156107375780601f1061070e57610100808354040283529160200191610737565b820191905f5260205f20905b81548152906001019060200180831161071a57829003601f168201915b505050505091505090565b5f61074c8261108b565b5061069b826110c2565b6107618282336110fb565b5050565b6001600160a01b03821661079357604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f61079f838333611108565b9050836001600160a01b0316816001600160a01b0316146107ed576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161078a565b50505050565b5f81815260326020526040902060018101548290600160801b900464ffffffffff16610835576040516347f23c9760e11b815260040161078a91815260200190565b5060018101548290600160a81b900464ffffffffff164281111561087c5760405163234d921f60e21b8152600481019290925264ffffffffff16602482015260440161078a565b50505f61088883610cb9565b90505f6108948361120a565b60018401549091505f906108b29083906001600160801b03166112a0565b60018501805464ffffffffff60801b1916905590506108d0856112af565b60018401548454600160601b90046001600160a01b03165f90815260346020526040812080546001600160801b03909316929091906109109084906127fa565b90915550508354604051636fe6a09760e11b8152600160601b9091046001600160a01b0390811660048301526024820183905284811660448301523060648301527f0000000000000000000000000000000000000000000000000000000000000000169063dfcd412e906084016020604051808303815f875af1158015610999573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bd919061280d565b5080821115610aaa578354600160601b90046001600160a01b031663a0ce552d610a5e6109ea84866127fa565b87546040516370a0823160e01b8152306004820152600160601b9091046001600160a01b0316906370a0823190602401602060405180830381865afa158015610a35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a59919061280d565b6112a0565b6040518263ffffffff1660e01b8152600401610a7c91815260200190565b5f604051808303815f87803b158015610a93575f5ffd5b505af1158015610aa5573d5f5f3e3d5ffd5b505050505b83546001850154604080516001600160801b039092168252602082018490526001600160a01b03868116938993600160601b909104909116917f5c7b80d3b1a3296ffcd888e34c2c2eccd66bb3edb1d128e65a384a38115cb582910160405180910390a45050505050565b5f8181526032602052604081206001810154600160801b900464ffffffffff168203610b4357505f92915050565b610b62610b4f8261120a565b60018301546001600160801b03166112a0565b9392505050565b610b8383838360405180602001604052805f815250610d78565b505050565b5f610b916112e7565b805490915060ff600160401b820416159067ffffffffffffffff165f81158015610bb85750825b90505f8267ffffffffffffffff166001148015610bd45750303b155b905081158015610be2575080155b15610c005760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c2a57845460ff60401b1916600160401b1785555b610c34878761130f565b8315610c7a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c8b611329565b610c94826113cf565b61076182826113db565b5f610ca7611497565b505f516020612a3d5f395f51905f5290565b5f61069b8261108b565b5f5f516020612a1d5f395f51905f526001600160a01b038316610cfb576040516322718ad960e21b81525f600482015260240161078a565b6001600160a01b039092165f908152600390920160205250604090205490565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f516020612a1d5f395f51905f52916106c0906127ae565b5f610d658484846114e0565b949350505050565b610761338383611932565b610d83848484610765565b6107ed33858585856119e1565b6060610d9b8261108b565b505f610db160408051602081019091525f815290565b90505f815111610dcf5760405180602001604052805f815250610b62565b80610dd984611b09565b604051602001610dea92919061283b565b6040516020818303038152906040529392505050565b5f6001600160a01b03881663d505accf336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018990526064810188905260ff8716608482015260a4810186905260c4810185905260e4015f604051808303815f87803b158015610e7a575f5ffd5b505af1925050508015610e8b575060015b50610e978888886114e0565b98975050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f00573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f24919061284f565b905090565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b6001600160a01b0382165f8181526033602090815260409182902054825164ffffffffff9182168152908516918101919091527f08dfa5493c453115ee7c83f7c1ecb7bf389adaaeade84190f2a6dca91ccaabbd910160405180910390a26001600160a01b03919091165f908152603360205260409020805464ffffffffff191664ffffffffff909216919091179055565b5f6001600160e01b031982166380ac58cd60e01b148061103757506001600160e01b03198216635b5e139f60e01b145b8061069b57506301ffc9a760e01b6001600160e01b031983161461069b565b5f6001600160e01b031982166301ffc9a760e01b148061069b57506001600160e01b03198216634d15eb0360e01b1492915050565b5f5f61109683611b99565b90506001600160a01b03811661069b57604051637e27328960e01b81526004810184905260240161078a565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610b838383836001611bd2565b5f5f516020612a1d5f395f51905f528161112185611b99565b90506001600160a01b0384161561113d5761113d818587611ce5565b6001600160a01b03811615611179576111585f865f5f611bd2565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b038616156111a9576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b80546040516379d989fb60e01b8152600160048201525f9161069b91600160601b9091046001600160a01b0316906379d989fb90602401602060405180830381865afa15801561125c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611280919061280d565b835460018501546001600160801b031691906001600160601b0316611d49565b5f828218828410028218610b62565b5f6112bb5f835f611108565b90506001600160a01b03811661076157604051637e27328960e01b81526004810183905260240161078a565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061069b565b611317611df9565b61131f611e1e565b6107618282611e26565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113af57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166113a35f516020612a3d5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156113cd5760405163703e46dd60e11b815260040160405180910390fd5b565b6113d881611e38565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611435575060408051601f3d908101601f191682019092526114329181019061280d565b60015b61145d57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161078a565b5f516020612a3d5f395f51905f52811461148d57604051632a87526960e21b81526004810182905260240161078a565b610b838383611ee9565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113cd5760405163703e46dd60e11b815260040160405180910390fd5b5f306001600160a01b0316846001600160a01b031663cf6a9a946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611527573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154b919061284f565b6001600160a01b03161484906115805760405163f1b1ee5d60e01b81526001600160a01b03909116600482015260240161078a565b505f198203611602576001600160a01b0384166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156115db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ff919061280d565b91505b5f8211611622576040516390633d3160e01b815260040160405180910390fd5b6001600160a01b0384165f9081526033602052604081205464ffffffffff1661164b904261286a565b90508364ffffffffff165f03611663578093506116a3565b8064ffffffffff168464ffffffffff1610156116a3576040516380be8b5960e01b815264ffffffffff80831660048301528516602482015260440161078a565b60355f81546116b190612887565b91829055506040516379d989fb60e01b8152600160048201529092505f906001600160a01b038716906379d989fb90602401602060405180830381865afa1580156116fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061280d565b90506040518060a00160405280826001600160601b03168152602001876001600160a01b0316815260200161175686611f3e565b6001600160801b0390811682524264ffffffffff9081166020808501919091528982166040948501525f888152603282528481208651878401516001600160601b03909116600160601b6001600160a01b0392831602178255878701516001909201805460608a01516080909a0151939097166001600160a81b031990971696909617600160801b988616989098029790971764ffffffffff60a81b1916600160a81b9190941602929092179092559289168352603490528120805486929061182090849061289f565b9091555061183b90506001600160a01b038716333087611f75565b6118ca338460325f8781526020019081526020015f206040516020016118b691905f60a08201905082546001600160601b03811683528060601c60208401525060018301546001600160801b038116604084015264ffffffffff8160801c16606084015264ffffffffff8160a81c1660808401525092915050565b604051602081830303815290604052611fab565b6040805164ffffffffff871681526001600160601b03831660208201528082018690529051339185916001600160a01b038a16917feb35eeca4c5d42d89fa3326185659928510d45c4e520668ad306241d7e288315919081900360600190a450509392505050565b5f516020612a1d5f395f51905f526001600160a01b03831661197257604051630b61174360e31b81526001600160a01b038416600482015260240161078a565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b6001600160a01b0383163b15611b0257604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611a239088908890879087906004016128b2565b6020604051808303815f875af1925050508015611a5d575060408051601f3d908101601f19168201909252611a5a918101906128ee565b60015b611ac4573d808015611a8a576040519150601f19603f3d011682016040523d82523d5f602084013e611a8f565b606091505b5080515f03611abc57604051633250574960e11b81526001600160a01b038516600482015260240161078a565b805160208201fd5b6001600160e01b03198116630a85bd0160e11b14611b0057604051633250574960e11b81526001600160a01b038516600482015260240161078a565b505b5050505050565b60605f611b1583611fc2565b60010190505f8167ffffffffffffffff811115611b3457611b3461249d565b6040519080825280601f01601f191660200182016040528015611b5e576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b6857509392505050565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f516020612a1d5f395f51905f528180611bf457506001600160a01b03831615155b15611cb5575f611c038561108b565b90506001600160a01b03841615801590611c2f5750836001600160a01b0316816001600160a01b031614155b8015611c425750611c408185610f29565b155b15611c6b5760405163a9fbf51f60e01b81526001600160a01b038516600482015260240161078a565b8215611cb35784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b611cf0838383612099565b610b83576001600160a01b038316611d1e57604051637e27328960e01b81526004810182905260240161078a565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161078a565b5f5f5f611d5686866120fd565b91509150815f03611d7a57838181611d7057611d70612909565b0492505050610b62565b818411611d9157611d916003851502601118612119565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b611e0161212a565b6113cd57604051631afcd79f60e31b815260040160405180910390fd5b6113cd611df9565b611e2e611df9565b6107618282612143565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec2919061284f565b6001600160a01b0316146113d85760405163d2b3d33f60e01b815260040160405180910390fd5b611ef282612173565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611f3657610b8382826121d6565b610761612276565b5f6001600160801b03821115611f71576040516306dfcc6560e41b8152608060048201526024810183905260440161078a565b5090565b611f83848484846001612295565b6107ed57604051635274afe760e01b81526001600160a01b038516600482015260240161078a565b611fb58383612302565b610b83335f8585856119e1565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120005772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061202c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061204a57662386f26fc10000830492506010015b6305f5e1008310612062576305f5e100830492506008015b612710831061207657612710830492506004015b60648310612088576064830492506002015b600a831061069b5760010192915050565b5f6001600160a01b03831615801590610d655750826001600160a01b0316846001600160a01b031614806120d257506120d28484610f29565b80610d655750826001600160a01b03166120eb836110c2565b6001600160a01b031614949350505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f6121336112e7565b54600160401b900460ff16919050565b61214b611df9565b5f516020612a1d5f395f51905f52806121648482612961565b50600181016107ed8382612961565b806001600160a01b03163b5f036121a857604051634c9c8ce360e01b81526001600160a01b038216600482015260240161078a565b5f516020612a3d5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f6121e38484612363565b905080801561220457505f3d118061220457505f846001600160a01b03163b115b1561221957612211612376565b91505061069b565b801561224357604051639996b31560e01b81526001600160a01b038516600482015260240161078a565b3d156122565761225161238f565b61226f565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b34156113cd5760405163b398979f60e01b815260040160405180910390fd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166122f15783831516156122e5573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03821661232b57604051633250574960e11b81525f600482015260240161078a565b5f61233783835f611108565b90506001600160a01b03811615610b83576040516339e3563760e11b81525f600482015260240161078a565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b6001600160e01b0319811681146113d8575f5ffd5b5f602082840312156123bf575f5ffd5b8135610b628161239a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610b6260208301846123ca565b5f6020828403121561241a575f5ffd5b5035919050565b6001600160a01b03811681146113d8575f5ffd5b5f5f60408385031215612446575f5ffd5b823561245181612421565b946020939093013593505050565b5f5f5f60608486031215612471575f5ffd5b833561247c81612421565b9250602084013561248c81612421565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126124c0575f5ffd5b8135602083015f5f67ffffffffffffffff8411156124e0576124e061249d565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561250f5761250f61249d565b604052838152905080828401871015612526575f5ffd5b838360208301375f602085830101528094505050505092915050565b5f5f60408385031215612553575f5ffd5b823567ffffffffffffffff811115612569575f5ffd5b612575858286016124b1565b925050602083013567ffffffffffffffff811115612591575f5ffd5b61259d858286016124b1565b9150509250929050565b5f5f604083850312156125b8575f5ffd5b82356125c381612421565b9150602083013567ffffffffffffffff811115612591575f5ffd5b5f602082840312156125ee575f5ffd5b8135610b6281612421565b803564ffffffffff8116811461260d575f5ffd5b919050565b5f5f5f60608486031215612624575f5ffd5b833561262f81612421565b925061248c602085016125f9565b5f5f6040838503121561264e575f5ffd5b823561265981612421565b91506020830135801515811461266d575f5ffd5b809150509250929050565b5f5f5f5f6080858703121561268b575f5ffd5b843561269681612421565b935060208501356126a681612421565b925060408501359150606085013567ffffffffffffffff8111156126c8575f5ffd5b6126d4878288016124b1565b91505092959194509250565b5f5f5f5f5f5f5f60e0888a0312156126f6575f5ffd5b873561270181612421565b965061270f602089016125f9565b95506040880135945060608801359350608088013560ff81168114612732575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215612760575f5ffd5b823561276b81612421565b9150602083013561266d81612421565b5f5f6040838503121561278c575f5ffd5b823561279781612421565b91506127a5602084016125f9565b90509250929050565b600181811c908216806127c257607f821691505b6020821081036127e057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561069b5761069b6127e6565b5f6020828403121561281d575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b5f610d656128498386612824565b84612824565b5f6020828403121561285f575f5ffd5b8151610b6281612421565b64ffffffffff818116838216019081111561069b5761069b6127e6565b5f60018201612898576128986127e6565b5060010190565b8082018082111561069b5761069b6127e6565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906128e4908301846123ca565b9695505050505050565b5f602082840312156128fe575f5ffd5b8151610b628161239a565b634e487b7160e01b5f52601260045260245ffd5b601f821115610b8357805f5260205f20601f840160051c810160208510156129425750805b601f840160051c820191505b81811015611b02575f815560010161294e565b815167ffffffffffffffff81111561297b5761297b61249d565b61298f8161298984546127ae565b8461291d565b6020601f8211600181146129c1575f83156129aa5750848201515b5f19600385901b1c1916600184901b178455611b02565b5f84815260208120601f198516915b828110156129f057878501518255602094850194600190920191016129d0565b5084821015612a0d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122004aa152a925cdf753087f90fcc9cb207eb0313b5aa4b3fb4c0946677e83b1f2264736f6c634300081e0033",
  "deployedBytecode": "0x608060405260043610610195575f3560e01c80636352211e116100e7578063b88d4fde11610087578063e5a6b10f11610062578063e5a6b10f146105e1578063e985e9c5146105f5578063f3f4370314610614578063f630ffe714610648575f5ffd5b8063b88d4fde14610584578063c87b56dd146105a3578063d3b59bf4146105c2575f5ffd5b806399a904b5116100c257806399a904b5146103ed578063a035807714610516578063a22cb46514610535578063ad3cb1cc14610554575f5ffd5b80636352211e1461039b57806370a08231146103ba57806395d89b41146103d9575f5ffd5b80633fcad964116101525780634d15eb031161012d5780634d15eb03146102ef5780634f1ef2861461032157806352d1902d146103345780635ce095ee14610348575f5ffd5b80633fcad9641461028457806342842e0e146102b15780634cd88b76146102d0575f5ffd5b806301ffc9a71461019957806306fdde03146101cd578063081812fc146101ee578063095ea7b31461022557806323b872dd1461024657806324f13a7614610265575b5f5ffd5b3480156101a4575f5ffd5b506101b86101b33660046123af565b610667565b60405190151581526020015b60405180910390f35b3480156101d8575f5ffd5b506101e16106a1565b6040516101c491906123f8565b3480156101f9575f5ffd5b5061020d61020836600461240a565b610742565b6040516001600160a01b0390911681526020016101c4565b348015610230575f5ffd5b5061024461023f366004612435565b610756565b005b348015610251575f5ffd5b5061024461026036600461245f565b610765565b348015610270575f5ffd5b5061024461027f36600461240a565b6107f3565b34801561028f575f5ffd5b506102a361029e36600461240a565b610b15565b6040519081526020016101c4565b3480156102bc575f5ffd5b506102446102cb36600461245f565b610b69565b3480156102db575f5ffd5b506102446102ea366004612542565b610b88565b3480156102fa575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061020d565b61024461032f3660046125a7565b610c83565b34801561033f575f5ffd5b506102a3610c9e565b348015610353575f5ffd5b5061038561036236600461245f565b50506001600160a01b03165f9081526033602052604090205464ffffffffff1690565b60405164ffffffffff90911681526020016101c4565b3480156103a6575f5ffd5b5061020d6103b536600461240a565b610cb9565b3480156103c5575f5ffd5b506102a36103d43660046125de565b610cc3565b3480156103e4575f5ffd5b506101e1610d1b565b3480156103f8575f5ffd5b506104ad61040736600461240a565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f90815260326020908152604091829020825160a08101845281546001600160601b03811682526001600160a01b03600160601b9091041692810192909252600101546001600160801b0381169282019290925264ffffffffff600160801b830481166060830152600160a81b909204909116608082015290565b6040516101c491905f60a0820190506001600160601b03835116825260018060a01b0360208401511660208301526001600160801b03604084015116604083015264ffffffffff606084015116606083015264ffffffffff608084015116608083015292915050565b348015610521575f5ffd5b506102a3610530366004612612565b610d59565b348015610540575f5ffd5b5061024461054f36600461263d565b610d6d565b34801561055f575f5ffd5b506101e1604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561058f575f5ffd5b5061024461059e366004612678565b610d78565b3480156105ae575f5ffd5b506101e16105bd36600461240a565b610d90565b3480156105cd575f5ffd5b506102a36105dc3660046126e0565b610e00565b3480156105ec575f5ffd5b5061020d610ea3565b348015610600575f5ffd5b506101b861060f36600461274f565b610f29565b34801561061f575f5ffd5b506102a361062e3660046125de565b6001600160a01b03165f9081526034602052604090205490565b348015610653575f5ffd5b5061024461066236600461277b565b610f75565b5f61067182611007565b80610680575061068082611056565b8061069b57506001600160e01b0319821663af14a2ed60e01b145b92915050565b5f516020612a1d5f395f51905f5280546060919081906106c0906127ae565b80601f01602080910402602001604051908101604052809291908181526020018280546106ec906127ae565b80156107375780601f1061070e57610100808354040283529160200191610737565b820191905f5260205f20905b81548152906001019060200180831161071a57829003601f168201915b505050505091505090565b5f61074c8261108b565b5061069b826110c2565b6107618282336110fb565b5050565b6001600160a01b03821661079357604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f61079f838333611108565b9050836001600160a01b0316816001600160a01b0316146107ed576040516364283d7b60e01b81526001600160a01b038086166004830152602482018490528216604482015260640161078a565b50505050565b5f81815260326020526040902060018101548290600160801b900464ffffffffff16610835576040516347f23c9760e11b815260040161078a91815260200190565b5060018101548290600160a81b900464ffffffffff164281111561087c5760405163234d921f60e21b8152600481019290925264ffffffffff16602482015260440161078a565b50505f61088883610cb9565b90505f6108948361120a565b60018401549091505f906108b29083906001600160801b03166112a0565b60018501805464ffffffffff60801b1916905590506108d0856112af565b60018401548454600160601b90046001600160a01b03165f90815260346020526040812080546001600160801b03909316929091906109109084906127fa565b90915550508354604051636fe6a09760e11b8152600160601b9091046001600160a01b0390811660048301526024820183905284811660448301523060648301527f0000000000000000000000000000000000000000000000000000000000000000169063dfcd412e906084016020604051808303815f875af1158015610999573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bd919061280d565b5080821115610aaa578354600160601b90046001600160a01b031663a0ce552d610a5e6109ea84866127fa565b87546040516370a0823160e01b8152306004820152600160601b9091046001600160a01b0316906370a0823190602401602060405180830381865afa158015610a35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a59919061280d565b6112a0565b6040518263ffffffff1660e01b8152600401610a7c91815260200190565b5f604051808303815f87803b158015610a93575f5ffd5b505af1158015610aa5573d5f5f3e3d5ffd5b505050505b83546001850154604080516001600160801b039092168252602082018490526001600160a01b03868116938993600160601b909104909116917f5c7b80d3b1a3296ffcd888e34c2c2eccd66bb3edb1d128e65a384a38115cb582910160405180910390a45050505050565b5f8181526032602052604081206001810154600160801b900464ffffffffff168203610b4357505f92915050565b610b62610b4f8261120a565b60018301546001600160801b03166112a0565b9392505050565b610b8383838360405180602001604052805f815250610d78565b505050565b5f610b916112e7565b805490915060ff600160401b820416159067ffffffffffffffff165f81158015610bb85750825b90505f8267ffffffffffffffff166001148015610bd45750303b155b905081158015610be2575080155b15610c005760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c2a57845460ff60401b1916600160401b1785555b610c34878761130f565b8315610c7a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c8b611329565b610c94826113cf565b61076182826113db565b5f610ca7611497565b505f516020612a3d5f395f51905f5290565b5f61069b8261108b565b5f5f516020612a1d5f395f51905f526001600160a01b038316610cfb576040516322718ad960e21b81525f600482015260240161078a565b6001600160a01b039092165f908152600390920160205250604090205490565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f516020612a1d5f395f51905f52916106c0906127ae565b5f610d658484846114e0565b949350505050565b610761338383611932565b610d83848484610765565b6107ed33858585856119e1565b6060610d9b8261108b565b505f610db160408051602081019091525f815290565b90505f815111610dcf5760405180602001604052805f815250610b62565b80610dd984611b09565b604051602001610dea92919061283b565b6040516020818303038152906040529392505050565b5f6001600160a01b03881663d505accf336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018990526064810188905260ff8716608482015260a4810186905260c4810185905260e4015f604051808303815f87803b158015610e7a575f5ffd5b505af1925050508015610e8b575060015b50610e978888886114e0565b98975050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f00573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f24919061284f565b905090565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b6001600160a01b0382165f8181526033602090815260409182902054825164ffffffffff9182168152908516918101919091527f08dfa5493c453115ee7c83f7c1ecb7bf389adaaeade84190f2a6dca91ccaabbd910160405180910390a26001600160a01b03919091165f908152603360205260409020805464ffffffffff191664ffffffffff909216919091179055565b5f6001600160e01b031982166380ac58cd60e01b148061103757506001600160e01b03198216635b5e139f60e01b145b8061069b57506301ffc9a760e01b6001600160e01b031983161461069b565b5f6001600160e01b031982166301ffc9a760e01b148061069b57506001600160e01b03198216634d15eb0360e01b1492915050565b5f5f61109683611b99565b90506001600160a01b03811661069b57604051637e27328960e01b81526004810184905260240161078a565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b610b838383836001611bd2565b5f5f516020612a1d5f395f51905f528161112185611b99565b90506001600160a01b0384161561113d5761113d818587611ce5565b6001600160a01b03811615611179576111585f865f5f611bd2565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b038616156111a9576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b80546040516379d989fb60e01b8152600160048201525f9161069b91600160601b9091046001600160a01b0316906379d989fb90602401602060405180830381865afa15801561125c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611280919061280d565b835460018501546001600160801b031691906001600160601b0316611d49565b5f828218828410028218610b62565b5f6112bb5f835f611108565b90506001600160a01b03811661076157604051637e27328960e01b81526004810183905260240161078a565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061069b565b611317611df9565b61131f611e1e565b6107618282611e26565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113af57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166113a35f516020612a3d5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156113cd5760405163703e46dd60e11b815260040160405180910390fd5b565b6113d881611e38565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611435575060408051601f3d908101601f191682019092526114329181019061280d565b60015b61145d57604051634c9c8ce360e01b81526001600160a01b038316600482015260240161078a565b5f516020612a3d5f395f51905f52811461148d57604051632a87526960e21b81526004810182905260240161078a565b610b838383611ee9565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113cd5760405163703e46dd60e11b815260040160405180910390fd5b5f306001600160a01b0316846001600160a01b031663cf6a9a946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611527573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154b919061284f565b6001600160a01b03161484906115805760405163f1b1ee5d60e01b81526001600160a01b03909116600482015260240161078a565b505f198203611602576001600160a01b0384166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156115db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ff919061280d565b91505b5f8211611622576040516390633d3160e01b815260040160405180910390fd5b6001600160a01b0384165f9081526033602052604081205464ffffffffff1661164b904261286a565b90508364ffffffffff165f03611663578093506116a3565b8064ffffffffff168464ffffffffff1610156116a3576040516380be8b5960e01b815264ffffffffff80831660048301528516602482015260440161078a565b60355f81546116b190612887565b91829055506040516379d989fb60e01b8152600160048201529092505f906001600160a01b038716906379d989fb90602401602060405180830381865afa1580156116fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061280d565b90506040518060a00160405280826001600160601b03168152602001876001600160a01b0316815260200161175686611f3e565b6001600160801b0390811682524264ffffffffff9081166020808501919091528982166040948501525f888152603282528481208651878401516001600160601b03909116600160601b6001600160a01b0392831602178255878701516001909201805460608a01516080909a0151939097166001600160a81b031990971696909617600160801b988616989098029790971764ffffffffff60a81b1916600160a81b9190941602929092179092559289168352603490528120805486929061182090849061289f565b9091555061183b90506001600160a01b038716333087611f75565b6118ca338460325f8781526020019081526020015f206040516020016118b691905f60a08201905082546001600160601b03811683528060601c60208401525060018301546001600160801b038116604084015264ffffffffff8160801c16606084015264ffffffffff8160a81c1660808401525092915050565b604051602081830303815290604052611fab565b6040805164ffffffffff871681526001600160601b03831660208201528082018690529051339185916001600160a01b038a16917feb35eeca4c5d42d89fa3326185659928510d45c4e520668ad306241d7e288315919081900360600190a450509392505050565b5f516020612a1d5f395f51905f526001600160a01b03831661197257604051630b61174360e31b81526001600160a01b038416600482015260240161078a565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b6001600160a01b0383163b15611b0257604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611a239088908890879087906004016128b2565b6020604051808303815f875af1925050508015611a5d575060408051601f3d908101601f19168201909252611a5a918101906128ee565b60015b611ac4573d808015611a8a576040519150601f19603f3d011682016040523d82523d5f602084013e611a8f565b606091505b5080515f03611abc57604051633250574960e11b81526001600160a01b038516600482015260240161078a565b805160208201fd5b6001600160e01b03198116630a85bd0160e11b14611b0057604051633250574960e11b81526001600160a01b038516600482015260240161078a565b505b5050505050565b60605f611b1583611fc2565b60010190505f8167ffffffffffffffff811115611b3457611b3461249d565b6040519080825280601f01601f191660200182016040528015611b5e576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b6857509392505050565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f516020612a1d5f395f51905f528180611bf457506001600160a01b03831615155b15611cb5575f611c038561108b565b90506001600160a01b03841615801590611c2f5750836001600160a01b0316816001600160a01b031614155b8015611c425750611c408185610f29565b155b15611c6b5760405163a9fbf51f60e01b81526001600160a01b038516600482015260240161078a565b8215611cb35784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b611cf0838383612099565b610b83576001600160a01b038316611d1e57604051637e27328960e01b81526004810182905260240161078a565b60405163177e802f60e01b81526001600160a01b03831660048201526024810182905260440161078a565b5f5f5f611d5686866120fd565b91509150815f03611d7a57838181611d7057611d70612909565b0492505050610b62565b818411611d9157611d916003851502601118612119565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b611e0161212a565b6113cd57604051631afcd79f60e31b815260040160405180910390fd5b6113cd611df9565b611e2e611df9565b6107618282612143565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e9e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec2919061284f565b6001600160a01b0316146113d85760405163d2b3d33f60e01b815260040160405180910390fd5b611ef282612173565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611f3657610b8382826121d6565b610761612276565b5f6001600160801b03821115611f71576040516306dfcc6560e41b8152608060048201526024810183905260440161078a565b5090565b611f83848484846001612295565b6107ed57604051635274afe760e01b81526001600160a01b038516600482015260240161078a565b611fb58383612302565b610b83335f8585856119e1565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120005772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061202c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061204a57662386f26fc10000830492506010015b6305f5e1008310612062576305f5e100830492506008015b612710831061207657612710830492506004015b60648310612088576064830492506002015b600a831061069b5760010192915050565b5f6001600160a01b03831615801590610d655750826001600160a01b0316846001600160a01b031614806120d257506120d28484610f29565b80610d655750826001600160a01b03166120eb836110c2565b6001600160a01b031614949350505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f6121336112e7565b54600160401b900460ff16919050565b61214b611df9565b5f516020612a1d5f395f51905f52806121648482612961565b50600181016107ed8382612961565b806001600160a01b03163b5f036121a857604051634c9c8ce360e01b81526001600160a01b038216600482015260240161078a565b5f516020612a3d5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f6121e38484612363565b905080801561220457505f3d118061220457505f846001600160a01b03163b115b1561221957612211612376565b91505061069b565b801561224357604051639996b31560e01b81526001600160a01b038516600482015260240161078a565b3d156122565761225161238f565b61226f565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b34156113cd5760405163b398979f60e01b815260040160405180910390fd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166122f15783831516156122e5573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03821661232b57604051633250574960e11b81525f600482015260240161078a565b5f61233783835f611108565b90506001600160a01b03811615610b83576040516339e3563760e11b81525f600482015260240161078a565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b6001600160e01b0319811681146113d8575f5ffd5b5f602082840312156123bf575f5ffd5b8135610b628161239a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610b6260208301846123ca565b5f6020828403121561241a575f5ffd5b5035919050565b6001600160a01b03811681146113d8575f5ffd5b5f5f60408385031215612446575f5ffd5b823561245181612421565b946020939093013593505050565b5f5f5f60608486031215612471575f5ffd5b833561247c81612421565b9250602084013561248c81612421565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126124c0575f5ffd5b8135602083015f5f67ffffffffffffffff8411156124e0576124e061249d565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff8211171561250f5761250f61249d565b604052838152905080828401871015612526575f5ffd5b838360208301375f602085830101528094505050505092915050565b5f5f60408385031215612553575f5ffd5b823567ffffffffffffffff811115612569575f5ffd5b612575858286016124b1565b925050602083013567ffffffffffffffff811115612591575f5ffd5b61259d858286016124b1565b9150509250929050565b5f5f604083850312156125b8575f5ffd5b82356125c381612421565b9150602083013567ffffffffffffffff811115612591575f5ffd5b5f602082840312156125ee575f5ffd5b8135610b6281612421565b803564ffffffffff8116811461260d575f5ffd5b919050565b5f5f5f60608486031215612624575f5ffd5b833561262f81612421565b925061248c602085016125f9565b5f5f6040838503121561264e575f5ffd5b823561265981612421565b91506020830135801515811461266d575f5ffd5b809150509250929050565b5f5f5f5f6080858703121561268b575f5ffd5b843561269681612421565b935060208501356126a681612421565b925060408501359150606085013567ffffffffffffffff8111156126c8575f5ffd5b6126d4878288016124b1565b91505092959194509250565b5f5f5f5f5f5f5f60e0888a0312156126f6575f5ffd5b873561270181612421565b965061270f602089016125f9565b95506040880135945060608801359350608088013560ff81168114612732575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215612760575f5ffd5b823561276b81612421565b9150602083013561266d81612421565b5f5f6040838503121561278c575f5ffd5b823561279781612421565b91506127a5602084016125f9565b90509250929050565b600181811c908216806127c257607f821691505b6020821081036127e057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561069b5761069b6127e6565b5f6020828403121561281d575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b5f610d656128498386612824565b84612824565b5f6020828403121561285f575f5ffd5b8151610b6281612421565b64ffffffffff818116838216019081111561069b5761069b6127e6565b5f60018201612898576128986127e6565b5060010190565b8082018082111561069b5761069b6127e6565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906128e4908301846123ca565b9695505050505050565b5f602082840312156128fe575f5ffd5b8151610b628161239a565b634e487b7160e01b5f52601260045260245ffd5b601f821115610b8357805f5260205f20601f840160051c810160208510156129425750805b601f840160051c820191505b81811015611b02575f815560010161294e565b815167ffffffffffffffff81111561297b5761297b61249d565b61298f8161298984546127ae565b8461291d565b6020601f8211600181146129c1575f83156129aa5750848201515b5f19600385901b1c1916600184901b178455611b02565b5f84815260208120601f198516915b828110156129f057878501518255602094850194600190920191016129d0565b5084821015612a0d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122004aa152a925cdf753087f90fcc9cb207eb0313b5aa4b3fb4c0946677e83b1f2264736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
