{
  "_format": "hh-sol-artifact-1",
  "contractName": "CashFlowLender",
  "sourceName": "contracts/CashFlowLender.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trustedForwarder_",
          "type": "address"
        },
        {
          "internalType": "contract IPolicyPool",
          "name": "policyPool_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "balanceReduction",
          "type": "uint256"
        }
      ],
      "name": "BalanceDecreasedOnResolve",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotDeactivateTarget",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotDeinvestYieldVault",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotRefreshAssetWithCash",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "int256",
          "name": "debtAfter",
          "type": "int256"
        }
      ],
      "name": "CashOutExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "currentDebt",
          "type": "int256"
        },
        {
          "internalType": "uint96",
          "name": "debtLimit",
          "type": "uint96"
        }
      ],
      "name": "DebtLimitExceeded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "allowance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSpender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxMint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxRedeem",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxWithdraw",
      "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": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidPolicyPool",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSlotSize",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MustChangeYieldAssetBeforeRefresh",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotEnoughCash",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NothingToRefresh",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "OnlyPolicyPool",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OutOfRangeAccess",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "int256",
          "name": "debtAfter",
          "type": "int256"
        }
      ],
      "name": "RepaymentExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "bits",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintDowncast",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintToInt",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TargetAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "status",
          "type": "uint8"
        }
      ],
      "name": "TargetNotActive",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "TargetNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "requiredSelector",
          "type": "bytes4"
        }
      ],
      "name": "UnauthorizedForward",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "YieldVaultIsRequired",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oldAsset",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAsset",
          "type": "address"
        }
      ],
      "name": "AssetChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "debtAfterChange",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "destination",
          "type": "address"
        }
      ],
      "name": "CashOutPayout",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "value",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "debtAfterChange",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "totalDebtAfterChange",
          "type": "int256"
        }
      ],
      "name": "DebtChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Deposit",
      "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": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "debtAfterChange",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "payer",
          "type": "address"
        }
      ],
      "name": "RepayDebt",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "slotSize",
              "type": "uint32"
            },
            {
              "internalType": "enum CashFlowLender.TargetStatus",
              "name": "status",
              "type": "uint8"
            },
            {
              "internalType": "uint96",
              "name": "debtLimit",
              "type": "uint96"
            },
            {
              "internalType": "uint96",
              "name": "minLiquidity",
              "type": "uint96"
            }
          ],
          "indexed": false,
          "internalType": "struct CashFlowLender.TargetConfig",
          "name": "config",
          "type": "tuple"
        }
      ],
      "name": "TargetAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "oldDebtLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newDebtLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "oldMinLiquidity",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newMinLiquidity",
          "type": "uint256"
        }
      ],
      "name": "TargetLimitsChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "oldSlotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "newSlotSize",
          "type": "uint32"
        }
      ],
      "name": "TargetSlotSizeChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "oldStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "newStatus",
          "type": "uint8"
        }
      ],
      "name": "TargetStatusChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "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": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IERC4626",
          "name": "oldVault",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "contract IERC4626",
          "name": "newVault",
          "type": "address"
        }
      ],
      "name": "YieldVaultChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "OWN_POLICY_SELECTOR",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOTSIZE_CALENDAR_MONTH",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "debtLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minLiquidity",
          "type": "uint256"
        }
      ],
      "name": "addTarget",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "asset",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "destination",
          "type": "address"
        }
      ],
      "name": "cashOutPayouts",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cashWithdrawable",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "convertToAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "convertToShares",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currentDebt",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "depositIntoYieldVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "forwardNewPolicy",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "forwardNewPolicyBatch",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "result",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "forwardResolvePolicy",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "forwardResolvePolicyBatch",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "result",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        }
      ],
      "name": "getDebtForPeriod",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "getTargetStatus",
      "outputs": [
        {
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "contract IERC4626",
          "name": "yieldVault_",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "forwarder",
          "type": "address"
        }
      ],
      "name": "isTrustedForwarder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "makeFakeSelector",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "maxMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC721Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "onPayoutReceived",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "onPolicyExpired",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "onPolicyReplaced",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "policyPool",
      "outputs": [
        {
          "internalType": "contract IPolicyPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "redeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "refreshAsset",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "repayDebt",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "debtLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minLiquidity",
          "type": "uint256"
        }
      ],
      "name": "setTargetLimits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "newSlotSize",
          "type": "uint32"
        }
      ],
      "name": "setTargetSlotSize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "newStatus",
          "type": "uint8"
        }
      ],
      "name": "setTargetStatus",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC4626",
          "name": "yieldVault_",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "force",
          "type": "bool"
        }
      ],
      "name": "setYieldVault",
      "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": [],
      "name": "totalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "trustedForwarder",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdrawFromYieldVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "yieldVault",
      "outputs": [
        {
          "internalType": "contract IERC4626",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60e06040523060a052348015610013575f5ffd5b5060405161550c38038061550c8339810160408190526100329161011a565b6001600160a01b03808316608052811660c05261004d610054565b5050610152565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114610103575f5ffd5b5f5f6040838503121561012b575f5ffd5b825161013681610106565b602084015190925061014781610106565b809150509250929050565b60805160a05160c0516153206101ec5f395f818161069101528181610fe201528181611440015281816115c201528181611e2a015281816120c7015281816121570152818161237c0152818161273e015281816127f701528181612b950152818161388d015261392201525f818161338e015281816133b701526134da01525f81816106f8015281816107bd01526139f801526153205ff3fe60806040526004361061037c575f3560e01c806382dbbd71116101d3578063c0c51217116100fd578063d6281d3e1161009d578063e8e617b71161006d578063e8e617b714610ad6578063ee07abbb14610af5578063ef8b30f7146109c8578063f7a3933314610b14575f5ffd5b8063d6281d3e14610a4d578063d905777e14610a6c578063dd62ed3e14610a8b578063e77659fd14610aaa575f5ffd5b8063c8030873116100d8578063c8030873146109e7578063cc671a18146109fb578063ce96cb7714610a0f578063d336078c14610a2e575f5ffd5b8063c0c51217146109a9578063c63d75b614610663578063c6e6f592146109c8575f5ffd5b8063a9ed148711610173578063b460af9411610143578063b460af941461092d578063ba0876521461094c578063bdb5371d1461096b578063bfdb20da1461098a575f5ffd5b8063a9ed1487146108a4578063ac860f74146108bf578063ad3cb1cc146108de578063b3d7f6b91461090e575f5ffd5b806395d89b41116101ae57806395d89b411461083e578063a3ac939014610852578063a7f8a5e214610871578063a9059cbb14610885575f5ffd5b806382dbbd71146107e157806386b440831461080057806394bf804d1461081f575f5ffd5b8063313ce567116102b45780634f1ef286116102545780636e553f65116102245780636e553f651461074757806370a0823114610766578063759076e5146107855780637da0a877146107af575f5ffd5b80634f1ef286146106b557806352d1902d146106c8578063572b6c05146106dc5780635ee0c7dd14610728575f5ffd5b80633edeb2571161028f5780633edeb25714610637578063402d267d146106635780634cdad506146104185780634d15eb0314610683575f5ffd5b8063313ce567146105c657806333bded3c146105ec57806338d52e0f1461060b575f5ffd5b8063095ea7b31161031f57806318160ddd116102fa57806318160ddd14610536578063194448e514610569578063225c531e1461058857806323b872dd146105a7575f5ffd5b8063095ea7b3146104c05780630a28a477146104df578063150b7a02146104fe575f5ffd5b8063077f224a1161035a578063077f224a146103f757806307a2d13a1461041857806308742d9014610437578063091ea8a614610456575f5ffd5b806301e1d1141461038057806301ffc9a7146103a757806306fdde03146103d6575b5f5ffd5b34801561038b575f5ffd5b50610394610b33565b6040519081526020015b60405180910390f35b3480156103b2575f5ffd5b506103c66103c13660046144be565b610c75565b604051901515815260200161039e565b3480156103e1575f5ffd5b506103ea610d32565b60405161039e9190614505565b348015610402575f5ffd5b506104166104113660046145d2565b610df2565b005b348015610423575f5ffd5b50610394610432366004614648565b610f02565b348015610442575f5ffd5b50610416610451366004614670565b610f0d565b348015610461575f5ffd5b506104b36104703660046146a7565b6001600160a01b03165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040902054600160201b900460ff1690565b60405161039e91906146f6565b3480156104cb575f5ffd5b506103c66104da366004614704565b610fa9565b3480156104ea575f5ffd5b506103946104f9366004614648565b610fca565b348015610509575f5ffd5b5061051d610518366004614772565b610fd6565b6040516001600160e01b0319909116815260200161039e565b348015610541575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610394565b348015610574575f5ffd5b506104166105833660046147ec565b611045565b348015610593575f5ffd5b506104166105a2366004614818565b611168565b3480156105b2575f5ffd5b506103c66105c136600461487c565b61128c565b3480156105d1575f5ffd5b506105da6112bb565b60405160ff909116815260200161039e565b3480156105f7575f5ffd5b506103ea6106063660046148ba565b6112e4565b348015610616575f5ffd5b5061061f61156a565b6040516001600160a01b03909116815260200161039e565b348015610642575f5ffd5b5061064e63ffffffff81565b60405163ffffffff909116815260200161039e565b34801561066e575f5ffd5b5061039461067d3660046146a7565b505f1990565b34801561068e575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061061f565b6104166106c336600461490a565b611585565b3480156106d3575f5ffd5b5061039461159b565b3480156106e7575f5ffd5b506103c66106f63660046146a7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b348015610733575f5ffd5b5061051d610742366004614969565b6115b6565b348015610752575f5ffd5b506103946107613660046149ac565b61161f565b348015610771575f5ffd5b506103946107803660046146a7565b611649565b348015610790575f5ffd5b505f5160206152ab5f395f51905f5254600160a01b9004600b0b610394565b3480156107ba575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061061f565b3480156107ec575f5ffd5b506104166107fb3660046149cf565b61166f565b34801561080b575f5ffd5b506103ea61081a3660046148ba565b611762565b34801561082a575f5ffd5b506103946108393660046149ac565b611883565b348015610849575f5ffd5b506103ea6118a5565b34801561085d575f5ffd5b5061039461086c366004614a1d565b6118e3565b34801561087c575f5ffd5b5061061f611937565b348015610890575f5ffd5b506103c661089f366004614704565b611956565b3480156108af575f5ffd5b5061051d6001600160e01b031981565b3480156108ca575f5ffd5b506104166108d9366004614648565b61196d565b3480156108e9575f5ffd5b506103ea604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610919575f5ffd5b50610394610928366004614648565b611a32565b348015610938575f5ffd5b50610394610947366004614a5a565b611a3e565b348015610957575f5ffd5b50610394610966366004614a5a565b611a9b565b348015610976575f5ffd5b50610416610985366004614a8e565b611aef565b348015610995575f5ffd5b506104166109a4366004614ac0565b611bd9565b3480156109b4575f5ffd5b5061051d6109c3366004614aee565b611dc5565b3480156109d3575f5ffd5b506103946109e2366004614648565b611e11565b3480156109f2575f5ffd5b50610416611e1c565b348015610a06575f5ffd5b5061039461221a565b348015610a1a575f5ffd5b50610394610a293660046146a7565b6122a6565b348015610a39575f5ffd5b50610416610a48366004614648565b6122c0565b348015610a58575f5ffd5b5061051d610a67366004614969565b612370565b348015610a77575f5ffd5b50610394610a863660046146a7565b612480565b348015610a96575f5ffd5b50610394610aa5366004614b21565b612498565b348015610ab5575f5ffd5b50610ac9610ac4366004614b4d565b6124e1565b60405161039e9190614bce565b348015610ae1575f5ffd5b5061051d610af036600461487c565b6127eb565b348015610b00575f5ffd5b50610ac9610b0f366004614b4d565b612853565b348015610b1f575f5ffd5b50610416610b2e366004614c31565b612a4d565b5f5f5160206152ab5f395f51905f52610b4a612b0c565b81546040516370a0823160e01b81523060048201529193506001600160a01b0316906307a2d13a9082906370a0823190602401602060405180830381865afa158015610b98573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbc9190614c60565b6040518263ffffffff1660e01b8152600401610bda91815260200190565b602060405180830381865afa158015610bf5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c199190614c60565b610c239083614c8b565b81549092505f600160a01b909104600b0b1215610c5f578054610c4f90600160a01b9004600b0b614c9e565b610c599083614cb8565b91505090565b8054610c5990600160a01b9004600b0b83614c8b565b5f6001600160e01b03198216630a85bd0160e11b1480610ca557506001600160e01b03198216633ece0a8960e01b145b80610cc057506001600160e01b03198216635ee0c7dd60e01b145b80610cdb57506001600160e01b031982166336372b0760e01b145b80610cf657506001600160e01b0319821663a219a02560e01b145b80610d1157506001600160e01b0319821663043eff2d60e51b145b80610d2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f51602061526b5f395f51905f5291610d7090614ccb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9c90614ccb565b8015610de75780601f10610dbe57610100808354040283529160200191610de7565b820191905f5260205f20905b815481529060010190602001808311610dca57829003601f168201915b505050505091505090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e365750825b90505f826001600160401b03166001148015610e515750303b155b905081158015610e5f575080155b15610e7d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ea757845460ff60401b1916600160401b1785555b610eb2888888612b82565b8315610ef857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610d2c825f612c31565b8063ffffffff165f03610f335760405163294da6c760e21b815260040160405180910390fd5b5f610f3d83612c88565b80546040805163ffffffff928316815291851660208301529192506001600160a01b038516917f4345ec61f717774fdb684b701c34934889550330da2b93f2c3a33379db77f817910160405180910390a2805463ffffffff191663ffffffff9290921691909117905550565b5f5f610fb3612d20565b9050610fc0818585612d29565b5060019392505050565b5f610d2c826001612d36565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146110325760405163950d88bf60e01b81526001600160a01b0390911660048201526024015b60405180910390fd5b50630a85bd0160e11b9695505050505050565b5f5f5160206152ab5f395f51905f5280546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906307a2d13a9082906370a0823190602401602060405180830381865afa1580156110a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ca9190614c60565b6040518263ffffffff1660e01b81526004016110e891815260200190565b602060405180830381865afa158015611103573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111279190614c60565b90508061113382612d84565b148061113c5750825b6111595760405163292d4c4b60e11b815260040160405180910390fd5b61116284612e7d565b50505050565b61117185612c88565b505f61118786868661118287613012565b613042565b905082815f8113156111b557604051630c97a6bf60e41b815260048101929092526024820152604401611029565b50505f6111c0612b0c565b905083811015611204576111d48185614cb8565b6111e66111e18387614cb8565b612d84565b146112045760405163af8075e960e01b815260040160405180910390fd5b611221838561121161156a565b6001600160a01b03169190613141565b6040805163ffffffff808916825287166020820152908101859052606081018390526001600160a01b0384811660808301528816907fcc010dd322eb2bc19138cf20160ad5643925810f442fc6c5d48b9b4c59b34efe9060a00160405180910390a250505050505050565b5f5f611296612d20565b90506112a38582856131a0565b6112ae8585856131eb565b60019150505b9392505050565b5f805f5160206152cb5f395f51905f5290505f8154610c599190600160a01b900460ff16614d03565b6060835f6112f182612c88565b905060018154600160201b900460ff166003811115611312576113126146c2565b82548492600160201b90910460ff16911461134257604051630e851c7960e31b8152600401611029929190614d1c565b50505f61134d612b0c565b8254909150600160881b90046001600160601b031681101561139657815461138a906111e1908390600160881b90046001600160601b0316614cb8565b50611393612b0c565b90505b6113bd6113a1612d20565b886113af60045f8a8c614d39565b6113b891614d60565b613248565b61140686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b169291505061334a565b93505f8480602001905181019061141d9190614c60565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611485573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a99190614d98565b6001600160a01b0316146114d1576114d16114c2612d20565b896001600160e01b0319613248565b505f6114db612b0c565b90508181101561155f5782545f9061151190869063ffffffff166114ff8142613357565b61118261150c8789614cb8565b613012565b84549091508190600160281b90046001600160601b03168082131561155b5760405163395192c560e21b815260048101929092526001600160601b03166024820152604401611029565b5050505b505050509392505050565b5f5160206152cb5f395f51905f52546001600160a01b031690565b61158d613383565b6115978282613413565b5050565b5f6115a46134cf565b505f51602061528b5f395f51905f5290565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016811461160d5760405163950d88bf60e01b81526001600160a01b039091166004820152602401611029565b50635ee0c7dd60e01b95945050505050565b5f5f195f61162c85611e11565b9050611641611639612d20565b858784613518565b949350505050565b6001600160a01b03165f9081525f51602061526b5f395f51905f52602052604090205490565b61167884612c88565b505f61169285858561168986613012565b61118290614c9e565b905081815f8112156116c05760405163239de57160e11b815260048101929092526024820152604401611029565b50506116e86116cd612d20565b30846116d761156a565b6001600160a01b03169291906135a4565b846001600160a01b03167ffe14813540c7709c2d7e702f39b104eeed265dd484f899e9f2f89c801aa6395c8585858561171f612d20565b6040805163ffffffff96871681529590941660208601529284019190915260608301526001600160a01b0316608082015260a00160405180910390a25050505050565b6060835f61176f82612c88565b905060018154600160201b900460ff166003811115611790576117906146c2565b14806117b8575060028154600160201b900460ff1660038111156117b6576117b66146c2565b145b81548391600160201b90910460ff16906117e757604051630e851c7960e31b8152600401611029929190614d1c565b50505f6117f2612b0c565b90506117ff6113a1612d20565b61184886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b169291505061334a565b93505f611853612b0c565b90508181101561155f576118678183614cb8565b6040516351f5977560e11b815260040161102991815260200190565b5f5f195f61189085611a32565b905061164161189d612d20565b858388613518565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f51602061526b5f395f51905f5291610d7090614ccb565b5f5f5160206152ab5f395f51905f527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af028261191f8787876135dd565b81526020019081526020015f20549150509392505050565b5f5f5160206152ab5f395f51905f525b546001600160a01b0316919050565b5f5f611960612d20565b9050610fc08185856131eb565b5f1981036119845761197d612b0c565b90506119ac565b61198c612b0c565b8111156119ac5760405163af8075e960e01b815260040160405180910390fd5b5f5f5160206152ab5f395f51905f528054604051636e553f6560e01b8152600481018590523060248201529192506001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a09573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2d9190614c60565b505050565b5f610d2c826001612c31565b5f5f611a49836122a6565b905080851115611a7257828582604051633fa733bb60e21b815260040161102993929190614db3565b5f611a7c86610fca565b9050611a92611a89612d20565b86868985613625565b95945050505050565b5f5f611aa683612480565b905080851115611acf57828582604051632e52afbb60e21b815260040161102993929190614db3565b5f611ad986610f02565b9050611a92611ae6612d20565b8686848a613625565b5f611af984612c88565b8054604080516001600160601b03600160281b84048116825260208201889052600160881b90930490921690820152606081018490529091506001600160a01b038516907f7e293d291e9dd159f2fbde9523c4191674384553a72c0833ba9cf7dcb5381fb79060800160405180910390a2611b7383613778565b81546001600160601b0391909116600160281b0270ffffffffffffffffffffffff000000000019909116178155611ba982613778565b81546001600160601b0391909116600160881b026bffffffffffffffffffffffff60881b19909116179055505050565b6001600160a01b0384165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040812080545f5160206152ab5f395f51905f529290600160201b900460ff166003811115611c3c57611c3c6146c2565b14611c5a5760405163cd43efa160e01b815260040160405180910390fd5b8463ffffffff165f03611c805760405163294da6c760e21b815260040160405180910390fd5b6040805160808101825263ffffffff8716815260016020820152908101611ca686613778565b6001600160601b03168152602001611cbd85613778565b6001600160601b031690526001600160a01b0387165f90815260018401602090815260409091208251815463ffffffff90911663ffffffff19821681178355928401519192839164ffffffffff191617600160201b836003811115611d2457611d246146c2565b0217905550604082810151825460609094015165010000000000600160e81b0319909416600160281b6001600160601b03928316026bffffffffffffffffffffffff60881b191617600160881b9190941602929092179055516001600160a01b038716907f422c963a67d52178b43a807b8c9df3a99468f416b736f9f040b6392cf790752e90611db5908490614dd4565b60405180910390a2505050505050565b6040516001600160601b0319606084901b1660208201526001600160e01b0319821660348201525f906112b490603801604051602081830303815290604052805190602001205f6137ab565b5f610d2c825f612d36565b5f611e2561156a565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e84573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea89190614d98565b9050806001600160a01b0316826001600160a01b031603611edc5760405163252fa83d60e21b815260040160405180910390fd5b611ee4612b0c565b15611f025760405163902dd39b60e01b815260040160405180910390fd5b5f5160206152ab5f395f51905f528054604080516338d52e0f60e01b815290516001600160a01b038581169316916338d52e0f9160048083019260209291908290030181865afa158015611f58573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f7c9190614d98565b6001600160a01b031614611fa35760405163233f856360e11b815260040160405180910390fd5b5f5f5160206152cb5f395f51905f5280546001600160a01b0319166001600160a01b03858116919091178255835460405163095ea7b360e01b815290821660048201525f602482015291925085169063095ea7b3906044016020604051808303815f875af1158015612017573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203b9190614e24565b50815460405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529084169063095ea7b3906044016020604051808303815f875af115801561208b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120af9190614e24565b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f602483015285169063095ea7b3906044016020604051808303815f875af115801561211b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190614e24565b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f19602483015284169063095ea7b3906044016020604051808303815f875af11580156121ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d09190614e24565b50604080516001600160a01b038087168252851660208201527f37465ce4c247e78514460560da0bcc785fff559503ce6c3d87a6e84352437392910160405180910390a150505050565b5f805f5160206152ab5f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa158015612270573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122949190614c60565b61229c612b0c565b610c599190614c8b565b5f610d2c6122b3836137e3565b6122bb61221a565b6137f6565b5f198103612345575f5f5160206152ab5f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561231d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123419190614c60565b9150505b8061234f82612d84565b1461236d5760405163af8075e960e01b815260040160405180910390fd5b50565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146123c75760405163950d88bf60e01b81526001600160a01b039091166004820152602401611029565b505f6123d286612c88565b905060018154600160201b900460ff1660038111156123f3576123f36146c2565b148061241b575060028154600160201b900460ff166003811115612419576124196146c2565b145b81548791600160201b90910460ff169061244a57604051630e851c7960e31b8152600401611029929190614d1c565b5050805461246d90879063ffffffff166124648142613357565b61168987613012565b50636b140e9f60e11b9695505050505050565b5f610d2c61248d83613805565b6122bb6109e261221a565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060835f6124ee82612c88565b905060018154600160201b900460ff16600381111561250f5761250f6146c2565b82548492600160201b90910460ff16911461253f57604051630e851c7960e31b8152600401611029929190614d1c565b50505f61254a612b0c565b8254909150600160881b90046001600160601b0316811015612593578154612587906111e1908390600160881b90046001600160601b0316614cb8565b50612590612b0c565b90505b5f80866001600160401b038111156125ad576125ad614517565b6040519080825280602002602001820160405280156125e057816020015b60608152602001906001900390816125cb5790505b5095505f5b878110156127df575f89898381811061260057612600614e3f565b90506020028101906126129190614e53565b612620916004915f91614d39565b61262991614d60565b905081158061264557506001600160e01b031981811690851614155b156126605761265c612655612d20565b8c83613248565b8093505b6126cb8a8a8481811061267557612675614e3f565b90506020028101906126879190614e53565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038f169291505061334a565b8883815181106126dd576126dd614e3f565b6020026020010181905250826127d6575f88838151811061270057612700614e3f565b602002602001015180602001905181019061271b9190614c60565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015612783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a79190614d98565b6001600160a01b0316146127d4576127cf6127c0612d20565b8d6001600160e01b0319613248565b600193505b505b506001016125e5565b5050505f6114db612b0c565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146128425760405163950d88bf60e01b81526001600160a01b039091166004820152602401611029565b5063e8e617b760e01b949350505050565b6060835f61286082612c88565b905060018154600160201b900460ff166003811115612881576128816146c2565b14806128a9575060028154600160201b900460ff1660038111156128a7576128a76146c2565b145b81548391600160201b90910460ff16906128d857604051630e851c7960e31b8152600401611029929190614d1c565b50505f6128e3612b0c565b90505f856001600160401b038111156128fe576128fe614517565b60405190808252806020026020018201604052801561293157816020015b606081526020019060019003908161291c5790505b5094505f5b86811015612a42575f88888381811061295157612951614e3f565b90506020028101906129639190614e53565b612971916004915f91614d39565b61297a91614d60565b905081158061299657506001600160e01b031981811690841614155b156129b1576129ad6129a6612d20565b8b83613248565b8092505b612a1c8989848181106129c6576129c6614e3f565b90506020028101906129d89190614e53565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038e169291505061334a565b878381518110612a2e57612a2e614e3f565b602090810291909101015250600101612936565b50505f611853612b0c565b5f816003811115612a6057612a606146c2565b03612a7e57604051635e64536560e11b815260040160405180910390fd5b5f612a8883612c88565b9050826001600160a01b03167f0638a5c17c348b99c05e7985ee5ee8bc0c41bc7a12265aec4a488d62350c1d24825f0160049054906101000a900460ff1684604051612ad5929190614e95565b60405180910390a280548290829064ff000000001916600160201b836003811115612b0257612b026146c2565b0217905550505050565b5f612b1561156a565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612b59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7d9190614c60565b905090565b612b8a61380f565b612b92613858565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c139190614d98565b9050612c1e81613860565b612c288484613871565b61116282613883565b5f6112b4612c3d610b33565b612c48906001614c8b565b612c535f600a614f93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612c7f9190614c8b565b859190856139a7565b6001600160a01b0381165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af0160205260408120805490915f5160206152ab5f395f51905f5291600160201b900460ff166003811115612cec57612cec6146c2565b14158390612d1957604051632dad902160e01b81526001600160a01b039091166004820152602401611029565b5050919050565b5f612b7d6139e9565b611a2d8383836001613a5c565b5f6112b4612d4582600a614f93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612d719190614c8b565b612d79610b33565b612c7f906001614c8b565b5f805f5160206152ab5f395f51905f52805460405163ce96cb7760e01b8152306004820152919250612e049185916001600160a01b03169063ce96cb7790602401602060405180830381865afa158015612de0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bb9190614c60565b8154604051632d182be560e21b815260048101839052306024820181905260448201529193506001600160a01b03169063b460af94906064016020604051808303815f875af1158015612e59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d199190614c60565b6001600160a01b038116612ea4576040516347ddf9c760e01b815260040160405180910390fd5b5f5160206152ab5f395f51905f5280546001600160a01b038381166001600160a01b03198316178355168015612f4f57612edc61156a565b60405163095ea7b360e01b81526001600160a01b0383811660048301525f6024830152919091169063095ea7b3906044016020604051808303815f875af1158015612f29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614e24565b505b612f5761156a565b60405163095ea7b360e01b81526001600160a01b0385811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af1158015612fa5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc99190614e24565b50604080516001600160a01b038084168252851660208201527f9baaddad37a65ca0df0360563fca87a13c1ce354be76d7ec35eac48bd766332a910160405180910390a1505050565b5f6001600160ff1b0382111561303e5760405163123baf0360e11b815260048101839052602401611029565b5090565b5f5f5160206152ab5f395f51905f528161305d8787876135dd565b905083826002015f8381526020019081526020015f205f8282546130819190614fa1565b9182905550835490945085915083906014906130a8908490600160a01b9004600b0b614fc8565b82546001600160601b039182166101009390930a92830291909202199091161790555081546040805163ffffffff808a1682528816602082015290810186905260608101859052600160a01b909104600b0b60808201526001600160a01b038816907fbc0ff1d27e119160a9a107d0725b9ed31b90773cf47e89332a35a8c1a319eaee9060a00160405180910390a25050949350505050565b6040516001600160a01b03838116602483015260448201839052611a2d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b37565b5f6131ab8484612498565b90505f1981101561116257818110156131dd57828183604051637dc7a0d960e11b815260040161102993929190614db3565b61116284848484035f613a5c565b6001600160a01b03831661321457604051634b637e8f60e11b81525f6004820152602401611029565b6001600160a01b03821661323d5760405163ec442f0560e01b81525f6004820152602401611029565b611a2d838383613ba3565b5f6132538383611dc5565b90505f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa158015613292573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b69190614d98565b6001600160a01b031663b70096138630856040518463ffffffff1660e01b81526004016132e593929190614fff565b6040805180830381865afa1580156132ff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613323919061502c565b50905084848383610ef85760405163c294136d60e01b815260040161102993929190614fff565b60606112b483835f613cc9565b5f63ffffffff8381161461337a5761337563ffffffff84168361506d565b6112b4565b6112b482613d69565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806133f357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166133e7613e46565b6001600160a01b031614155b156134115760405163703e46dd60e11b815260040160405180910390fd5b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561346d575060408051601f3d908101601f1916820190925261346a91810190614c60565b60015b61349557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611029565b5f51602061528b5f395f51905f5281146134c557604051632a87526960e21b815260048101829052602401611029565b611a2d8383613e5a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146134115760405163703e46dd60e11b815260040160405180910390fd5b5f5160206152cb5f395f51905f52805461353d906001600160a01b03168630866135a4565b6135478483613eaf565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051613595929190918252602082015260400190565b60405180910390a35050505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526111629186918216906323b872dd9060840161316e565b6bffffffffffffffff000000006001600160e01b031960e09390931b9290921660c09190911b63ffffffff60c01b161760a01c1660609190911b6001600160601b0319161790565b5f61362e612b0c565b905082811015613763575f5f5160206152ab5f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561368d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136b19190614c60565b6136bb8386614cb8565b11156136da5760405163af8075e960e01b815260040160405180910390fd5b80546001600160a01b031663b460af946136f48487614cb8565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af115801561373c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137609190614c60565b50505b6137708686868686613ee3565b505050505050565b5f6001600160601b0382111561303e576040516306dfcc6560e41b81526060600482015260248101839052604401611029565b5f601c8260ff1611156137d157604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b6001600160e01b03191690565b5f610d2c6137f083611649565b5f612c31565b5f8282188284100282186112b4565b5f610d2c82611649565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661341157604051631afcd79f60e31b815260040160405180910390fd5b61341161380f565b61386861380f565b61236d81613f97565b61387961380f565b6115978282614007565b61388b61380f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390b9190614d98565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af1158015613979573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061399d9190614e24565b5061236d81612e7d565b5f6139d46139b483614057565b80156139cf57505f84806139ca576139ca615059565b868809115b151590565b6139df868686614083565b611a929190614c8b565b5f366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015613a255750808210155b15613a54575f36613a368385614cb8565b613a41928290614d39565b613a4a91615080565b60601c9250505090565b339250505090565b5f51602061526b5f395f51905f526001600160a01b038516613a935760405163e602df0560e01b81525f6004820152602401611029565b6001600160a01b038416613abc57604051634a1406b160e11b81525f6004820152602401611029565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115613b3057836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161359591815260200190565b5050505050565b5f5f60205f8451602086015f885af180613b56576040513d5f823e3d81fd5b50505f513d91508115613b6d578060011415613b7a565b6001600160a01b0384163b155b1561116257604051635274afe760e01b81526001600160a01b0385166004820152602401611029565b5f51602061526b5f395f51905f526001600160a01b038416613bdd5781816002015f828254613bd29190614c8b565b90915550613c3a9050565b6001600160a01b0384165f9081526020829052604090205482811015613c1c5784818460405163391434e360e21b815260040161102993929190614db3565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316613c58576002810180548390039055613c76565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613cbb91815260200190565b60405180910390a350505050565b606081471015613cf55760405163cf47918160e01b815247600482015260248101839052604401611029565b5f5f856001600160a01b03168486604051613d1091906150b6565b5f6040518083038185875af1925050503d805f8114613d4a576040519150601f19603f3d011682016040523d82523d5f602084013e613d4f565b606091505b5091509150613d5f868383614139565b9695505050505050565b6107e95f8062015180613d80636774858086614cb8565b613d8a919061506d565b90505b81613d9a5761016d613d9e565b61016e5b61ffff168110613e215781613db55761016d613db9565b61016e5b613dc79061ffff1682614cb8565b9050613dd2836150cc565b9250613ddf6004846150f0565b63ffffffff16158015613e1a5750613df86064846150f0565b63ffffffff16151580613e1a5750613e12610190846150f0565b63ffffffff16155b9150613d8d565b613e2b8183614190565b613e36846064615117565b63ffffffff166116419190614c8b565b5f5f51602061528b5f395f51905f52611947565b613e6382614273565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613ea757611a2d82826142d6565b61159761433f565b6001600160a01b038216613ed85760405163ec442f0560e01b81525f6004820152602401611029565b6115975f8383613ba3565b5f5160206152cb5f395f51905f526001600160a01b0386811690851614613f0f57613f0f8487846131a0565b613f19848361435e565b8054613f2f906001600160a01b03168685613141565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051613f87929190918252602082015260400190565b60405180910390a4505050505050565b613f9f61380f565b5f5160206152cb5f395f51905f525f80613fb884614392565b9150915081613fc8576012613fca565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61400f61380f565b5f51602061526b5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03614048848261517a565b5060048101611162838261517a565b5f600282600381111561406c5761406c6146c2565b6140769190615234565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036140b7578382816140ad576140ad615059565b04925050506112b4565b8084116140ce576140ce6003851502601118614468565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6060826141495761337582614479565b815115801561416057506001600160a01b0384163b155b1561418957604051639996b31560e01b81526001600160a01b0385166004820152602401611029565b50806112b4565b5f601f8310156141a257506001610d2c565b81156141cb57603c8310156141b957506002610d2c565b826141c381615255565b9350506141dc565b603b8310156141dc57506002610d2c565b605a8310614266576078831061425f57609783106142585760b583106142515760d4831061424a5760f3831061424357610111831061423c5761013083106142355761014e831061422e57600c614269565b600b614269565b600a614269565b6009614269565b6008614269565b6007614269565b6006614269565b6005614269565b6004614269565b60035b60ff169392505050565b806001600160a01b03163b5f036142a857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611029565b5f51602061528b5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516142f291906150b6565b5f60405180830381855af49150503d805f811461432a576040519150601f19603f3d011682016040523d82523d5f602084013e61432f565b606091505b5091509150611a92858383614139565b34156134115760405163b398979f60e01b815260040160405180910390fd5b6001600160a01b03821661438757604051634b637e8f60e11b81525f6004820152602401611029565b611597825f83613ba3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916143d8916150b6565b5f60405180830381855afa9150503d805f8114614410576040519150601f19603f3d011682016040523d82523d5f602084013e614415565b606091505b509150915081801561442957506020815110155b1561445c575f818060200190518101906144439190614c60565b905060ff811161445a576001969095509350505050565b505b505f9485945092505050565b634e487b715f52806020526024601cfd5b8051156144895780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160e01b0319811681146144b9575f5ffd5b919050565b5f602082840312156144ce575f5ffd5b6112b4826144a2565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112b460208301846144d7565b634e487b7160e01b5f52604160045260245ffd5b5f5f6001600160401b0384111561454457614544614517565b50604051601f19601f85018116603f011681018181106001600160401b038211171561457257614572614517565b604052838152905080828401851015614589575f5ffd5b838360208301375f60208583010152509392505050565b5f82601f8301126145af575f5ffd5b6112b48383356020850161452b565b6001600160a01b038116811461236d575f5ffd5b5f5f5f606084860312156145e4575f5ffd5b83356001600160401b038111156145f9575f5ffd5b614605868287016145a0565b93505060208401356001600160401b03811115614620575f5ffd5b61462c868287016145a0565b925050604084013561463d816145be565b809150509250925092565b5f60208284031215614658575f5ffd5b5035919050565b63ffffffff8116811461236d575f5ffd5b5f5f60408385031215614681575f5ffd5b823561468c816145be565b9150602083013561469c8161465f565b809150509250929050565b5f602082840312156146b7575f5ffd5b81356112b4816145be565b634e487b7160e01b5f52602160045260245ffd5b600481106146f257634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610d2c82846146d6565b5f5f60408385031215614715575f5ffd5b8235614720816145be565b946020939093013593505050565b5f5f83601f84011261473e575f5ffd5b5081356001600160401b03811115614754575f5ffd5b60208301915083602082850101111561476b575f5ffd5b9250929050565b5f5f5f5f5f60808688031215614786575f5ffd5b8535614791816145be565b945060208601356147a1816145be565b93506040860135925060608601356001600160401b038111156147c2575f5ffd5b6147ce8882890161472e565b969995985093965092949392505050565b801515811461236d575f5ffd5b5f5f604083850312156147fd575f5ffd5b8235614808816145be565b9150602083013561469c816147df565b5f5f5f5f5f60a0868803121561482c575f5ffd5b8535614837816145be565b945060208601356148478161465f565b935060408601356148578161465f565b925060608601359150608086013561486e816145be565b809150509295509295909350565b5f5f5f6060848603121561488e575f5ffd5b8335614899816145be565b925060208401356148a9816145be565b929592945050506040919091013590565b5f5f5f604084860312156148cc575f5ffd5b83356148d7816145be565b925060208401356001600160401b038111156148f1575f5ffd5b6148fd8682870161472e565b9497909650939450505050565b5f5f6040838503121561491b575f5ffd5b8235614926816145be565b915060208301356001600160401b03811115614940575f5ffd5b8301601f81018513614950575f5ffd5b61495f8582356020840161452b565b9150509250929050565b5f5f5f5f6080858703121561497c575f5ffd5b8435614987816145be565b93506020850135614997816145be565b93969395505050506040820135916060013590565b5f5f604083850312156149bd575f5ffd5b82359150602083013561469c816145be565b5f5f5f5f608085870312156149e2575f5ffd5b84356149ed816145be565b935060208501356149fd8161465f565b92506040850135614a0d8161465f565b9396929550929360600135925050565b5f5f5f60608486031215614a2f575f5ffd5b8335614a3a816145be565b92506020840135614a4a8161465f565b9150604084013561463d8161465f565b5f5f5f60608486031215614a6c575f5ffd5b833592506020840135614a7e816145be565b9150604084013561463d816145be565b5f5f5f60608486031215614aa0575f5ffd5b8335614aab816145be565b95602085013595506040909401359392505050565b5f5f5f5f60808587031215614ad3575f5ffd5b8435614ade816145be565b935060208501356149978161465f565b5f5f60408385031215614aff575f5ffd5b8235614b0a816145be565b9150614b18602084016144a2565b90509250929050565b5f5f60408385031215614b32575f5ffd5b8235614b3d816145be565b9150602083013561469c816145be565b5f5f5f60408486031215614b5f575f5ffd5b8335614b6a816145be565b925060208401356001600160401b03811115614b84575f5ffd5b8401601f81018613614b94575f5ffd5b80356001600160401b03811115614ba9575f5ffd5b8660208260051b8401011115614bbd575f5ffd5b939660209190910195509293505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614c2557603f19878603018452614c108583516144d7565b94506020938401939190910190600101614bf4565b50929695505050505050565b5f5f60408385031215614c42575f5ffd5b8235614c4d816145be565b915060208301356004811061469c575f5ffd5b5f60208284031215614c70575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d2c57610d2c614c77565b5f600160ff1b8201614cb257614cb2614c77565b505f0390565b81810381811115610d2c57610d2c614c77565b600181811c90821680614cdf57607f821691505b602082108103614cfd57634e487b7160e01b5f52602260045260245ffd5b50919050565b60ff8181168382160190811115610d2c57610d2c614c77565b6001600160a01b0383168152604081016112b460208301846146d6565b5f5f85851115614d47575f5ffd5b83861115614d53575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015614d91576001600160e01b0319600485900360031b81901b82161691505b5092915050565b5f60208284031215614da8575f5ffd5b81516112b4816145be565b6001600160a01b039390931683526020830191909152604082015260600190565b5f608082019050825463ffffffff81168352614df96020840160ff8360201c166146d6565b6001600160601b038160281c1660408401526001600160601b038160881c1660608401525092915050565b5f60208284031215614e34575f5ffd5b81516112b4816147df565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112614e68575f5ffd5b8301803591506001600160401b03821115614e81575f5ffd5b60200191503681900382131561476b575f5ffd5b60408101614ea382856146d6565b6112b460208301846146d6565b6001815b6001841115614eeb57808504811115614ecf57614ecf614c77565b6001841615614edd57908102905b60019390931c928002614eb4565b935093915050565b5f82614f0157506001610d2c565b81614f0d57505f610d2c565b8160018114614f235760028114614f2d57614f49565b6001915050610d2c565b60ff841115614f3e57614f3e614c77565b50506001821b610d2c565b5060208310610133831016604e8410600b8410161715614f6c575081810a610d2c565b614f785f198484614eb0565b805f1904821115614f8b57614f8b614c77565b029392505050565b5f6112b460ff841683614ef3565b8082018281125f831280158216821582161715614fc057614fc0614c77565b505092915050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff1982121715610d2c57610d2c614c77565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f5f6040838503121561503d575f5ffd5b8251615048816147df565b602084015190925061469c8161465f565b634e487b7160e01b5f52601260045260245ffd5b5f8261507b5761507b615059565b500490565b80356001600160601b03198116906014841015614d91576001600160601b031960149490940360031b84901b1690921692915050565b5f82518060208501845e5f920191825250919050565b5f63ffffffff821663ffffffff81036150e7576150e7614c77565b60010192915050565b5f63ffffffff83168061510557615105615059565b8063ffffffff84160691505092915050565b63ffffffff8181168382160290811690818114614d9157614d91614c77565b601f821115611a2d57805f5260205f20601f840160051c8101602085101561515b5750805b601f840160051c820191505b81811015613b30575f8155600101615167565b81516001600160401b0381111561519357615193614517565b6151a7816151a18454614ccb565b84615136565b6020601f8211600181146151d9575f83156151c25750848201515b5f19600385901b1c1916600184901b178455613b30565b5f84815260208120601f198516915b8281101561520857878501518255602094850194600190920191016151e8565b508482101561522557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff83168061524657615246615059565b8060ff84160691505092915050565b5f8161526357615263614c77565b505f19019056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a2646970667358221220a437ab8baaeac542b492f00325fe0203380b85eac82313377e452cd6962686bf64736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061037c575f3560e01c806382dbbd71116101d3578063c0c51217116100fd578063d6281d3e1161009d578063e8e617b71161006d578063e8e617b714610ad6578063ee07abbb14610af5578063ef8b30f7146109c8578063f7a3933314610b14575f5ffd5b8063d6281d3e14610a4d578063d905777e14610a6c578063dd62ed3e14610a8b578063e77659fd14610aaa575f5ffd5b8063c8030873116100d8578063c8030873146109e7578063cc671a18146109fb578063ce96cb7714610a0f578063d336078c14610a2e575f5ffd5b8063c0c51217146109a9578063c63d75b614610663578063c6e6f592146109c8575f5ffd5b8063a9ed148711610173578063b460af9411610143578063b460af941461092d578063ba0876521461094c578063bdb5371d1461096b578063bfdb20da1461098a575f5ffd5b8063a9ed1487146108a4578063ac860f74146108bf578063ad3cb1cc146108de578063b3d7f6b91461090e575f5ffd5b806395d89b41116101ae57806395d89b411461083e578063a3ac939014610852578063a7f8a5e214610871578063a9059cbb14610885575f5ffd5b806382dbbd71146107e157806386b440831461080057806394bf804d1461081f575f5ffd5b8063313ce567116102b45780634f1ef286116102545780636e553f65116102245780636e553f651461074757806370a0823114610766578063759076e5146107855780637da0a877146107af575f5ffd5b80634f1ef286146106b557806352d1902d146106c8578063572b6c05146106dc5780635ee0c7dd14610728575f5ffd5b80633edeb2571161028f5780633edeb25714610637578063402d267d146106635780634cdad506146104185780634d15eb0314610683575f5ffd5b8063313ce567146105c657806333bded3c146105ec57806338d52e0f1461060b575f5ffd5b8063095ea7b31161031f57806318160ddd116102fa57806318160ddd14610536578063194448e514610569578063225c531e1461058857806323b872dd146105a7575f5ffd5b8063095ea7b3146104c05780630a28a477146104df578063150b7a02146104fe575f5ffd5b8063077f224a1161035a578063077f224a146103f757806307a2d13a1461041857806308742d9014610437578063091ea8a614610456575f5ffd5b806301e1d1141461038057806301ffc9a7146103a757806306fdde03146103d6575b5f5ffd5b34801561038b575f5ffd5b50610394610b33565b6040519081526020015b60405180910390f35b3480156103b2575f5ffd5b506103c66103c13660046144be565b610c75565b604051901515815260200161039e565b3480156103e1575f5ffd5b506103ea610d32565b60405161039e9190614505565b348015610402575f5ffd5b506104166104113660046145d2565b610df2565b005b348015610423575f5ffd5b50610394610432366004614648565b610f02565b348015610442575f5ffd5b50610416610451366004614670565b610f0d565b348015610461575f5ffd5b506104b36104703660046146a7565b6001600160a01b03165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040902054600160201b900460ff1690565b60405161039e91906146f6565b3480156104cb575f5ffd5b506103c66104da366004614704565b610fa9565b3480156104ea575f5ffd5b506103946104f9366004614648565b610fca565b348015610509575f5ffd5b5061051d610518366004614772565b610fd6565b6040516001600160e01b0319909116815260200161039e565b348015610541575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610394565b348015610574575f5ffd5b506104166105833660046147ec565b611045565b348015610593575f5ffd5b506104166105a2366004614818565b611168565b3480156105b2575f5ffd5b506103c66105c136600461487c565b61128c565b3480156105d1575f5ffd5b506105da6112bb565b60405160ff909116815260200161039e565b3480156105f7575f5ffd5b506103ea6106063660046148ba565b6112e4565b348015610616575f5ffd5b5061061f61156a565b6040516001600160a01b03909116815260200161039e565b348015610642575f5ffd5b5061064e63ffffffff81565b60405163ffffffff909116815260200161039e565b34801561066e575f5ffd5b5061039461067d3660046146a7565b505f1990565b34801561068e575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061061f565b6104166106c336600461490a565b611585565b3480156106d3575f5ffd5b5061039461159b565b3480156106e7575f5ffd5b506103c66106f63660046146a7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b348015610733575f5ffd5b5061051d610742366004614969565b6115b6565b348015610752575f5ffd5b506103946107613660046149ac565b61161f565b348015610771575f5ffd5b506103946107803660046146a7565b611649565b348015610790575f5ffd5b505f5160206152ab5f395f51905f5254600160a01b9004600b0b610394565b3480156107ba575f5ffd5b507f000000000000000000000000000000000000000000000000000000000000000061061f565b3480156107ec575f5ffd5b506104166107fb3660046149cf565b61166f565b34801561080b575f5ffd5b506103ea61081a3660046148ba565b611762565b34801561082a575f5ffd5b506103946108393660046149ac565b611883565b348015610849575f5ffd5b506103ea6118a5565b34801561085d575f5ffd5b5061039461086c366004614a1d565b6118e3565b34801561087c575f5ffd5b5061061f611937565b348015610890575f5ffd5b506103c661089f366004614704565b611956565b3480156108af575f5ffd5b5061051d6001600160e01b031981565b3480156108ca575f5ffd5b506104166108d9366004614648565b61196d565b3480156108e9575f5ffd5b506103ea604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610919575f5ffd5b50610394610928366004614648565b611a32565b348015610938575f5ffd5b50610394610947366004614a5a565b611a3e565b348015610957575f5ffd5b50610394610966366004614a5a565b611a9b565b348015610976575f5ffd5b50610416610985366004614a8e565b611aef565b348015610995575f5ffd5b506104166109a4366004614ac0565b611bd9565b3480156109b4575f5ffd5b5061051d6109c3366004614aee565b611dc5565b3480156109d3575f5ffd5b506103946109e2366004614648565b611e11565b3480156109f2575f5ffd5b50610416611e1c565b348015610a06575f5ffd5b5061039461221a565b348015610a1a575f5ffd5b50610394610a293660046146a7565b6122a6565b348015610a39575f5ffd5b50610416610a48366004614648565b6122c0565b348015610a58575f5ffd5b5061051d610a67366004614969565b612370565b348015610a77575f5ffd5b50610394610a863660046146a7565b612480565b348015610a96575f5ffd5b50610394610aa5366004614b21565b612498565b348015610ab5575f5ffd5b50610ac9610ac4366004614b4d565b6124e1565b60405161039e9190614bce565b348015610ae1575f5ffd5b5061051d610af036600461487c565b6127eb565b348015610b00575f5ffd5b50610ac9610b0f366004614b4d565b612853565b348015610b1f575f5ffd5b50610416610b2e366004614c31565b612a4d565b5f5f5160206152ab5f395f51905f52610b4a612b0c565b81546040516370a0823160e01b81523060048201529193506001600160a01b0316906307a2d13a9082906370a0823190602401602060405180830381865afa158015610b98573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbc9190614c60565b6040518263ffffffff1660e01b8152600401610bda91815260200190565b602060405180830381865afa158015610bf5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c199190614c60565b610c239083614c8b565b81549092505f600160a01b909104600b0b1215610c5f578054610c4f90600160a01b9004600b0b614c9e565b610c599083614cb8565b91505090565b8054610c5990600160a01b9004600b0b83614c8b565b5f6001600160e01b03198216630a85bd0160e11b1480610ca557506001600160e01b03198216633ece0a8960e01b145b80610cc057506001600160e01b03198216635ee0c7dd60e01b145b80610cdb57506001600160e01b031982166336372b0760e01b145b80610cf657506001600160e01b0319821663a219a02560e01b145b80610d1157506001600160e01b0319821663043eff2d60e51b145b80610d2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f51602061526b5f395f51905f5291610d7090614ccb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9c90614ccb565b8015610de75780601f10610dbe57610100808354040283529160200191610de7565b820191905f5260205f20905b815481529060010190602001808311610dca57829003601f168201915b505050505091505090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e365750825b90505f826001600160401b03166001148015610e515750303b155b905081158015610e5f575080155b15610e7d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ea757845460ff60401b1916600160401b1785555b610eb2888888612b82565b8315610ef857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610d2c825f612c31565b8063ffffffff165f03610f335760405163294da6c760e21b815260040160405180910390fd5b5f610f3d83612c88565b80546040805163ffffffff928316815291851660208301529192506001600160a01b038516917f4345ec61f717774fdb684b701c34934889550330da2b93f2c3a33379db77f817910160405180910390a2805463ffffffff191663ffffffff9290921691909117905550565b5f5f610fb3612d20565b9050610fc0818585612d29565b5060019392505050565b5f610d2c826001612d36565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146110325760405163950d88bf60e01b81526001600160a01b0390911660048201526024015b60405180910390fd5b50630a85bd0160e11b9695505050505050565b5f5f5160206152ab5f395f51905f5280546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906307a2d13a9082906370a0823190602401602060405180830381865afa1580156110a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ca9190614c60565b6040518263ffffffff1660e01b81526004016110e891815260200190565b602060405180830381865afa158015611103573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111279190614c60565b90508061113382612d84565b148061113c5750825b6111595760405163292d4c4b60e11b815260040160405180910390fd5b61116284612e7d565b50505050565b61117185612c88565b505f61118786868661118287613012565b613042565b905082815f8113156111b557604051630c97a6bf60e41b815260048101929092526024820152604401611029565b50505f6111c0612b0c565b905083811015611204576111d48185614cb8565b6111e66111e18387614cb8565b612d84565b146112045760405163af8075e960e01b815260040160405180910390fd5b611221838561121161156a565b6001600160a01b03169190613141565b6040805163ffffffff808916825287166020820152908101859052606081018390526001600160a01b0384811660808301528816907fcc010dd322eb2bc19138cf20160ad5643925810f442fc6c5d48b9b4c59b34efe9060a00160405180910390a250505050505050565b5f5f611296612d20565b90506112a38582856131a0565b6112ae8585856131eb565b60019150505b9392505050565b5f805f5160206152cb5f395f51905f5290505f8154610c599190600160a01b900460ff16614d03565b6060835f6112f182612c88565b905060018154600160201b900460ff166003811115611312576113126146c2565b82548492600160201b90910460ff16911461134257604051630e851c7960e31b8152600401611029929190614d1c565b50505f61134d612b0c565b8254909150600160881b90046001600160601b031681101561139657815461138a906111e1908390600160881b90046001600160601b0316614cb8565b50611393612b0c565b90505b6113bd6113a1612d20565b886113af60045f8a8c614d39565b6113b891614d60565b613248565b61140686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b169291505061334a565b93505f8480602001905181019061141d9190614c60565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611485573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a99190614d98565b6001600160a01b0316146114d1576114d16114c2612d20565b896001600160e01b0319613248565b505f6114db612b0c565b90508181101561155f5782545f9061151190869063ffffffff166114ff8142613357565b61118261150c8789614cb8565b613012565b84549091508190600160281b90046001600160601b03168082131561155b5760405163395192c560e21b815260048101929092526001600160601b03166024820152604401611029565b5050505b505050509392505050565b5f5160206152cb5f395f51905f52546001600160a01b031690565b61158d613383565b6115978282613413565b5050565b5f6115a46134cf565b505f51602061528b5f395f51905f5290565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016811461160d5760405163950d88bf60e01b81526001600160a01b039091166004820152602401611029565b50635ee0c7dd60e01b95945050505050565b5f5f195f61162c85611e11565b9050611641611639612d20565b858784613518565b949350505050565b6001600160a01b03165f9081525f51602061526b5f395f51905f52602052604090205490565b61167884612c88565b505f61169285858561168986613012565b61118290614c9e565b905081815f8112156116c05760405163239de57160e11b815260048101929092526024820152604401611029565b50506116e86116cd612d20565b30846116d761156a565b6001600160a01b03169291906135a4565b846001600160a01b03167ffe14813540c7709c2d7e702f39b104eeed265dd484f899e9f2f89c801aa6395c8585858561171f612d20565b6040805163ffffffff96871681529590941660208601529284019190915260608301526001600160a01b0316608082015260a00160405180910390a25050505050565b6060835f61176f82612c88565b905060018154600160201b900460ff166003811115611790576117906146c2565b14806117b8575060028154600160201b900460ff1660038111156117b6576117b66146c2565b145b81548391600160201b90910460ff16906117e757604051630e851c7960e31b8152600401611029929190614d1c565b50505f6117f2612b0c565b90506117ff6113a1612d20565b61184886868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b169291505061334a565b93505f611853612b0c565b90508181101561155f576118678183614cb8565b6040516351f5977560e11b815260040161102991815260200190565b5f5f195f61189085611a32565b905061164161189d612d20565b858388613518565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f51602061526b5f395f51905f5291610d7090614ccb565b5f5f5160206152ab5f395f51905f527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af028261191f8787876135dd565b81526020019081526020015f20549150509392505050565b5f5f5160206152ab5f395f51905f525b546001600160a01b0316919050565b5f5f611960612d20565b9050610fc08185856131eb565b5f1981036119845761197d612b0c565b90506119ac565b61198c612b0c565b8111156119ac5760405163af8075e960e01b815260040160405180910390fd5b5f5f5160206152ab5f395f51905f528054604051636e553f6560e01b8152600481018590523060248201529192506001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a09573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2d9190614c60565b505050565b5f610d2c826001612c31565b5f5f611a49836122a6565b905080851115611a7257828582604051633fa733bb60e21b815260040161102993929190614db3565b5f611a7c86610fca565b9050611a92611a89612d20565b86868985613625565b95945050505050565b5f5f611aa683612480565b905080851115611acf57828582604051632e52afbb60e21b815260040161102993929190614db3565b5f611ad986610f02565b9050611a92611ae6612d20565b8686848a613625565b5f611af984612c88565b8054604080516001600160601b03600160281b84048116825260208201889052600160881b90930490921690820152606081018490529091506001600160a01b038516907f7e293d291e9dd159f2fbde9523c4191674384553a72c0833ba9cf7dcb5381fb79060800160405180910390a2611b7383613778565b81546001600160601b0391909116600160281b0270ffffffffffffffffffffffff000000000019909116178155611ba982613778565b81546001600160601b0391909116600160881b026bffffffffffffffffffffffff60881b19909116179055505050565b6001600160a01b0384165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040812080545f5160206152ab5f395f51905f529290600160201b900460ff166003811115611c3c57611c3c6146c2565b14611c5a5760405163cd43efa160e01b815260040160405180910390fd5b8463ffffffff165f03611c805760405163294da6c760e21b815260040160405180910390fd5b6040805160808101825263ffffffff8716815260016020820152908101611ca686613778565b6001600160601b03168152602001611cbd85613778565b6001600160601b031690526001600160a01b0387165f90815260018401602090815260409091208251815463ffffffff90911663ffffffff19821681178355928401519192839164ffffffffff191617600160201b836003811115611d2457611d246146c2565b0217905550604082810151825460609094015165010000000000600160e81b0319909416600160281b6001600160601b03928316026bffffffffffffffffffffffff60881b191617600160881b9190941602929092179055516001600160a01b038716907f422c963a67d52178b43a807b8c9df3a99468f416b736f9f040b6392cf790752e90611db5908490614dd4565b60405180910390a2505050505050565b6040516001600160601b0319606084901b1660208201526001600160e01b0319821660348201525f906112b490603801604051602081830303815290604052805190602001205f6137ab565b5f610d2c825f612d36565b5f611e2561156a565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e84573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea89190614d98565b9050806001600160a01b0316826001600160a01b031603611edc5760405163252fa83d60e21b815260040160405180910390fd5b611ee4612b0c565b15611f025760405163902dd39b60e01b815260040160405180910390fd5b5f5160206152ab5f395f51905f528054604080516338d52e0f60e01b815290516001600160a01b038581169316916338d52e0f9160048083019260209291908290030181865afa158015611f58573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f7c9190614d98565b6001600160a01b031614611fa35760405163233f856360e11b815260040160405180910390fd5b5f5f5160206152cb5f395f51905f5280546001600160a01b0319166001600160a01b03858116919091178255835460405163095ea7b360e01b815290821660048201525f602482015291925085169063095ea7b3906044016020604051808303815f875af1158015612017573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203b9190614e24565b50815460405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529084169063095ea7b3906044016020604051808303815f875af115801561208b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120af9190614e24565b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f602483015285169063095ea7b3906044016020604051808303815f875af115801561211b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190614e24565b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f19602483015284169063095ea7b3906044016020604051808303815f875af11580156121ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d09190614e24565b50604080516001600160a01b038087168252851660208201527f37465ce4c247e78514460560da0bcc785fff559503ce6c3d87a6e84352437392910160405180910390a150505050565b5f805f5160206152ab5f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa158015612270573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122949190614c60565b61229c612b0c565b610c599190614c8b565b5f610d2c6122b3836137e3565b6122bb61221a565b6137f6565b5f198103612345575f5f5160206152ab5f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561231d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123419190614c60565b9150505b8061234f82612d84565b1461236d5760405163af8075e960e01b815260040160405180910390fd5b50565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146123c75760405163950d88bf60e01b81526001600160a01b039091166004820152602401611029565b505f6123d286612c88565b905060018154600160201b900460ff1660038111156123f3576123f36146c2565b148061241b575060028154600160201b900460ff166003811115612419576124196146c2565b145b81548791600160201b90910460ff169061244a57604051630e851c7960e31b8152600401611029929190614d1c565b5050805461246d90879063ffffffff166124648142613357565b61168987613012565b50636b140e9f60e11b9695505050505050565b5f610d2c61248d83613805565b6122bb6109e261221a565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060835f6124ee82612c88565b905060018154600160201b900460ff16600381111561250f5761250f6146c2565b82548492600160201b90910460ff16911461253f57604051630e851c7960e31b8152600401611029929190614d1c565b50505f61254a612b0c565b8254909150600160881b90046001600160601b0316811015612593578154612587906111e1908390600160881b90046001600160601b0316614cb8565b50612590612b0c565b90505b5f80866001600160401b038111156125ad576125ad614517565b6040519080825280602002602001820160405280156125e057816020015b60608152602001906001900390816125cb5790505b5095505f5b878110156127df575f89898381811061260057612600614e3f565b90506020028101906126129190614e53565b612620916004915f91614d39565b61262991614d60565b905081158061264557506001600160e01b031981811690851614155b156126605761265c612655612d20565b8c83613248565b8093505b6126cb8a8a8481811061267557612675614e3f565b90506020028101906126879190614e53565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038f169291505061334a565b8883815181106126dd576126dd614e3f565b6020026020010181905250826127d6575f88838151811061270057612700614e3f565b602002602001015180602001905181019061271b9190614c60565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015612783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a79190614d98565b6001600160a01b0316146127d4576127cf6127c0612d20565b8d6001600160e01b0319613248565b600193505b505b506001016125e5565b5050505f6114db612b0c565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146128425760405163950d88bf60e01b81526001600160a01b039091166004820152602401611029565b5063e8e617b760e01b949350505050565b6060835f61286082612c88565b905060018154600160201b900460ff166003811115612881576128816146c2565b14806128a9575060028154600160201b900460ff1660038111156128a7576128a76146c2565b145b81548391600160201b90910460ff16906128d857604051630e851c7960e31b8152600401611029929190614d1c565b50505f6128e3612b0c565b90505f856001600160401b038111156128fe576128fe614517565b60405190808252806020026020018201604052801561293157816020015b606081526020019060019003908161291c5790505b5094505f5b86811015612a42575f88888381811061295157612951614e3f565b90506020028101906129639190614e53565b612971916004915f91614d39565b61297a91614d60565b905081158061299657506001600160e01b031981811690841614155b156129b1576129ad6129a6612d20565b8b83613248565b8092505b612a1c8989848181106129c6576129c6614e3f565b90506020028101906129d89190614e53565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038e169291505061334a565b878381518110612a2e57612a2e614e3f565b602090810291909101015250600101612936565b50505f611853612b0c565b5f816003811115612a6057612a606146c2565b03612a7e57604051635e64536560e11b815260040160405180910390fd5b5f612a8883612c88565b9050826001600160a01b03167f0638a5c17c348b99c05e7985ee5ee8bc0c41bc7a12265aec4a488d62350c1d24825f0160049054906101000a900460ff1684604051612ad5929190614e95565b60405180910390a280548290829064ff000000001916600160201b836003811115612b0257612b026146c2565b0217905550505050565b5f612b1561156a565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612b59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7d9190614c60565b905090565b612b8a61380f565b612b92613858565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c139190614d98565b9050612c1e81613860565b612c288484613871565b61116282613883565b5f6112b4612c3d610b33565b612c48906001614c8b565b612c535f600a614f93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612c7f9190614c8b565b859190856139a7565b6001600160a01b0381165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af0160205260408120805490915f5160206152ab5f395f51905f5291600160201b900460ff166003811115612cec57612cec6146c2565b14158390612d1957604051632dad902160e01b81526001600160a01b039091166004820152602401611029565b5050919050565b5f612b7d6139e9565b611a2d8383836001613a5c565b5f6112b4612d4582600a614f93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612d719190614c8b565b612d79610b33565b612c7f906001614c8b565b5f805f5160206152ab5f395f51905f52805460405163ce96cb7760e01b8152306004820152919250612e049185916001600160a01b03169063ce96cb7790602401602060405180830381865afa158015612de0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bb9190614c60565b8154604051632d182be560e21b815260048101839052306024820181905260448201529193506001600160a01b03169063b460af94906064016020604051808303815f875af1158015612e59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d199190614c60565b6001600160a01b038116612ea4576040516347ddf9c760e01b815260040160405180910390fd5b5f5160206152ab5f395f51905f5280546001600160a01b038381166001600160a01b03198316178355168015612f4f57612edc61156a565b60405163095ea7b360e01b81526001600160a01b0383811660048301525f6024830152919091169063095ea7b3906044016020604051808303815f875af1158015612f29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614e24565b505b612f5761156a565b60405163095ea7b360e01b81526001600160a01b0385811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af1158015612fa5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc99190614e24565b50604080516001600160a01b038084168252851660208201527f9baaddad37a65ca0df0360563fca87a13c1ce354be76d7ec35eac48bd766332a910160405180910390a1505050565b5f6001600160ff1b0382111561303e5760405163123baf0360e11b815260048101839052602401611029565b5090565b5f5f5160206152ab5f395f51905f528161305d8787876135dd565b905083826002015f8381526020019081526020015f205f8282546130819190614fa1565b9182905550835490945085915083906014906130a8908490600160a01b9004600b0b614fc8565b82546001600160601b039182166101009390930a92830291909202199091161790555081546040805163ffffffff808a1682528816602082015290810186905260608101859052600160a01b909104600b0b60808201526001600160a01b038816907fbc0ff1d27e119160a9a107d0725b9ed31b90773cf47e89332a35a8c1a319eaee9060a00160405180910390a25050949350505050565b6040516001600160a01b03838116602483015260448201839052611a2d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b37565b5f6131ab8484612498565b90505f1981101561116257818110156131dd57828183604051637dc7a0d960e11b815260040161102993929190614db3565b61116284848484035f613a5c565b6001600160a01b03831661321457604051634b637e8f60e11b81525f6004820152602401611029565b6001600160a01b03821661323d5760405163ec442f0560e01b81525f6004820152602401611029565b611a2d838383613ba3565b5f6132538383611dc5565b90505f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa158015613292573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b69190614d98565b6001600160a01b031663b70096138630856040518463ffffffff1660e01b81526004016132e593929190614fff565b6040805180830381865afa1580156132ff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613323919061502c565b50905084848383610ef85760405163c294136d60e01b815260040161102993929190614fff565b60606112b483835f613cc9565b5f63ffffffff8381161461337a5761337563ffffffff84168361506d565b6112b4565b6112b482613d69565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806133f357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166133e7613e46565b6001600160a01b031614155b156134115760405163703e46dd60e11b815260040160405180910390fd5b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561346d575060408051601f3d908101601f1916820190925261346a91810190614c60565b60015b61349557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611029565b5f51602061528b5f395f51905f5281146134c557604051632a87526960e21b815260048101829052602401611029565b611a2d8383613e5a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146134115760405163703e46dd60e11b815260040160405180910390fd5b5f5160206152cb5f395f51905f52805461353d906001600160a01b03168630866135a4565b6135478483613eaf565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051613595929190918252602082015260400190565b60405180910390a35050505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526111629186918216906323b872dd9060840161316e565b6bffffffffffffffff000000006001600160e01b031960e09390931b9290921660c09190911b63ffffffff60c01b161760a01c1660609190911b6001600160601b0319161790565b5f61362e612b0c565b905082811015613763575f5f5160206152ab5f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561368d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136b19190614c60565b6136bb8386614cb8565b11156136da5760405163af8075e960e01b815260040160405180910390fd5b80546001600160a01b031663b460af946136f48487614cb8565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af115801561373c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137609190614c60565b50505b6137708686868686613ee3565b505050505050565b5f6001600160601b0382111561303e576040516306dfcc6560e41b81526060600482015260248101839052604401611029565b5f601c8260ff1611156137d157604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b6001600160e01b03191690565b5f610d2c6137f083611649565b5f612c31565b5f8282188284100282186112b4565b5f610d2c82611649565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661341157604051631afcd79f60e31b815260040160405180910390fd5b61341161380f565b61386861380f565b61236d81613f97565b61387961380f565b6115978282614007565b61388b61380f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390b9190614d98565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af1158015613979573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061399d9190614e24565b5061236d81612e7d565b5f6139d46139b483614057565b80156139cf57505f84806139ca576139ca615059565b868809115b151590565b6139df868686614083565b611a929190614c8b565b5f366014336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015613a255750808210155b15613a54575f36613a368385614cb8565b613a41928290614d39565b613a4a91615080565b60601c9250505090565b339250505090565b5f51602061526b5f395f51905f526001600160a01b038516613a935760405163e602df0560e01b81525f6004820152602401611029565b6001600160a01b038416613abc57604051634a1406b160e11b81525f6004820152602401611029565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115613b3057836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161359591815260200190565b5050505050565b5f5f60205f8451602086015f885af180613b56576040513d5f823e3d81fd5b50505f513d91508115613b6d578060011415613b7a565b6001600160a01b0384163b155b1561116257604051635274afe760e01b81526001600160a01b0385166004820152602401611029565b5f51602061526b5f395f51905f526001600160a01b038416613bdd5781816002015f828254613bd29190614c8b565b90915550613c3a9050565b6001600160a01b0384165f9081526020829052604090205482811015613c1c5784818460405163391434e360e21b815260040161102993929190614db3565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316613c58576002810180548390039055613c76565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613cbb91815260200190565b60405180910390a350505050565b606081471015613cf55760405163cf47918160e01b815247600482015260248101839052604401611029565b5f5f856001600160a01b03168486604051613d1091906150b6565b5f6040518083038185875af1925050503d805f8114613d4a576040519150601f19603f3d011682016040523d82523d5f602084013e613d4f565b606091505b5091509150613d5f868383614139565b9695505050505050565b6107e95f8062015180613d80636774858086614cb8565b613d8a919061506d565b90505b81613d9a5761016d613d9e565b61016e5b61ffff168110613e215781613db55761016d613db9565b61016e5b613dc79061ffff1682614cb8565b9050613dd2836150cc565b9250613ddf6004846150f0565b63ffffffff16158015613e1a5750613df86064846150f0565b63ffffffff16151580613e1a5750613e12610190846150f0565b63ffffffff16155b9150613d8d565b613e2b8183614190565b613e36846064615117565b63ffffffff166116419190614c8b565b5f5f51602061528b5f395f51905f52611947565b613e6382614273565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613ea757611a2d82826142d6565b61159761433f565b6001600160a01b038216613ed85760405163ec442f0560e01b81525f6004820152602401611029565b6115975f8383613ba3565b5f5160206152cb5f395f51905f526001600160a01b0386811690851614613f0f57613f0f8487846131a0565b613f19848361435e565b8054613f2f906001600160a01b03168685613141565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051613f87929190918252602082015260400190565b60405180910390a4505050505050565b613f9f61380f565b5f5160206152cb5f395f51905f525f80613fb884614392565b9150915081613fc8576012613fca565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61400f61380f565b5f51602061526b5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03614048848261517a565b5060048101611162838261517a565b5f600282600381111561406c5761406c6146c2565b6140769190615234565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036140b7578382816140ad576140ad615059565b04925050506112b4565b8084116140ce576140ce6003851502601118614468565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6060826141495761337582614479565b815115801561416057506001600160a01b0384163b155b1561418957604051639996b31560e01b81526001600160a01b0385166004820152602401611029565b50806112b4565b5f601f8310156141a257506001610d2c565b81156141cb57603c8310156141b957506002610d2c565b826141c381615255565b9350506141dc565b603b8310156141dc57506002610d2c565b605a8310614266576078831061425f57609783106142585760b583106142515760d4831061424a5760f3831061424357610111831061423c5761013083106142355761014e831061422e57600c614269565b600b614269565b600a614269565b6009614269565b6008614269565b6007614269565b6006614269565b6005614269565b6004614269565b60035b60ff169392505050565b806001600160a01b03163b5f036142a857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611029565b5f51602061528b5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516142f291906150b6565b5f60405180830381855af49150503d805f811461432a576040519150601f19603f3d011682016040523d82523d5f602084013e61432f565b606091505b5091509150611a92858383614139565b34156134115760405163b398979f60e01b815260040160405180910390fd5b6001600160a01b03821661438757604051634b637e8f60e11b81525f6004820152602401611029565b611597825f83613ba3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916143d8916150b6565b5f60405180830381855afa9150503d805f8114614410576040519150601f19603f3d011682016040523d82523d5f602084013e614415565b606091505b509150915081801561442957506020815110155b1561445c575f818060200190518101906144439190614c60565b905060ff811161445a576001969095509350505050565b505b505f9485945092505050565b634e487b715f52806020526024601cfd5b8051156144895780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160e01b0319811681146144b9575f5ffd5b919050565b5f602082840312156144ce575f5ffd5b6112b4826144a2565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112b460208301846144d7565b634e487b7160e01b5f52604160045260245ffd5b5f5f6001600160401b0384111561454457614544614517565b50604051601f19601f85018116603f011681018181106001600160401b038211171561457257614572614517565b604052838152905080828401851015614589575f5ffd5b838360208301375f60208583010152509392505050565b5f82601f8301126145af575f5ffd5b6112b48383356020850161452b565b6001600160a01b038116811461236d575f5ffd5b5f5f5f606084860312156145e4575f5ffd5b83356001600160401b038111156145f9575f5ffd5b614605868287016145a0565b93505060208401356001600160401b03811115614620575f5ffd5b61462c868287016145a0565b925050604084013561463d816145be565b809150509250925092565b5f60208284031215614658575f5ffd5b5035919050565b63ffffffff8116811461236d575f5ffd5b5f5f60408385031215614681575f5ffd5b823561468c816145be565b9150602083013561469c8161465f565b809150509250929050565b5f602082840312156146b7575f5ffd5b81356112b4816145be565b634e487b7160e01b5f52602160045260245ffd5b600481106146f257634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610d2c82846146d6565b5f5f60408385031215614715575f5ffd5b8235614720816145be565b946020939093013593505050565b5f5f83601f84011261473e575f5ffd5b5081356001600160401b03811115614754575f5ffd5b60208301915083602082850101111561476b575f5ffd5b9250929050565b5f5f5f5f5f60808688031215614786575f5ffd5b8535614791816145be565b945060208601356147a1816145be565b93506040860135925060608601356001600160401b038111156147c2575f5ffd5b6147ce8882890161472e565b969995985093965092949392505050565b801515811461236d575f5ffd5b5f5f604083850312156147fd575f5ffd5b8235614808816145be565b9150602083013561469c816147df565b5f5f5f5f5f60a0868803121561482c575f5ffd5b8535614837816145be565b945060208601356148478161465f565b935060408601356148578161465f565b925060608601359150608086013561486e816145be565b809150509295509295909350565b5f5f5f6060848603121561488e575f5ffd5b8335614899816145be565b925060208401356148a9816145be565b929592945050506040919091013590565b5f5f5f604084860312156148cc575f5ffd5b83356148d7816145be565b925060208401356001600160401b038111156148f1575f5ffd5b6148fd8682870161472e565b9497909650939450505050565b5f5f6040838503121561491b575f5ffd5b8235614926816145be565b915060208301356001600160401b03811115614940575f5ffd5b8301601f81018513614950575f5ffd5b61495f8582356020840161452b565b9150509250929050565b5f5f5f5f6080858703121561497c575f5ffd5b8435614987816145be565b93506020850135614997816145be565b93969395505050506040820135916060013590565b5f5f604083850312156149bd575f5ffd5b82359150602083013561469c816145be565b5f5f5f5f608085870312156149e2575f5ffd5b84356149ed816145be565b935060208501356149fd8161465f565b92506040850135614a0d8161465f565b9396929550929360600135925050565b5f5f5f60608486031215614a2f575f5ffd5b8335614a3a816145be565b92506020840135614a4a8161465f565b9150604084013561463d8161465f565b5f5f5f60608486031215614a6c575f5ffd5b833592506020840135614a7e816145be565b9150604084013561463d816145be565b5f5f5f60608486031215614aa0575f5ffd5b8335614aab816145be565b95602085013595506040909401359392505050565b5f5f5f5f60808587031215614ad3575f5ffd5b8435614ade816145be565b935060208501356149978161465f565b5f5f60408385031215614aff575f5ffd5b8235614b0a816145be565b9150614b18602084016144a2565b90509250929050565b5f5f60408385031215614b32575f5ffd5b8235614b3d816145be565b9150602083013561469c816145be565b5f5f5f60408486031215614b5f575f5ffd5b8335614b6a816145be565b925060208401356001600160401b03811115614b84575f5ffd5b8401601f81018613614b94575f5ffd5b80356001600160401b03811115614ba9575f5ffd5b8660208260051b8401011115614bbd575f5ffd5b939660209190910195509293505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614c2557603f19878603018452614c108583516144d7565b94506020938401939190910190600101614bf4565b50929695505050505050565b5f5f60408385031215614c42575f5ffd5b8235614c4d816145be565b915060208301356004811061469c575f5ffd5b5f60208284031215614c70575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d2c57610d2c614c77565b5f600160ff1b8201614cb257614cb2614c77565b505f0390565b81810381811115610d2c57610d2c614c77565b600181811c90821680614cdf57607f821691505b602082108103614cfd57634e487b7160e01b5f52602260045260245ffd5b50919050565b60ff8181168382160190811115610d2c57610d2c614c77565b6001600160a01b0383168152604081016112b460208301846146d6565b5f5f85851115614d47575f5ffd5b83861115614d53575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015614d91576001600160e01b0319600485900360031b81901b82161691505b5092915050565b5f60208284031215614da8575f5ffd5b81516112b4816145be565b6001600160a01b039390931683526020830191909152604082015260600190565b5f608082019050825463ffffffff81168352614df96020840160ff8360201c166146d6565b6001600160601b038160281c1660408401526001600160601b038160881c1660608401525092915050565b5f60208284031215614e34575f5ffd5b81516112b4816147df565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112614e68575f5ffd5b8301803591506001600160401b03821115614e81575f5ffd5b60200191503681900382131561476b575f5ffd5b60408101614ea382856146d6565b6112b460208301846146d6565b6001815b6001841115614eeb57808504811115614ecf57614ecf614c77565b6001841615614edd57908102905b60019390931c928002614eb4565b935093915050565b5f82614f0157506001610d2c565b81614f0d57505f610d2c565b8160018114614f235760028114614f2d57614f49565b6001915050610d2c565b60ff841115614f3e57614f3e614c77565b50506001821b610d2c565b5060208310610133831016604e8410600b8410161715614f6c575081810a610d2c565b614f785f198484614eb0565b805f1904821115614f8b57614f8b614c77565b029392505050565b5f6112b460ff841683614ef3565b8082018281125f831280158216821582161715614fc057614fc0614c77565b505092915050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff1982121715610d2c57610d2c614c77565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f5f6040838503121561503d575f5ffd5b8251615048816147df565b602084015190925061469c8161465f565b634e487b7160e01b5f52601260045260245ffd5b5f8261507b5761507b615059565b500490565b80356001600160601b03198116906014841015614d91576001600160601b031960149490940360031b84901b1690921692915050565b5f82518060208501845e5f920191825250919050565b5f63ffffffff821663ffffffff81036150e7576150e7614c77565b60010192915050565b5f63ffffffff83168061510557615105615059565b8063ffffffff84160691505092915050565b63ffffffff8181168382160290811690818114614d9157614d91614c77565b601f821115611a2d57805f5260205f20601f840160051c8101602085101561515b5750805b601f840160051c820191505b81811015613b30575f8155600101615167565b81516001600160401b0381111561519357615193614517565b6151a7816151a18454614ccb565b84615136565b6020601f8211600181146151d9575f83156151c25750848201515b5f19600385901b1c1916600184901b178455613b30565b5f84815260208120601f198516915b8281101561520857878501518255602094850194600190920191016151e8565b508482101561522557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff83168061524657615246615059565b8060ff84160691505092915050565b5f8161526357615263614c77565b505f19019056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a2646970667358221220a437ab8baaeac542b492f00325fe0203380b85eac82313377e452cd6962686bf64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
