{
  "_format": "hh-sol-artifact-1",
  "contractName": "AccessManagedMSV",
  "sourceName": "contracts/AccessManagedMSV.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "AccessManagedUnauthorized",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotRemoveStrategyWithAssets",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "DepositError",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "contract IInvestStrategy",
          "name": "strategy",
          "type": "address"
        }
      ],
      "name": "DuplicatedStrategy",
      "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": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidQueue",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "index",
          "type": "uint8"
        }
      ],
      "name": "InvalidQueueIndexDuplicated",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidQueueLength",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidStrategiesLength",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidStrategy",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidStrategyAsset",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "index",
          "type": "uint8"
        }
      ],
      "name": "InvalidStrategyInDepositQueue",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "index",
          "type": "uint8"
        }
      ],
      "name": "InvalidStrategyInWithdrawQueue",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyStrategyStorageExposed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "RebalanceAmountExceedsMaxDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "RebalanceAmountExceedsMaxWithdraw",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "WithdrawError",
      "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": 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": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DepositFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DepositFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8[]",
          "name": "queue",
          "type": "uint8[]"
        }
      ],
      "name": "DepositQueueChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DisconnectFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DisconnectFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IInvestStrategy",
          "name": "strategyFrom",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "contract IInvestStrategy",
          "name": "strategyTo",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Rebalance",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IInvestStrategy",
          "name": "strategy",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "index",
          "type": "uint8"
        }
      ],
      "name": "StrategyAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "oldStrategy",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        }
      ],
      "name": "StrategyChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "oldStrategy",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        }
      ],
      "name": "StrategyChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IInvestStrategy",
          "name": "strategy",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "index",
          "type": "uint8"
        }
      ],
      "name": "StrategyRemoved",
      "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": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "WithdrawFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "WithdrawFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8[]",
          "name": "queue",
          "type": "uint8[]"
        }
      ],
      "name": "WithdrawQueueChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MAX_STRATEGIES",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "initStrategyData",
          "type": "bytes"
        }
      ],
      "name": "addStrategy",
      "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": "uint8[]",
          "name": "newDepositQueue_",
          "type": "uint8[]"
        }
      ],
      "name": "changeDepositQueue",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8[]",
          "name": "newWithdrawQueue_",
          "type": "uint8[]"
        }
      ],
      "name": "changeWithdrawQueue",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": "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": [],
      "name": "depositQueue",
      "outputs": [
        {
          "internalType": "uint8[32]",
          "name": "",
          "type": "uint8[32]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "depositToStrategies",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "strategyIndex",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "method",
          "type": "uint8"
        },
        {
          "internalType": "bytes",
          "name": "extraData",
          "type": "bytes"
        }
      ],
      "name": "forwardToStrategy",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "getBytesSlot",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "strategyIndex",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "method",
          "type": "uint8"
        }
      ],
      "name": "getForwardToStrategySelector",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "contract IERC20",
          "name": "asset_",
          "type": "address"
        },
        {
          "internalType": "contract IInvestStrategy[]",
          "name": "strategies_",
          "type": "address[]"
        },
        {
          "internalType": "bytes[]",
          "name": "initStrategyDatas",
          "type": "bytes[]"
        },
        {
          "internalType": "uint8[]",
          "name": "depositQueue_",
          "type": "uint8[]"
        },
        {
          "internalType": "uint8[]",
          "name": "withdrawQueue_",
          "type": "uint8[]"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "ret",
          "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": "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": "uint8",
          "name": "strategyFromIdx",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "strategyToIdx",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "rebalance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "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": [
        {
          "internalType": "uint8",
          "name": "strategyIndex",
          "type": "uint8"
        },
        {
          "internalType": "bool",
          "name": "force",
          "type": "bool"
        }
      ],
      "name": "removeStrategy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "strategyIndex",
          "type": "uint8"
        },
        {
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "initStrategyData",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "force",
          "type": "bool"
        }
      ],
      "name": "replaceStrategy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "strategies",
      "outputs": [
        {
          "internalType": "contract IInvestStrategy[32]",
          "name": "",
          "type": "address[32]"
        }
      ],
      "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": [
        {
          "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": [],
      "name": "withdrawQueue",
      "outputs": [
        {
          "internalType": "uint8[32]",
          "name": "",
          "type": "uint8[32]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051614aa36100f95f395f81816125360152818161255f01526126980152614aa35ff3fe608060405260043610610254575f3560e01c80637aeedf2a1161013f578063ba087652116100b3578063d905777e11610078578063d905777e146106f7578063d9f9027f14610716578063dd62ed3e14610737578063e682324d14610756578063ef8b30f7146106b9578063f617eecc14610775575f5ffd5b8063ba0876521461065c578063bd577eb61461067b578063c63d75b61461069a578063c6e6f592146106b9578063ce96cb77146106d8575f5ffd5b806396da35da1161010457806396da35da14610591578063a7ded2ea146105b0578063a9059cbb146105cf578063ad3cb1cc146105ee578063b3d7f6b91461061e578063b460af941461063d575f5ffd5b80637aeedf2a146104e85780638cdf48a814610507578063914abf4f1461053f57806394bf804d1461055e57806395d89b411461057d575f5ffd5b8063402d267d116101d657806351a2d6d11161019b57806351a2d6d11461044257806352d1902d146104635780636e553f651461047757806370a0823114610496578063767f06ae146104b55780637ac445a7146104c9575f5ffd5b8063402d267d146103d05780634614b896146103ef57806347e57533146104105780634cdad506146102a05780634f1ef2861461042f575f5ffd5b806318160ddd1161021c57806318160ddd1461030d57806323b872dd14610340578063313ce5671461035f57806338d52e0f146103855780633aaf9048146103b1575f5ffd5b806301e1d1141461025857806306fdde031461027f57806307a2d13a146102a0578063095ea7b3146102bf5780630a28a477146102ee575b5f5ffd5b348015610263575f5ffd5b5061026c610789565b6040519081526020015b60405180910390f35b34801561028a575f5ffd5b50610293610797565b6040516102769190613f09565b3480156102ab575f5ffd5b5061026c6102ba366004613f1b565b610857565b3480156102ca575f5ffd5b506102de6102d9366004613f46565b610868565b6040519015158152602001610276565b3480156102f9575f5ffd5b5061026c610308366004613f1b565b61087f565b348015610318575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461026c565b34801561034b575f5ffd5b506102de61035a366004613f70565b61088b565b34801561036a575f5ffd5b506103736108b0565b60405160ff9091168152602001610276565b348015610390575f5ffd5b506103996108f2565b6040516001600160a01b039091168152602001610276565b3480156103bc575f5ffd5b506102936103cb366004614078565b610920565b3480156103db575f5ffd5b5061026c6103ea3660046140d1565b6109a5565b3480156103fa575f5ffd5b5061040e610409366004613f1b565b6109ae565b005b34801561041b575f5ffd5b5061029361042a366004613f1b565b6109ba565b61040e61043d3660046140ec565b610b3a565b34801561044d575f5ffd5b50610456610b50565b6040516102769190614138565b34801561046e575f5ffd5b5061026c610ba8565b348015610482575f5ffd5b5061026c61049136600461416c565b610bc3565b3480156104a1575f5ffd5b5061026c6104b03660046140d1565b610c20565b3480156104c0575f5ffd5b50610373602081565b3480156104d4575f5ffd5b5061040e6104e33660046141a7565b610c46565b3480156104f3575f5ffd5b5061040e6105023660046140ec565b610d7f565b348015610512575f5ffd5b50610526610521366004614215565b610f84565b6040516001600160e01b03199091168152602001610276565b34801561054a575f5ffd5b5061040e6105593660046142d9565b610fe2565b348015610569575f5ffd5b5061026c61057836600461416c565b611241565b348015610588575f5ffd5b5061029361128d565b34801561059c575f5ffd5b5061040e6105ab36600461430a565b6112cb565b3480156105bb575f5ffd5b5061040e6105ca366004614421565b6118e2565b3480156105da575f5ffd5b506102de6105e9366004613f46565b6119e5565b3480156105f9575f5ffd5b50610293604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610629575f5ffd5b5061026c610638366004613f1b565b6119f2565b348015610648575f5ffd5b5061026c610657366004614538565b6119fe565b348015610667575f5ffd5b5061026c610676366004614538565b611a4b565b348015610686575f5ffd5b5061040e6106953660046142d9565b611a98565b3480156106a5575f5ffd5b5061026c6106b43660046140d1565b611ce4565b3480156106c4575f5ffd5b5061026c6106d3366004613f1b565b611d10565b3480156106e3575f5ffd5b5061026c6106f23660046140d1565b611d1b565b348015610702575f5ffd5b5061026c6107113660046140d1565b611d31565b348015610721575f5ffd5b5061072a611d76565b6040516102769190614577565b348015610742575f5ffd5b5061026c6107513660046145a8565b611dbc565b348015610761575f5ffd5b5061026c6107703660046145d4565b611e05565b348015610780575f5ffd5b50610456611ff5565b5f610792612030565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020614a2e5f395f51905f52916107d5906145fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610801906145fd565b801561084c5780601f106108235761010080835404028352916020019161084c565b820191905f5260205f20905b81548152906001019060200180831161082f57829003601f168201915b505050505091505090565b5f610862825f6120ab565b92915050565b5f33610875818585612102565b5060019392505050565b5f610862826001612114565b5f33610898858285612162565b6108a38585856121b3565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f81546108ec9190600160a01b900460ff16614649565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b606061092d848484612210565b5f60028560ff166020811061094457610944614662565b01546001600160a01b031690508061096f57604051632711b74d60e11b815260040160405180910390fd5b61099c848460028860ff166020811061098a5761098a614662565b01546001600160a01b0316919061232e565b95945050505050565b5f610862612380565b6109b781612414565b50565b60605f5b5f600282602081106109d2576109d2614662565b01546001600160a01b0316148015906109eb5750602081105b15610b205760028160208110610a0357610a03614662565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a769190614676565b8303610b1057825483908190610a8b906145fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab7906145fd565b8015610b025780601f10610ad957610100808354040283529160200191610b02565b820191905f5260205f20905b815481529060010190602001808311610ae557829003601f168201915b505050505092505050919050565b610b198161468d565b90506109be565b5060405163213109dd60e11b815260040160405180910390fd5b610b4261252b565b610b4c82826125d1565b5050565b610b58613ebc565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b705790505050505050905090565b5f610bb161268d565b505f516020614a4e5f395f51905f5290565b5f5f610bce836109a5565b905080841115610c0057828482604051633c8097d960e11b8152600401610bf7939291906146a5565b60405180910390fd5b5f610c0a85611d10565b9050610c18338587846126d6565b949350505050565b6001600160a01b03165f9081525f516020614a2e5f395f51905f52602052604090205490565b5f60028560ff1660208110610c5d57610c5d614662565b01546001600160a01b0316905080610c8857604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610cb757505f60028260208110610ca957610ca9614662565b01546001600160a01b031614155b15610d2d57846001600160a01b031660028260208110610cd957610cd9614662565b01546001600160a01b0316148015610cf457508560ff168114155b15610d1d5760405163b5a9314f60e01b81526001600160a01b0386166004820152602401610bf7565b610d268161468d565b9050610c8a565b50610d42818585610d3c6126eb565b866126f4565b8360028660ff1660208110610d5957610d59614662565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b038216610da657604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610dd557505f60028260208110610dc757610dc7614662565b01546001600160a01b031614155b15610e3b57826001600160a01b031660028260208110610df757610df7614662565b01546001600160a01b031603610e2b5760405163b5a9314f60e01b81526001600160a01b0384166004820152602401610bf7565b610e348161468d565b9050610da8565b601f198101610e6057604051600162ad1fab60e01b0319815260040160405180910390fd5b8260028260208110610e7457610e74614662565b0180546001600160a01b0319166001600160a01b0392909216919091179055610e9e8160016146c6565b5f8260208110610eb057610eb0614662565b602091828204019190066101000a81548160ff021916908360ff160217905550806001610edd91906146c6565b60018260208110610ef057610ef0614662565b602091828204019190066101000a81548160ff021916908360ff160217905550610f2b610f1b6126eb565b6001600160a01b03851690612842565b610f3e6001600160a01b038416836128d4565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b5f5f60028460ff1660208110610f9c57610f9c614662565b0154604080516001600160a01b039092166020830181905260ff8616918301919091529150610c1890606001604051602081830303815290604052805160209091012090565b610fea613ebc565b81515f906020101561100f5760405163a29b1f1160e01b815260040160405180910390fd5b82518110156111ba57602060ff1683828151811061102f5761102f614662565b602002602001015160ff1610158061108857505f6001600160a01b0316600284838151811061106057611060614662565b602002602001015160ff166020811061107b5761107b614662565b01546001600160a01b0316145b156110a65760405163a29b1f1160e01b815260040160405180910390fd5b818382815181106110b9576110b9614662565b602002602001015160ff16602081106110d4576110d4614662565b60200201511561111b578281815181106110f0576110f0614662565b602002602001015160405163c41fdbb960e01b8152600401610bf7919060ff91909116815260200190565b60018284838151811061113057611130614662565b602002602001015160ff166020811061114b5761114b614662565b91151560209092020152825183908290811061116957611169614662565b6020026020010151600161117d9190614649565b5f826020811061118f5761118f614662565b602091828204019190066101000a81548160ff021916908360ff16021790555080600101905061100f565b6020811080156111e757505f600282602081106111d9576111d9614662565b01546001600160a01b031614155b1561120557604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec8360405161123491906146d9565b60405180910390a1505050565b5f5f61124c83611ce4565b9050808411156112755782848260405163284ff66760e01b8152600401610bf7939291906146a5565b5f61127f856119f2565b9050610c18338583886126d6565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020614a2e5f395f51905f52916107d5906145fd565b602060ff8316106112ef57604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff166020811061130657611306614662565b01546001600160a01b031690508061133157604051632711b74d60e11b815260040160405180910390fd5b8115801561134f575061134c816001600160a01b0316612922565b15155b1561136d576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561138757506003546001600160a01b0316155b156113a857604051600162ad1fab60e01b0319815260040160405180910390fd5b5f6113b4846001614649565b60ff1690505b6020811080156113e757505f600282602081106113d9576113d9614662565b01546001600160a01b031614155b1561145657600281602081106113ff576113ff614662565b01546001600160a01b0316600261141760018461471e565b6020811061142757611427614662565b0180546001600160a01b0319166001600160a01b039290921691909117905561144f8161468d565b90506113ba565b5f600261146460018461471e565b6020811061147457611474614662565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b600183602081106114ab576114ab614662565b602081049091015460ff601f9092166101000a900416158015906114cf5750602083105b15611801578015611593576114e5866001614649565b60ff16600184602081106114fb576114fb614662565b602081049091015460ff601f9092166101000a9004161161151c575f61151f565b60015b6001846020811061153257611532614662565b602091828204019190069054906101000a900460ff166115529190614731565b600161155e818661471e565b6020811061156e5761156e614662565b602091828204019190066101000a81548160ff021916908360ff160217905550611664565b61159e866001614649565b60ff16600184602081106115b4576115b4614662565b602081049091015460ff601f9092166101000a900416036115d757506001611664565b6115e2866001614649565b60ff16600184602081106115f8576115f8614662565b602081049091015460ff601f9092166101000a900416111561166457600180846020811061162857611628614662565b602091828204019190068282829054906101000a900460ff1661164b9190614731565b92506101000a81548160ff021916908360ff1602179055505b811561172157611675866001614649565b60ff165f846020811061168a5761168a614662565b602081049091015460ff601f9092166101000a900416116116ab575f6116ae565b60015b5f84602081106116c0576116c0614662565b602091828204019190069054906101000a900460ff166116e09190614731565b5f6116ec60018661471e565b602081106116fc576116fc614662565b602091828204019190066101000a81548160ff021916908360ff1602179055506117f1565b61172c866001614649565b60ff165f846020811061174157611741614662565b602081049091015460ff601f9092166101000a9004160361176557600191506117f1565b611770866001614649565b60ff165f846020811061178557611785614662565b602081049091015460ff601f9092166101000a90041611156117f15760015f84602081106117b5576117b5614662565b602091828204019190068282829054906101000a900460ff166117d89190614731565b92506101000a81548160ff021916908360ff1602179055505b6117fa8361468d565b9250611498565b5f8061180e60018661471e565b6020811061181e5761181e614662565b602091828204019190066101000a81548160ff021916908360ff1602179055505f6001808561184d919061471e565b6020811061185d5761185d614662565b602091828204019190066101000a81548160ff021916908360ff16021790555061189985856001600160a01b031661298b90919063ffffffff16565b60405160ff871681526001600160a01b038516907f978014566e371fef52158b004e150b6e1fd723f5aa3d8c9aa2a7c98ddb0e65b89060200160405180910390a2505050505050565b5f6118eb612ab0565b805490915060ff600160401b82041615906001600160401b03165f811580156119115750825b90505f826001600160401b0316600114801561192c5750303b155b90508115801561193a575080155b156119585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561198257845460ff60401b1916600160401b1785555b6119918c8c8c8c8c8c8c612ad8565b83156119d757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b5f336108758185856121b3565b5f6108628260016120ab565b5f5f611a0983611d1b565b905080851115611a3257828582604051633fa733bb60e21b8152600401610bf7939291906146a5565b5f611a3c8661087f565b905061099c3386868985612b08565b5f5f611a5683611d31565b905080851115611a7f57828582604051632e52afbb60e21b8152600401610bf7939291906146a5565b5f611a8986610857565b905061099c338686848a612b08565b611aa0613ebc565b81515f9060201015611ac55760405163a29b1f1160e01b815260040160405180910390fd5b82518160ff161015611c6457602060ff16838260ff1681518110611aeb57611aeb614662565b602002602001015160ff16101580611b4757505f6001600160a01b03166002848360ff1681518110611b1f57611b1f614662565b602002602001015160ff1660208110611b3a57611b3a614662565b01546001600160a01b0316145b15611b655760405163a29b1f1160e01b815260040160405180910390fd5b81838260ff1681518110611b7b57611b7b614662565b602002602001015160ff1660208110611b9657611b96614662565b602002015115611bb557828160ff16815181106110f0576110f0614662565b600182848360ff1681518110611bcd57611bcd614662565b602002602001015160ff1660208110611be857611be8614662565b911515602090920201528251839060ff8316908110611c0957611c09614662565b60200260200101516001611c1d9190614649565b60018260ff1660208110611c3357611c33614662565b602091828204019190066101000a81548160ff021916908360ff16021790555080611c5d9061474a565b9050611ac5565b602060ff8216108015611c9757505f600260ff831660208110611c8957611c89614662565b01546001600160a01b031614155b15611cb557604051636712b27b60e01b815260040160405180910390fd5b7f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c8360405161123491906146d9565b5f5f611cee612380565b90505f198114611d0757611d02815f612114565b6108a9565b5f199392505050565b5f610862825f612114565b5f5f611d2683612b1e565b90506108a981612b2b565b5f5f611d3c83612bc0565b90505f611d49825f6120ab565b90505f611d5582612b2b565b9050818114611d6d57611d68815f612114565b61099c565b50909392505050565b611d7e613ebc565b604080516104008101918290529060029060209082845b81546001600160a01b03168152600190910190602001808311611d95575050505050905090565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f602060ff8516101580611e1d5750602060ff841610155b15611e3b57604051632711b74d60e11b815260040160405180910390fd5b5f60028560ff1660208110611e5257611e52614662565b01546001600160a01b031690505f600260ff861660208110611e7657611e76614662565b01546001600160a01b03908116915082161580611e9a57506001600160a01b038116155b15611eb857604051632711b74d60e11b815260040160405180910390fd5b5f198403611ed557611ed2826001600160a01b0316612922565b93505b835f03611ee6575f925050506108a9565b611ef8826001600160a01b0316612bca565b841115611f2d57611f11826001600160a01b0316612bca565b604051633ce011d560e01b8152600401610bf791815260200190565b611f3f816001600160a01b0316612bf8565b841115611f7457611f58816001600160a01b0316612bf8565b6040516350a3e37560e11b8152600401610bf791815260200190565b611f886001600160a01b038316855f612c26565b50611f9d6001600160a01b038216855f612d62565b50806001600160a01b0316826001600160a01b03167fb0850b8e0f9e8315dde3c9f9f31138283e6bbe16cd29e8552eb1dcdf9fac9e3b86604051611fe391815260200190565b60405180910390a35091949350505050565b611ffd613ebc565b604080516104008101918290525f805460ff1682529091602090826001838601808411610b705790505050505050905090565b5f5f5b5f6002826020811061204757612047614662565b01546001600160a01b0316148015906120605750602081105b156120a75761208b6002826020811061207b5761207b614662565b01546001600160a01b0316612922565b61209590836146c6565b91506120a08161468d565b9050612033565b5090565b5f6108a96120b7610789565b6120c29060016146c6565b6120cd5f600a61484b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546120f991906146c6565b85919085612e83565b61210f8383836001612ec5565b505050565b5f6108a961212382600a61484b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461214f91906146c6565b612157610789565b6120f99060016146c6565b5f61216d8484611dbc565b90505f198110156121ad578181101561219f57828183604051637dc7a0d960e11b8152600401610bf7939291906146a5565b6121ad84848484035f612ec5565b50505050565b6001600160a01b0383166121dc57604051634b637e8f60e11b81525f6004820152602401610bf7565b6001600160a01b0382166122055760405163ec442f0560e01b81525f6004820152602401610bf7565b61210f838383612fa8565b5f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa15801561224d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122719190614859565b90505f816001600160a01b031663b7009613333061228f8989610f84565b60405160e085901b6001600160e01b031990811682526001600160a01b0394851660048301529290931660248401521660448201526064016040805180830381865afa1580156122e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123059190614874565b509050806123275760405162d1953b60e31b8152336004820152602401610bf7565b5050505050565b6060610c1883836040516024016123469291906148a9565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b038616906130ce565b5f5f5f5b5f6002826020811061239857612398614662565b01546001600160a01b0316148015906123b15750602081105b1561240f576123ed836123e0600284602081106123d0576123d0614662565b01546001600160a01b0316612bf8565b8101908110159190820290565b93509150816123ff575f199250505090565b6124088161468d565b9050612384565b505090565b805f5b811580159061244c57505f816020811061243357612433614662565b602081049091015460ff601f9092166101000a90041615155b80156124585750602081105b1561250b575f600260015f846020811061247457612474614662565b602091828204019190069054906101000a900460ff166124949190614731565b60ff16602081106124a7576124a7614662565b01546001600160a01b031690505f6124c7846124c284612bf8565b61316e565b9050805f036124d75750506124fb565b6124eb6001600160a01b038316825f612d62565b506124f6818561471e565b935050505b6125048161468d565b9050612417565b508015610b4c5760405163285a546d60e01b815260040160405180910390fd5b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806125b157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166125a55f516020614a4e5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156125cf5760405163703e46dd60e11b815260040160405180910390fd5b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561262b575060408051601f3d908101601f1916820190925261262891810190614676565b60015b61265357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610bf7565b5f516020614a4e5f395f51905f52811461268357604051632a87526960e21b815260048101829052602401610bf7565b61210f838361317d565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146125cf5760405163703e46dd60e11b815260040160405180910390fd5b6126e2848484846131d2565b6121ad82612414565b5f6107926108f2565b6126fe8483612842565b60405163f3e0ffbf60e01b81523060048201526127709086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa158015612746573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276a9190614676565b83612c26565b5061277b858261298b565b61278584846128d4565b6040516370a0823160e01b81523060048201526127f79085906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614676565b83612d62565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa158015612889573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ad9190614859565b6001600160a01b031614610b4c5760405163e76673ef60e01b815260040160405180910390fd5b61210f816040516024016128e89190613f09565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b038416906130ce565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015612967573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108629190614676565b8015612a6657604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b179052516129e291906148c4565b5f60405180830381855af49150503d805f8114612a1a576040519150601f19603f3d011682016040523d82523d5f602084013e612a1f565b606091505b5091509150816121ad577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf881604051612a589190613f09565b60405180910390a150505050565b6040515f602482015261210f9060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b038416906130ce565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610862565b612ae061323d565b612ae985613262565b612af38787613273565b612aff84848484613285565b50505050505050565b612b1182613806565b6123278585858585613919565b5f6108626102ba83611d31565b5f5f5f5b5f60028260208110612b4357612b43614662565b01546001600160a01b031614801590612b5c5750602081105b15612bb957612b8b836123e060028460208110612b7b57612b7b614662565b01546001600160a01b0316612bca565b93509150811580612b9c5750838310155b15612ba957509192915050565b612bb28161468d565b9050612b2f565b5050919050565b5f61086282610c20565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb779060240161294c565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d9060240161294c565b5f8115612d08575f5f856001600160a01b031685604051602401612c4c91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251612c8191906148c4565b5f60405180830381855af49150503d805f8114612cb9576040519150601f19603f3d011682016040523d82523d5f602084013e612cbe565b606091505b509150915081612d00577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051612cf79190613f09565b60405180910390a15b5090506108a9565b612d5883604051602401612d1e91815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b038616906130ce565b50600190506108a9565b5f8115612e33575f5f856001600160a01b031685604051602401612d8891815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251612dbd91906148c4565b5f60405180830381855af49150503d805f8114612df5576040519150601f19603f3d011682016040523d82523d5f602084013e612dfa565b606091505b509150915081612d00577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051612cf79190613f09565b612d5883604051602401612e4991815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b038616906130ce565b5f612eb0612e90836139c0565b8015612eab57505f8480612ea657612ea66148da565b868809115b151590565b612ebb8686866139ec565b61099c91906146c6565b5f516020614a2e5f395f51905f526001600160a01b038516612efc5760405163e602df0560e01b81525f6004820152602401610bf7565b6001600160a01b038416612f2557604051634a1406b160e11b81525f6004820152602401610bf7565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561232757836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612f9991815260200190565b60405180910390a35050505050565b5f516020614a2e5f395f51905f526001600160a01b038416612fe25781816002015f828254612fd791906146c6565b9091555061303f9050565b6001600160a01b0384165f90815260208290526040902054828110156130215784818460405163391434e360e21b8152600401610bf7939291906146a5565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661305d57600281018054839003905561307b565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130c091815260200190565b60405180910390a350505050565b60605f6130db8484613a9c565b90508080156130fc57505f3d11806130fc57505f846001600160a01b03163b115b1561311157613109613aaf565b915050610862565b801561313b57604051639996b31560e01b81526001600160a01b0385166004820152602401610bf7565b3d1561314e57613149613ac8565b613167565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b5f8282188284100282186108a9565b61318682613ad3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156131ca5761210f82826130ce565b610b4c613b36565b6131e56131dd6108f2565b853085613b55565b6131ef8382613b8b565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d784846040516130c0929190918252602082015260400190565b613245613bbf565b6125cf57604051631afcd79f60e31b815260040160405180910390fd5b61326a61323d565b6109b781613bd8565b61327b61323d565b610b4c8282613c5b565b83511580613294575083516020105b806132a157508251845114155b806132ae57508151845114155b806132bb57508051845114155b156132dc57604051600162ad1fab60e01b0319815260040160405180910390fd5b6132e4613ebc565b6132ec613ebc565b5f5b865181101561378f575f6001600160a01b031687828151811061331357613313614662565b60200260200101516001600160a01b03160361334257604051632711b74d60e11b815260040160405180910390fd5b61337e61334d6126eb565b88838151811061335f5761335f614662565b60200260200101516001600160a01b031661284290919063ffffffff16565b5f5b8181101561341e5787818151811061339a5761339a614662565b60200260200101516001600160a01b03168883815181106133bd576133bd614662565b60200260200101516001600160a01b031603613416578782815181106133e5576133e5614662565b602002602001015160405163b5a9314f60e01b8152600401610bf791906001600160a01b0391909116815260200190565b600101613380565b50865185828151811061343357613433614662565b602002602001015160ff1610158061347a57508285828151811061345957613459614662565b602002602001015160ff166020811061347457613474614662565b60200201515b156134bc5784818151811061349157613491614662565b602002602001015160405163306ccd5d60e11b8152600401610bf7919060ff91909116815260200190565b86518482815181106134d0576134d0614662565b602002602001015160ff161015806135175750818482815181106134f6576134f6614662565b602002602001015160ff166020811061351157613511614662565b60200201515b156135595783818151811061352e5761352e614662565b6020026020010151604051632776924160e11b8152600401610bf7919060ff91909116815260200190565b60018386838151811061356e5761356e614662565b602002602001015160ff166020811061358957613589614662565b6020020190151590811515815250506001828583815181106135ad576135ad614662565b602002602001015160ff16602081106135c8576135c8614662565b9115156020909202015286518790829081106135e6576135e6614662565b60200260200101516002826020811061360157613601614662565b015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084818151811061363757613637614662565b6020026020010151600161364b9190614649565b5f826020811061365d5761365d614662565b602091828204019190066101000a81548160ff021916908360ff16021790555083818151811061368f5761368f614662565b602002602001015160016136a39190614649565b600182602081106136b6576136b6614662565b602091828204019190066101000a81548160ff021916908360ff1602179055506137248682815181106136eb576136eb614662565b602002602001015188838151811061370557613705614662565b60200260200101516001600160a01b03166128d490919063ffffffff16565b86818151811061373657613736614662565b60200260200101516001600160a01b03167f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f588260405161377f919060ff91909116815260200190565b60405180910390a26001016132ee565b507f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec846040516137bf91906146d9565b60405180910390a17f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516137f691906146d9565b60405180910390a1505050505050565b805f5b811580159061383f57506001816020811061382657613826614662565b602081049091015460ff601f9092166101000a90041615155b801561384b5750602081105b156138f9575f6002600180846020811061386757613867614662565b602091828204019190069054906101000a900460ff166138879190614731565b60ff166020811061389a5761389a614662565b01546001600160a01b031690505f6138b5846124c284612bca565b9050805f036138c55750506138e9565b6138d96001600160a01b038316825f612c26565b506138e4818561471e565b935050505b6138f28161468d565b9050613809565b508015610b4c5760405163351dc55d60e21b815260040160405180910390fd5b826001600160a01b0316856001600160a01b03161461393d5761393d838683612162565b6139478382613cab565b6139596139526108f2565b8584613cdf565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db85856040516139b1929190918252602082015260400190565b60405180910390a45050505050565b5f60028260038111156139d5576139d56148ee565b6139df9190614902565b60ff166001149050919050565b5f5f5f6139f98686613d14565b91509150815f03613a1d57838181613a1357613a136148da565b04925050506108a9565b818411613a3457613a346003851502601118613d30565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b806001600160a01b03163b5f03613b0857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf7565b5f516020614a4e5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b34156125cf5760405163b398979f60e01b815260040160405180910390fd5b613b63848484846001613d41565b6121ad57604051635274afe760e01b81526001600160a01b0385166004820152602401610bf7565b6001600160a01b038216613bb45760405163ec442f0560e01b81525f6004820152602401610bf7565b610b4c5f8383612fa8565b5f613bc8612ab0565b54600160401b900460ff16919050565b613be061323d565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80613c0c84613dae565b9150915081613c1c576012613c1e565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b613c6361323d565b5f516020614a2e5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03613c9c8482614973565b50600481016121ad8382614973565b6001600160a01b038216613cd457604051634b637e8f60e11b81525f6004820152602401610bf7565b610b4c825f83612fa8565b613cec8383836001613e39565b61210f57604051635274afe760e01b81526001600160a01b0384166004820152602401610bf7565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316613d9d578383151615613d91573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b5f5f5f613dba60405190565b6040805160048152602481019091526020810180516001600160e01b031663313ce56760e01b1790529091505f908190613df5908790613e9b565b5091509150613e0383604052565b818015613e11575060203d10155b8015613e1e575060ff8111155b613e29575f5f613e2d565b6001815b94509450505050915091565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316613e8f578383151615613e83573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5f5f60405f855160208701885afa92505f51915060205190509250925092565b6040518061040001604052806020906020820280368337509192915050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108a96020830184613edb565b5f60208284031215613f2b575f5ffd5b5035919050565b6001600160a01b03811681146109b7575f5ffd5b5f5f60408385031215613f57575f5ffd5b8235613f6281613f32565b946020939093013593505050565b5f5f5f60608486031215613f82575f5ffd5b8335613f8d81613f32565b92506020840135613f9d81613f32565b929592945050506040919091013590565b803560ff81168114613fbe575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613fff57613fff613fc3565b604052919050565b5f82601f830112614016575f5ffd5b8135602083015f5f6001600160401b0384111561403557614035613fc3565b50601f8301601f191660200161404a81613fd7565b91505082815285838301111561405e575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f5f6060848603121561408a575f5ffd5b61409384613fae565b92506140a160208501613fae565b915060408401356001600160401b038111156140bb575f5ffd5b6140c786828701614007565b9150509250925092565b5f602082840312156140e1575f5ffd5b81356108a981613f32565b5f5f604083850312156140fd575f5ffd5b823561410881613f32565b915060208301356001600160401b03811115614122575f5ffd5b61412e85828601614007565b9150509250929050565b610400810181835f5b602081101561416357815160ff16835260209283019290910190600101614141565b50505092915050565b5f5f6040838503121561417d575f5ffd5b82359150602083013561418f81613f32565b809150509250929050565b80151581146109b7575f5ffd5b5f5f5f5f608085870312156141ba575f5ffd5b6141c385613fae565b935060208501356141d381613f32565b925060408501356001600160401b038111156141ed575f5ffd5b6141f987828801614007565b925050606085013561420a8161419a565b939692955090935050565b5f5f60408385031215614226575f5ffd5b61422f83613fae565b915061423d60208401613fae565b90509250929050565b5f6001600160401b0382111561425e5761425e613fc3565b5060051b60200190565b5f82601f830112614277575f5ffd5b813561428a61428582614246565b613fd7565b8082825260208201915060208360051b8601019250858311156142ab575f5ffd5b602085015b838110156142cf576142c181613fae565b8352602092830192016142b0565b5095945050505050565b5f602082840312156142e9575f5ffd5b81356001600160401b038111156142fe575f5ffd5b610c1884828501614268565b5f5f6040838503121561431b575f5ffd5b61432483613fae565b9150602083013561418f8161419a565b8035613fbe81613f32565b5f82601f83011261434e575f5ffd5b813561435c61428582614246565b8082825260208201915060208360051b86010192508583111561437d575f5ffd5b602085015b838110156142cf57803561439581613f32565b835260209283019201614382565b5f82601f8301126143b2575f5ffd5b81356143c061428582614246565b8082825260208201915060208360051b8601019250858311156143e1575f5ffd5b602085015b838110156142cf5780356001600160401b03811115614403575f5ffd5b614412886020838a0101614007565b845250602092830192016143e6565b5f5f5f5f5f5f5f60e0888a031215614437575f5ffd5b87356001600160401b0381111561444c575f5ffd5b6144588a828b01614007565b97505060208801356001600160401b03811115614473575f5ffd5b61447f8a828b01614007565b96505061448e60408901614334565b945060608801356001600160401b038111156144a8575f5ffd5b6144b48a828b0161433f565b94505060808801356001600160401b038111156144cf575f5ffd5b6144db8a828b016143a3565b93505060a08801356001600160401b038111156144f6575f5ffd5b6145028a828b01614268565b92505060c08801356001600160401b0381111561451d575f5ffd5b6145298a828b01614268565b91505092959891949750929550565b5f5f5f6060848603121561454a575f5ffd5b83359250602084013561455c81613f32565b9150604084013561456c81613f32565b809150509250925092565b610400810181835f5b60208110156141635781516001600160a01b0316835260209283019290910190600101614580565b5f5f604083850312156145b9575f5ffd5b82356145c481613f32565b9150602083013561418f81613f32565b5f5f5f606084860312156145e6575f5ffd5b6145ef84613fae565b9250613f9d60208501613fae565b600181811c9082168061461157607f821691505b60208210810361462f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561086257610862614635565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614686575f5ffd5b5051919050565b5f6001820161469e5761469e614635565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561086257610862614635565b602080825282518282018190525f918401906040840190835b8181101561471357835160ff168352602093840193909201916001016146f2565b509095945050505050565b8181038181111561086257610862614635565b60ff828116828216039081111561086257610862614635565b5f60ff821660ff810361475f5761475f614635565b60010192915050565b6001815b60018411156147a35780850481111561478757614787614635565b600184161561479557908102905b60019390931c92800261476c565b935093915050565b5f826147b957506001610862565b816147c557505f610862565b81600181146147db57600281146147e557614801565b6001915050610862565b60ff8411156147f6576147f6614635565b50506001821b610862565b5060208310610133831016604e8410600b8410161715614824575081810a610862565b6148305f198484614768565b805f190482111561484357614843614635565b029392505050565b5f6108a960ff8416836147ab565b5f60208284031215614869575f5ffd5b81516108a981613f32565b5f5f60408385031215614885575f5ffd5b82516148908161419a565b602084015190925063ffffffff8116811461418f575f5ffd5b60ff83168152604060208201525f610c186040830184613edb565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061492057634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f82111561210f57805f5260205f20601f840160051c810160208510156149545750805b601f840160051c820191505b81811015612327575f8155600101614960565b81516001600160401b0381111561498c5761498c613fc3565b6149a08161499a84546145fd565b8461492f565b6020601f8211600181146149d2575f83156149bb5750848201515b5f19600385901b1c1916600184901b178455612327565b5f84815260208120601f198516915b82811015614a0157878501518255602094850194600190920191016149e1565b5084821015614a1e57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220c794b6ddbd4cfb3941fee0d7f43479cb8b47ac102f550f916026e193879f834464736f6c634300081e0033",
  "deployedBytecode": "0x608060405260043610610254575f3560e01c80637aeedf2a1161013f578063ba087652116100b3578063d905777e11610078578063d905777e146106f7578063d9f9027f14610716578063dd62ed3e14610737578063e682324d14610756578063ef8b30f7146106b9578063f617eecc14610775575f5ffd5b8063ba0876521461065c578063bd577eb61461067b578063c63d75b61461069a578063c6e6f592146106b9578063ce96cb77146106d8575f5ffd5b806396da35da1161010457806396da35da14610591578063a7ded2ea146105b0578063a9059cbb146105cf578063ad3cb1cc146105ee578063b3d7f6b91461061e578063b460af941461063d575f5ffd5b80637aeedf2a146104e85780638cdf48a814610507578063914abf4f1461053f57806394bf804d1461055e57806395d89b411461057d575f5ffd5b8063402d267d116101d657806351a2d6d11161019b57806351a2d6d11461044257806352d1902d146104635780636e553f651461047757806370a0823114610496578063767f06ae146104b55780637ac445a7146104c9575f5ffd5b8063402d267d146103d05780634614b896146103ef57806347e57533146104105780634cdad506146102a05780634f1ef2861461042f575f5ffd5b806318160ddd1161021c57806318160ddd1461030d57806323b872dd14610340578063313ce5671461035f57806338d52e0f146103855780633aaf9048146103b1575f5ffd5b806301e1d1141461025857806306fdde031461027f57806307a2d13a146102a0578063095ea7b3146102bf5780630a28a477146102ee575b5f5ffd5b348015610263575f5ffd5b5061026c610789565b6040519081526020015b60405180910390f35b34801561028a575f5ffd5b50610293610797565b6040516102769190613f09565b3480156102ab575f5ffd5b5061026c6102ba366004613f1b565b610857565b3480156102ca575f5ffd5b506102de6102d9366004613f46565b610868565b6040519015158152602001610276565b3480156102f9575f5ffd5b5061026c610308366004613f1b565b61087f565b348015610318575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461026c565b34801561034b575f5ffd5b506102de61035a366004613f70565b61088b565b34801561036a575f5ffd5b506103736108b0565b60405160ff9091168152602001610276565b348015610390575f5ffd5b506103996108f2565b6040516001600160a01b039091168152602001610276565b3480156103bc575f5ffd5b506102936103cb366004614078565b610920565b3480156103db575f5ffd5b5061026c6103ea3660046140d1565b6109a5565b3480156103fa575f5ffd5b5061040e610409366004613f1b565b6109ae565b005b34801561041b575f5ffd5b5061029361042a366004613f1b565b6109ba565b61040e61043d3660046140ec565b610b3a565b34801561044d575f5ffd5b50610456610b50565b6040516102769190614138565b34801561046e575f5ffd5b5061026c610ba8565b348015610482575f5ffd5b5061026c61049136600461416c565b610bc3565b3480156104a1575f5ffd5b5061026c6104b03660046140d1565b610c20565b3480156104c0575f5ffd5b50610373602081565b3480156104d4575f5ffd5b5061040e6104e33660046141a7565b610c46565b3480156104f3575f5ffd5b5061040e6105023660046140ec565b610d7f565b348015610512575f5ffd5b50610526610521366004614215565b610f84565b6040516001600160e01b03199091168152602001610276565b34801561054a575f5ffd5b5061040e6105593660046142d9565b610fe2565b348015610569575f5ffd5b5061026c61057836600461416c565b611241565b348015610588575f5ffd5b5061029361128d565b34801561059c575f5ffd5b5061040e6105ab36600461430a565b6112cb565b3480156105bb575f5ffd5b5061040e6105ca366004614421565b6118e2565b3480156105da575f5ffd5b506102de6105e9366004613f46565b6119e5565b3480156105f9575f5ffd5b50610293604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610629575f5ffd5b5061026c610638366004613f1b565b6119f2565b348015610648575f5ffd5b5061026c610657366004614538565b6119fe565b348015610667575f5ffd5b5061026c610676366004614538565b611a4b565b348015610686575f5ffd5b5061040e6106953660046142d9565b611a98565b3480156106a5575f5ffd5b5061026c6106b43660046140d1565b611ce4565b3480156106c4575f5ffd5b5061026c6106d3366004613f1b565b611d10565b3480156106e3575f5ffd5b5061026c6106f23660046140d1565b611d1b565b348015610702575f5ffd5b5061026c6107113660046140d1565b611d31565b348015610721575f5ffd5b5061072a611d76565b6040516102769190614577565b348015610742575f5ffd5b5061026c6107513660046145a8565b611dbc565b348015610761575f5ffd5b5061026c6107703660046145d4565b611e05565b348015610780575f5ffd5b50610456611ff5565b5f610792612030565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020614a2e5f395f51905f52916107d5906145fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610801906145fd565b801561084c5780601f106108235761010080835404028352916020019161084c565b820191905f5260205f20905b81548152906001019060200180831161082f57829003601f168201915b505050505091505090565b5f610862825f6120ab565b92915050565b5f33610875818585612102565b5060019392505050565b5f610862826001612114565b5f33610898858285612162565b6108a38585856121b3565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f81546108ec9190600160a01b900460ff16614649565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b606061092d848484612210565b5f60028560ff166020811061094457610944614662565b01546001600160a01b031690508061096f57604051632711b74d60e11b815260040160405180910390fd5b61099c848460028860ff166020811061098a5761098a614662565b01546001600160a01b0316919061232e565b95945050505050565b5f610862612380565b6109b781612414565b50565b60605f5b5f600282602081106109d2576109d2614662565b01546001600160a01b0316148015906109eb5750602081105b15610b205760028160208110610a0357610a03614662565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a769190614676565b8303610b1057825483908190610a8b906145fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab7906145fd565b8015610b025780601f10610ad957610100808354040283529160200191610b02565b820191905f5260205f20905b815481529060010190602001808311610ae557829003601f168201915b505050505092505050919050565b610b198161468d565b90506109be565b5060405163213109dd60e11b815260040160405180910390fd5b610b4261252b565b610b4c82826125d1565b5050565b610b58613ebc565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610b705790505050505050905090565b5f610bb161268d565b505f516020614a4e5f395f51905f5290565b5f5f610bce836109a5565b905080841115610c0057828482604051633c8097d960e11b8152600401610bf7939291906146a5565b60405180910390fd5b5f610c0a85611d10565b9050610c18338587846126d6565b949350505050565b6001600160a01b03165f9081525f516020614a2e5f395f51905f52602052604090205490565b5f60028560ff1660208110610c5d57610c5d614662565b01546001600160a01b0316905080610c8857604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610cb757505f60028260208110610ca957610ca9614662565b01546001600160a01b031614155b15610d2d57846001600160a01b031660028260208110610cd957610cd9614662565b01546001600160a01b0316148015610cf457508560ff168114155b15610d1d5760405163b5a9314f60e01b81526001600160a01b0386166004820152602401610bf7565b610d268161468d565b9050610c8a565b50610d42818585610d3c6126eb565b866126f4565b8360028660ff1660208110610d5957610d59614662565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b038216610da657604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015610dd557505f60028260208110610dc757610dc7614662565b01546001600160a01b031614155b15610e3b57826001600160a01b031660028260208110610df757610df7614662565b01546001600160a01b031603610e2b5760405163b5a9314f60e01b81526001600160a01b0384166004820152602401610bf7565b610e348161468d565b9050610da8565b601f198101610e6057604051600162ad1fab60e01b0319815260040160405180910390fd5b8260028260208110610e7457610e74614662565b0180546001600160a01b0319166001600160a01b0392909216919091179055610e9e8160016146c6565b5f8260208110610eb057610eb0614662565b602091828204019190066101000a81548160ff021916908360ff160217905550806001610edd91906146c6565b60018260208110610ef057610ef0614662565b602091828204019190066101000a81548160ff021916908360ff160217905550610f2b610f1b6126eb565b6001600160a01b03851690612842565b610f3e6001600160a01b038416836128d4565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b5f5f60028460ff1660208110610f9c57610f9c614662565b0154604080516001600160a01b039092166020830181905260ff8616918301919091529150610c1890606001604051602081830303815290604052805160209091012090565b610fea613ebc565b81515f906020101561100f5760405163a29b1f1160e01b815260040160405180910390fd5b82518110156111ba57602060ff1683828151811061102f5761102f614662565b602002602001015160ff1610158061108857505f6001600160a01b0316600284838151811061106057611060614662565b602002602001015160ff166020811061107b5761107b614662565b01546001600160a01b0316145b156110a65760405163a29b1f1160e01b815260040160405180910390fd5b818382815181106110b9576110b9614662565b602002602001015160ff16602081106110d4576110d4614662565b60200201511561111b578281815181106110f0576110f0614662565b602002602001015160405163c41fdbb960e01b8152600401610bf7919060ff91909116815260200190565b60018284838151811061113057611130614662565b602002602001015160ff166020811061114b5761114b614662565b91151560209092020152825183908290811061116957611169614662565b6020026020010151600161117d9190614649565b5f826020811061118f5761118f614662565b602091828204019190066101000a81548160ff021916908360ff16021790555080600101905061100f565b6020811080156111e757505f600282602081106111d9576111d9614662565b01546001600160a01b031614155b1561120557604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec8360405161123491906146d9565b60405180910390a1505050565b5f5f61124c83611ce4565b9050808411156112755782848260405163284ff66760e01b8152600401610bf7939291906146a5565b5f61127f856119f2565b9050610c18338583886126d6565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020614a2e5f395f51905f52916107d5906145fd565b602060ff8316106112ef57604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff166020811061130657611306614662565b01546001600160a01b031690508061133157604051632711b74d60e11b815260040160405180910390fd5b8115801561134f575061134c816001600160a01b0316612922565b15155b1561136d576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561138757506003546001600160a01b0316155b156113a857604051600162ad1fab60e01b0319815260040160405180910390fd5b5f6113b4846001614649565b60ff1690505b6020811080156113e757505f600282602081106113d9576113d9614662565b01546001600160a01b031614155b1561145657600281602081106113ff576113ff614662565b01546001600160a01b0316600261141760018461471e565b6020811061142757611427614662565b0180546001600160a01b0319166001600160a01b039290921691909117905561144f8161468d565b90506113ba565b5f600261146460018461471e565b6020811061147457611474614662565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b600183602081106114ab576114ab614662565b602081049091015460ff601f9092166101000a900416158015906114cf5750602083105b15611801578015611593576114e5866001614649565b60ff16600184602081106114fb576114fb614662565b602081049091015460ff601f9092166101000a9004161161151c575f61151f565b60015b6001846020811061153257611532614662565b602091828204019190069054906101000a900460ff166115529190614731565b600161155e818661471e565b6020811061156e5761156e614662565b602091828204019190066101000a81548160ff021916908360ff160217905550611664565b61159e866001614649565b60ff16600184602081106115b4576115b4614662565b602081049091015460ff601f9092166101000a900416036115d757506001611664565b6115e2866001614649565b60ff16600184602081106115f8576115f8614662565b602081049091015460ff601f9092166101000a900416111561166457600180846020811061162857611628614662565b602091828204019190068282829054906101000a900460ff1661164b9190614731565b92506101000a81548160ff021916908360ff1602179055505b811561172157611675866001614649565b60ff165f846020811061168a5761168a614662565b602081049091015460ff601f9092166101000a900416116116ab575f6116ae565b60015b5f84602081106116c0576116c0614662565b602091828204019190069054906101000a900460ff166116e09190614731565b5f6116ec60018661471e565b602081106116fc576116fc614662565b602091828204019190066101000a81548160ff021916908360ff1602179055506117f1565b61172c866001614649565b60ff165f846020811061174157611741614662565b602081049091015460ff601f9092166101000a9004160361176557600191506117f1565b611770866001614649565b60ff165f846020811061178557611785614662565b602081049091015460ff601f9092166101000a90041611156117f15760015f84602081106117b5576117b5614662565b602091828204019190068282829054906101000a900460ff166117d89190614731565b92506101000a81548160ff021916908360ff1602179055505b6117fa8361468d565b9250611498565b5f8061180e60018661471e565b6020811061181e5761181e614662565b602091828204019190066101000a81548160ff021916908360ff1602179055505f6001808561184d919061471e565b6020811061185d5761185d614662565b602091828204019190066101000a81548160ff021916908360ff16021790555061189985856001600160a01b031661298b90919063ffffffff16565b60405160ff871681526001600160a01b038516907f978014566e371fef52158b004e150b6e1fd723f5aa3d8c9aa2a7c98ddb0e65b89060200160405180910390a2505050505050565b5f6118eb612ab0565b805490915060ff600160401b82041615906001600160401b03165f811580156119115750825b90505f826001600160401b0316600114801561192c5750303b155b90508115801561193a575080155b156119585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561198257845460ff60401b1916600160401b1785555b6119918c8c8c8c8c8c8c612ad8565b83156119d757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b5f336108758185856121b3565b5f6108628260016120ab565b5f5f611a0983611d1b565b905080851115611a3257828582604051633fa733bb60e21b8152600401610bf7939291906146a5565b5f611a3c8661087f565b905061099c3386868985612b08565b5f5f611a5683611d31565b905080851115611a7f57828582604051632e52afbb60e21b8152600401610bf7939291906146a5565b5f611a8986610857565b905061099c338686848a612b08565b611aa0613ebc565b81515f9060201015611ac55760405163a29b1f1160e01b815260040160405180910390fd5b82518160ff161015611c6457602060ff16838260ff1681518110611aeb57611aeb614662565b602002602001015160ff16101580611b4757505f6001600160a01b03166002848360ff1681518110611b1f57611b1f614662565b602002602001015160ff1660208110611b3a57611b3a614662565b01546001600160a01b0316145b15611b655760405163a29b1f1160e01b815260040160405180910390fd5b81838260ff1681518110611b7b57611b7b614662565b602002602001015160ff1660208110611b9657611b96614662565b602002015115611bb557828160ff16815181106110f0576110f0614662565b600182848360ff1681518110611bcd57611bcd614662565b602002602001015160ff1660208110611be857611be8614662565b911515602090920201528251839060ff8316908110611c0957611c09614662565b60200260200101516001611c1d9190614649565b60018260ff1660208110611c3357611c33614662565b602091828204019190066101000a81548160ff021916908360ff16021790555080611c5d9061474a565b9050611ac5565b602060ff8216108015611c9757505f600260ff831660208110611c8957611c89614662565b01546001600160a01b031614155b15611cb557604051636712b27b60e01b815260040160405180910390fd5b7f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c8360405161123491906146d9565b5f5f611cee612380565b90505f198114611d0757611d02815f612114565b6108a9565b5f199392505050565b5f610862825f612114565b5f5f611d2683612b1e565b90506108a981612b2b565b5f5f611d3c83612bc0565b90505f611d49825f6120ab565b90505f611d5582612b2b565b9050818114611d6d57611d68815f612114565b61099c565b50909392505050565b611d7e613ebc565b604080516104008101918290529060029060209082845b81546001600160a01b03168152600190910190602001808311611d95575050505050905090565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f602060ff8516101580611e1d5750602060ff841610155b15611e3b57604051632711b74d60e11b815260040160405180910390fd5b5f60028560ff1660208110611e5257611e52614662565b01546001600160a01b031690505f600260ff861660208110611e7657611e76614662565b01546001600160a01b03908116915082161580611e9a57506001600160a01b038116155b15611eb857604051632711b74d60e11b815260040160405180910390fd5b5f198403611ed557611ed2826001600160a01b0316612922565b93505b835f03611ee6575f925050506108a9565b611ef8826001600160a01b0316612bca565b841115611f2d57611f11826001600160a01b0316612bca565b604051633ce011d560e01b8152600401610bf791815260200190565b611f3f816001600160a01b0316612bf8565b841115611f7457611f58816001600160a01b0316612bf8565b6040516350a3e37560e11b8152600401610bf791815260200190565b611f886001600160a01b038316855f612c26565b50611f9d6001600160a01b038216855f612d62565b50806001600160a01b0316826001600160a01b03167fb0850b8e0f9e8315dde3c9f9f31138283e6bbe16cd29e8552eb1dcdf9fac9e3b86604051611fe391815260200190565b60405180910390a35091949350505050565b611ffd613ebc565b604080516104008101918290525f805460ff1682529091602090826001838601808411610b705790505050505050905090565b5f5f5b5f6002826020811061204757612047614662565b01546001600160a01b0316148015906120605750602081105b156120a75761208b6002826020811061207b5761207b614662565b01546001600160a01b0316612922565b61209590836146c6565b91506120a08161468d565b9050612033565b5090565b5f6108a96120b7610789565b6120c29060016146c6565b6120cd5f600a61484b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546120f991906146c6565b85919085612e83565b61210f8383836001612ec5565b505050565b5f6108a961212382600a61484b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461214f91906146c6565b612157610789565b6120f99060016146c6565b5f61216d8484611dbc565b90505f198110156121ad578181101561219f57828183604051637dc7a0d960e11b8152600401610bf7939291906146a5565b6121ad84848484035f612ec5565b50505050565b6001600160a01b0383166121dc57604051634b637e8f60e11b81525f6004820152602401610bf7565b6001600160a01b0382166122055760405163ec442f0560e01b81525f6004820152602401610bf7565b61210f838383612fa8565b5f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa15801561224d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122719190614859565b90505f816001600160a01b031663b7009613333061228f8989610f84565b60405160e085901b6001600160e01b031990811682526001600160a01b0394851660048301529290931660248401521660448201526064016040805180830381865afa1580156122e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123059190614874565b509050806123275760405162d1953b60e31b8152336004820152602401610bf7565b5050505050565b6060610c1883836040516024016123469291906148a9565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b038616906130ce565b5f5f5f5b5f6002826020811061239857612398614662565b01546001600160a01b0316148015906123b15750602081105b1561240f576123ed836123e0600284602081106123d0576123d0614662565b01546001600160a01b0316612bf8565b8101908110159190820290565b93509150816123ff575f199250505090565b6124088161468d565b9050612384565b505090565b805f5b811580159061244c57505f816020811061243357612433614662565b602081049091015460ff601f9092166101000a90041615155b80156124585750602081105b1561250b575f600260015f846020811061247457612474614662565b602091828204019190069054906101000a900460ff166124949190614731565b60ff16602081106124a7576124a7614662565b01546001600160a01b031690505f6124c7846124c284612bf8565b61316e565b9050805f036124d75750506124fb565b6124eb6001600160a01b038316825f612d62565b506124f6818561471e565b935050505b6125048161468d565b9050612417565b508015610b4c5760405163285a546d60e01b815260040160405180910390fd5b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806125b157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166125a55f516020614a4e5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156125cf5760405163703e46dd60e11b815260040160405180910390fd5b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561262b575060408051601f3d908101601f1916820190925261262891810190614676565b60015b61265357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610bf7565b5f516020614a4e5f395f51905f52811461268357604051632a87526960e21b815260048101829052602401610bf7565b61210f838361317d565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146125cf5760405163703e46dd60e11b815260040160405180910390fd5b6126e2848484846131d2565b6121ad82612414565b5f6107926108f2565b6126fe8483612842565b60405163f3e0ffbf60e01b81523060048201526127709086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa158015612746573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276a9190614676565b83612c26565b5061277b858261298b565b61278584846128d4565b6040516370a0823160e01b81523060048201526127f79085906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f19190614676565b83612d62565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa158015612889573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ad9190614859565b6001600160a01b031614610b4c5760405163e76673ef60e01b815260040160405180910390fd5b61210f816040516024016128e89190613f09565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b038416906130ce565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015612967573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108629190614676565b8015612a6657604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b179052516129e291906148c4565b5f60405180830381855af49150503d805f8114612a1a576040519150601f19603f3d011682016040523d82523d5f602084013e612a1f565b606091505b5091509150816121ad577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf881604051612a589190613f09565b60405180910390a150505050565b6040515f602482015261210f9060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b038416906130ce565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610862565b612ae061323d565b612ae985613262565b612af38787613273565b612aff84848484613285565b50505050505050565b612b1182613806565b6123278585858585613919565b5f6108626102ba83611d31565b5f5f5f5b5f60028260208110612b4357612b43614662565b01546001600160a01b031614801590612b5c5750602081105b15612bb957612b8b836123e060028460208110612b7b57612b7b614662565b01546001600160a01b0316612bca565b93509150811580612b9c5750838310155b15612ba957509192915050565b612bb28161468d565b9050612b2f565b5050919050565b5f61086282610c20565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb779060240161294c565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d9060240161294c565b5f8115612d08575f5f856001600160a01b031685604051602401612c4c91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251612c8191906148c4565b5f60405180830381855af49150503d805f8114612cb9576040519150601f19603f3d011682016040523d82523d5f602084013e612cbe565b606091505b509150915081612d00577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051612cf79190613f09565b60405180910390a15b5090506108a9565b612d5883604051602401612d1e91815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b038616906130ce565b50600190506108a9565b5f8115612e33575f5f856001600160a01b031685604051602401612d8891815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251612dbd91906148c4565b5f60405180830381855af49150503d805f8114612df5576040519150601f19603f3d011682016040523d82523d5f602084013e612dfa565b606091505b509150915081612d00577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051612cf79190613f09565b612d5883604051602401612e4991815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b038616906130ce565b5f612eb0612e90836139c0565b8015612eab57505f8480612ea657612ea66148da565b868809115b151590565b612ebb8686866139ec565b61099c91906146c6565b5f516020614a2e5f395f51905f526001600160a01b038516612efc5760405163e602df0560e01b81525f6004820152602401610bf7565b6001600160a01b038416612f2557604051634a1406b160e11b81525f6004820152602401610bf7565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561232757836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612f9991815260200190565b60405180910390a35050505050565b5f516020614a2e5f395f51905f526001600160a01b038416612fe25781816002015f828254612fd791906146c6565b9091555061303f9050565b6001600160a01b0384165f90815260208290526040902054828110156130215784818460405163391434e360e21b8152600401610bf7939291906146a5565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661305d57600281018054839003905561307b565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130c091815260200190565b60405180910390a350505050565b60605f6130db8484613a9c565b90508080156130fc57505f3d11806130fc57505f846001600160a01b03163b115b1561311157613109613aaf565b915050610862565b801561313b57604051639996b31560e01b81526001600160a01b0385166004820152602401610bf7565b3d1561314e57613149613ac8565b613167565b60405163d6bda27560e01b815260040160405180910390fd5b5092915050565b5f8282188284100282186108a9565b61318682613ad3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156131ca5761210f82826130ce565b610b4c613b36565b6131e56131dd6108f2565b853085613b55565b6131ef8382613b8b565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d784846040516130c0929190918252602082015260400190565b613245613bbf565b6125cf57604051631afcd79f60e31b815260040160405180910390fd5b61326a61323d565b6109b781613bd8565b61327b61323d565b610b4c8282613c5b565b83511580613294575083516020105b806132a157508251845114155b806132ae57508151845114155b806132bb57508051845114155b156132dc57604051600162ad1fab60e01b0319815260040160405180910390fd5b6132e4613ebc565b6132ec613ebc565b5f5b865181101561378f575f6001600160a01b031687828151811061331357613313614662565b60200260200101516001600160a01b03160361334257604051632711b74d60e11b815260040160405180910390fd5b61337e61334d6126eb565b88838151811061335f5761335f614662565b60200260200101516001600160a01b031661284290919063ffffffff16565b5f5b8181101561341e5787818151811061339a5761339a614662565b60200260200101516001600160a01b03168883815181106133bd576133bd614662565b60200260200101516001600160a01b031603613416578782815181106133e5576133e5614662565b602002602001015160405163b5a9314f60e01b8152600401610bf791906001600160a01b0391909116815260200190565b600101613380565b50865185828151811061343357613433614662565b602002602001015160ff1610158061347a57508285828151811061345957613459614662565b602002602001015160ff166020811061347457613474614662565b60200201515b156134bc5784818151811061349157613491614662565b602002602001015160405163306ccd5d60e11b8152600401610bf7919060ff91909116815260200190565b86518482815181106134d0576134d0614662565b602002602001015160ff161015806135175750818482815181106134f6576134f6614662565b602002602001015160ff166020811061351157613511614662565b60200201515b156135595783818151811061352e5761352e614662565b6020026020010151604051632776924160e11b8152600401610bf7919060ff91909116815260200190565b60018386838151811061356e5761356e614662565b602002602001015160ff166020811061358957613589614662565b6020020190151590811515815250506001828583815181106135ad576135ad614662565b602002602001015160ff16602081106135c8576135c8614662565b9115156020909202015286518790829081106135e6576135e6614662565b60200260200101516002826020811061360157613601614662565b015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084818151811061363757613637614662565b6020026020010151600161364b9190614649565b5f826020811061365d5761365d614662565b602091828204019190066101000a81548160ff021916908360ff16021790555083818151811061368f5761368f614662565b602002602001015160016136a39190614649565b600182602081106136b6576136b6614662565b602091828204019190066101000a81548160ff021916908360ff1602179055506137248682815181106136eb576136eb614662565b602002602001015188838151811061370557613705614662565b60200260200101516001600160a01b03166128d490919063ffffffff16565b86818151811061373657613736614662565b60200260200101516001600160a01b03167f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f588260405161377f919060ff91909116815260200190565b60405180910390a26001016132ee565b507f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec846040516137bf91906146d9565b60405180910390a17f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516137f691906146d9565b60405180910390a1505050505050565b805f5b811580159061383f57506001816020811061382657613826614662565b602081049091015460ff601f9092166101000a90041615155b801561384b5750602081105b156138f9575f6002600180846020811061386757613867614662565b602091828204019190069054906101000a900460ff166138879190614731565b60ff166020811061389a5761389a614662565b01546001600160a01b031690505f6138b5846124c284612bca565b9050805f036138c55750506138e9565b6138d96001600160a01b038316825f612c26565b506138e4818561471e565b935050505b6138f28161468d565b9050613809565b508015610b4c5760405163351dc55d60e21b815260040160405180910390fd5b826001600160a01b0316856001600160a01b03161461393d5761393d838683612162565b6139478382613cab565b6139596139526108f2565b8584613cdf565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db85856040516139b1929190918252602082015260400190565b60405180910390a45050505050565b5f60028260038111156139d5576139d56148ee565b6139df9190614902565b60ff166001149050919050565b5f5f5f6139f98686613d14565b91509150815f03613a1d57838181613a1357613a136148da565b04925050506108a9565b818411613a3457613a346003851502601118613d30565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f5f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b806001600160a01b03163b5f03613b0857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610bf7565b5f516020614a4e5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b34156125cf5760405163b398979f60e01b815260040160405180910390fd5b613b63848484846001613d41565b6121ad57604051635274afe760e01b81526001600160a01b0385166004820152602401610bf7565b6001600160a01b038216613bb45760405163ec442f0560e01b81525f6004820152602401610bf7565b610b4c5f8383612fa8565b5f613bc8612ab0565b54600160401b900460ff16919050565b613be061323d565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80613c0c84613dae565b9150915081613c1c576012613c1e565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b613c6361323d565b5f516020614a2e5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03613c9c8482614973565b50600481016121ad8382614973565b6001600160a01b038216613cd457604051634b637e8f60e11b81525f6004820152602401610bf7565b610b4c825f83612fa8565b613cec8383836001613e39565b61210f57604051635274afe760e01b81526001600160a01b0384166004820152602401610bf7565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316613d9d578383151615613d91573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b5f5f5f613dba60405190565b6040805160048152602481019091526020810180516001600160e01b031663313ce56760e01b1790529091505f908190613df5908790613e9b565b5091509150613e0383604052565b818015613e11575060203d10155b8015613e1e575060ff8111155b613e29575f5f613e2d565b6001815b94509450505050915091565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316613e8f578383151615613e83573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5f5f60405f855160208701885afa92505f51915060205190509250925092565b6040518061040001604052806020906020820280368337509192915050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108a96020830184613edb565b5f60208284031215613f2b575f5ffd5b5035919050565b6001600160a01b03811681146109b7575f5ffd5b5f5f60408385031215613f57575f5ffd5b8235613f6281613f32565b946020939093013593505050565b5f5f5f60608486031215613f82575f5ffd5b8335613f8d81613f32565b92506020840135613f9d81613f32565b929592945050506040919091013590565b803560ff81168114613fbe575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613fff57613fff613fc3565b604052919050565b5f82601f830112614016575f5ffd5b8135602083015f5f6001600160401b0384111561403557614035613fc3565b50601f8301601f191660200161404a81613fd7565b91505082815285838301111561405e575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f5f6060848603121561408a575f5ffd5b61409384613fae565b92506140a160208501613fae565b915060408401356001600160401b038111156140bb575f5ffd5b6140c786828701614007565b9150509250925092565b5f602082840312156140e1575f5ffd5b81356108a981613f32565b5f5f604083850312156140fd575f5ffd5b823561410881613f32565b915060208301356001600160401b03811115614122575f5ffd5b61412e85828601614007565b9150509250929050565b610400810181835f5b602081101561416357815160ff16835260209283019290910190600101614141565b50505092915050565b5f5f6040838503121561417d575f5ffd5b82359150602083013561418f81613f32565b809150509250929050565b80151581146109b7575f5ffd5b5f5f5f5f608085870312156141ba575f5ffd5b6141c385613fae565b935060208501356141d381613f32565b925060408501356001600160401b038111156141ed575f5ffd5b6141f987828801614007565b925050606085013561420a8161419a565b939692955090935050565b5f5f60408385031215614226575f5ffd5b61422f83613fae565b915061423d60208401613fae565b90509250929050565b5f6001600160401b0382111561425e5761425e613fc3565b5060051b60200190565b5f82601f830112614277575f5ffd5b813561428a61428582614246565b613fd7565b8082825260208201915060208360051b8601019250858311156142ab575f5ffd5b602085015b838110156142cf576142c181613fae565b8352602092830192016142b0565b5095945050505050565b5f602082840312156142e9575f5ffd5b81356001600160401b038111156142fe575f5ffd5b610c1884828501614268565b5f5f6040838503121561431b575f5ffd5b61432483613fae565b9150602083013561418f8161419a565b8035613fbe81613f32565b5f82601f83011261434e575f5ffd5b813561435c61428582614246565b8082825260208201915060208360051b86010192508583111561437d575f5ffd5b602085015b838110156142cf57803561439581613f32565b835260209283019201614382565b5f82601f8301126143b2575f5ffd5b81356143c061428582614246565b8082825260208201915060208360051b8601019250858311156143e1575f5ffd5b602085015b838110156142cf5780356001600160401b03811115614403575f5ffd5b614412886020838a0101614007565b845250602092830192016143e6565b5f5f5f5f5f5f5f60e0888a031215614437575f5ffd5b87356001600160401b0381111561444c575f5ffd5b6144588a828b01614007565b97505060208801356001600160401b03811115614473575f5ffd5b61447f8a828b01614007565b96505061448e60408901614334565b945060608801356001600160401b038111156144a8575f5ffd5b6144b48a828b0161433f565b94505060808801356001600160401b038111156144cf575f5ffd5b6144db8a828b016143a3565b93505060a08801356001600160401b038111156144f6575f5ffd5b6145028a828b01614268565b92505060c08801356001600160401b0381111561451d575f5ffd5b6145298a828b01614268565b91505092959891949750929550565b5f5f5f6060848603121561454a575f5ffd5b83359250602084013561455c81613f32565b9150604084013561456c81613f32565b809150509250925092565b610400810181835f5b60208110156141635781516001600160a01b0316835260209283019290910190600101614580565b5f5f604083850312156145b9575f5ffd5b82356145c481613f32565b9150602083013561418f81613f32565b5f5f5f606084860312156145e6575f5ffd5b6145ef84613fae565b9250613f9d60208501613fae565b600181811c9082168061461157607f821691505b60208210810361462f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561086257610862614635565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614686575f5ffd5b5051919050565b5f6001820161469e5761469e614635565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561086257610862614635565b602080825282518282018190525f918401906040840190835b8181101561471357835160ff168352602093840193909201916001016146f2565b509095945050505050565b8181038181111561086257610862614635565b60ff828116828216039081111561086257610862614635565b5f60ff821660ff810361475f5761475f614635565b60010192915050565b6001815b60018411156147a35780850481111561478757614787614635565b600184161561479557908102905b60019390931c92800261476c565b935093915050565b5f826147b957506001610862565b816147c557505f610862565b81600181146147db57600281146147e557614801565b6001915050610862565b60ff8411156147f6576147f6614635565b50506001821b610862565b5060208310610133831016604e8410600b8410161715614824575081810a610862565b6148305f198484614768565b805f190482111561484357614843614635565b029392505050565b5f6108a960ff8416836147ab565b5f60208284031215614869575f5ffd5b81516108a981613f32565b5f5f60408385031215614885575f5ffd5b82516148908161419a565b602084015190925063ffffffff8116811461418f575f5ffd5b60ff83168152604060208201525f610c186040830184613edb565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061492057634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f82111561210f57805f5260205f20601f840160051c810160208510156149545750805b601f840160051c820191505b81811015612327575f8155600101614960565b81516001600160401b0381111561498c5761498c613fc3565b6149a08161499a84546145fd565b8461492f565b6020601f8211600181146149d2575f83156149bb5750848201515b5f19600385901b1c1916600184901b178455612327565b5f84815260208120601f198516915b82811015614a0157878501518255602094850194600190920191016149e1565b5084821015614a1e57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220c794b6ddbd4cfb3941fee0d7f43479cb8b47ac102f550f916026e193879f834464736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
