{
  "_format": "hh-sol-artifact-1",
  "contractName": "MultiStrategyERC4626",
  "sourceName": "contracts/MultiStrategyERC4626.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "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": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "InvalidAsset",
      "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": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "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": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FORWARD_TO_STRATEGY_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "GUARDIAN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "LP_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_STRATEGIES",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "QUEUE_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "REBALANCER_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "STRATEGY_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "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": "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": "getForwardToStrategyRole",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "admin_",
          "type": "address"
        },
        {
          "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": "owner",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "ret",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "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": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "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": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "adminRole",
          "type": "bytes32"
        }
      ],
      "name": "setRoleAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "strategies",
      "outputs": [
        {
          "internalType": "contract IInvestStrategy[32]",
          "name": "",
          "type": "address[32]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "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": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516151f56100f95f395f8181611a0a01528181611a330152611b9601526151f55ff3fe60806040526004361061035b575f3560e01c806370a08231116101bd578063ba087652116100f2578063d905777e11610092578063e1d394501161006d578063e1d3945014610a04578063e682324d14610a37578063ef8b30f714610915578063f617eecc14610a56575f5ffd5b8063d905777e146109a5578063d9f9027f146109c4578063dd62ed3e146109e5575f5ffd5b8063c6e6f592116100cd578063c6e6f59214610915578063cd0e0f4414610934578063ce96cb7714610967578063d547741f14610986575f5ffd5b8063ba087652146108b8578063bd577eb6146108d7578063c63d75b6146108f6575f5ffd5b806395d89b411161015d578063a9059cbb11610138578063a9059cbb1461082b578063ad3cb1cc1461084a578063b3d7f6b91461087a578063b460af9414610899575f5ffd5b806395d89b41146107e557806396da35da146107f9578063a217fddf14610818575f5ffd5b80637aeedf2a116101985780637aeedf2a14610769578063914abf4f1461078857806391d14854146107a757806394bf804d146107c6575f5ffd5b806370a0823114610717578063767f06ae146107365780637ac445a71461074a575f5ffd5b8063313ce56711610293578063490b48f81161023357806351a2d6d11161020e57806351a2d6d1146106a457806352d1902d146106c55780636b3ea526146106d95780636e553f65146106f8575f5ffd5b8063490b48f81461065e5780634cdad506146103d65780634f1ef28614610691575f5ffd5b806338d52e0f1161026e57806338d52e0f146105ce5780633aaf904814610601578063402d267d1461062057806347e575331461063f575f5ffd5b8063313ce5671461055657806336568abe1461057c578063367fee391461059b575f5ffd5b8063128b772f116102fe57806323b872dd116102d957806323b872dd146104c6578063248a9ca3146104e557806324ea54f4146105045780632f2ff15d14610537575f5ffd5b8063128b772f1461045357806318160ddd146104725780631e4e0091146104a5575f5ffd5b806307a2d13a1161033957806307a2d13a146103d6578063095ea7b3146103f55780630a28a477146104145780630b74ce8c14610433575f5ffd5b806301e1d1141461035f57806301ffc9a71461038657806306fdde03146103b5575b5f5ffd5b34801561036a575f5ffd5b50610373610a6a565b6040519081526020015b60405180910390f35b348015610391575f5ffd5b506103a56103a03660046145ac565b610a78565b604051901515815260200161037d565b3480156103c0575f5ffd5b506103c9610aae565b60405161037d9190614601565b3480156103e1575f5ffd5b506103736103f0366004614613565b610b6e565b348015610400575f5ffd5b506103a561040f36600461464e565b610b79565b34801561041f575f5ffd5b5061037361042e366004614613565b610b90565b34801561043e575f5ffd5b506103735f5160206151405f395f51905f5281565b34801561045e575f5ffd5b5061037361046d366004614688565b610b9c565b34801561047d575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610373565b3480156104b0575f5ffd5b506104c46104bf3660046146b9565b610c0e565b005b3480156104d1575f5ffd5b506103a56104e03660046146d9565b610c27565b3480156104f0575f5ffd5b506103736104ff366004614613565b610c4c565b34801561050f575f5ffd5b506103737f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b348015610542575f5ffd5b506104c4610551366004614717565b610c6c565b348015610561575f5ffd5b5061056a610c8e565b60405160ff909116815260200161037d565b348015610587575f5ffd5b506104c4610596366004614717565b610cbd565b3480156105a6575f5ffd5b506103737f326866b70291d731c5324fd58ae009670d3e8c69fccbef09e56e5c87e78b69c181565b3480156105d9575f5ffd5b505f5160206151a05f395f51905f52546040516001600160a01b03909116815260200161037d565b34801561060c575f5ffd5b506103c961061b3660046147fa565b610cf0565b34801561062b575f5ffd5b5061037361063a366004614853565b610d75565b34801561064a575f5ffd5b506103c9610659366004614613565b610d94565b348015610669575f5ffd5b506103737fccc64574297998b6c3edf6078cc5e01268465ff116954e3af02ff3a70a730f4681565b6104c461069f36600461486e565b610f14565b3480156106af575f5ffd5b506106b8610f33565b60405161037d91906148ba565b3480156106d0575f5ffd5b50610373610f8b565b3480156106e4575f5ffd5b506104c46106f3366004614a63565b610fa6565b348015610703575f5ffd5b50610373610712366004614717565b6110c0565b348015610722575f5ffd5b50610373610731366004614853565b61111d565b348015610741575f5ffd5b5061056a602081565b348015610755575f5ffd5b506104c4610764366004614b9a565b611143565b348015610774575f5ffd5b506104c461078336600461486e565b61116d565b348015610793575f5ffd5b506104c46107a2366004614c06565b61118e565b3480156107b2575f5ffd5b506103a56107c1366004614717565b6111c1565b3480156107d1575f5ffd5b506103736107e0366004614717565b6111f7565b3480156107f0575f5ffd5b506103c9611243565b348015610804575f5ffd5b506104c4610813366004614c37565b611281565b348015610823575f5ffd5b506103735f81565b348015610836575f5ffd5b506103a561084536600461464e565b6112a2565b348015610855575f5ffd5b506103c9604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610885575f5ffd5b50610373610894366004614613565b6112af565b3480156108a4575f5ffd5b506103736108b3366004614c5f565b6112bb565b3480156108c3575f5ffd5b506103736108d2366004614c5f565b611308565b3480156108e2575f5ffd5b506104c46108f1366004614c06565b611355565b348015610901575f5ffd5b50610373610910366004614853565b611388565b348015610920575f5ffd5b5061037361092f366004614613565b6113ca565b34801561093f575f5ffd5b506103737f6e824273980c4b4b65db074aeeccb75bec12f5e2e377c170763af52d00c592cc81565b348015610972575f5ffd5b50610373610981366004614853565b6113d5565b348015610991575f5ffd5b506104c46109a0366004614717565b6113eb565b3480156109b0575f5ffd5b506103736109bf366004614853565b611407565b3480156109cf575f5ffd5b506109d861144c565b60405161037d9190614c9e565b3480156109f0575f5ffd5b506103736109ff366004614ccf565b611492565b348015610a0f575f5ffd5b506103737fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b348015610a42575f5ffd5b50610373610a51366004614cfb565b6114db565b348015610a61575f5ffd5b506106b8611511565b5f610a7361154c565b905090565b5f6001600160e01b03198216637965db0b60e01b1480610aa857506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206151205f395f51905f5291610aec90614d24565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1890614d24565b8015610b635780601f10610b3a57610100808354040283529160200191610b63565b820191905f5260205f20905b815481529060010190602001808311610b4657829003601f168201915b505050505091505090565b5f610aa8825f6115c7565b5f33610b8681858561161e565b5060019392505050565b5f610aa882600161162b565b5f5f60028460ff1660208110610bb457610bb4614d5c565b01546bffffffffffffffffffffffff1960609190911b1660ff60581b605885901b161860ff60501b605086901b16187f6e824273980c4b4b65db074aeeccb75bec12f5e2e377c170763af52d00c592cc1891505092915050565b5f610c1881611679565b610c228383611686565b505050565b5f33610c348582856116e6565b610c3f858585611730565b60019150505b9392505050565b5f9081525f5160206151805f395f51905f52602052604090206001015490565b610c7582610c4c565b610c7e81611679565b610c88838361178d565b50505050565b5f805f5160206151a05f395f51905f5290505f8154610cb79190600160a01b900460ff16614d84565b91505090565b6001600160a01b0381163314610ce65760405163334bd91960e11b815260040160405180910390fd5b610c22828261182e565b6060610cfd8484846118a7565b5f60028560ff1660208110610d1457610d14614d5c565b01546001600160a01b0316905080610d3f57604051632711b74d60e11b815260040160405180910390fd5b610d6c848460028860ff1660208110610d5a57610d5a614d5c565b01546001600160a01b031691906118e4565b95945050505050565b5f610d7f82611936565b5f03610d8c57505f919050565b610aa8611973565b60605f5b5f60028260208110610dac57610dac614d5c565b01546001600160a01b031614801590610dc55750602081105b15610efa5760028160208110610ddd57610ddd614d5c565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e509190614d9d565b8303610eea57825483908190610e6590614d24565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9190614d24565b8015610edc5780601f10610eb357610100808354040283529160200191610edc565b820191905f5260205f20905b815481529060010190602001808311610ebf57829003601f168201915b505050505092505050919050565b610ef381614db4565b9050610d98565b5060405163213109dd60e11b815260040160405180910390fd5b610f1c6119ff565b610f2582611aa5565b610f2f8282611acf565b5050565b610f3b61458d565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f535790505050505050905090565b5f610f94611b8b565b505f5160206151605f395f51905f5290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610fea5750825b90505f826001600160401b031660011480156110055750303b155b905081158015611013575080155b156110315760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105b57845460ff60401b1916600160401b1785555b61106b8d8d8d8d8d8d8d8d611bd4565b83156110b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b5f5f6110cb83610d75565b9050808411156110fd57828482604051633c8097d960e11b81526004016110f493929190614dcc565b60405180910390fd5b5f611107856113ca565b905061111533858784611bfe565b949350505050565b6001600160a01b03165f9081525f5160206151205f395f51905f52602052604090205490565b5f5160206151405f395f51905f5261115a81611679565b61116685858585611c13565b5050505050565b5f5160206151405f395f51905f5261118481611679565b610c228383611d4c565b7f326866b70291d731c5324fd58ae009670d3e8c69fccbef09e56e5c87e78b69c16111b881611679565b610f2f82611f51565b5f9182525f5160206151805f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f61120283611388565b90508084111561122b5782848260405163284ff66760e01b81526004016110f493929190614dcc565b5f611235856112af565b905061111533858388611bfe565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206151205f395f51905f5291610aec90614d24565b5f5160206151405f395f51905f5261129881611679565b610c2283836121b0565b5f33610b86818585611730565b5f610aa88260016115c7565b5f5f6112c6836113d5565b9050808511156112ef57828582604051633fa733bb60e21b81526004016110f493929190614dcc565b5f6112f986610b90565b9050610d6c33868689856127c7565b5f5f61131383611407565b90508085111561133c57828582604051632e52afbb60e21b81526004016110f493929190614dcc565b5f61134686610b6e565b9050610d6c338686848a6127c7565b7f326866b70291d731c5324fd58ae009670d3e8c69fccbef09e56e5c87e78b69c161137f81611679565b610f2f826127dd565b5f61139282611936565b5f0361139f57505f919050565b5f6113a8611973565b90505f1981146113c1576113bc815f61162b565b610c45565b5f199392505050565b5f610aa8825f61162b565b5f5f6113e083612a29565b9050610c4581612a3c565b6113f482610c4c565b6113fd81611679565b610c88838361182e565b5f5f61141283612ad1565b90505f61141f825f6115c7565b90505f61142b82612a3c565b90508181146114435761143e815f61162b565b610d6c565b50909392505050565b61145461458d565b604080516104008101918290529060029060209082845b81546001600160a01b0316815260019091019060200180831161146b575050505050905090565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f7fccc64574297998b6c3edf6078cc5e01268465ff116954e3af02ff3a70a730f4661150681611679565b610d6c858585612adb565b61151961458d565b604080516104008101918290525f805460ff1682529091602090826001838601808411610f535790505050505050905090565b5f5f5b5f6002826020811061156357611563614d5c565b01546001600160a01b03161480159061157c5750602081105b156115c3576115a76002826020811061159757611597614d5c565b01546001600160a01b0316612ccb565b6115b19083614ded565b91506115bc81614db4565b905061154f565b5090565b5f610c456115d3610a6a565b6115de906001614ded565b6115e95f600a614ee3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546116159190614ded565b85919085612d34565b610c228383836001612d76565b5f610c4561163a82600a614ee3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546116669190614ded565b61166e610a6a565b611615906001614ded565b6116838133612e59565b50565b5f5160206151805f395f51905f525f61169e84610c4c565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f6116f18484611492565b90505f198114610c88578181101561172257828183604051637dc7a0d960e11b81526004016110f493929190614dcc565b610c8884848484035f612d76565b6001600160a01b03831661175957604051634b637e8f60e11b81525f60048201526024016110f4565b6001600160a01b0382166117825760405163ec442f0560e01b81525f60048201526024016110f4565b610c22838383612e92565b5f5f5160206151805f395f51905f526117a684846111c1565b611825575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117db3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610aa8565b5f915050610aa8565b5f5f5160206151805f395f51905f5261184784846111c1565b15611825575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610aa8565b7f6e824273980c4b4b65db074aeeccb75bec12f5e2e377c170763af52d00c592cc6118d181611679565b6118db8484610b9c565b61116681611679565b606061111583836040516024016118fc929190614ef1565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b03861690612fb8565b5f6119617fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a6836111c1565b61196c57505f919050565b5f19610aa8565b5f5f5f5b5f6002826020811061198b5761198b614d5c565b01546001600160a01b0316148015906119a45750602081105b156119fa576119d8836119d3600284602081106119c3576119c3614d5c565b01546001600160a01b0316613021565b61304f565b93509150816119ea575f199250505090565b6119f381614db4565b9050611977565b505090565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a8557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a795f5160206151605f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15611aa35760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610f2f81611679565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b29575060408051601f3d908101601f19168201909252611b2691810190614d9d565b60015b611b5157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016110f4565b5f5160206151605f395f51905f528114611b8157604051632a87526960e21b8152600481018290526024016110f4565b610c228383613076565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611aa35760405163703e46dd60e11b815260040160405180910390fd5b611bdc6130cb565b611be888888888613114565b611bf484848484613171565b5050505050505050565b611c0a848484846136f2565b610c888261376f565b5f60028560ff1660208110611c2a57611c2a614d5c565b01546001600160a01b0316905080611c5557604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015611c8457505f60028260208110611c7657611c76614d5c565b01546001600160a01b031614155b15611cfa57846001600160a01b031660028260208110611ca657611ca6614d5c565b01546001600160a01b0316148015611cc157508560ff168114155b15611cea5760405163b5a9314f60e01b81526001600160a01b03861660048201526024016110f4565b611cf381614db4565b9050611c57565b50611d0f818585611d09613886565b866138a5565b8360028660ff1660208110611d2657611d26614d5c565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b038216611d7357604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015611da257505f60028260208110611d9457611d94614d5c565b01546001600160a01b031614155b15611e0857826001600160a01b031660028260208110611dc457611dc4614d5c565b01546001600160a01b031603611df85760405163b5a9314f60e01b81526001600160a01b03841660048201526024016110f4565b611e0181614db4565b9050611d75565b601f198101611e2d57604051600162ad1fab60e01b0319815260040160405180910390fd5b8260028260208110611e4157611e41614d5c565b0180546001600160a01b0319166001600160a01b0392909216919091179055611e6b816001614ded565b5f8260208110611e7d57611e7d614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550806001611eaa9190614ded565b60018260208110611ebd57611ebd614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550611ef8611ee8613886565b6001600160a01b038516906139f3565b611f0b6001600160a01b03841683613a85565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b611f5961458d565b81515f9060201015611f7e5760405163a29b1f1160e01b815260040160405180910390fd5b825181101561212957602060ff16838281518110611f9e57611f9e614d5c565b602002602001015160ff16101580611ff757505f6001600160a01b03166002848381518110611fcf57611fcf614d5c565b602002602001015160ff1660208110611fea57611fea614d5c565b01546001600160a01b0316145b156120155760405163a29b1f1160e01b815260040160405180910390fd5b8183828151811061202857612028614d5c565b602002602001015160ff166020811061204357612043614d5c565b60200201511561208a5782818151811061205f5761205f614d5c565b602002602001015160405163c41fdbb960e01b81526004016110f4919060ff91909116815260200190565b60018284838151811061209f5761209f614d5c565b602002602001015160ff16602081106120ba576120ba614d5c565b9115156020909202015282518390829081106120d8576120d8614d5c565b602002602001015160016120ec9190614d84565b5f82602081106120fe576120fe614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550806001019050611f7e565b60208110801561215657505f6002826020811061214857612148614d5c565b01546001600160a01b031614155b1561217457604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec836040516121a39190614f0c565b60405180910390a1505050565b602060ff8316106121d457604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff16602081106121eb576121eb614d5c565b01546001600160a01b031690508061221657604051632711b74d60e11b815260040160405180910390fd5b811580156122345750612231816001600160a01b0316612ccb565b15155b15612252576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561226c57506003546001600160a01b0316155b1561228d57604051600162ad1fab60e01b0319815260040160405180910390fd5b5f612299846001614d84565b60ff1690505b6020811080156122cc57505f600282602081106122be576122be614d5c565b01546001600160a01b031614155b1561233b57600281602081106122e4576122e4614d5c565b01546001600160a01b031660026122fc600184614f51565b6020811061230c5761230c614d5c565b0180546001600160a01b0319166001600160a01b039290921691909117905561233481614db4565b905061229f565b5f6002612349600184614f51565b6020811061235957612359614d5c565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b6001836020811061239057612390614d5c565b602081049091015460ff601f9092166101000a900416158015906123b45750602083105b156126e6578015612478576123ca866001614d84565b60ff16600184602081106123e0576123e0614d5c565b602081049091015460ff601f9092166101000a90041611612401575f612404565b60015b6001846020811061241757612417614d5c565b602091828204019190069054906101000a900460ff166124379190614f64565b60016124438186614f51565b6020811061245357612453614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550612549565b612483866001614d84565b60ff166001846020811061249957612499614d5c565b602081049091015460ff601f9092166101000a900416036124bc57506001612549565b6124c7866001614d84565b60ff16600184602081106124dd576124dd614d5c565b602081049091015460ff601f9092166101000a900416111561254957600180846020811061250d5761250d614d5c565b602091828204019190068282829054906101000a900460ff166125309190614f64565b92506101000a81548160ff021916908360ff1602179055505b81156126065761255a866001614d84565b60ff165f846020811061256f5761256f614d5c565b602081049091015460ff601f9092166101000a90041611612590575f612593565b60015b5f84602081106125a5576125a5614d5c565b602091828204019190069054906101000a900460ff166125c59190614f64565b5f6125d1600186614f51565b602081106125e1576125e1614d5c565b602091828204019190066101000a81548160ff021916908360ff1602179055506126d6565b612611866001614d84565b60ff165f846020811061262657612626614d5c565b602081049091015460ff601f9092166101000a9004160361264a57600191506126d6565b612655866001614d84565b60ff165f846020811061266a5761266a614d5c565b602081049091015460ff601f9092166101000a90041611156126d65760015f846020811061269a5761269a614d5c565b602091828204019190068282829054906101000a900460ff166126bd9190614f64565b92506101000a81548160ff021916908360ff1602179055505b6126df83614db4565b925061237d565b5f806126f3600186614f51565b6020811061270357612703614d5c565b602091828204019190066101000a81548160ff021916908360ff1602179055505f600180856127329190614f51565b6020811061274257612742614d5c565b602091828204019190066101000a81548160ff021916908360ff16021790555061277e85856001600160a01b0316613ad390919063ffffffff16565b60405160ff871681526001600160a01b038516907f978014566e371fef52158b004e150b6e1fd723f5aa3d8c9aa2a7c98ddb0e65b89060200160405180910390a2505050505050565b6127d082613bf8565b6111668585858585613d0b565b6127e561458d565b81515f906020101561280a5760405163a29b1f1160e01b815260040160405180910390fd5b82518160ff1610156129a957602060ff16838260ff168151811061283057612830614d5c565b602002602001015160ff1610158061288c57505f6001600160a01b03166002848360ff168151811061286457612864614d5c565b602002602001015160ff166020811061287f5761287f614d5c565b01546001600160a01b0316145b156128aa5760405163a29b1f1160e01b815260040160405180910390fd5b81838260ff16815181106128c0576128c0614d5c565b602002602001015160ff16602081106128db576128db614d5c565b6020020151156128fa57828160ff168151811061205f5761205f614d5c565b600182848360ff168151811061291257612912614d5c565b602002602001015160ff166020811061292d5761292d614d5c565b911515602090920201528251839060ff831690811061294e5761294e614d5c565b602002602001015160016129629190614d84565b60018260ff166020811061297857612978614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550806129a290614f7d565b905061280a565b602060ff82161080156129dc57505f600260ff8316602081106129ce576129ce614d5c565b01546001600160a01b031614155b156129fa57604051636712b27b60e01b815260040160405180910390fd5b7f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516121a39190614f0c565b5f610aa8612a368361111d565b5f6115c7565b5f5f5f5b5f60028260208110612a5457612a54614d5c565b01546001600160a01b031614801590612a6d5750602081105b15612aca57612a9c836119d360028460208110612a8c57612a8c614d5c565b01546001600160a01b0316613dbf565b93509150811580612aad5750838310155b15612aba57509192915050565b612ac381614db4565b9050612a40565b5050919050565b5f610aa88261111d565b5f602060ff8516101580612af35750602060ff841610155b15612b1157604051632711b74d60e11b815260040160405180910390fd5b5f60028560ff1660208110612b2857612b28614d5c565b01546001600160a01b031690505f600260ff861660208110612b4c57612b4c614d5c565b01546001600160a01b03908116915082161580612b7057506001600160a01b038116155b15612b8e57604051632711b74d60e11b815260040160405180910390fd5b5f198403612bab57612ba8826001600160a01b0316612ccb565b93505b835f03612bbc575f92505050610c45565b612bce826001600160a01b0316613dbf565b841115612c0357612be7826001600160a01b0316613dbf565b604051633ce011d560e01b81526004016110f491815260200190565b612c15816001600160a01b0316613021565b841115612c4a57612c2e816001600160a01b0316613021565b6040516350a3e37560e11b81526004016110f491815260200190565b612c5e6001600160a01b038316855f613ded565b50612c736001600160a01b038216855f613f29565b50806001600160a01b0316826001600160a01b03167fb0850b8e0f9e8315dde3c9f9f31138283e6bbe16cd29e8552eb1dcdf9fac9e3b86604051612cb991815260200190565b60405180910390a35091949350505050565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015612d10573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa89190614d9d565b5f612d61612d418361404a565b8015612d5c57505f8480612d5757612d57614f9b565b868809115b151590565b612d6c868686614076565b610d6c9190614ded565b5f5160206151205f395f51905f526001600160a01b038516612dad5760405163e602df0560e01b81525f60048201526024016110f4565b6001600160a01b038416612dd657604051634a1406b160e11b81525f60048201526024016110f4565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561116657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612e4a91815260200190565b60405180910390a35050505050565b612e6382826111c1565b610f2f5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016110f4565b5f5160206151205f395f51905f526001600160a01b038416612ecc5781816002015f828254612ec19190614ded565b90915550612f299050565b6001600160a01b0384165f9081526020829052604090205482811015612f0b5784818460405163391434e360e21b81526004016110f493929190614dcc565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316612f47576002810180548390039055612f65565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612faa91815260200190565b60405180910390a350505050565b60605f5f846001600160a01b031684604051612fd49190614faf565b5f60405180830381855af49150503d805f811461300c576040519150601f19603f3d011682016040523d82523d5f602084013e613011565b606091505b5091509150610d6c85838361412c565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d90602401612cf5565b5f8083830184811015613068575f5f925092505061306f565b6001925090505b9250929050565b61307f82614183565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156130c357610c228282612fb8565b610f2f6141e6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611aa357604051631afcd79f60e31b815260040160405180910390fd5b61311c6130cb565b613124614205565b61312c614205565b6001600160a01b038116613155576040516337bce3c560e11b81525f60048201526024016110f4565b61315e8161420d565b613168848461421e565b610c8882614230565b83511580613180575083516020105b8061318d57508251845114155b8061319a57508151845114155b806131a757508051845114155b156131c857604051600162ad1fab60e01b0319815260040160405180910390fd5b6131d061458d565b6131d861458d565b5f5b865181101561367b575f6001600160a01b03168782815181106131ff576131ff614d5c565b60200260200101516001600160a01b03160361322e57604051632711b74d60e11b815260040160405180910390fd5b61326a613239613886565b88838151811061324b5761324b614d5c565b60200260200101516001600160a01b03166139f390919063ffffffff16565b5f5b8181101561330a5787818151811061328657613286614d5c565b60200260200101516001600160a01b03168883815181106132a9576132a9614d5c565b60200260200101516001600160a01b031603613302578782815181106132d1576132d1614d5c565b602002602001015160405163b5a9314f60e01b81526004016110f491906001600160a01b0391909116815260200190565b60010161326c565b50865185828151811061331f5761331f614d5c565b602002602001015160ff1610158061336657508285828151811061334557613345614d5c565b602002602001015160ff166020811061336057613360614d5c565b60200201515b156133a85784818151811061337d5761337d614d5c565b602002602001015160405163306ccd5d60e11b81526004016110f4919060ff91909116815260200190565b86518482815181106133bc576133bc614d5c565b602002602001015160ff161015806134035750818482815181106133e2576133e2614d5c565b602002602001015160ff16602081106133fd576133fd614d5c565b60200201515b156134455783818151811061341a5761341a614d5c565b6020026020010151604051632776924160e11b81526004016110f4919060ff91909116815260200190565b60018386838151811061345a5761345a614d5c565b602002602001015160ff166020811061347557613475614d5c565b60200201901515908115158152505060018285838151811061349957613499614d5c565b602002602001015160ff16602081106134b4576134b4614d5c565b9115156020909202015286518790829081106134d2576134d2614d5c565b6020026020010151600282602081106134ed576134ed614d5c565b015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084818151811061352357613523614d5c565b602002602001015160016135379190614d84565b5f826020811061354957613549614d5c565b602091828204019190066101000a81548160ff021916908360ff16021790555083818151811061357b5761357b614d5c565b6020026020010151600161358f9190614d84565b600182602081106135a2576135a2614d5c565b602091828204019190066101000a81548160ff021916908360ff1602179055506136108682815181106135d7576135d7614d5c565b60200260200101518883815181106135f1576135f1614d5c565b60200260200101516001600160a01b0316613a8590919063ffffffff16565b86818151811061362257613622614d5c565b60200260200101516001600160a01b03167f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f588260405161366b919060ff91909116815260200190565b60405180910390a26001016131da565b507f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec846040516136ab9190614f0c565b60405180910390a17f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516136e29190614f0c565b60405180910390a1505050505050565b5f5160206151a05f395f51905f528054613717906001600160a01b0316863086614242565b61372184836142a9565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051612e4a929190918252602082015260400190565b805f5b81158015906137a757505f816020811061378e5761378e614d5c565b602081049091015460ff601f9092166101000a90041615155b80156137b35750602081105b15613866575f600260015f84602081106137cf576137cf614d5c565b602091828204019190069054906101000a900460ff166137ef9190614f64565b60ff166020811061380257613802614d5c565b01546001600160a01b031690505f6138228461381d84613021565b6142dd565b9050805f03613832575050613856565b6138466001600160a01b038316825f613f29565b506138518185614f51565b935050505b61385f81614db4565b9050613772565b508015610f2f5760405163285a546d60e01b815260040160405180910390fd5b5f610a735f5160206151a05f395f51905f52546001600160a01b031690565b6138af84836139f3565b60405163f3e0ffbf60e01b81523060048201526139219086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa1580156138f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061391b9190614d9d565b83613ded565b5061392c8582613ad3565b6139368484613a85565b6040516370a0823160e01b81523060048201526139a89085906001600160a01b038516906370a0823190602401602060405180830381865afa15801561397e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a29190614d9d565b83613f29565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa158015613a3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a5e9190614fc5565b6001600160a01b031614610f2f5760405163e76673ef60e01b815260040160405180910390fd5b610c2281604051602401613a999190614601565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b03841690612fb8565b8015613bae57604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b17905251613b2a9190614faf565b5f60405180830381855af49150503d805f8114613b62576040519150601f19603f3d011682016040523d82523d5f602084013e613b67565b606091505b509150915081610c88577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf881604051613ba09190614601565b60405180910390a150505050565b6040515f6024820152610c229060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b03841690612fb8565b805f5b8115801590613c31575060018160208110613c1857613c18614d5c565b602081049091015460ff601f9092166101000a90041615155b8015613c3d5750602081105b15613ceb575f60026001808460208110613c5957613c59614d5c565b602091828204019190069054906101000a900460ff16613c799190614f64565b60ff1660208110613c8c57613c8c614d5c565b01546001600160a01b031690505f613ca78461381d84613dbf565b9050805f03613cb7575050613cdb565b613ccb6001600160a01b038316825f613ded565b50613cd68185614f51565b935050505b613ce481614db4565b9050613bfb565b508015610f2f5760405163351dc55d60e21b815260040160405180910390fd5b5f5160206151a05f395f51905f526001600160a01b0386811690851614613d3757613d378487846116e6565b613d4184836142ec565b8054613d57906001600160a01b03168685614320565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051613daf929190918252602082015260400190565b60405180910390a4505050505050565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb7790602401612cf5565b5f8115613ecf575f5f856001600160a01b031685604051602401613e1391815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251613e489190614faf565b5f60405180830381855af49150503d805f8114613e80576040519150601f19603f3d011682016040523d82523d5f602084013e613e85565b606091505b509150915081613ec7577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051613ebe9190614601565b60405180910390a15b509050610c45565b613f1f83604051602401613ee591815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b03861690612fb8565b5060019050610c45565b5f8115613ffa575f5f856001600160a01b031685604051602401613f4f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251613f849190614faf565b5f60405180830381855af49150503d805f8114613fbc576040519150601f19603f3d011682016040523d82523d5f602084013e613fc1565b606091505b509150915081613ec7577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051613ebe9190614601565b613f1f8360405160240161401091815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b03861690612fb8565b5f600282600381111561405f5761405f614fe0565b6140699190614ff4565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036140aa578382816140a0576140a0614f9b565b0492505050610c45565b8084116140c1576140c16003851502601118614351565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60608261413c576113bc82614362565b815115801561415357506001600160a01b0384163b155b1561417c57604051639996b31560e01b81526001600160a01b03851660048201526024016110f4565b5080610c45565b806001600160a01b03163b5f036141b857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016110f4565b5f5160206151605f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611aa35760405163b398979f60e01b815260040160405180910390fd5b611aa36130cb565b6142156130cb565b6116838161438b565b6142266130cb565b610f2f82826143fb565b6142386130cb565b610f2f5f8261178d565b6040516001600160a01b038481166024830152838116604483015260648201839052610c889186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061444b565b6001600160a01b0382166142d25760405163ec442f0560e01b81525f60048201526024016110f4565b610f2f5f8383612e92565b5f828218828410028218610c45565b6001600160a01b03821661431557604051634b637e8f60e11b81525f60048201526024016110f4565b610f2f825f83612e92565b6040516001600160a01b03838116602483015260448201839052610c2291859182169063a9059cbb90606401614277565b634e487b715f52806020526024601cfd5b8051156143725780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6143936130cb565b5f5160206151a05f395f51905f525f806143ac846144b7565b91509150816143bc5760126143be565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b6144036130cb565b5f5160206151205f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361443c8482615065565b5060048101610c888382615065565b5f5f60205f8451602086015f885af18061446a576040513d5f823e3d81fd5b50505f513d9150811561448157806001141561448e565b6001600160a01b0384163b155b15610c8857604051635274afe760e01b81526001600160a01b03851660048201526024016110f4565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916144fd91614faf565b5f60405180830381855afa9150503d805f8114614535576040519150601f19603f3d011682016040523d82523d5f602084013e61453a565b606091505b509150915081801561454e57506020815110155b15614581575f818060200190518101906145689190614d9d565b905060ff811161457f576001969095509350505050565b505b505f9485945092505050565b6040518061040001604052806020906020820280368337509192915050565b5f602082840312156145bc575f5ffd5b81356001600160e01b031981168114610c45575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c4560208301846145d3565b5f60208284031215614623575f5ffd5b5035919050565b6001600160a01b0381168114611683575f5ffd5b80356146498161462a565b919050565b5f5f6040838503121561465f575f5ffd5b823561466a8161462a565b946020939093013593505050565b803560ff81168114614649575f5ffd5b5f5f60408385031215614699575f5ffd5b6146a283614678565b91506146b060208401614678565b90509250929050565b5f5f604083850312156146ca575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156146eb575f5ffd5b83356146f68161462a565b925060208401356147068161462a565b929592945050506040919091013590565b5f5f60408385031215614728575f5ffd5b82359150602083013561473a8161462a565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561478157614781614745565b604052919050565b5f82601f830112614798575f5ffd5b8135602083015f5f6001600160401b038411156147b7576147b7614745565b50601f8301601f19166020016147cc81614759565b9150508281528583830111156147e0575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f5f6060848603121561480c575f5ffd5b61481584614678565b925061482360208501614678565b915060408401356001600160401b0381111561483d575f5ffd5b61484986828701614789565b9150509250925092565b5f60208284031215614863575f5ffd5b8135610c458161462a565b5f5f6040838503121561487f575f5ffd5b823561488a8161462a565b915060208301356001600160401b038111156148a4575f5ffd5b6148b085828601614789565b9150509250929050565b610400810181835f5b60208110156148e557815160ff168352602092830192909101906001016148c3565b50505092915050565b5f6001600160401b0382111561490657614906614745565b5060051b60200190565b5f82601f83011261491f575f5ffd5b813561493261492d826148ee565b614759565b8082825260208201915060208360051b860101925085831115614953575f5ffd5b602085015b8381101561497957803561496b8161462a565b835260209283019201614958565b5095945050505050565b5f82601f830112614992575f5ffd5b81356149a061492d826148ee565b8082825260208201915060208360051b8601019250858311156149c1575f5ffd5b602085015b838110156149795780356001600160401b038111156149e3575f5ffd5b6149f2886020838a0101614789565b845250602092830192016149c6565b5f82601f830112614a10575f5ffd5b8135614a1e61492d826148ee565b8082825260208201915060208360051b860101925085831115614a3f575f5ffd5b602085015b8381101561497957614a5581614678565b835260209283019201614a44565b5f5f5f5f5f5f5f5f610100898b031215614a7b575f5ffd5b88356001600160401b03811115614a90575f5ffd5b614a9c8b828c01614789565b98505060208901356001600160401b03811115614ab7575f5ffd5b614ac38b828c01614789565b975050614ad260408a0161463e565b9550614ae060608a0161463e565b945060808901356001600160401b03811115614afa575f5ffd5b614b068b828c01614910565b94505060a08901356001600160401b03811115614b21575f5ffd5b614b2d8b828c01614983565b93505060c08901356001600160401b03811115614b48575f5ffd5b614b548b828c01614a01565b92505060e08901356001600160401b03811115614b6f575f5ffd5b614b7b8b828c01614a01565b9150509295985092959890939650565b80358015158114614649575f5ffd5b5f5f5f5f60808587031215614bad575f5ffd5b614bb685614678565b93506020850135614bc68161462a565b925060408501356001600160401b03811115614be0575f5ffd5b614bec87828801614789565b925050614bfb60608601614b8b565b905092959194509250565b5f60208284031215614c16575f5ffd5b81356001600160401b03811115614c2b575f5ffd5b61111584828501614a01565b5f5f60408385031215614c48575f5ffd5b614c5183614678565b91506146b060208401614b8b565b5f5f5f60608486031215614c71575f5ffd5b833592506020840135614c838161462a565b91506040840135614c938161462a565b809150509250925092565b610400810181835f5b60208110156148e55781516001600160a01b0316835260209283019290910190600101614ca7565b5f5f60408385031215614ce0575f5ffd5b8235614ceb8161462a565b9150602083013561473a8161462a565b5f5f5f60608486031215614d0d575f5ffd5b614d1684614678565b925061470660208501614678565b600181811c90821680614d3857607f821691505b602082108103614d5657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610aa857610aa8614d70565b5f60208284031215614dad575f5ffd5b5051919050565b5f60018201614dc557614dc5614d70565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b80820180821115610aa857610aa8614d70565b6001815b6001841115614e3b57808504811115614e1f57614e1f614d70565b6001841615614e2d57908102905b60019390931c928002614e04565b935093915050565b5f82614e5157506001610aa8565b81614e5d57505f610aa8565b8160018114614e735760028114614e7d57614e99565b6001915050610aa8565b60ff841115614e8e57614e8e614d70565b50506001821b610aa8565b5060208310610133831016604e8410600b8410161715614ebc575081810a610aa8565b614ec85f198484614e00565b805f1904821115614edb57614edb614d70565b029392505050565b5f610c4560ff841683614e43565b60ff83168152604060208201525f61111560408301846145d3565b602080825282518282018190525f918401906040840190835b81811015614f4657835160ff16835260209384019390920191600101614f25565b509095945050505050565b81810381811115610aa857610aa8614d70565b60ff8281168282160390811115610aa857610aa8614d70565b5f60ff821660ff8103614f9257614f92614d70565b60010192915050565b634e487b7160e01b5f52601260045260245ffd5b5f82518060208501845e5f920191825250919050565b5f60208284031215614fd5575f5ffd5b8151610c458161462a565b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061501257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f821115610c2257805f5260205f20601f840160051c810160208510156150465750805b601f840160051c820191505b81811015611166575f8155600101615052565b81516001600160401b0381111561507e5761507e614745565b6150928161508c8454614d24565b84615021565b6020601f8211600181146150c4575f83156150ad5750848201515b5f19600385901b1c1916600184901b178455611166565b5f84815260208120601f198516915b828110156150f357878501518255602094850194600190920191016150d3565b508482101561511057868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace005604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a26469706673582212201c9b7fe0f18e75a0251d462b589a16503c58d706f46971a5675dd8ec8649302a64736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061035b575f3560e01c806370a08231116101bd578063ba087652116100f2578063d905777e11610092578063e1d394501161006d578063e1d3945014610a04578063e682324d14610a37578063ef8b30f714610915578063f617eecc14610a56575f5ffd5b8063d905777e146109a5578063d9f9027f146109c4578063dd62ed3e146109e5575f5ffd5b8063c6e6f592116100cd578063c6e6f59214610915578063cd0e0f4414610934578063ce96cb7714610967578063d547741f14610986575f5ffd5b8063ba087652146108b8578063bd577eb6146108d7578063c63d75b6146108f6575f5ffd5b806395d89b411161015d578063a9059cbb11610138578063a9059cbb1461082b578063ad3cb1cc1461084a578063b3d7f6b91461087a578063b460af9414610899575f5ffd5b806395d89b41146107e557806396da35da146107f9578063a217fddf14610818575f5ffd5b80637aeedf2a116101985780637aeedf2a14610769578063914abf4f1461078857806391d14854146107a757806394bf804d146107c6575f5ffd5b806370a0823114610717578063767f06ae146107365780637ac445a71461074a575f5ffd5b8063313ce56711610293578063490b48f81161023357806351a2d6d11161020e57806351a2d6d1146106a457806352d1902d146106c55780636b3ea526146106d95780636e553f65146106f8575f5ffd5b8063490b48f81461065e5780634cdad506146103d65780634f1ef28614610691575f5ffd5b806338d52e0f1161026e57806338d52e0f146105ce5780633aaf904814610601578063402d267d1461062057806347e575331461063f575f5ffd5b8063313ce5671461055657806336568abe1461057c578063367fee391461059b575f5ffd5b8063128b772f116102fe57806323b872dd116102d957806323b872dd146104c6578063248a9ca3146104e557806324ea54f4146105045780632f2ff15d14610537575f5ffd5b8063128b772f1461045357806318160ddd146104725780631e4e0091146104a5575f5ffd5b806307a2d13a1161033957806307a2d13a146103d6578063095ea7b3146103f55780630a28a477146104145780630b74ce8c14610433575f5ffd5b806301e1d1141461035f57806301ffc9a71461038657806306fdde03146103b5575b5f5ffd5b34801561036a575f5ffd5b50610373610a6a565b6040519081526020015b60405180910390f35b348015610391575f5ffd5b506103a56103a03660046145ac565b610a78565b604051901515815260200161037d565b3480156103c0575f5ffd5b506103c9610aae565b60405161037d9190614601565b3480156103e1575f5ffd5b506103736103f0366004614613565b610b6e565b348015610400575f5ffd5b506103a561040f36600461464e565b610b79565b34801561041f575f5ffd5b5061037361042e366004614613565b610b90565b34801561043e575f5ffd5b506103735f5160206151405f395f51905f5281565b34801561045e575f5ffd5b5061037361046d366004614688565b610b9c565b34801561047d575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610373565b3480156104b0575f5ffd5b506104c46104bf3660046146b9565b610c0e565b005b3480156104d1575f5ffd5b506103a56104e03660046146d9565b610c27565b3480156104f0575f5ffd5b506103736104ff366004614613565b610c4c565b34801561050f575f5ffd5b506103737f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b348015610542575f5ffd5b506104c4610551366004614717565b610c6c565b348015610561575f5ffd5b5061056a610c8e565b60405160ff909116815260200161037d565b348015610587575f5ffd5b506104c4610596366004614717565b610cbd565b3480156105a6575f5ffd5b506103737f326866b70291d731c5324fd58ae009670d3e8c69fccbef09e56e5c87e78b69c181565b3480156105d9575f5ffd5b505f5160206151a05f395f51905f52546040516001600160a01b03909116815260200161037d565b34801561060c575f5ffd5b506103c961061b3660046147fa565b610cf0565b34801561062b575f5ffd5b5061037361063a366004614853565b610d75565b34801561064a575f5ffd5b506103c9610659366004614613565b610d94565b348015610669575f5ffd5b506103737fccc64574297998b6c3edf6078cc5e01268465ff116954e3af02ff3a70a730f4681565b6104c461069f36600461486e565b610f14565b3480156106af575f5ffd5b506106b8610f33565b60405161037d91906148ba565b3480156106d0575f5ffd5b50610373610f8b565b3480156106e4575f5ffd5b506104c46106f3366004614a63565b610fa6565b348015610703575f5ffd5b50610373610712366004614717565b6110c0565b348015610722575f5ffd5b50610373610731366004614853565b61111d565b348015610741575f5ffd5b5061056a602081565b348015610755575f5ffd5b506104c4610764366004614b9a565b611143565b348015610774575f5ffd5b506104c461078336600461486e565b61116d565b348015610793575f5ffd5b506104c46107a2366004614c06565b61118e565b3480156107b2575f5ffd5b506103a56107c1366004614717565b6111c1565b3480156107d1575f5ffd5b506103736107e0366004614717565b6111f7565b3480156107f0575f5ffd5b506103c9611243565b348015610804575f5ffd5b506104c4610813366004614c37565b611281565b348015610823575f5ffd5b506103735f81565b348015610836575f5ffd5b506103a561084536600461464e565b6112a2565b348015610855575f5ffd5b506103c9604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610885575f5ffd5b50610373610894366004614613565b6112af565b3480156108a4575f5ffd5b506103736108b3366004614c5f565b6112bb565b3480156108c3575f5ffd5b506103736108d2366004614c5f565b611308565b3480156108e2575f5ffd5b506104c46108f1366004614c06565b611355565b348015610901575f5ffd5b50610373610910366004614853565b611388565b348015610920575f5ffd5b5061037361092f366004614613565b6113ca565b34801561093f575f5ffd5b506103737f6e824273980c4b4b65db074aeeccb75bec12f5e2e377c170763af52d00c592cc81565b348015610972575f5ffd5b50610373610981366004614853565b6113d5565b348015610991575f5ffd5b506104c46109a0366004614717565b6113eb565b3480156109b0575f5ffd5b506103736109bf366004614853565b611407565b3480156109cf575f5ffd5b506109d861144c565b60405161037d9190614c9e565b3480156109f0575f5ffd5b506103736109ff366004614ccf565b611492565b348015610a0f575f5ffd5b506103737fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b348015610a42575f5ffd5b50610373610a51366004614cfb565b6114db565b348015610a61575f5ffd5b506106b8611511565b5f610a7361154c565b905090565b5f6001600160e01b03198216637965db0b60e01b1480610aa857506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206151205f395f51905f5291610aec90614d24565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1890614d24565b8015610b635780601f10610b3a57610100808354040283529160200191610b63565b820191905f5260205f20905b815481529060010190602001808311610b4657829003601f168201915b505050505091505090565b5f610aa8825f6115c7565b5f33610b8681858561161e565b5060019392505050565b5f610aa882600161162b565b5f5f60028460ff1660208110610bb457610bb4614d5c565b01546bffffffffffffffffffffffff1960609190911b1660ff60581b605885901b161860ff60501b605086901b16187f6e824273980c4b4b65db074aeeccb75bec12f5e2e377c170763af52d00c592cc1891505092915050565b5f610c1881611679565b610c228383611686565b505050565b5f33610c348582856116e6565b610c3f858585611730565b60019150505b9392505050565b5f9081525f5160206151805f395f51905f52602052604090206001015490565b610c7582610c4c565b610c7e81611679565b610c88838361178d565b50505050565b5f805f5160206151a05f395f51905f5290505f8154610cb79190600160a01b900460ff16614d84565b91505090565b6001600160a01b0381163314610ce65760405163334bd91960e11b815260040160405180910390fd5b610c22828261182e565b6060610cfd8484846118a7565b5f60028560ff1660208110610d1457610d14614d5c565b01546001600160a01b0316905080610d3f57604051632711b74d60e11b815260040160405180910390fd5b610d6c848460028860ff1660208110610d5a57610d5a614d5c565b01546001600160a01b031691906118e4565b95945050505050565b5f610d7f82611936565b5f03610d8c57505f919050565b610aa8611973565b60605f5b5f60028260208110610dac57610dac614d5c565b01546001600160a01b031614801590610dc55750602081105b15610efa5760028160208110610ddd57610ddd614d5c565b015f9054906101000a90046001600160a01b03166001600160a01b0316635b9a4c356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e509190614d9d565b8303610eea57825483908190610e6590614d24565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9190614d24565b8015610edc5780601f10610eb357610100808354040283529160200191610edc565b820191905f5260205f20905b815481529060010190602001808311610ebf57829003601f168201915b505050505092505050919050565b610ef381614db4565b9050610d98565b5060405163213109dd60e11b815260040160405180910390fd5b610f1c6119ff565b610f2582611aa5565b610f2f8282611acf565b5050565b610f3b61458d565b6040805161040081019182905290600190602090825f855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f535790505050505050905090565b5f610f94611b8b565b505f5160206151605f395f51905f5290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610fea5750825b90505f826001600160401b031660011480156110055750303b155b905081158015611013575080155b156110315760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561105b57845460ff60401b1916600160401b1785555b61106b8d8d8d8d8d8d8d8d611bd4565b83156110b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b5f5f6110cb83610d75565b9050808411156110fd57828482604051633c8097d960e11b81526004016110f493929190614dcc565b60405180910390fd5b5f611107856113ca565b905061111533858784611bfe565b949350505050565b6001600160a01b03165f9081525f5160206151205f395f51905f52602052604090205490565b5f5160206151405f395f51905f5261115a81611679565b61116685858585611c13565b5050505050565b5f5160206151405f395f51905f5261118481611679565b610c228383611d4c565b7f326866b70291d731c5324fd58ae009670d3e8c69fccbef09e56e5c87e78b69c16111b881611679565b610f2f82611f51565b5f9182525f5160206151805f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f61120283611388565b90508084111561122b5782848260405163284ff66760e01b81526004016110f493929190614dcc565b5f611235856112af565b905061111533858388611bfe565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206151205f395f51905f5291610aec90614d24565b5f5160206151405f395f51905f5261129881611679565b610c2283836121b0565b5f33610b86818585611730565b5f610aa88260016115c7565b5f5f6112c6836113d5565b9050808511156112ef57828582604051633fa733bb60e21b81526004016110f493929190614dcc565b5f6112f986610b90565b9050610d6c33868689856127c7565b5f5f61131383611407565b90508085111561133c57828582604051632e52afbb60e21b81526004016110f493929190614dcc565b5f61134686610b6e565b9050610d6c338686848a6127c7565b7f326866b70291d731c5324fd58ae009670d3e8c69fccbef09e56e5c87e78b69c161137f81611679565b610f2f826127dd565b5f61139282611936565b5f0361139f57505f919050565b5f6113a8611973565b90505f1981146113c1576113bc815f61162b565b610c45565b5f199392505050565b5f610aa8825f61162b565b5f5f6113e083612a29565b9050610c4581612a3c565b6113f482610c4c565b6113fd81611679565b610c88838361182e565b5f5f61141283612ad1565b90505f61141f825f6115c7565b90505f61142b82612a3c565b90508181146114435761143e815f61162b565b610d6c565b50909392505050565b61145461458d565b604080516104008101918290529060029060209082845b81546001600160a01b0316815260019091019060200180831161146b575050505050905090565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f7fccc64574297998b6c3edf6078cc5e01268465ff116954e3af02ff3a70a730f4661150681611679565b610d6c858585612adb565b61151961458d565b604080516104008101918290525f805460ff1682529091602090826001838601808411610f535790505050505050905090565b5f5f5b5f6002826020811061156357611563614d5c565b01546001600160a01b03161480159061157c5750602081105b156115c3576115a76002826020811061159757611597614d5c565b01546001600160a01b0316612ccb565b6115b19083614ded565b91506115bc81614db4565b905061154f565b5090565b5f610c456115d3610a6a565b6115de906001614ded565b6115e95f600a614ee3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546116159190614ded565b85919085612d34565b610c228383836001612d76565b5f610c4561163a82600a614ee3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546116669190614ded565b61166e610a6a565b611615906001614ded565b6116838133612e59565b50565b5f5160206151805f395f51905f525f61169e84610c4c565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f6116f18484611492565b90505f198114610c88578181101561172257828183604051637dc7a0d960e11b81526004016110f493929190614dcc565b610c8884848484035f612d76565b6001600160a01b03831661175957604051634b637e8f60e11b81525f60048201526024016110f4565b6001600160a01b0382166117825760405163ec442f0560e01b81525f60048201526024016110f4565b610c22838383612e92565b5f5f5160206151805f395f51905f526117a684846111c1565b611825575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117db3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610aa8565b5f915050610aa8565b5f5f5160206151805f395f51905f5261184784846111c1565b15611825575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610aa8565b7f6e824273980c4b4b65db074aeeccb75bec12f5e2e377c170763af52d00c592cc6118d181611679565b6118db8484610b9c565b61116681611679565b606061111583836040516024016118fc929190614ef1565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b03861690612fb8565b5f6119617fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a6836111c1565b61196c57505f919050565b5f19610aa8565b5f5f5f5b5f6002826020811061198b5761198b614d5c565b01546001600160a01b0316148015906119a45750602081105b156119fa576119d8836119d3600284602081106119c3576119c3614d5c565b01546001600160a01b0316613021565b61304f565b93509150816119ea575f199250505090565b6119f381614db4565b9050611977565b505090565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611a8557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a795f5160206151605f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15611aa35760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610f2f81611679565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b29575060408051601f3d908101601f19168201909252611b2691810190614d9d565b60015b611b5157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016110f4565b5f5160206151605f395f51905f528114611b8157604051632a87526960e21b8152600481018290526024016110f4565b610c228383613076565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611aa35760405163703e46dd60e11b815260040160405180910390fd5b611bdc6130cb565b611be888888888613114565b611bf484848484613171565b5050505050505050565b611c0a848484846136f2565b610c888261376f565b5f60028560ff1660208110611c2a57611c2a614d5c565b01546001600160a01b0316905080611c5557604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015611c8457505f60028260208110611c7657611c76614d5c565b01546001600160a01b031614155b15611cfa57846001600160a01b031660028260208110611ca657611ca6614d5c565b01546001600160a01b0316148015611cc157508560ff168114155b15611cea5760405163b5a9314f60e01b81526001600160a01b03861660048201526024016110f4565b611cf381614db4565b9050611c57565b50611d0f818585611d09613886565b866138a5565b8360028660ff1660208110611d2657611d26614d5c565b0180546001600160a01b0319166001600160a01b03929092169190911790555050505050565b6001600160a01b038216611d7357604051632711b74d60e11b815260040160405180910390fd5b5f5b602081108015611da257505f60028260208110611d9457611d94614d5c565b01546001600160a01b031614155b15611e0857826001600160a01b031660028260208110611dc457611dc4614d5c565b01546001600160a01b031603611df85760405163b5a9314f60e01b81526001600160a01b03841660048201526024016110f4565b611e0181614db4565b9050611d75565b601f198101611e2d57604051600162ad1fab60e01b0319815260040160405180910390fd5b8260028260208110611e4157611e41614d5c565b0180546001600160a01b0319166001600160a01b0392909216919091179055611e6b816001614ded565b5f8260208110611e7d57611e7d614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550806001611eaa9190614ded565b60018260208110611ebd57611ebd614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550611ef8611ee8613886565b6001600160a01b038516906139f3565b611f0b6001600160a01b03841683613a85565b60405160ff821681526001600160a01b038416907f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f589060200160405180910390a2505050565b611f5961458d565b81515f9060201015611f7e5760405163a29b1f1160e01b815260040160405180910390fd5b825181101561212957602060ff16838281518110611f9e57611f9e614d5c565b602002602001015160ff16101580611ff757505f6001600160a01b03166002848381518110611fcf57611fcf614d5c565b602002602001015160ff1660208110611fea57611fea614d5c565b01546001600160a01b0316145b156120155760405163a29b1f1160e01b815260040160405180910390fd5b8183828151811061202857612028614d5c565b602002602001015160ff166020811061204357612043614d5c565b60200201511561208a5782818151811061205f5761205f614d5c565b602002602001015160405163c41fdbb960e01b81526004016110f4919060ff91909116815260200190565b60018284838151811061209f5761209f614d5c565b602002602001015160ff16602081106120ba576120ba614d5c565b9115156020909202015282518390829081106120d8576120d8614d5c565b602002602001015160016120ec9190614d84565b5f82602081106120fe576120fe614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550806001019050611f7e565b60208110801561215657505f6002826020811061214857612148614d5c565b01546001600160a01b031614155b1561217457604051636712b27b60e01b815260040160405180910390fd5b7f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec836040516121a39190614f0c565b60405180910390a1505050565b602060ff8316106121d457604051632711b74d60e11b815260040160405180910390fd5b5f60028360ff16602081106121eb576121eb614d5c565b01546001600160a01b031690508061221657604051632711b74d60e11b815260040160405180910390fd5b811580156122345750612231816001600160a01b0316612ccb565b15155b15612252576040516343c2dfef60e01b815260040160405180910390fd5b60ff831615801561226c57506003546001600160a01b0316155b1561228d57604051600162ad1fab60e01b0319815260040160405180910390fd5b5f612299846001614d84565b60ff1690505b6020811080156122cc57505f600282602081106122be576122be614d5c565b01546001600160a01b031614155b1561233b57600281602081106122e4576122e4614d5c565b01546001600160a01b031660026122fc600184614f51565b6020811061230c5761230c614d5c565b0180546001600160a01b0319166001600160a01b039290921691909117905561233481614db4565b905061229f565b5f6002612349600184614f51565b6020811061235957612359614d5c565b0180546001600160a01b0319166001600160a01b0392909216919091179055505f80805b6001836020811061239057612390614d5c565b602081049091015460ff601f9092166101000a900416158015906123b45750602083105b156126e6578015612478576123ca866001614d84565b60ff16600184602081106123e0576123e0614d5c565b602081049091015460ff601f9092166101000a90041611612401575f612404565b60015b6001846020811061241757612417614d5c565b602091828204019190069054906101000a900460ff166124379190614f64565b60016124438186614f51565b6020811061245357612453614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550612549565b612483866001614d84565b60ff166001846020811061249957612499614d5c565b602081049091015460ff601f9092166101000a900416036124bc57506001612549565b6124c7866001614d84565b60ff16600184602081106124dd576124dd614d5c565b602081049091015460ff601f9092166101000a900416111561254957600180846020811061250d5761250d614d5c565b602091828204019190068282829054906101000a900460ff166125309190614f64565b92506101000a81548160ff021916908360ff1602179055505b81156126065761255a866001614d84565b60ff165f846020811061256f5761256f614d5c565b602081049091015460ff601f9092166101000a90041611612590575f612593565b60015b5f84602081106125a5576125a5614d5c565b602091828204019190069054906101000a900460ff166125c59190614f64565b5f6125d1600186614f51565b602081106125e1576125e1614d5c565b602091828204019190066101000a81548160ff021916908360ff1602179055506126d6565b612611866001614d84565b60ff165f846020811061262657612626614d5c565b602081049091015460ff601f9092166101000a9004160361264a57600191506126d6565b612655866001614d84565b60ff165f846020811061266a5761266a614d5c565b602081049091015460ff601f9092166101000a90041611156126d65760015f846020811061269a5761269a614d5c565b602091828204019190068282829054906101000a900460ff166126bd9190614f64565b92506101000a81548160ff021916908360ff1602179055505b6126df83614db4565b925061237d565b5f806126f3600186614f51565b6020811061270357612703614d5c565b602091828204019190066101000a81548160ff021916908360ff1602179055505f600180856127329190614f51565b6020811061274257612742614d5c565b602091828204019190066101000a81548160ff021916908360ff16021790555061277e85856001600160a01b0316613ad390919063ffffffff16565b60405160ff871681526001600160a01b038516907f978014566e371fef52158b004e150b6e1fd723f5aa3d8c9aa2a7c98ddb0e65b89060200160405180910390a2505050505050565b6127d082613bf8565b6111668585858585613d0b565b6127e561458d565b81515f906020101561280a5760405163a29b1f1160e01b815260040160405180910390fd5b82518160ff1610156129a957602060ff16838260ff168151811061283057612830614d5c565b602002602001015160ff1610158061288c57505f6001600160a01b03166002848360ff168151811061286457612864614d5c565b602002602001015160ff166020811061287f5761287f614d5c565b01546001600160a01b0316145b156128aa5760405163a29b1f1160e01b815260040160405180910390fd5b81838260ff16815181106128c0576128c0614d5c565b602002602001015160ff16602081106128db576128db614d5c565b6020020151156128fa57828160ff168151811061205f5761205f614d5c565b600182848360ff168151811061291257612912614d5c565b602002602001015160ff166020811061292d5761292d614d5c565b911515602090920201528251839060ff831690811061294e5761294e614d5c565b602002602001015160016129629190614d84565b60018260ff166020811061297857612978614d5c565b602091828204019190066101000a81548160ff021916908360ff160217905550806129a290614f7d565b905061280a565b602060ff82161080156129dc57505f600260ff8316602081106129ce576129ce614d5c565b01546001600160a01b031614155b156129fa57604051636712b27b60e01b815260040160405180910390fd5b7f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516121a39190614f0c565b5f610aa8612a368361111d565b5f6115c7565b5f5f5f5b5f60028260208110612a5457612a54614d5c565b01546001600160a01b031614801590612a6d5750602081105b15612aca57612a9c836119d360028460208110612a8c57612a8c614d5c565b01546001600160a01b0316613dbf565b93509150811580612aad5750838310155b15612aba57509192915050565b612ac381614db4565b9050612a40565b5050919050565b5f610aa88261111d565b5f602060ff8516101580612af35750602060ff841610155b15612b1157604051632711b74d60e11b815260040160405180910390fd5b5f60028560ff1660208110612b2857612b28614d5c565b01546001600160a01b031690505f600260ff861660208110612b4c57612b4c614d5c565b01546001600160a01b03908116915082161580612b7057506001600160a01b038116155b15612b8e57604051632711b74d60e11b815260040160405180910390fd5b5f198403612bab57612ba8826001600160a01b0316612ccb565b93505b835f03612bbc575f92505050610c45565b612bce826001600160a01b0316613dbf565b841115612c0357612be7826001600160a01b0316613dbf565b604051633ce011d560e01b81526004016110f491815260200190565b612c15816001600160a01b0316613021565b841115612c4a57612c2e816001600160a01b0316613021565b6040516350a3e37560e11b81526004016110f491815260200190565b612c5e6001600160a01b038316855f613ded565b50612c736001600160a01b038216855f613f29565b50806001600160a01b0316826001600160a01b03167fb0850b8e0f9e8315dde3c9f9f31138283e6bbe16cd29e8552eb1dcdf9fac9e3b86604051612cb991815260200190565b60405180910390a35091949350505050565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015612d10573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa89190614d9d565b5f612d61612d418361404a565b8015612d5c57505f8480612d5757612d57614f9b565b868809115b151590565b612d6c868686614076565b610d6c9190614ded565b5f5160206151205f395f51905f526001600160a01b038516612dad5760405163e602df0560e01b81525f60048201526024016110f4565b6001600160a01b038416612dd657604051634a1406b160e11b81525f60048201526024016110f4565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561116657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051612e4a91815260200190565b60405180910390a35050505050565b612e6382826111c1565b610f2f5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016110f4565b5f5160206151205f395f51905f526001600160a01b038416612ecc5781816002015f828254612ec19190614ded565b90915550612f299050565b6001600160a01b0384165f9081526020829052604090205482811015612f0b5784818460405163391434e360e21b81526004016110f493929190614dcc565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316612f47576002810180548390039055612f65565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612faa91815260200190565b60405180910390a350505050565b60605f5f846001600160a01b031684604051612fd49190614faf565b5f60405180830381855af49150503d805f811461300c576040519150601f19603f3d011682016040523d82523d5f602084013e613011565b606091505b5091509150610d6c85838361412c565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d90602401612cf5565b5f8083830184811015613068575f5f925092505061306f565b6001925090505b9250929050565b61307f82614183565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156130c357610c228282612fb8565b610f2f6141e6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611aa357604051631afcd79f60e31b815260040160405180910390fd5b61311c6130cb565b613124614205565b61312c614205565b6001600160a01b038116613155576040516337bce3c560e11b81525f60048201526024016110f4565b61315e8161420d565b613168848461421e565b610c8882614230565b83511580613180575083516020105b8061318d57508251845114155b8061319a57508151845114155b806131a757508051845114155b156131c857604051600162ad1fab60e01b0319815260040160405180910390fd5b6131d061458d565b6131d861458d565b5f5b865181101561367b575f6001600160a01b03168782815181106131ff576131ff614d5c565b60200260200101516001600160a01b03160361322e57604051632711b74d60e11b815260040160405180910390fd5b61326a613239613886565b88838151811061324b5761324b614d5c565b60200260200101516001600160a01b03166139f390919063ffffffff16565b5f5b8181101561330a5787818151811061328657613286614d5c565b60200260200101516001600160a01b03168883815181106132a9576132a9614d5c565b60200260200101516001600160a01b031603613302578782815181106132d1576132d1614d5c565b602002602001015160405163b5a9314f60e01b81526004016110f491906001600160a01b0391909116815260200190565b60010161326c565b50865185828151811061331f5761331f614d5c565b602002602001015160ff1610158061336657508285828151811061334557613345614d5c565b602002602001015160ff166020811061336057613360614d5c565b60200201515b156133a85784818151811061337d5761337d614d5c565b602002602001015160405163306ccd5d60e11b81526004016110f4919060ff91909116815260200190565b86518482815181106133bc576133bc614d5c565b602002602001015160ff161015806134035750818482815181106133e2576133e2614d5c565b602002602001015160ff16602081106133fd576133fd614d5c565b60200201515b156134455783818151811061341a5761341a614d5c565b6020026020010151604051632776924160e11b81526004016110f4919060ff91909116815260200190565b60018386838151811061345a5761345a614d5c565b602002602001015160ff166020811061347557613475614d5c565b60200201901515908115158152505060018285838151811061349957613499614d5c565b602002602001015160ff16602081106134b4576134b4614d5c565b9115156020909202015286518790829081106134d2576134d2614d5c565b6020026020010151600282602081106134ed576134ed614d5c565b015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084818151811061352357613523614d5c565b602002602001015160016135379190614d84565b5f826020811061354957613549614d5c565b602091828204019190066101000a81548160ff021916908360ff16021790555083818151811061357b5761357b614d5c565b6020026020010151600161358f9190614d84565b600182602081106135a2576135a2614d5c565b602091828204019190066101000a81548160ff021916908360ff1602179055506136108682815181106135d7576135d7614d5c565b60200260200101518883815181106135f1576135f1614d5c565b60200260200101516001600160a01b0316613a8590919063ffffffff16565b86818151811061362257613622614d5c565b60200260200101516001600160a01b03167f4973f7978f2b1810531aed51dc15a8e446cb3191afcca470f8ce464af7494f588260405161366b919060ff91909116815260200190565b60405180910390a26001016131da565b507f193fc4e628c27ae3ca098952dfc16a40425b44e7b0a97f4cc59d0f267f47caec846040516136ab9190614f0c565b60405180910390a17f3c56b6bca0d55eda581f8f2819d1f85d3b91cfcc24914a8fa39d301796d8964c836040516136e29190614f0c565b60405180910390a1505050505050565b5f5160206151a05f395f51905f528054613717906001600160a01b0316863086614242565b61372184836142a9565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051612e4a929190918252602082015260400190565b805f5b81158015906137a757505f816020811061378e5761378e614d5c565b602081049091015460ff601f9092166101000a90041615155b80156137b35750602081105b15613866575f600260015f84602081106137cf576137cf614d5c565b602091828204019190069054906101000a900460ff166137ef9190614f64565b60ff166020811061380257613802614d5c565b01546001600160a01b031690505f6138228461381d84613021565b6142dd565b9050805f03613832575050613856565b6138466001600160a01b038316825f613f29565b506138518185614f51565b935050505b61385f81614db4565b9050613772565b508015610f2f5760405163285a546d60e01b815260040160405180910390fd5b5f610a735f5160206151a05f395f51905f52546001600160a01b031690565b6138af84836139f3565b60405163f3e0ffbf60e01b81523060048201526139219086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa1580156138f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061391b9190614d9d565b83613ded565b5061392c8582613ad3565b6139368484613a85565b6040516370a0823160e01b81523060048201526139a89085906001600160a01b038516906370a0823190602401602060405180830381865afa15801561397e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a29190614d9d565b83613f29565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa158015613a3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a5e9190614fc5565b6001600160a01b031614610f2f5760405163e76673ef60e01b815260040160405180910390fd5b610c2281604051602401613a999190614601565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b03841690612fb8565b8015613bae57604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b17905251613b2a9190614faf565b5f60405180830381855af49150503d805f8114613b62576040519150601f19603f3d011682016040523d82523d5f602084013e613b67565b606091505b509150915081610c88577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf881604051613ba09190614601565b60405180910390a150505050565b6040515f6024820152610c229060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b03841690612fb8565b805f5b8115801590613c31575060018160208110613c1857613c18614d5c565b602081049091015460ff601f9092166101000a90041615155b8015613c3d5750602081105b15613ceb575f60026001808460208110613c5957613c59614d5c565b602091828204019190069054906101000a900460ff16613c799190614f64565b60ff1660208110613c8c57613c8c614d5c565b01546001600160a01b031690505f613ca78461381d84613dbf565b9050805f03613cb7575050613cdb565b613ccb6001600160a01b038316825f613ded565b50613cd68185614f51565b935050505b613ce481614db4565b9050613bfb565b508015610f2f5760405163351dc55d60e21b815260040160405180910390fd5b5f5160206151a05f395f51905f526001600160a01b0386811690851614613d3757613d378487846116e6565b613d4184836142ec565b8054613d57906001600160a01b03168685614320565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051613daf929190918252602082015260400190565b60405180910390a4505050505050565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb7790602401612cf5565b5f8115613ecf575f5f856001600160a01b031685604051602401613e1391815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251613e489190614faf565b5f60405180830381855af49150503d805f8114613e80576040519150601f19603f3d011682016040523d82523d5f602084013e613e85565b606091505b509150915081613ec7577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051613ebe9190614601565b60405180910390a15b509050610c45565b613f1f83604051602401613ee591815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b03861690612fb8565b5060019050610c45565b5f8115613ffa575f5f856001600160a01b031685604051602401613f4f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251613f849190614faf565b5f60405180830381855af49150503d805f8114613fbc576040519150601f19603f3d011682016040523d82523d5f602084013e613fc1565b606091505b509150915081613ec7577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051613ebe9190614601565b613f1f8360405160240161401091815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b03861690612fb8565b5f600282600381111561405f5761405f614fe0565b6140699190614ff4565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036140aa578382816140a0576140a0614f9b565b0492505050610c45565b8084116140c1576140c16003851502601118614351565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60608261413c576113bc82614362565b815115801561415357506001600160a01b0384163b155b1561417c57604051639996b31560e01b81526001600160a01b03851660048201526024016110f4565b5080610c45565b806001600160a01b03163b5f036141b857604051634c9c8ce360e01b81526001600160a01b03821660048201526024016110f4565b5f5160206151605f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b3415611aa35760405163b398979f60e01b815260040160405180910390fd5b611aa36130cb565b6142156130cb565b6116838161438b565b6142266130cb565b610f2f82826143fb565b6142386130cb565b610f2f5f8261178d565b6040516001600160a01b038481166024830152838116604483015260648201839052610c889186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061444b565b6001600160a01b0382166142d25760405163ec442f0560e01b81525f60048201526024016110f4565b610f2f5f8383612e92565b5f828218828410028218610c45565b6001600160a01b03821661431557604051634b637e8f60e11b81525f60048201526024016110f4565b610f2f825f83612e92565b6040516001600160a01b03838116602483015260448201839052610c2291859182169063a9059cbb90606401614277565b634e487b715f52806020526024601cfd5b8051156143725780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6143936130cb565b5f5160206151a05f395f51905f525f806143ac846144b7565b91509150816143bc5760126143be565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b6144036130cb565b5f5160206151205f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361443c8482615065565b5060048101610c888382615065565b5f5f60205f8451602086015f885af18061446a576040513d5f823e3d81fd5b50505f513d9150811561448157806001141561448e565b6001600160a01b0384163b155b15610c8857604051635274afe760e01b81526001600160a01b03851660048201526024016110f4565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916144fd91614faf565b5f60405180830381855afa9150503d805f8114614535576040519150601f19603f3d011682016040523d82523d5f602084013e61453a565b606091505b509150915081801561454e57506020815110155b15614581575f818060200190518101906145689190614d9d565b905060ff811161457f576001969095509350505050565b505b505f9485945092505050565b6040518061040001604052806020906020820280368337509192915050565b5f602082840312156145bc575f5ffd5b81356001600160e01b031981168114610c45575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c4560208301846145d3565b5f60208284031215614623575f5ffd5b5035919050565b6001600160a01b0381168114611683575f5ffd5b80356146498161462a565b919050565b5f5f6040838503121561465f575f5ffd5b823561466a8161462a565b946020939093013593505050565b803560ff81168114614649575f5ffd5b5f5f60408385031215614699575f5ffd5b6146a283614678565b91506146b060208401614678565b90509250929050565b5f5f604083850312156146ca575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156146eb575f5ffd5b83356146f68161462a565b925060208401356147068161462a565b929592945050506040919091013590565b5f5f60408385031215614728575f5ffd5b82359150602083013561473a8161462a565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561478157614781614745565b604052919050565b5f82601f830112614798575f5ffd5b8135602083015f5f6001600160401b038411156147b7576147b7614745565b50601f8301601f19166020016147cc81614759565b9150508281528583830111156147e0575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f5f6060848603121561480c575f5ffd5b61481584614678565b925061482360208501614678565b915060408401356001600160401b0381111561483d575f5ffd5b61484986828701614789565b9150509250925092565b5f60208284031215614863575f5ffd5b8135610c458161462a565b5f5f6040838503121561487f575f5ffd5b823561488a8161462a565b915060208301356001600160401b038111156148a4575f5ffd5b6148b085828601614789565b9150509250929050565b610400810181835f5b60208110156148e557815160ff168352602092830192909101906001016148c3565b50505092915050565b5f6001600160401b0382111561490657614906614745565b5060051b60200190565b5f82601f83011261491f575f5ffd5b813561493261492d826148ee565b614759565b8082825260208201915060208360051b860101925085831115614953575f5ffd5b602085015b8381101561497957803561496b8161462a565b835260209283019201614958565b5095945050505050565b5f82601f830112614992575f5ffd5b81356149a061492d826148ee565b8082825260208201915060208360051b8601019250858311156149c1575f5ffd5b602085015b838110156149795780356001600160401b038111156149e3575f5ffd5b6149f2886020838a0101614789565b845250602092830192016149c6565b5f82601f830112614a10575f5ffd5b8135614a1e61492d826148ee565b8082825260208201915060208360051b860101925085831115614a3f575f5ffd5b602085015b8381101561497957614a5581614678565b835260209283019201614a44565b5f5f5f5f5f5f5f5f610100898b031215614a7b575f5ffd5b88356001600160401b03811115614a90575f5ffd5b614a9c8b828c01614789565b98505060208901356001600160401b03811115614ab7575f5ffd5b614ac38b828c01614789565b975050614ad260408a0161463e565b9550614ae060608a0161463e565b945060808901356001600160401b03811115614afa575f5ffd5b614b068b828c01614910565b94505060a08901356001600160401b03811115614b21575f5ffd5b614b2d8b828c01614983565b93505060c08901356001600160401b03811115614b48575f5ffd5b614b548b828c01614a01565b92505060e08901356001600160401b03811115614b6f575f5ffd5b614b7b8b828c01614a01565b9150509295985092959890939650565b80358015158114614649575f5ffd5b5f5f5f5f60808587031215614bad575f5ffd5b614bb685614678565b93506020850135614bc68161462a565b925060408501356001600160401b03811115614be0575f5ffd5b614bec87828801614789565b925050614bfb60608601614b8b565b905092959194509250565b5f60208284031215614c16575f5ffd5b81356001600160401b03811115614c2b575f5ffd5b61111584828501614a01565b5f5f60408385031215614c48575f5ffd5b614c5183614678565b91506146b060208401614b8b565b5f5f5f60608486031215614c71575f5ffd5b833592506020840135614c838161462a565b91506040840135614c938161462a565b809150509250925092565b610400810181835f5b60208110156148e55781516001600160a01b0316835260209283019290910190600101614ca7565b5f5f60408385031215614ce0575f5ffd5b8235614ceb8161462a565b9150602083013561473a8161462a565b5f5f5f60608486031215614d0d575f5ffd5b614d1684614678565b925061470660208501614678565b600181811c90821680614d3857607f821691505b602082108103614d5657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610aa857610aa8614d70565b5f60208284031215614dad575f5ffd5b5051919050565b5f60018201614dc557614dc5614d70565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b80820180821115610aa857610aa8614d70565b6001815b6001841115614e3b57808504811115614e1f57614e1f614d70565b6001841615614e2d57908102905b60019390931c928002614e04565b935093915050565b5f82614e5157506001610aa8565b81614e5d57505f610aa8565b8160018114614e735760028114614e7d57614e99565b6001915050610aa8565b60ff841115614e8e57614e8e614d70565b50506001821b610aa8565b5060208310610133831016604e8410600b8410161715614ebc575081810a610aa8565b614ec85f198484614e00565b805f1904821115614edb57614edb614d70565b029392505050565b5f610c4560ff841683614e43565b60ff83168152604060208201525f61111560408301846145d3565b602080825282518282018190525f918401906040840190835b81811015614f4657835160ff16835260209384019390920191600101614f25565b509095945050505050565b81810381811115610aa857610aa8614d70565b60ff8281168282160390811115610aa857610aa8614d70565b5f60ff821660ff8103614f9257614f92614d70565b60010192915050565b634e487b7160e01b5f52601260045260245ffd5b5f82518060208501845e5f920191825250919050565b5f60208284031215614fd5575f5ffd5b8151610c458161462a565b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061501257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f821115610c2257805f5260205f20601f840160051c810160208510156150465750805b601f840160051c820191505b81811015611166575f8155600101615052565b81516001600160401b0381111561507e5761507e614745565b6150928161508c8454614d24565b84615021565b6020601f8211600181146150c4575f83156150ad5750848201515b5f19600385901b1c1916600184901b178455611166565b5f84815260208120601f198516915b828110156150f357878501518255602094850194600190920191016150d3565b508482101561511057868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace005604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f38360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a26469706673582212201c9b7fe0f18e75a0251d462b589a16503c58d706f46971a5675dd8ec8649302a64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
