{
  "_format": "hh-sol-artifact-1",
  "contractName": "Vault",
  "sourceName": "contracts/core/Vault.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "usdgAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeBasisPoints",
          "type": "uint256"
        }
      ],
      "name": "BuyUSDG",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "key",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "size",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "averagePrice",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "entryFundingRate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reserveAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "realisedPnl",
          "type": "int256"
        }
      ],
      "name": "ClosePosition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeUsd",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeTokens",
          "type": "uint256"
        }
      ],
      "name": "CollectMarginFees",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeUsd",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeTokens",
          "type": "uint256"
        }
      ],
      "name": "CollectSwapFees",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "DecreaseGuaranteedUsd",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "DecreasePoolAmount",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "key",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "collateralToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "indexToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateralDelta",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sizeDelta",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isLong",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        }
      ],
      "name": "DecreasePosition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "DecreaseReservedAmount",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "DecreaseUsdgAmount",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "DirectPoolDeposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "IncreaseGuaranteedUsd",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "IncreasePoolAmount",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "key",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "collateralToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "indexToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateralDelta",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sizeDelta",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isLong",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        }
      ],
      "name": "IncreasePosition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "IncreaseReservedAmount",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "IncreaseUsdgAmount",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "key",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "collateralToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "indexToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isLong",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "size",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reserveAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "realisedPnl",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "markPrice",
          "type": "uint256"
        }
      ],
      "name": "LiquidatePosition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "usdgAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeBasisPoints",
          "type": "uint256"
        }
      ],
      "name": "SellUSDG",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenIn",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenOut",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountIn",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountOut",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountOutAfterFees",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeBasisPoints",
          "type": "uint256"
        }
      ],
      "name": "Swap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fundingRate",
          "type": "uint256"
        }
      ],
      "name": "UpdateFundingRate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "key",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "hasProfit",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "delta",
          "type": "uint256"
        }
      ],
      "name": "UpdatePnl",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "key",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "size",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "averagePrice",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "entryFundingRate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reserveAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "realisedPnl",
          "type": "int256"
        }
      ],
      "name": "UpdatePosition",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "BASIS_POINTS_DIVISOR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FUNDING_RATE_PRECISION",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_FEE_BASIS_POINTS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_FUNDING_RATE_FACTOR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAX_LIQUIDATION_FEE_USD",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_FUNDING_RATE_INTERVAL",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_LEVERAGE",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PRICE_PRECISION",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "USDG_DECIMALS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_router",
          "type": "address"
        }
      ],
      "name": "addRouter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_tokenDiv",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenMul",
          "type": "address"
        }
      ],
      "name": "adjustForDecimals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "allWhitelistedTokens",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "allWhitelistedTokensLength",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "approvedRouters",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "bufferAmounts",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "buyUSDG",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "clearTokenConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "cumulativeFundingRates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralDelta",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_sizeDelta",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "decreasePosition",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "directPoolDeposit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "errorController",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "errors",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "feeReserves",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fundingInterval",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fundingRateFactor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_averagePrice",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "_lastIncreasedTime",
          "type": "uint256"
        }
      ],
      "name": "getDelta",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_usdgDelta",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_feeBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_taxBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_increment",
          "type": "bool"
        }
      ],
      "name": "getFeeBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_entryFundingRate",
          "type": "uint256"
        }
      ],
      "name": "getFundingFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getGlobalShortDelta",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getMaxPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getMinPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_averagePrice",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "_nextPrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_sizeDelta",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_lastIncreasedTime",
          "type": "uint256"
        }
      ],
      "name": "getNextAveragePrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getNextFundingRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_nextPrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_sizeDelta",
          "type": "uint256"
        }
      ],
      "name": "getNextGlobalShortAveragePrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        }
      ],
      "name": "getPosition",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        }
      ],
      "name": "getPositionDelta",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_sizeDelta",
          "type": "uint256"
        }
      ],
      "name": "getPositionFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        }
      ],
      "name": "getPositionKey",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        }
      ],
      "name": "getPositionLeverage",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_usdgAmount",
          "type": "uint256"
        }
      ],
      "name": "getRedemptionAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getRedemptionCollateral",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getRedemptionCollateralUsd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getTargetUsdgAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "getUtilisation",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "globalShortAveragePrices",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "globalShortSizes",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gov",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "guaranteedUsd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "hasDynamicFees",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "inManagerMode",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "inPrivateLiquidationMode",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "includeAmmPrice",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_sizeDelta",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        }
      ],
      "name": "increasePosition",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_router",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_usdg",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_priceFeed",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_liquidationFeeUsd",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_fundingRateFactor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_stableFundingRateFactor",
          "type": "uint256"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isInitialized",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isLeverageEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isLiquidator",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isManager",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isSwapEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lastFundingTimes",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "_feeReceiver",
          "type": "address"
        }
      ],
      "name": "liquidatePosition",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "liquidationFeeUsd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "marginFeeBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxGasPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxLeverage",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "maxUsdgAmounts",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "minProfitBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minProfitTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "mintBurnFeeBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "poolAmounts",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "positions",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "size",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "averagePrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "entryFundingRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "reserveAmount",
          "type": "uint256"
        },
        {
          "internalType": "int256",
          "name": "realisedPnl",
          "type": "int256"
        },
        {
          "internalType": "uint256",
          "name": "lastIncreasedTime",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "priceFeed",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_router",
          "type": "address"
        }
      ],
      "name": "removeRouter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "reservedAmounts",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "router",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "sellUSDG",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "setBufferAmount",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_errorCode",
          "type": "uint256"
        },
        {
          "internalType": "string",
          "name": "_error",
          "type": "string"
        }
      ],
      "name": "setError",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_errorController",
          "type": "address"
        }
      ],
      "name": "setErrorController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_taxBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_stableTaxBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_mintBurnFeeBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_swapFeeBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_stableSwapFeeBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_marginFeeBasisPoints",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_liquidationFeeUsd",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_minProfitTime",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_hasDynamicFees",
          "type": "bool"
        }
      ],
      "name": "setFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_fundingInterval",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_fundingRateFactor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_stableFundingRateFactor",
          "type": "uint256"
        }
      ],
      "name": "setFundingRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_gov",
          "type": "address"
        }
      ],
      "name": "setGov",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_inManagerMode",
          "type": "bool"
        }
      ],
      "name": "setInManagerMode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_inPrivateLiquidationMode",
          "type": "bool"
        }
      ],
      "name": "setInPrivateLiquidationMode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_isLeverageEnabled",
          "type": "bool"
        }
      ],
      "name": "setIsLeverageEnabled",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_isSwapEnabled",
          "type": "bool"
        }
      ],
      "name": "setIsSwapEnabled",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_liquidator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isActive",
          "type": "bool"
        }
      ],
      "name": "setLiquidator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_manager",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isManager",
          "type": "bool"
        }
      ],
      "name": "setManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_maxGasPrice",
          "type": "uint256"
        }
      ],
      "name": "setMaxGasPrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_maxLeverage",
          "type": "uint256"
        }
      ],
      "name": "setMaxLeverage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_priceFeed",
          "type": "address"
        }
      ],
      "name": "setPriceFeed",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_tokenDecimals",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_tokenWeight",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_minProfitBps",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxUsdgAmount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isStable",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "_isShortable",
          "type": "bool"
        }
      ],
      "name": "setTokenConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "setUsdgAmount",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "shortableTokens",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stableFundingRateFactor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stableSwapFeeBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stableTaxBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "stableTokens",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenIn",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenOut",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "swap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "swapFeeBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "taxBasisPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "tokenBalances",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "tokenDecimals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "tokenToUsdMin",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "tokenWeights",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalTokenWeights",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "updateCumulativeFundingRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newVault",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "upgradeVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_usdAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "usdToToken",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_usdAmount",
          "type": "uint256"
        }
      ],
      "name": "usdToTokenMax",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_usdAmount",
          "type": "uint256"
        }
      ],
      "name": "usdToTokenMin",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "usdg",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "usdgAmounts",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "useSwapPricing",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_indexToken",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isLong",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "_raise",
          "type": "bool"
        }
      ],
      "name": "validateLiquidation",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "whitelistedTokenCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "whitelistedTokens",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "withdrawFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040526001805462ff00001961ff00199091166101001716620100001781556207a12060075560326009556014600a908155601e600b819055600c556004600d55600e556010805460ff199081169091556170806011556015805463ffffff0019921690921716905534801561007657600080fd5b506001600055600580546001600160a01b03191633179055615b9e806200009e6000396000f3fe608060405234801561001057600080fd5b50600436106105325760003560e01c806304fef1db1461053757806307c587521461056f5780630842b076146105775780630a48d5a91461057f57806310eb56c2146105ab578063126082cf146105b357806312d43a51146105bb578063134ca63b146105df57806313f1e736146105e7578063174d26941461060f57806317bbf25c14610617578063181e210e146106345780631aa4ace5146106505780631ce9cb8f1461067657806324b0c04d1461069c57806324ca984e146106bb57806328e67be5146106e157806329ff9615146107565780632c668ec11461077c5780632d4b0576146107a857806330455ede146107e6578063318bc6891461080557806334c1557d146105b3578063351a964d1461080d578063392e53cd146108155780633a05dcc11461081d5780633c5a6e35146108435780633de39c11146108915780633e72a2621461089957806340eb3802146108a157806342152873146108f257806342b60b03146109265780634453a3741461094c57806345a6f3701461097a57806348d91abf146109d357806348f35cbb14610a175780634a3f088d14610a1f5780634a993ee914610aa05780634befe2ca14610ac65780634d47b30414610ace578063514ea4bf14610ad657806351723e8214610b2b578063523fba7f14610b69578063529a356f14610b8f57806352f55eed14610bb55780635c07eaab14610bdb5780635f7bc11914610c1b5780636092219914610c4157806362287a3214610c6f5780636274980314610c775780636ae0b15414610c9d5780636be6026b14610cc3578063711e619014610ccb578063724e78da14610cf9578063728cdbca14610d1f578063741bef1a14610d675780637a210a2b14610d6f5780637c2eb9f714610d77578063817bb85714610d9657806381a612d614610dc457806382a0849014610dea5780638585f4d214610e3e578063870d917c14610e6a57806388b1fbdf14610e725780638a27d46814610e985780638a39735a146105b35780638a78daa814610ec15780638ee573ac14610ee75780638f7b840414610f0d5780639060b1ca14610f335780639331621214610f3b57806395082d2514610f735780639849e41214610f7b5780639899cd0214610f835780639d7432ca14610faf5780639f392eb314610fe1578063a22f239214610fe9578063a42ab3d214610ff1578063a5e90eee1461101d578063a93acac21461104b578063ab08c1c614611071578063ab2f3ad414611079578063ad1e4f8d1461109f578063ae3302c2146110c5578063b06423f3146110cd578063b136ca49146110d5578063b364accb146110fb578063c3c7b9e914611121578063c4f718bf14611147578063c65bc7b11461114f578063c7e074c314611175578063cc5b8144146111b5578063cea0c328146111e7578063cfad57a21461121d578063d2fa635e14611243578063d3127e6314611260578063d54d5a9f1461127d578063d66b000d146112dc578063d8f897c314611308578063d9ac42251461132e578063daf9c21014611336578063db3555fb1461135c578063db97495f14611382578063dc8f5fac146113ce578063de2ea948146113d6578063df73a2671461141e578063e124e6d214611426578063e468baf01461144c578063e67f59a714611469578063f07456ce1461148f578063f07bbf77146114b5578063f2555278146114d4578063f3ae241514611502578063f5b91b7b14611528578063f887ea4014611530578063fa12dbc014611538578063fce28c101461156a578063fed1a60614611572575b600080fd5b61055d6004803603602081101561054d57600080fd5b50356001600160a01b0316611604565b60408051918252519081900360200190f35b61055d611667565b61055d611678565b61055d6004803603604081101561059557600080fd5b506001600160a01b03813516906020013561167e565b61055d6116d1565b61055d6116d7565b6105c36116dd565b604080516001600160a01b039092168252519081900360200190f35b61055d6116ec565b61060d600480360360208110156105fd57600080fd5b50356001600160a01b03166116f2565b005b61055d611835565b61055d6004803603602081101561062d57600080fd5b503561183b565b61063c61187f565b604080519115158252519081900360200190f35b61055d6004803603602081101561066657600080fd5b50356001600160a01b031661188f565b61055d6004803603602081101561068c57600080fd5b50356001600160a01b03166118a1565b61060d600480360360208110156106b257600080fd5b503515156118b3565b61060d600480360360208110156106d157600080fd5b50356001600160a01b03166118d7565b61060d600480360360408110156106f757600080fd5b81359190810190604081016020820135600160201b81111561071857600080fd5b82018360208201111561072a57600080fd5b803590602001918460018302840111600160201b8311171561074b57600080fd5b509092509050611908565b61055d6004803603602081101561076c57600080fd5b50356001600160a01b031661198d565b61055d6004803603604081101561079257600080fd5b506001600160a01b0381351690602001356119a1565b61055d600480360360808110156107be57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013515156119e6565b61060d600480360360208110156107fc57600080fd5b50351515611a3c565b61055d611a5e565b61063c611a64565b61063c611a72565b61055d6004803603602081101561083357600080fd5b50356001600160a01b0316611a7b565b61060d600480360360e081101561085957600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a081013515159060c001351515611b2e565b61055d611c72565b61063c611c78565b61060d60048036036101208110156108b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e08101359061010001351515611c87565b61055d6004803603606081101561090857600080fd5b508035906001600160a01b0360208201358116916040013516611d41565b61063c6004803603602081101561093c57600080fd5b50356001600160a01b0316611de3565b61060d6004803603604081101561096257600080fd5b506001600160a01b0381351690602001351515611df8565b6109b86004803603608081101561099057600080fd5b506001600160a01b038135811691602081013582169160408201351690606001351515611e2b565b60408051921515835260208301919091528051918290030190f35b61060d600480360360a08110156109e957600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001351515611ec9565b6105c361229f565b610a5d60048036036080811015610a3557600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013515156122b5565b604080519889526020890197909752878701959095526060870193909352608086019190915260a0850152151560c084015260e083015251908190036101000190f35b61055d60048036036020811015610ab657600080fd5b50356001600160a01b03166123ab565b61055d6123bd565b61055d6123c3565b610af360048036036020811015610aec57600080fd5b50356123c9565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61055d60048036036080811015610b4157600080fd5b506001600160a01b038135811691602081013582169160408201351690606001351515612406565b61055d60048036036020811015610b7f57600080fd5b50356001600160a01b03166124ac565b61063c60048036036020811015610ba557600080fd5b50356001600160a01b03166124bd565b61055d60048036036020811015610bcb57600080fd5b50356001600160a01b03166124d2565b6109b8600480360360a0811015610bf157600080fd5b506001600160a01b03813516906020810135906040810135906060810135151590608001356124e4565b61060d60048036036020811015610c3157600080fd5b50356001600160a01b03166125de565b61063c60048036036040811015610c5757600080fd5b506001600160a01b03813581169160200135166126c1565b61055d6126e1565b61055d60048036036020811015610c8d57600080fd5b50356001600160a01b03166126e7565b61060d60048036036020811015610cb357600080fd5b50356001600160a01b03166126f9565b61055d612727565b61055d60048036036040811015610ce157600080fd5b506001600160a01b038135811691602001351661272e565b61060d60048036036020811015610d0f57600080fd5b50356001600160a01b031661294c565b61060d600480360360c0811015610d3557600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135612976565b6105c36129ed565b61055d6129fc565b61060d60048036036020811015610d8d57600080fd5b50351515612a02565b61055d60048036036040811015610dac57600080fd5b506001600160a01b0381358116916020013516612a26565b61055d60048036036020811015610dda57600080fd5b50356001600160a01b0316612c83565b61055d600480360360e0811015610e0057600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359160808201359160a081013515159160c09091013516612d2d565b61060d60048036036040811015610e5457600080fd5b506001600160a01b038135169060200135612dab565b61055d612dcf565b61055d60048036036020811015610e8857600080fd5b50356001600160a01b0316612dd4565b61060d60048036036060811015610eae57600080fd5b5080359060208101359060400135612de6565b61055d60048036036020811015610ed757600080fd5b50356001600160a01b0316612e2c565b61055d60048036036020811015610efd57600080fd5b50356001600160a01b0316612e3e565b61060d60048036036020811015610f2357600080fd5b50356001600160a01b0316612e50565b61063c612e84565b61055d60048036036060811015610f5157600080fd5b506001600160a01b038135811691602081013582169160409091013516612e93565b61055d61318c565b61055d61319c565b61055d60048036036040811015610f9957600080fd5b506001600160a01b0381351690602001356131a2565b61055d60048036036060811015610fc557600080fd5b506001600160a01b0381351690602081013590604001356131c4565b61063c61326d565b61055d613276565b61055d6004803603604081101561100757600080fd5b506001600160a01b03813516906020013561327c565b61060d6004803603604081101561103357600080fd5b506001600160a01b0381351690602001351515613299565b61055d6004803603602081101561106157600080fd5b50356001600160a01b03166132cc565b61063c6133c4565b61055d6004803603602081101561108f57600080fd5b50356001600160a01b03166133cd565b61055d600480360360208110156110b557600080fd5b50356001600160a01b03166133df565b61055d6133f1565b61063c6133f7565b61055d600480360360208110156110eb57600080fd5b50356001600160a01b0316613405565b6109b86004803603602081101561111157600080fd5b50356001600160a01b03166134a6565b61055d6004803603602081101561113757600080fd5b50356001600160a01b031661353e565b61055d613550565b61055d6004803603602081101561116557600080fd5b50356001600160a01b0316613556565b61055d600480360360a081101561118b57600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001351515613568565b61055d600480360360608110156111cb57600080fd5b506001600160a01b0381351690602081013590604001356136b3565b61060d600480360360608110156111fd57600080fd5b506001600160a01b03813581169160208101359091169060400135613707565b61060d6004803603602081101561123357600080fd5b50356001600160a01b0316613728565b61060d6004803603602081101561125957600080fd5b5035613752565b61060d6004803603602081101561127657600080fd5b503561375f565b6112c3600480360360a081101561129357600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013515159060800135151561377b565b6040805192835260208301919091528051918290030190f35b61060d600480360360408110156112f257600080fd5b506001600160a01b038135169060200135613a3b565b61055d6004803603602081101561131e57600080fd5b50356001600160a01b0316613a94565b61055d613aa6565b61063c6004803603602081101561134c57600080fd5b50356001600160a01b0316613aac565b61063c6004803603602081101561137257600080fd5b50356001600160a01b0316613ac1565b61055d600480360360e081101561139857600080fd5b506001600160a01b0381351690602081013590604081013590606081013515159060808101359060a08101359060c00135613ad6565b61055d613b67565b61060d600480360360a08110156113ec57600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013515159160809091013516613b6d565b61055d613f24565b61055d6004803603602081101561143c57600080fd5b50356001600160a01b0316613f2a565b6105c36004803603602081101561146257600080fd5b5035613fa1565b61060d6004803603602081101561147f57600080fd5b50356001600160a01b0316613fc8565b61055d600480360360208110156114a557600080fd5b50356001600160a01b031661409d565b61060d600480360360208110156114cb57600080fd5b503515156140af565b61055d600480360360408110156114ea57600080fd5b506001600160a01b03813581169160200135166140d5565b61063c6004803603602081101561151857600080fd5b50356001600160a01b031661412b565b6105c3614140565b6105c361414f565b61055d6004803603606081101561154e57600080fd5b506001600160a01b03813516906020810135906040013561415e565b61055d614198565b61158f6004803603602081101561158857600080fd5b503561419e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156115c95781810151838201526020016115b1565b50505050905090810190601f1680156115f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6001600160a01b0381166000908152602460205260408120548061162c576000915050611662565b6001600160a01b03831660009081526025602052604090205461165e90829061165890620f4240614239565b90614292565b9150505b919050565b6904ee2d6d415b85acef8160201b81565b601a5490565b60008161168d575060006116cb565b600061169884612c83565b6001600160a01b0385166000908152601c60205260409020549091506116c6600a82900a6116588685614239565b925050505b92915050565b600a5481565b61271081565b6005546001600160a01b031681565b60135481565b6001600160a01b03811660009081526029602052604090205461174457601154611726906117204282614292565b90614239565b6001600160a01b038216600090815260296020526040902055611832565b6011546001600160a01b038216600090815260296020526040902054429161176c91906142d1565b111561177757611832565b6000611782826132cc565b6001600160a01b0383166000908152602860205260409020549091506117a890826142d1565b6001600160a01b0383166000908152602860205260409020556011546117d2906117204282614292565b6001600160a01b03831660008181526029602090815260408083209490945560288152908390205483519283529082015281517fa146fc154e1913322e9817d49f0d5c37466c24326e15de10e739a948be815eab929181900390910190a1505b50565b60085481565b60008161184a57506000611662565b600061187361271061165861186c600e5461271061432990919063ffffffff16565b8690614239565b905061165e8382614329565b6015546301000000900460ff1681565b60226020526000908152604090205481565b602b6020526000908152604090205481565b6118bb61436b565b60158054911515620100000262ff000019909216919091179055565b3360009081526017602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b600154630100000090046001600160a01b0316331461196e576040805162461bcd60e51b815260206004820152601e60248201527f5661756c743a20696e76616c6964206572726f72436f6e74726f6c6c65720000604482015290519081900360640190fd5b6000838152602e60205260409020611987908383615984565b50505050565b60006116cb8261199c84613405565b61167e565b6000806119ad84613f2a565b905060006119cb826116588668327cb2734119d3b7a9601e1b614239565b6004549091506116c69082906001600160a01b031687611d41565b604080516001600160601b0319606096871b811660208084019190915295871b811660348301529390951b9092166048850152151560f81b605c8401528051603d818503018152605d9093019052815191012090565b611a4461436b565b600180549115156101000261ff0019909216919091179055565b600e5481565b600154610100900460ff1681565b60015460ff1681565b60048054604080516318160ddd60e01b8152905160009384936001600160a01b0316926318160ddd9281830192602092829003018186803b158015611abf57600080fd5b505afa158015611ad3573d6000803e3d6000fd5b505050506040513d6020811015611ae957600080fd5b5051905080611afc576000915050611662565b6001600160a01b038316600090815260216020526040902054601454611b26906116588385614239565b949350505050565b611b3661436b565b6001600160a01b0387166000908152601b602052604090205460ff16611bb357600654611b649060016142d1565b600655601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319166001600160a01b0389161790555b6014546001600160a01b038816600090815260216020526040902054611bda908290614329565b6001600160a01b0389166000908152601b602090815260408083208054600160ff1991821617909155601c83528184208c9055602183528184208b9055601d83528184208a905560238352818420899055601e835281842080548216891515179055601f90925290912080549091168415151790559050611c5b81876142d1565b601455611c6788613f2a565b505050505050505050565b60165481565b60015462010000900460ff1681565b611c8f61436b565b611c9f6101f48a11156003614386565b611caf6101f48911156004614386565b611cbf6101f48811156005614386565b611ccf6101f48711156006614386565b611cdf6101f48611156007614386565b611cef6101f48511156008614386565b611d0a6904ee2d6d415b85acef8160201b8411156009614386565b600998909855600a96909655600b94909455600c92909255600d55600e55600855600f556010805460ff1916911515919091179055565b60045460009081906001600160a01b03858116911614611d79576001600160a01b0384166000908152601c6020526040902054611d7c565b60125b6004549091506000906001600160a01b03858116911614611db5576001600160a01b0384166000908152601c6020526040902054611db8565b60125b9050611dd782600a0a61165883600a0a8961423990919063ffffffff16565b925050505b9392505050565b601e6020526000908152604090205460ff1681565b611e0061436b565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b6000806000611e3c878787876119e6565b9050611e46615a02565b506000818152602a6020908152604091829020825160e081018452815480825260018301549382019390935260028201549381018490526003820154606082015260048201546080820152600582015460a082015260069091015460c082018190529092611eba92899290919089906124e4565b93509350505094509492505050565b60026000541415611f0f576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055600154611f2b9062010000900460ff16601c614386565b611f33614432565b611f3c8561444e565b611f478484836144ae565b611f50846116f2565b6000611f5e868686856119e6565b6000818152602a6020526040812091925083611f8257611f7d86612c83565b611f8b565b611f8b86613f2a565b8254909150611f9c57600282018190555b815415801590611fac5750600085115b15611fd257611fcc868360000154846002015487858a8860060154613ad6565b60028301555b6000611fe88887856000015486600301546145c4565b90506000611ff589614676565b905060006120038a8361167e565b600186015490915061201590826142d1565b6001860181905561202a90841115601d614386565b60018501546120399084614329565b60018601556001600160a01b038a166000908152602860205260409020546003860155845461206890896142d1565b80865542600687015561207e901515601e614386565b61209085600001548660010154614720565b61209e8b8b8b8a600161377b565b505060006120ac8b8a61327c565b60048701549091506120be90826142d1565b60048701556120cd8b82614744565b8715612112576120e68b6120e18b876142d1565b6147e4565b6120f08b83614863565b6120fa8b846148e2565b61210d8b6121088d876131a2565b6149f9565b6121b1565b6001600160a01b038a166000908152602c602052604090205461214f576001600160a01b038a166000908152602d60205260409020859055612174565b61215a8a868b6131c4565b6001600160a01b038b166000908152602d60205260409020555b6001600160a01b038a166000908152602c6020526040902054612197908a6142d1565b6001600160a01b038b166000908152602c60205260409020555b604080518881526001600160a01b03808f166020830152808e16828401528c1660608201526080810184905260a081018b905289151560c082015260e08101879052610100810186905290517f2fe68525253654c21998f35787a8d0f361905ef647c854092430ab65f2f15022918190036101200190a1855460018701546002880154600389015460048a015460058b0154604080518e81526020810197909752868101959095526060860193909352608085019190915260a084015260c083015251600080516020615a958339815191529181900360e00190a15050600160005550505050505050505050565b600154630100000090046001600160a01b031681565b60008060008060008060008060006122cf8d8d8d8d6119e6565b90506122d9615a02565b602a60008381526020019081526020016000206040518060e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090506000808260a0015113612359578160a0015160000361235f565b8160a001515b9050816000015182602001518360400151846060015185608001518560008860a0015112158860c001519a509a509a509a509a509a509a509a5050505094995094995094999196509450565b60266020526000908152604090205481565b6101f481565b600b5481565b602a602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b600080612415868686866119e6565b905061241f615a02565b506000818152602a6020908152604091829020825160e0810184528154815260018201549281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c08301526124899015156025614386565b602081015181516124a1919061165890612710614239565b979650505050505050565b602080526000908152604090205481565b60186020526000908152604090205460ff1681565b60246020526000908152604090205481565b6000806124f5600086116026614386565b60008461250a5761250588613f2a565b612513565b61251388612c83565b9050600081871161252d576125288288614329565b612537565b6125378783614329565b90506000612549886116588b85614239565b90506000871561255c5750878311612561565b508288115b6000612578600f54896142d190919063ffffffff16565b421161259c576001600160a01b038c166000908152601d602052604090205461259f565b60005b90508180156125c257506125b38b82614239565b6125bf84612710614239565b11155b156125cc57600092505b509450925050505b9550959350505050565b60026000541415612624576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b600260009081556001600160a01b0382168152601b602052604090205461264f9060ff16600e614386565b600061265a82614676565b905061266a60008211600f614386565b61267482826148e2565b604080516001600160a01b03841681526020810183905281517fa5a389190ebf6170a133bda5c769b77f4d6715b8aa172ec0ddf8473d0b4944bd929181900390910190a150506001600055565b601760209081526000928352604080842090915290825290205460ff1681565b60065481565b602d6020526000908152604090205481565b3360009081526017602090815260408083206001600160a01b0394909416835292905220805460ff19169055565b620f424081565b600060026000541415612776576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055612783614acc565b6001600160a01b0383166000908152601b60205260409020546127aa9060ff166013614386565b6015805461ff0019166101001790556004546000906127d1906001600160a01b0316614676565b90506127e1600082116014614386565b6127ea846116f2565b60006127f685836119a1565b9050612806600082116015614386565b6128108583614afb565b61281a85826149f9565b6004805460408051632770a7eb60e21b8152309381019390935260248301859052516001600160a01b0390911691639dc29fac91604480830192600092919082900301818387803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b505060045461289c92506001600160a01b03169050614bb9565b60006128b08684600b546009546000613568565b905060006128bf878484614c53565b90506128cf600082116016614386565b6128da878288614d1b565b604080516001600160a01b03808916825289166020820152808201869052606081018390526080810184905290517fd732b7828fa6cee72c285eac756fc66a7477e3dc22e22e7c432f1c265d40b4839181900360a00190a16015805461ff001916905560016000559695505050505050565b61295461436b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61297e61436b565b600180546129929160ff9091161590614386565b6001805460ff191681179055600280546001600160a01b03199081166001600160a01b039889161790915560048054821696881696909617909555600380549095169390951692909217909255600891909155601255601355565b6003546001600160a01b031681565b60095481565b612a0a61436b565b60018054911515620100000262ff000019909216919091179055565b600060026000541415612a6e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055612a7b614acc565b6001600160a01b0383166000908152601b6020526040902054612aa29060ff166010614386565b6015805461ff0019166101001790556000612abc84614676565b9050612acc600082116011614386565b612ad5846116f2565b6000612ae085612c83565b90506000612afe68327cb2734119d3b7a9601e1b6116588585614239565b600454909150612b1a90829088906001600160a01b0316611d41565b9050612b2a600082116012614386565b6000612b3e8783600b546009546001613568565b90506000612b4d888684614c53565b90506000612b6b68327cb2734119d3b7a9601e1b6116588488614239565b600454909150612b879082908b906001600160a01b0316611d41565b9050612b938982614dc1565b612b9d89836148e2565b60048054604080516340c10f1960e01b81526001600160a01b038c81169482019490945260248101859052905192909116916340c10f199160448082019260009290919082900301818387803b158015612bf657600080fd5b505af1158015612c0a573d6000803e3d6000fd5b5050604080516001600160a01b03808d1682528d1660208201528082018a9052606081018590526080810187905290517fab4c77c74cd32c85f35416cf03e7ce9e2d4387f7b7f2c1f4bf53daaecf8ea72d93509081900360a0019150a16015805461ff0019169055600160005598975050505050505050565b600354601554604080516317e1d38560e11b81526001600160a01b03858116600483015260006024830181905260ff8086161515604485015261010090950490941615156064830152915192939190911691632fc3a70a91608480820192602092909190829003018186803b158015612cfb57600080fd5b505afa158015612d0f573d6000803e3d6000fd5b505050506040513d6020811015612d2557600080fd5b505192915050565b600060026000541415612d75576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055612d82614432565b612d8b8861444e565b612d9a88888888888888614e7f565b600160005598975050505050505050565b612db361436b565b6001600160a01b03909116600090815260266020526040902055565b601281565b601d6020526000908152604090205481565b612dee61436b565b612dfe610e10841015600a614386565b612e0e612710831115600b614386565b612e1e612710821115600c614386565b601192909255601255601355565b602c6020526000908152604090205481565b601c6020526000908152604090205481565b612e5861436b565b600180546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60155462010000900460ff1681565b600060026000541415612edb576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055600154612ef690610100900460ff166017614386565b6001600160a01b0384166000908152601b6020526040902054612f1d9060ff166018614386565b6001600160a01b0383166000908152601b6020526040902054612f449060ff166019614386565b612f64836001600160a01b0316856001600160a01b03161415601a614386565b6015805461ff001916610100179055612f7c846116f2565b612f85836116f2565b6000612f9085614676565b9050612fa060008211601b614386565b6000612fab86612c83565b90506000612fb886613f2a565b90506000612fca826116588686614239565b9050612fd7818989611d41565b90506000612ff568327cb2734119d3b7a9601e1b6116588787614239565b6004549091506130119082908b906001600160a01b0316611d41565b6001600160a01b038a166000908152601e60205260408120549192509060ff16801561305557506001600160a01b0389166000908152601e602052604090205460ff165b90506000808261306757600c5461306b565b600d545b905060008361307c57600954613080565b600a545b905060006130928e8785856001613568565b905060006130a48e8886866000613568565b90508082116130b357806130b5565b815b94505050505060006130c88b8684614c53565b90506130d48c85614dc1565b6130de8b85614afb565b6130e88c896148e2565b6130f28b866149f9565b6130fb8b615277565b6131068b828c614d1b565b604080516001600160a01b03808d168252808f1660208301528d1681830152606081018a90526080810187905260a0810183905260c0810184905290517f0874b2d545cb271cdbda4e093020c452328b24af12382ed62c4d00f5c26709db9181900360e00190a16015805461ff001916905560016000559b9a5050505050505050505050565b68327cb2734119d3b7a9601e1b81565b60115481565b6000816131b1575060006116cb565b611ddc83836131bf86613f2a565b61415e565b6001600160a01b0383166000908152602c6020908152604080832054602d909252822054828582116131ff576131fa8683614329565b613209565b6132098287614329565b9050600061321b836116588685614239565b9050868311600061322c86896142d1565b90506000826132445761323f82856142d1565b61324e565b61324e8285614329565b905061325e816116588c85614239565b9b9a5050505050505050505050565b60105460ff1681565b600c5481565b60008161328b575060006116cb565b611ddc83836131bf86612c83565b6132a161436b565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6011546001600160a01b038216600090815260296020526040812054909142916132f5916142d1565b111561330357506000611662565b6011546001600160a01b038316600090815260296020526040812054909161333091611658904290614329565b6001600160a01b0384166000908152602460205260409020549091508061335c57600092505050611662565b6001600160a01b0384166000908152601e602052604081205460ff1661338457601254613388565b6013545b6001600160a01b0386166000908152602560205260409020549091506133bb908390611658908690611720908690614239565b95945050505050565b60155460ff1681565b60216020526000908152604090205481565b60236020526000908152604090205481565b60075481565b601554610100900460ff1681565b6001600160a01b0381166000908152601e602052604081205460ff161561344557506001600160a01b038116600090815260246020526040902054611662565b6001600160a01b0382166000908152602760205260408120546134699084906131a2565b6001600160a01b03841660009081526025602090815260408083205460249092529091205491925061165e916134a09084906142d1565b90614329565b6001600160a01b0381166000908152602c60205260408120548190806134d3576000809250925050613539565b60006134de85613f2a565b6001600160a01b0386166000908152602d60205260408120549192508282116135105761350b8383614329565b61351a565b61351a8284614329565b9050600061352c836116588785614239565b9390921195509193505050505b915091565b60256020526000908152604090205481565b60125481565b60286020526000908152604090205481565b60105460009060ff1661357c5750826133bb565b6001600160a01b038616600090815260226020526040812054906135a082886142d1565b9050836135c3578187116135bd576135b88288614329565b6135c0565b60005b90505b60006135ce89611a7b565b9050806135e0578693505050506133bb565b60008184116135f8576135f38285614329565b613602565b6136028483614329565b9050600082841161361c576136178385614329565b613626565b6136268484614329565b905081811015613668576000613640846116588b86614239565b9050898111613658576136538a82614329565b61365b565b60005b96505050505050506133bb565b6000613679600261165885856142d1565b9050838111156136865750825b6000613696856116588c85614239565b90506136a28b826142d1565b9d9c50505050505050505050505050565b6000826136c257506000611ddc565b6001600160a01b0384166000908152602860205260408120546136e59084614329565b9050806136f6576000915050611ddc565b6133bb620f42406116588684614239565b61370f61436b565b6137236001600160a01b03831684836152ec565b505050565b61373061436b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b61375a61436b565b601655565b61376761436b565b61377661271082116002614386565b600755565b600080600061378c888888886119e6565b9050613796615a02565b506000818152602a60209081526040808320815160e081018352815480825260018301549482019490945260028201549281018390526003820154606082015260048201546080820152600582015460a082015260069091015460c08201819052909392839261380b928c9291908c906124e4565b9150915060006138248b856000015186606001516136b3565b905061383d613836856000015161183b565b82906142d1565b9050821580156138505750818460200151105b156138b85787156138a8576040805162461bcd60e51b815260206004820152601f60248201527f5661756c743a206c6f737365732065786365656420636f6c6c61746572616c00604482015290519081900360640190fd5b6001965094506125d49350505050565b6020840151836138d45760208501516138d19084614329565b90505b8181101561394057881561392f576040805162461bcd60e51b815260206004820152601d60248201527f5661756c743a20666565732065786365656420636f6c6c61746572616c000000604482015290519081900360640190fd5b6001975095506125d4945050505050565b60085461394e9083906142d1565b8110156139a35788156139925760405162461bcd60e51b8152600401808060200182810382526029815260200180615ab56029913960400191505060405180910390fd5b506001965094506125d49350505050565b84516139b190612710614239565b6007546139bf908390614239565b1015613a27578815613a16576040805162461bcd60e51b815260206004820152601b60248201527a15985d5b1d0e881b585e13195d995c9859d948195e18d959591959602a1b604482015290519081900360640190fd5b506002965094506125d49350505050565b5060009c909b509950505050505050505050565b613a4361436b565b6001600160a01b03821660009081526022602052604090205480821115613a7d57613a7783613a728484614329565b614dc1565b50613a90565b61372383613a8b8385614329565b614afb565b5050565b60296020526000908152604090205481565b600f5481565b601b6020526000908152604090205460ff1681565b601f6020526000908152604090205460ff1681565b6000806000613ae88a8a8a8a886124e4565b90925090506000613af98a876142d1565b905060008815613b285783613b1757613b128284614329565b613b21565b613b2182846142d1565b9050613b49565b83613b3c57613b3782846142d1565b613b46565b613b468284614329565b90505b613b57816116588a85614239565b9c9b505050505050505050505050565b60145481565b60026000541415613bb3576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b60026000556015546301000000900460ff1615613be85733600090815260186020526040902054613be89060ff166022614386565b6015805460ff19169055613bfb846116f2565b6000613c09868686866119e6565b9050613c13615a02565b506000818152602a6020908152604091829020825160e08101845281548082526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c0830152613c7f9015156023614386565b600080613c9089898989600061377b565b91509150613ca382600014156024614386565b8160021415613cca57613cc0898989600087600001518b8f614e7f565b5050505050613f18565b6000613cd689836131a2565b6001600160a01b038a166000908152602b6020526040902054909150613cfc90826142d1565b6001600160a01b038a166000818152602b60209081526040918290209390935580519182529181018490528082018390529051600080516020615b498339815191529181900360600190a1613d5589856080015161533e565b8615613d845760208401518451613d76918b91613d7191614329565b614863565b613d84896121088b856131a2565b600087613d9957613d9489613f2a565b613da2565b613da289612c83565b90507f2e1f85a64a2f22cf2f0c42584e7c919ed4abe8d53675cff0f62bf1e95a1c676f868c8c8c8c8a600001518b602001518c608001518d60a001518a604051808b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001886001600160a01b0316815260200187151581526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a187158015613e615750846020015183105b15613e8f576020850151600090613e789085614329565b9050613e8d8b613e888d846131a2565b6148e2565b505b87613ea257613ea28986600001516153f3565b6000868152602a60205260408120818155600181018290556002810182905560038101829055600481018290556005810182905560060155600854613eee908b906121089082906131a2565b613f048a613efe8c6008546131a2565b89614d1b565b50506015805460ff19166001179055505050505b50506001600055505050565b600d5481565b600354601554604080516317e1d38560e11b81526001600160a01b0385811660048301526001602483015260ff808516151560448401526101009094049093161515606482015290516000939290921691632fc3a70a91608480820192602092909190829003018186803b158015612cfb57600080fd5b601a8181548110613fae57fe5b6000918252602090912001546001600160a01b0316905081565b613fd061436b565b6001600160a01b0381166000908152601b6020526040902054613ff79060ff16600d614386565b6001600160a01b03811660009081526021602052604090205460145461401c91614329565b6014556001600160a01b0381166000908152601b60209081526040808320805460ff19908116909155601c835281842084905560218352818420849055601d835281842084905560238352818420849055601e8352818420805482169055601f90925290912080549091169055600654614097906001614329565b60065550565b60276020526000908152604090205481565b6140b761436b565b6015805491151563010000000263ff00000019909216919091179055565b60006140df61436b565b6001600160a01b0383166000908152602b6020526040902054806141075760009150506116cb565b6001600160a01b0384166000908152602b6020526040812055611ddc848285614d1b565b60196020526000908152604090205460ff1681565b6004546001600160a01b031681565b6002546001600160a01b031681565b60008261416d57506000611ddc565b6001600160a01b0384166000908152601c60205260409020546133bb8361165886600a85900a614239565b610e1081565b602e6020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156142315780601f1061420657610100808354040283529160200191614231565b820191906000526020600020905b81548152906001019060200180831161421457829003601f168201915b505050505081565b600082614248575060006116cb565b8282028284828161425557fe5b0414611ddc5760405162461bcd60e51b8152600401808060200182810382526021815260200180615ade6021913960400191505060405180910390fd5b6000611ddc83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061545b565b600082820183811015611ddc576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b6000611ddc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154fd565b600554614384906001600160a01b031633146035614386565b565b6000818152602e60205260409020826137235760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156144235780601f106143f857610100808354040283529160200191614423565b820191906000526020600020905b81548152906001019060200180831161440657829003601f168201915b50509250505060405180910390fd5b60165461443e57614384565b6143846016543a11156037614386565b336001600160a01b038216141561446457611832565b6002546001600160a01b031633141561447c57611832565b6001600160a01b03811660009081526017602090815260408083203384529091529020546118329060ff166029614386565b8015614527576144d3826001600160a01b0316846001600160a01b031614602a614386565b6001600160a01b0383166000908152601b60205260409020546144fa9060ff16602b614386565b6001600160a01b0383166000908152601e60205260409020546145229060ff1615602c614386565b613723565b6001600160a01b0383166000908152601b602052604090205461454e9060ff16602d614386565b6001600160a01b0383166000908152601e60205260409020546145759060ff16602e614386565b6001600160a01b0382166000908152601e602052604090205461459d9060ff1615602f614386565b6001600160a01b0382166000908152601f60205260409020546137239060ff166030614386565b6000806145d08561183b565b905060006145df8786866136b3565b90506145eb82826142d1565b915060006145f988846131a2565b6001600160a01b0389166000908152602b602052604090205490915061461f90826142d1565b6001600160a01b0389166000818152602b60209081526040918290209390935580519182529181018590528082018390529051600080516020615b498339815191529181900360600190a150909695505050505050565b6001600160a01b0381166000818152602080805260408083205481516370a0823160e01b8152306004820152915193949093859391926370a08231926024808301939192829003018186803b1580156146ce57600080fd5b505afa1580156146e2573d6000803e3d6000fd5b505050506040513d60208110156146f857600080fd5b50516001600160a01b038516600090815260208052604090208190559050611b268183614329565b816147365761473181156027614386565b613a90565b613a90818310156028614386565b6001600160a01b03821660009081526025602052604090205461476790826142d1565b6001600160a01b03831660009081526025602081815260408084208590556024825290922054915261479c9111156034614386565b604080516001600160a01b03841681526020810183905281517faa5649d82f5462be9d19b0f2b31a59b2259950a6076550bac9f3a1c07db9f66d929181900390910190a15050565b6001600160a01b03821660009081526027602052604090205461480790826142d1565b6001600160a01b03831660008181526027602090815260409182902093909355805191825291810183905281517fd9d4761f75e0d0103b5cbeab941eeb443d7a56a35b5baf2a0787c03f03f4e474929181900390910190a15050565b6001600160a01b0382166000908152602760205260409020546148869082614329565b6001600160a01b03831660008181526027602090815260409182902093909355805191825291810183905281517f34e07158b9db50df5613e591c44ea2ebc82834eff4a4dc3a46e000e608261d68929181900390910190a15050565b6001600160a01b03821660009081526024602052604090205461490590826142d1565b6001600160a01b03831660008181526024602081815260408084209590955584516370a0823160e01b8152306004820152945192946370a0823193818401939091829003018186803b15801561495a57600080fd5b505afa15801561496e573d6000803e3d6000fd5b505050506040513d602081101561498457600080fd5b50516001600160a01b0384166000908152602460205260409020549091506149b0908210156031614386565b604080516001600160a01b03851681526020810184905281517f976177fbe09a15e5e43f848844963a42b41ef919ef17ff21a17a5421de8f4737929181900390910190a1505050565b604080518082018252601a81527915985d5b1d0e881c1bdbdb105b5bdd5b9d08195e18d95959195960321b6020808301919091526001600160a01b038516600090815260249091529190912054614a519183906154fd565b6001600160a01b03831660009081526024602090815260408083208490556025909152902054614a849110156032614386565b604080516001600160a01b03841681526020810183905281517f112726233fbeaeed0f5b1dba5cb0b2b81883dee49fb35ff99fd98ed9f6d31eb0929181900390910190a15050565b60155462010000900460ff161561438457336000908152601960205260409020546143849060ff166036614386565b6001600160a01b038216600090815260226020526040902054818111614b64576001600160a01b038316600081815260226020908152604080832092909255815192835282018390528051600080516020615aff8339815191529281900390910190a150613a90565b614b6e8183614329565b6001600160a01b0384166000818152602260209081526040918290209390935580519182529181018490528151600080516020615aff833981519152929181900390910190a1505050565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614c0857600080fd5b505afa158015614c1c573d6000803e3d6000fd5b505050506040513d6020811015614c3257600080fd5b50516001600160a01b03909216600090815260208052604090209190915550565b600080614c70612710611658614c698287614329565b8790614239565b90506000614c7e8583614329565b6001600160a01b0387166000908152602b6020526040902054909150614ca490826142d1565b6001600160a01b0387166000908152602b60205260409020557f47cd9dda0e50ce30bcaaacd0488452b596221c07ac402a581cfae4d3933cac2b86614ce9818461167e565b604080516001600160a01b0390931683526020830191909152818101849052519081900360600190a150949350505050565b614d2f6001600160a01b03841682846152ec565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015614d7557600080fd5b505afa158015614d89573d6000803e3d6000fd5b505050506040513d6020811015614d9f57600080fd5b50516001600160a01b0390931660009081526020805260409020929092555050565b6001600160a01b038216600090815260226020526040902054614de490826142d1565b6001600160a01b0383166000908152602260209081526040808320939093556023905220548015614e36576001600160a01b038316600090815260226020526040902054614e36908210156033614386565b604080516001600160a01b03851681526020810184905281517f64243679a443432e2293343b77d411ff6144370404618f00ca0d2025d9ca9882929181900390910190a1505050565b6000614e8a876116f2565b6000614e98898989876119e6565b6000818152602a60205260409020805491925090614eb9901515601f614386565b614ecb86826000015410156020614386565b614edd87826001015410156021614386565b600181015481546004830154600091614efa91611658908b614239565b6004840154909150614f0c9082614329565b6004840155614f1b8b8261533e565b50600080614f2d8d8d8d8d8d8d615557565b8554919350915089146150b3576001600160a01b038c1660009081526028602052604090205460038501558354614f64908a614329565b8085556001850154614f769190614720565b614f848d8d8d8b600161377b565b50508715614fb157614fa78c6120e186600101548661432990919063ffffffff16565b614fb18c8a614863565b600088614fc657614fc18c613f2a565b614fcf565b614fcf8c612c83565b9050600080516020615a75833981519152868f8f8f8f8f8f88614ff28c8c614329565b60408051998a526001600160a01b0398891660208b015296881689880152949096166060880152608087019290925260a0860152151560c085015260e084019290925261010083019190915251908190036101200190a18454600186015460028701546003880154600489015460058a0154604080518d81526020810197909752868101959095526060860193909352608085019190915260a084015260c083015251600080516020615a958339815191529181900360e00190a150615215565b87156150cd576150c38c846147e4565b6150cd8c8a614863565b6000886150e2576150dd8c613f2a565b6150eb565b6150eb8c612c83565b9050600080516020615a75833981519152868f8f8f8f8f8f8861510e8c8c614329565b60408051998a526001600160a01b0398891660208b015296881689880152949096166060880152608087019290925260a0860152151560c085015260e084019290925261010083019190915251908190036101200190a18454600186015460028701546003880154600489015460058a0154604080518d81526020810197909752868101959095526060860193909352608085019190915260a084015260c0830152517f73af1d417d82c240fdb6d319b34ad884487c6bf2845d98980cc52ad9171cb4559181900360e00190a1506000858152602a602052604081208181556001810182905560028101829055600381018290556004810182905560058101829055600601555b87615224576152248b8a6153f3565b811561526457871561523e5761523e8c6121088e856131a2565b600061524a8d836131a2565b90506152578d828a614d1b565b95506124a1945050505050565b5060009c9b505050505050505050505050565b6001600160a01b0381166000908152602660209081526040808320546024909252909120541015611832576040805162461bcd60e51b815260206004820152601a6024820152792b30bab63a1d103837b7b620b6b7bab73a101e10313ab33332b960311b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261372390849061574c565b604080518082018252601b81527a5661756c743a20696e73756666696369656e74207265736572766560281b6020808301919091526001600160a01b0385166000908152602590915291909120546153979183906154fd565b6001600160a01b03831660008181526025602090815260409182902093909355805191825291810183905281517f533cb5ed32be6a90284e96b5747a1bfc2d38fdb5768a6b5f67ff7d62144ed67b929181900390910190a15050565b6001600160a01b0382166000908152602c60205260409020548082111561543357506001600160a01b0382166000908152602c6020526040812055613a90565b61543d8183614329565b6001600160a01b0384166000908152602c6020526040902055505050565b600081836154e75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156154ac578181015183820152602001615494565b50505050905090810190601f1680156154d95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816154f357fe5b0495945050505050565b6000818484111561554f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156154ac578181015183820152602001615494565b505050900390565b6000806000615568898989876119e6565b6000818152602a60205260408120805460038201549394509092615590918c918a91906145c4565b90506000806000806155b18d876000015488600201548d8a600601546124e4565b875491955085935091506155c9906116588d84614239565b9250505060008280156155dc5750600082115b1561560c575060058401805482019055808861560c5760006155fe8e846131a2565b905061560a8e826149f9565b505b8215801561561a5750600082115b1561565e57600185015461562e9083614329565b6001860155886156525760006156448e846131a2565b90506156508e826148e2565b505b60058501805483900390555b8a156156865761566e818c6142d1565b6001860154909150615680908c614329565b60018601555b84548a14156156a957600185015461569f9082906142d1565b6000600187015590505b80848111156156c3576156bc8286614329565b90506156f7565b60018601546156d29086614329565b600187015589156156f75760006156e98f876131a2565b90506156f58f826149f9565b505b60408051888152851515602082015280820185905290517f3ff41bdde87755b687ae83d0221a232b6be51a803330ed9661c1b5d0105e0d8a9181900360600190a1909e909d509b505050505050505050505050565b60606157a1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166157fd9092919063ffffffff16565b805190915015613723578080602001905160208110156157c057600080fd5b50516137235760405162461bcd60e51b815260040180806020018281038252602a815260200180615b1f602a913960400191505060405180910390fd5b6060611b2684846000858561581185615918565b615862576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106158a15780518252601f199092019160209182019101615882565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615903576040519150601f19603f3d011682016040523d82523d6000602084013e615908565b606091505b50915091506124a182828661591e565b3b151590565b6060831561592d575081611ddc565b82511561593d5782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156154ac578181015183820152602001615494565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106159c55782800160ff198235161785556159f2565b828001600101855582156159f2579182015b828111156159f25782358255916020019190600101906159d7565b506159fe929150615a3f565b5090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156159fe5760008155600101615a4056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0093d75d64d1f84fc6f430a64fc578bdd4c1e090e90ea2d51773e626d19de56d3025e8a331a7394a9f09862048843323b00bdbada258f524f5ce624a45bf00aabb5661756c743a206c69717569646174696f6e20666565732065786365656420636f6c6c61746572616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77e1e812596aac93a06ecc4ca627014d18e30f5c33b825160cc9d5c0ba61e452275361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645d0c0019d3d45fadeb74eff9d2c9924d146d000ac6bcf3c28bf0ac3c9baa011aa2646970667358221220228994fceccc81f6ccb2826931d9c6f81c91d3e29057a3bc4c057367e22010a264736f6c634300060c0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106105325760003560e01c806304fef1db1461053757806307c587521461056f5780630842b076146105775780630a48d5a91461057f57806310eb56c2146105ab578063126082cf146105b357806312d43a51146105bb578063134ca63b146105df57806313f1e736146105e7578063174d26941461060f57806317bbf25c14610617578063181e210e146106345780631aa4ace5146106505780631ce9cb8f1461067657806324b0c04d1461069c57806324ca984e146106bb57806328e67be5146106e157806329ff9615146107565780632c668ec11461077c5780632d4b0576146107a857806330455ede146107e6578063318bc6891461080557806334c1557d146105b3578063351a964d1461080d578063392e53cd146108155780633a05dcc11461081d5780633c5a6e35146108435780633de39c11146108915780633e72a2621461089957806340eb3802146108a157806342152873146108f257806342b60b03146109265780634453a3741461094c57806345a6f3701461097a57806348d91abf146109d357806348f35cbb14610a175780634a3f088d14610a1f5780634a993ee914610aa05780634befe2ca14610ac65780634d47b30414610ace578063514ea4bf14610ad657806351723e8214610b2b578063523fba7f14610b69578063529a356f14610b8f57806352f55eed14610bb55780635c07eaab14610bdb5780635f7bc11914610c1b5780636092219914610c4157806362287a3214610c6f5780636274980314610c775780636ae0b15414610c9d5780636be6026b14610cc3578063711e619014610ccb578063724e78da14610cf9578063728cdbca14610d1f578063741bef1a14610d675780637a210a2b14610d6f5780637c2eb9f714610d77578063817bb85714610d9657806381a612d614610dc457806382a0849014610dea5780638585f4d214610e3e578063870d917c14610e6a57806388b1fbdf14610e725780638a27d46814610e985780638a39735a146105b35780638a78daa814610ec15780638ee573ac14610ee75780638f7b840414610f0d5780639060b1ca14610f335780639331621214610f3b57806395082d2514610f735780639849e41214610f7b5780639899cd0214610f835780639d7432ca14610faf5780639f392eb314610fe1578063a22f239214610fe9578063a42ab3d214610ff1578063a5e90eee1461101d578063a93acac21461104b578063ab08c1c614611071578063ab2f3ad414611079578063ad1e4f8d1461109f578063ae3302c2146110c5578063b06423f3146110cd578063b136ca49146110d5578063b364accb146110fb578063c3c7b9e914611121578063c4f718bf14611147578063c65bc7b11461114f578063c7e074c314611175578063cc5b8144146111b5578063cea0c328146111e7578063cfad57a21461121d578063d2fa635e14611243578063d3127e6314611260578063d54d5a9f1461127d578063d66b000d146112dc578063d8f897c314611308578063d9ac42251461132e578063daf9c21014611336578063db3555fb1461135c578063db97495f14611382578063dc8f5fac146113ce578063de2ea948146113d6578063df73a2671461141e578063e124e6d214611426578063e468baf01461144c578063e67f59a714611469578063f07456ce1461148f578063f07bbf77146114b5578063f2555278146114d4578063f3ae241514611502578063f5b91b7b14611528578063f887ea4014611530578063fa12dbc014611538578063fce28c101461156a578063fed1a60614611572575b600080fd5b61055d6004803603602081101561054d57600080fd5b50356001600160a01b0316611604565b60408051918252519081900360200190f35b61055d611667565b61055d611678565b61055d6004803603604081101561059557600080fd5b506001600160a01b03813516906020013561167e565b61055d6116d1565b61055d6116d7565b6105c36116dd565b604080516001600160a01b039092168252519081900360200190f35b61055d6116ec565b61060d600480360360208110156105fd57600080fd5b50356001600160a01b03166116f2565b005b61055d611835565b61055d6004803603602081101561062d57600080fd5b503561183b565b61063c61187f565b604080519115158252519081900360200190f35b61055d6004803603602081101561066657600080fd5b50356001600160a01b031661188f565b61055d6004803603602081101561068c57600080fd5b50356001600160a01b03166118a1565b61060d600480360360208110156106b257600080fd5b503515156118b3565b61060d600480360360208110156106d157600080fd5b50356001600160a01b03166118d7565b61060d600480360360408110156106f757600080fd5b81359190810190604081016020820135600160201b81111561071857600080fd5b82018360208201111561072a57600080fd5b803590602001918460018302840111600160201b8311171561074b57600080fd5b509092509050611908565b61055d6004803603602081101561076c57600080fd5b50356001600160a01b031661198d565b61055d6004803603604081101561079257600080fd5b506001600160a01b0381351690602001356119a1565b61055d600480360360808110156107be57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013515156119e6565b61060d600480360360208110156107fc57600080fd5b50351515611a3c565b61055d611a5e565b61063c611a64565b61063c611a72565b61055d6004803603602081101561083357600080fd5b50356001600160a01b0316611a7b565b61060d600480360360e081101561085957600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a081013515159060c001351515611b2e565b61055d611c72565b61063c611c78565b61060d60048036036101208110156108b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e08101359061010001351515611c87565b61055d6004803603606081101561090857600080fd5b508035906001600160a01b0360208201358116916040013516611d41565b61063c6004803603602081101561093c57600080fd5b50356001600160a01b0316611de3565b61060d6004803603604081101561096257600080fd5b506001600160a01b0381351690602001351515611df8565b6109b86004803603608081101561099057600080fd5b506001600160a01b038135811691602081013582169160408201351690606001351515611e2b565b60408051921515835260208301919091528051918290030190f35b61060d600480360360a08110156109e957600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001351515611ec9565b6105c361229f565b610a5d60048036036080811015610a3557600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013515156122b5565b604080519889526020890197909752878701959095526060870193909352608086019190915260a0850152151560c084015260e083015251908190036101000190f35b61055d60048036036020811015610ab657600080fd5b50356001600160a01b03166123ab565b61055d6123bd565b61055d6123c3565b610af360048036036020811015610aec57600080fd5b50356123c9565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61055d60048036036080811015610b4157600080fd5b506001600160a01b038135811691602081013582169160408201351690606001351515612406565b61055d60048036036020811015610b7f57600080fd5b50356001600160a01b03166124ac565b61063c60048036036020811015610ba557600080fd5b50356001600160a01b03166124bd565b61055d60048036036020811015610bcb57600080fd5b50356001600160a01b03166124d2565b6109b8600480360360a0811015610bf157600080fd5b506001600160a01b03813516906020810135906040810135906060810135151590608001356124e4565b61060d60048036036020811015610c3157600080fd5b50356001600160a01b03166125de565b61063c60048036036040811015610c5757600080fd5b506001600160a01b03813581169160200135166126c1565b61055d6126e1565b61055d60048036036020811015610c8d57600080fd5b50356001600160a01b03166126e7565b61060d60048036036020811015610cb357600080fd5b50356001600160a01b03166126f9565b61055d612727565b61055d60048036036040811015610ce157600080fd5b506001600160a01b038135811691602001351661272e565b61060d60048036036020811015610d0f57600080fd5b50356001600160a01b031661294c565b61060d600480360360c0811015610d3557600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135612976565b6105c36129ed565b61055d6129fc565b61060d60048036036020811015610d8d57600080fd5b50351515612a02565b61055d60048036036040811015610dac57600080fd5b506001600160a01b0381358116916020013516612a26565b61055d60048036036020811015610dda57600080fd5b50356001600160a01b0316612c83565b61055d600480360360e0811015610e0057600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359160808201359160a081013515159160c09091013516612d2d565b61060d60048036036040811015610e5457600080fd5b506001600160a01b038135169060200135612dab565b61055d612dcf565b61055d60048036036020811015610e8857600080fd5b50356001600160a01b0316612dd4565b61060d60048036036060811015610eae57600080fd5b5080359060208101359060400135612de6565b61055d60048036036020811015610ed757600080fd5b50356001600160a01b0316612e2c565b61055d60048036036020811015610efd57600080fd5b50356001600160a01b0316612e3e565b61060d60048036036020811015610f2357600080fd5b50356001600160a01b0316612e50565b61063c612e84565b61055d60048036036060811015610f5157600080fd5b506001600160a01b038135811691602081013582169160409091013516612e93565b61055d61318c565b61055d61319c565b61055d60048036036040811015610f9957600080fd5b506001600160a01b0381351690602001356131a2565b61055d60048036036060811015610fc557600080fd5b506001600160a01b0381351690602081013590604001356131c4565b61063c61326d565b61055d613276565b61055d6004803603604081101561100757600080fd5b506001600160a01b03813516906020013561327c565b61060d6004803603604081101561103357600080fd5b506001600160a01b0381351690602001351515613299565b61055d6004803603602081101561106157600080fd5b50356001600160a01b03166132cc565b61063c6133c4565b61055d6004803603602081101561108f57600080fd5b50356001600160a01b03166133cd565b61055d600480360360208110156110b557600080fd5b50356001600160a01b03166133df565b61055d6133f1565b61063c6133f7565b61055d600480360360208110156110eb57600080fd5b50356001600160a01b0316613405565b6109b86004803603602081101561111157600080fd5b50356001600160a01b03166134a6565b61055d6004803603602081101561113757600080fd5b50356001600160a01b031661353e565b61055d613550565b61055d6004803603602081101561116557600080fd5b50356001600160a01b0316613556565b61055d600480360360a081101561118b57600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001351515613568565b61055d600480360360608110156111cb57600080fd5b506001600160a01b0381351690602081013590604001356136b3565b61060d600480360360608110156111fd57600080fd5b506001600160a01b03813581169160208101359091169060400135613707565b61060d6004803603602081101561123357600080fd5b50356001600160a01b0316613728565b61060d6004803603602081101561125957600080fd5b5035613752565b61060d6004803603602081101561127657600080fd5b503561375f565b6112c3600480360360a081101561129357600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013515159060800135151561377b565b6040805192835260208301919091528051918290030190f35b61060d600480360360408110156112f257600080fd5b506001600160a01b038135169060200135613a3b565b61055d6004803603602081101561131e57600080fd5b50356001600160a01b0316613a94565b61055d613aa6565b61063c6004803603602081101561134c57600080fd5b50356001600160a01b0316613aac565b61063c6004803603602081101561137257600080fd5b50356001600160a01b0316613ac1565b61055d600480360360e081101561139857600080fd5b506001600160a01b0381351690602081013590604081013590606081013515159060808101359060a08101359060c00135613ad6565b61055d613b67565b61060d600480360360a08110156113ec57600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013515159160809091013516613b6d565b61055d613f24565b61055d6004803603602081101561143c57600080fd5b50356001600160a01b0316613f2a565b6105c36004803603602081101561146257600080fd5b5035613fa1565b61060d6004803603602081101561147f57600080fd5b50356001600160a01b0316613fc8565b61055d600480360360208110156114a557600080fd5b50356001600160a01b031661409d565b61060d600480360360208110156114cb57600080fd5b503515156140af565b61055d600480360360408110156114ea57600080fd5b506001600160a01b03813581169160200135166140d5565b61063c6004803603602081101561151857600080fd5b50356001600160a01b031661412b565b6105c3614140565b6105c361414f565b61055d6004803603606081101561154e57600080fd5b506001600160a01b03813516906020810135906040013561415e565b61055d614198565b61158f6004803603602081101561158857600080fd5b503561419e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156115c95781810151838201526020016115b1565b50505050905090810190601f1680156115f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6001600160a01b0381166000908152602460205260408120548061162c576000915050611662565b6001600160a01b03831660009081526025602052604090205461165e90829061165890620f4240614239565b90614292565b9150505b919050565b6904ee2d6d415b85acef8160201b81565b601a5490565b60008161168d575060006116cb565b600061169884612c83565b6001600160a01b0385166000908152601c60205260409020549091506116c6600a82900a6116588685614239565b925050505b92915050565b600a5481565b61271081565b6005546001600160a01b031681565b60135481565b6001600160a01b03811660009081526029602052604090205461174457601154611726906117204282614292565b90614239565b6001600160a01b038216600090815260296020526040902055611832565b6011546001600160a01b038216600090815260296020526040902054429161176c91906142d1565b111561177757611832565b6000611782826132cc565b6001600160a01b0383166000908152602860205260409020549091506117a890826142d1565b6001600160a01b0383166000908152602860205260409020556011546117d2906117204282614292565b6001600160a01b03831660008181526029602090815260408083209490945560288152908390205483519283529082015281517fa146fc154e1913322e9817d49f0d5c37466c24326e15de10e739a948be815eab929181900390910190a1505b50565b60085481565b60008161184a57506000611662565b600061187361271061165861186c600e5461271061432990919063ffffffff16565b8690614239565b905061165e8382614329565b6015546301000000900460ff1681565b60226020526000908152604090205481565b602b6020526000908152604090205481565b6118bb61436b565b60158054911515620100000262ff000019909216919091179055565b3360009081526017602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b600154630100000090046001600160a01b0316331461196e576040805162461bcd60e51b815260206004820152601e60248201527f5661756c743a20696e76616c6964206572726f72436f6e74726f6c6c65720000604482015290519081900360640190fd5b6000838152602e60205260409020611987908383615984565b50505050565b60006116cb8261199c84613405565b61167e565b6000806119ad84613f2a565b905060006119cb826116588668327cb2734119d3b7a9601e1b614239565b6004549091506116c69082906001600160a01b031687611d41565b604080516001600160601b0319606096871b811660208084019190915295871b811660348301529390951b9092166048850152151560f81b605c8401528051603d818503018152605d9093019052815191012090565b611a4461436b565b600180549115156101000261ff0019909216919091179055565b600e5481565b600154610100900460ff1681565b60015460ff1681565b60048054604080516318160ddd60e01b8152905160009384936001600160a01b0316926318160ddd9281830192602092829003018186803b158015611abf57600080fd5b505afa158015611ad3573d6000803e3d6000fd5b505050506040513d6020811015611ae957600080fd5b5051905080611afc576000915050611662565b6001600160a01b038316600090815260216020526040902054601454611b26906116588385614239565b949350505050565b611b3661436b565b6001600160a01b0387166000908152601b602052604090205460ff16611bb357600654611b649060016142d1565b600655601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319166001600160a01b0389161790555b6014546001600160a01b038816600090815260216020526040902054611bda908290614329565b6001600160a01b0389166000908152601b602090815260408083208054600160ff1991821617909155601c83528184208c9055602183528184208b9055601d83528184208a905560238352818420899055601e835281842080548216891515179055601f90925290912080549091168415151790559050611c5b81876142d1565b601455611c6788613f2a565b505050505050505050565b60165481565b60015462010000900460ff1681565b611c8f61436b565b611c9f6101f48a11156003614386565b611caf6101f48911156004614386565b611cbf6101f48811156005614386565b611ccf6101f48711156006614386565b611cdf6101f48611156007614386565b611cef6101f48511156008614386565b611d0a6904ee2d6d415b85acef8160201b8411156009614386565b600998909855600a96909655600b94909455600c92909255600d55600e55600855600f556010805460ff1916911515919091179055565b60045460009081906001600160a01b03858116911614611d79576001600160a01b0384166000908152601c6020526040902054611d7c565b60125b6004549091506000906001600160a01b03858116911614611db5576001600160a01b0384166000908152601c6020526040902054611db8565b60125b9050611dd782600a0a61165883600a0a8961423990919063ffffffff16565b925050505b9392505050565b601e6020526000908152604090205460ff1681565b611e0061436b565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b6000806000611e3c878787876119e6565b9050611e46615a02565b506000818152602a6020908152604091829020825160e081018452815480825260018301549382019390935260028201549381018490526003820154606082015260048201546080820152600582015460a082015260069091015460c082018190529092611eba92899290919089906124e4565b93509350505094509492505050565b60026000541415611f0f576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055600154611f2b9062010000900460ff16601c614386565b611f33614432565b611f3c8561444e565b611f478484836144ae565b611f50846116f2565b6000611f5e868686856119e6565b6000818152602a6020526040812091925083611f8257611f7d86612c83565b611f8b565b611f8b86613f2a565b8254909150611f9c57600282018190555b815415801590611fac5750600085115b15611fd257611fcc868360000154846002015487858a8860060154613ad6565b60028301555b6000611fe88887856000015486600301546145c4565b90506000611ff589614676565b905060006120038a8361167e565b600186015490915061201590826142d1565b6001860181905561202a90841115601d614386565b60018501546120399084614329565b60018601556001600160a01b038a166000908152602860205260409020546003860155845461206890896142d1565b80865542600687015561207e901515601e614386565b61209085600001548660010154614720565b61209e8b8b8b8a600161377b565b505060006120ac8b8a61327c565b60048701549091506120be90826142d1565b60048701556120cd8b82614744565b8715612112576120e68b6120e18b876142d1565b6147e4565b6120f08b83614863565b6120fa8b846148e2565b61210d8b6121088d876131a2565b6149f9565b6121b1565b6001600160a01b038a166000908152602c602052604090205461214f576001600160a01b038a166000908152602d60205260409020859055612174565b61215a8a868b6131c4565b6001600160a01b038b166000908152602d60205260409020555b6001600160a01b038a166000908152602c6020526040902054612197908a6142d1565b6001600160a01b038b166000908152602c60205260409020555b604080518881526001600160a01b03808f166020830152808e16828401528c1660608201526080810184905260a081018b905289151560c082015260e08101879052610100810186905290517f2fe68525253654c21998f35787a8d0f361905ef647c854092430ab65f2f15022918190036101200190a1855460018701546002880154600389015460048a015460058b0154604080518e81526020810197909752868101959095526060860193909352608085019190915260a084015260c083015251600080516020615a958339815191529181900360e00190a15050600160005550505050505050505050565b600154630100000090046001600160a01b031681565b60008060008060008060008060006122cf8d8d8d8d6119e6565b90506122d9615a02565b602a60008381526020019081526020016000206040518060e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090506000808260a0015113612359578160a0015160000361235f565b8160a001515b9050816000015182602001518360400151846060015185608001518560008860a0015112158860c001519a509a509a509a509a509a509a509a5050505094995094995094999196509450565b60266020526000908152604090205481565b6101f481565b600b5481565b602a602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919087565b600080612415868686866119e6565b905061241f615a02565b506000818152602a6020908152604091829020825160e0810184528154815260018201549281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c08301526124899015156025614386565b602081015181516124a1919061165890612710614239565b979650505050505050565b602080526000908152604090205481565b60186020526000908152604090205460ff1681565b60246020526000908152604090205481565b6000806124f5600086116026614386565b60008461250a5761250588613f2a565b612513565b61251388612c83565b9050600081871161252d576125288288614329565b612537565b6125378783614329565b90506000612549886116588b85614239565b90506000871561255c5750878311612561565b508288115b6000612578600f54896142d190919063ffffffff16565b421161259c576001600160a01b038c166000908152601d602052604090205461259f565b60005b90508180156125c257506125b38b82614239565b6125bf84612710614239565b11155b156125cc57600092505b509450925050505b9550959350505050565b60026000541415612624576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b600260009081556001600160a01b0382168152601b602052604090205461264f9060ff16600e614386565b600061265a82614676565b905061266a60008211600f614386565b61267482826148e2565b604080516001600160a01b03841681526020810183905281517fa5a389190ebf6170a133bda5c769b77f4d6715b8aa172ec0ddf8473d0b4944bd929181900390910190a150506001600055565b601760209081526000928352604080842090915290825290205460ff1681565b60065481565b602d6020526000908152604090205481565b3360009081526017602090815260408083206001600160a01b0394909416835292905220805460ff19169055565b620f424081565b600060026000541415612776576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055612783614acc565b6001600160a01b0383166000908152601b60205260409020546127aa9060ff166013614386565b6015805461ff0019166101001790556004546000906127d1906001600160a01b0316614676565b90506127e1600082116014614386565b6127ea846116f2565b60006127f685836119a1565b9050612806600082116015614386565b6128108583614afb565b61281a85826149f9565b6004805460408051632770a7eb60e21b8152309381019390935260248301859052516001600160a01b0390911691639dc29fac91604480830192600092919082900301818387803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b505060045461289c92506001600160a01b03169050614bb9565b60006128b08684600b546009546000613568565b905060006128bf878484614c53565b90506128cf600082116016614386565b6128da878288614d1b565b604080516001600160a01b03808916825289166020820152808201869052606081018390526080810184905290517fd732b7828fa6cee72c285eac756fc66a7477e3dc22e22e7c432f1c265d40b4839181900360a00190a16015805461ff001916905560016000559695505050505050565b61295461436b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61297e61436b565b600180546129929160ff9091161590614386565b6001805460ff191681179055600280546001600160a01b03199081166001600160a01b039889161790915560048054821696881696909617909555600380549095169390951692909217909255600891909155601255601355565b6003546001600160a01b031681565b60095481565b612a0a61436b565b60018054911515620100000262ff000019909216919091179055565b600060026000541415612a6e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055612a7b614acc565b6001600160a01b0383166000908152601b6020526040902054612aa29060ff166010614386565b6015805461ff0019166101001790556000612abc84614676565b9050612acc600082116011614386565b612ad5846116f2565b6000612ae085612c83565b90506000612afe68327cb2734119d3b7a9601e1b6116588585614239565b600454909150612b1a90829088906001600160a01b0316611d41565b9050612b2a600082116012614386565b6000612b3e8783600b546009546001613568565b90506000612b4d888684614c53565b90506000612b6b68327cb2734119d3b7a9601e1b6116588488614239565b600454909150612b879082908b906001600160a01b0316611d41565b9050612b938982614dc1565b612b9d89836148e2565b60048054604080516340c10f1960e01b81526001600160a01b038c81169482019490945260248101859052905192909116916340c10f199160448082019260009290919082900301818387803b158015612bf657600080fd5b505af1158015612c0a573d6000803e3d6000fd5b5050604080516001600160a01b03808d1682528d1660208201528082018a9052606081018590526080810187905290517fab4c77c74cd32c85f35416cf03e7ce9e2d4387f7b7f2c1f4bf53daaecf8ea72d93509081900360a0019150a16015805461ff0019169055600160005598975050505050505050565b600354601554604080516317e1d38560e11b81526001600160a01b03858116600483015260006024830181905260ff8086161515604485015261010090950490941615156064830152915192939190911691632fc3a70a91608480820192602092909190829003018186803b158015612cfb57600080fd5b505afa158015612d0f573d6000803e3d6000fd5b505050506040513d6020811015612d2557600080fd5b505192915050565b600060026000541415612d75576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055612d82614432565b612d8b8861444e565b612d9a88888888888888614e7f565b600160005598975050505050505050565b612db361436b565b6001600160a01b03909116600090815260266020526040902055565b601281565b601d6020526000908152604090205481565b612dee61436b565b612dfe610e10841015600a614386565b612e0e612710831115600b614386565b612e1e612710821115600c614386565b601192909255601255601355565b602c6020526000908152604090205481565b601c6020526000908152604090205481565b612e5861436b565b600180546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60155462010000900460ff1681565b600060026000541415612edb576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b6002600055600154612ef690610100900460ff166017614386565b6001600160a01b0384166000908152601b6020526040902054612f1d9060ff166018614386565b6001600160a01b0383166000908152601b6020526040902054612f449060ff166019614386565b612f64836001600160a01b0316856001600160a01b03161415601a614386565b6015805461ff001916610100179055612f7c846116f2565b612f85836116f2565b6000612f9085614676565b9050612fa060008211601b614386565b6000612fab86612c83565b90506000612fb886613f2a565b90506000612fca826116588686614239565b9050612fd7818989611d41565b90506000612ff568327cb2734119d3b7a9601e1b6116588787614239565b6004549091506130119082908b906001600160a01b0316611d41565b6001600160a01b038a166000908152601e60205260408120549192509060ff16801561305557506001600160a01b0389166000908152601e602052604090205460ff165b90506000808261306757600c5461306b565b600d545b905060008361307c57600954613080565b600a545b905060006130928e8785856001613568565b905060006130a48e8886866000613568565b90508082116130b357806130b5565b815b94505050505060006130c88b8684614c53565b90506130d48c85614dc1565b6130de8b85614afb565b6130e88c896148e2565b6130f28b866149f9565b6130fb8b615277565b6131068b828c614d1b565b604080516001600160a01b03808d168252808f1660208301528d1681830152606081018a90526080810187905260a0810183905260c0810184905290517f0874b2d545cb271cdbda4e093020c452328b24af12382ed62c4d00f5c26709db9181900360e00190a16015805461ff001916905560016000559b9a5050505050505050505050565b68327cb2734119d3b7a9601e1b81565b60115481565b6000816131b1575060006116cb565b611ddc83836131bf86613f2a565b61415e565b6001600160a01b0383166000908152602c6020908152604080832054602d909252822054828582116131ff576131fa8683614329565b613209565b6132098287614329565b9050600061321b836116588685614239565b9050868311600061322c86896142d1565b90506000826132445761323f82856142d1565b61324e565b61324e8285614329565b905061325e816116588c85614239565b9b9a5050505050505050505050565b60105460ff1681565b600c5481565b60008161328b575060006116cb565b611ddc83836131bf86612c83565b6132a161436b565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6011546001600160a01b038216600090815260296020526040812054909142916132f5916142d1565b111561330357506000611662565b6011546001600160a01b038316600090815260296020526040812054909161333091611658904290614329565b6001600160a01b0384166000908152602460205260409020549091508061335c57600092505050611662565b6001600160a01b0384166000908152601e602052604081205460ff1661338457601254613388565b6013545b6001600160a01b0386166000908152602560205260409020549091506133bb908390611658908690611720908690614239565b95945050505050565b60155460ff1681565b60216020526000908152604090205481565b60236020526000908152604090205481565b60075481565b601554610100900460ff1681565b6001600160a01b0381166000908152601e602052604081205460ff161561344557506001600160a01b038116600090815260246020526040902054611662565b6001600160a01b0382166000908152602760205260408120546134699084906131a2565b6001600160a01b03841660009081526025602090815260408083205460249092529091205491925061165e916134a09084906142d1565b90614329565b6001600160a01b0381166000908152602c60205260408120548190806134d3576000809250925050613539565b60006134de85613f2a565b6001600160a01b0386166000908152602d60205260408120549192508282116135105761350b8383614329565b61351a565b61351a8284614329565b9050600061352c836116588785614239565b9390921195509193505050505b915091565b60256020526000908152604090205481565b60125481565b60286020526000908152604090205481565b60105460009060ff1661357c5750826133bb565b6001600160a01b038616600090815260226020526040812054906135a082886142d1565b9050836135c3578187116135bd576135b88288614329565b6135c0565b60005b90505b60006135ce89611a7b565b9050806135e0578693505050506133bb565b60008184116135f8576135f38285614329565b613602565b6136028483614329565b9050600082841161361c576136178385614329565b613626565b6136268484614329565b905081811015613668576000613640846116588b86614239565b9050898111613658576136538a82614329565b61365b565b60005b96505050505050506133bb565b6000613679600261165885856142d1565b9050838111156136865750825b6000613696856116588c85614239565b90506136a28b826142d1565b9d9c50505050505050505050505050565b6000826136c257506000611ddc565b6001600160a01b0384166000908152602860205260408120546136e59084614329565b9050806136f6576000915050611ddc565b6133bb620f42406116588684614239565b61370f61436b565b6137236001600160a01b03831684836152ec565b505050565b61373061436b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b61375a61436b565b601655565b61376761436b565b61377661271082116002614386565b600755565b600080600061378c888888886119e6565b9050613796615a02565b506000818152602a60209081526040808320815160e081018352815480825260018301549482019490945260028201549281018390526003820154606082015260048201546080820152600582015460a082015260069091015460c08201819052909392839261380b928c9291908c906124e4565b9150915060006138248b856000015186606001516136b3565b905061383d613836856000015161183b565b82906142d1565b9050821580156138505750818460200151105b156138b85787156138a8576040805162461bcd60e51b815260206004820152601f60248201527f5661756c743a206c6f737365732065786365656420636f6c6c61746572616c00604482015290519081900360640190fd5b6001965094506125d49350505050565b6020840151836138d45760208501516138d19084614329565b90505b8181101561394057881561392f576040805162461bcd60e51b815260206004820152601d60248201527f5661756c743a20666565732065786365656420636f6c6c61746572616c000000604482015290519081900360640190fd5b6001975095506125d4945050505050565b60085461394e9083906142d1565b8110156139a35788156139925760405162461bcd60e51b8152600401808060200182810382526029815260200180615ab56029913960400191505060405180910390fd5b506001965094506125d49350505050565b84516139b190612710614239565b6007546139bf908390614239565b1015613a27578815613a16576040805162461bcd60e51b815260206004820152601b60248201527a15985d5b1d0e881b585e13195d995c9859d948195e18d959591959602a1b604482015290519081900360640190fd5b506002965094506125d49350505050565b5060009c909b509950505050505050505050565b613a4361436b565b6001600160a01b03821660009081526022602052604090205480821115613a7d57613a7783613a728484614329565b614dc1565b50613a90565b61372383613a8b8385614329565b614afb565b5050565b60296020526000908152604090205481565b600f5481565b601b6020526000908152604090205460ff1681565b601f6020526000908152604090205460ff1681565b6000806000613ae88a8a8a8a886124e4565b90925090506000613af98a876142d1565b905060008815613b285783613b1757613b128284614329565b613b21565b613b2182846142d1565b9050613b49565b83613b3c57613b3782846142d1565b613b46565b613b468284614329565b90505b613b57816116588a85614239565b9c9b505050505050505050505050565b60145481565b60026000541415613bb3576040805162461bcd60e51b815260206004820152601f6024820152600080516020615a55833981519152604482015290519081900360640190fd5b60026000556015546301000000900460ff1615613be85733600090815260186020526040902054613be89060ff166022614386565b6015805460ff19169055613bfb846116f2565b6000613c09868686866119e6565b9050613c13615a02565b506000818152602a6020908152604091829020825160e08101845281548082526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c0830152613c7f9015156023614386565b600080613c9089898989600061377b565b91509150613ca382600014156024614386565b8160021415613cca57613cc0898989600087600001518b8f614e7f565b5050505050613f18565b6000613cd689836131a2565b6001600160a01b038a166000908152602b6020526040902054909150613cfc90826142d1565b6001600160a01b038a166000818152602b60209081526040918290209390935580519182529181018490528082018390529051600080516020615b498339815191529181900360600190a1613d5589856080015161533e565b8615613d845760208401518451613d76918b91613d7191614329565b614863565b613d84896121088b856131a2565b600087613d9957613d9489613f2a565b613da2565b613da289612c83565b90507f2e1f85a64a2f22cf2f0c42584e7c919ed4abe8d53675cff0f62bf1e95a1c676f868c8c8c8c8a600001518b602001518c608001518d60a001518a604051808b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001886001600160a01b0316815260200187151581526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a187158015613e615750846020015183105b15613e8f576020850151600090613e789085614329565b9050613e8d8b613e888d846131a2565b6148e2565b505b87613ea257613ea28986600001516153f3565b6000868152602a60205260408120818155600181018290556002810182905560038101829055600481018290556005810182905560060155600854613eee908b906121089082906131a2565b613f048a613efe8c6008546131a2565b89614d1b565b50506015805460ff19166001179055505050505b50506001600055505050565b600d5481565b600354601554604080516317e1d38560e11b81526001600160a01b0385811660048301526001602483015260ff808516151560448401526101009094049093161515606482015290516000939290921691632fc3a70a91608480820192602092909190829003018186803b158015612cfb57600080fd5b601a8181548110613fae57fe5b6000918252602090912001546001600160a01b0316905081565b613fd061436b565b6001600160a01b0381166000908152601b6020526040902054613ff79060ff16600d614386565b6001600160a01b03811660009081526021602052604090205460145461401c91614329565b6014556001600160a01b0381166000908152601b60209081526040808320805460ff19908116909155601c835281842084905560218352818420849055601d835281842084905560238352818420849055601e8352818420805482169055601f90925290912080549091169055600654614097906001614329565b60065550565b60276020526000908152604090205481565b6140b761436b565b6015805491151563010000000263ff00000019909216919091179055565b60006140df61436b565b6001600160a01b0383166000908152602b6020526040902054806141075760009150506116cb565b6001600160a01b0384166000908152602b6020526040812055611ddc848285614d1b565b60196020526000908152604090205460ff1681565b6004546001600160a01b031681565b6002546001600160a01b031681565b60008261416d57506000611ddc565b6001600160a01b0384166000908152601c60205260409020546133bb8361165886600a85900a614239565b610e1081565b602e6020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156142315780601f1061420657610100808354040283529160200191614231565b820191906000526020600020905b81548152906001019060200180831161421457829003601f168201915b505050505081565b600082614248575060006116cb565b8282028284828161425557fe5b0414611ddc5760405162461bcd60e51b8152600401808060200182810382526021815260200180615ade6021913960400191505060405180910390fd5b6000611ddc83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061545b565b600082820183811015611ddc576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b6000611ddc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154fd565b600554614384906001600160a01b031633146035614386565b565b6000818152602e60205260409020826137235760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156144235780601f106143f857610100808354040283529160200191614423565b820191906000526020600020905b81548152906001019060200180831161440657829003601f168201915b50509250505060405180910390fd5b60165461443e57614384565b6143846016543a11156037614386565b336001600160a01b038216141561446457611832565b6002546001600160a01b031633141561447c57611832565b6001600160a01b03811660009081526017602090815260408083203384529091529020546118329060ff166029614386565b8015614527576144d3826001600160a01b0316846001600160a01b031614602a614386565b6001600160a01b0383166000908152601b60205260409020546144fa9060ff16602b614386565b6001600160a01b0383166000908152601e60205260409020546145229060ff1615602c614386565b613723565b6001600160a01b0383166000908152601b602052604090205461454e9060ff16602d614386565b6001600160a01b0383166000908152601e60205260409020546145759060ff16602e614386565b6001600160a01b0382166000908152601e602052604090205461459d9060ff1615602f614386565b6001600160a01b0382166000908152601f60205260409020546137239060ff166030614386565b6000806145d08561183b565b905060006145df8786866136b3565b90506145eb82826142d1565b915060006145f988846131a2565b6001600160a01b0389166000908152602b602052604090205490915061461f90826142d1565b6001600160a01b0389166000818152602b60209081526040918290209390935580519182529181018590528082018390529051600080516020615b498339815191529181900360600190a150909695505050505050565b6001600160a01b0381166000818152602080805260408083205481516370a0823160e01b8152306004820152915193949093859391926370a08231926024808301939192829003018186803b1580156146ce57600080fd5b505afa1580156146e2573d6000803e3d6000fd5b505050506040513d60208110156146f857600080fd5b50516001600160a01b038516600090815260208052604090208190559050611b268183614329565b816147365761473181156027614386565b613a90565b613a90818310156028614386565b6001600160a01b03821660009081526025602052604090205461476790826142d1565b6001600160a01b03831660009081526025602081815260408084208590556024825290922054915261479c9111156034614386565b604080516001600160a01b03841681526020810183905281517faa5649d82f5462be9d19b0f2b31a59b2259950a6076550bac9f3a1c07db9f66d929181900390910190a15050565b6001600160a01b03821660009081526027602052604090205461480790826142d1565b6001600160a01b03831660008181526027602090815260409182902093909355805191825291810183905281517fd9d4761f75e0d0103b5cbeab941eeb443d7a56a35b5baf2a0787c03f03f4e474929181900390910190a15050565b6001600160a01b0382166000908152602760205260409020546148869082614329565b6001600160a01b03831660008181526027602090815260409182902093909355805191825291810183905281517f34e07158b9db50df5613e591c44ea2ebc82834eff4a4dc3a46e000e608261d68929181900390910190a15050565b6001600160a01b03821660009081526024602052604090205461490590826142d1565b6001600160a01b03831660008181526024602081815260408084209590955584516370a0823160e01b8152306004820152945192946370a0823193818401939091829003018186803b15801561495a57600080fd5b505afa15801561496e573d6000803e3d6000fd5b505050506040513d602081101561498457600080fd5b50516001600160a01b0384166000908152602460205260409020549091506149b0908210156031614386565b604080516001600160a01b03851681526020810184905281517f976177fbe09a15e5e43f848844963a42b41ef919ef17ff21a17a5421de8f4737929181900390910190a1505050565b604080518082018252601a81527915985d5b1d0e881c1bdbdb105b5bdd5b9d08195e18d95959195960321b6020808301919091526001600160a01b038516600090815260249091529190912054614a519183906154fd565b6001600160a01b03831660009081526024602090815260408083208490556025909152902054614a849110156032614386565b604080516001600160a01b03841681526020810183905281517f112726233fbeaeed0f5b1dba5cb0b2b81883dee49fb35ff99fd98ed9f6d31eb0929181900390910190a15050565b60155462010000900460ff161561438457336000908152601960205260409020546143849060ff166036614386565b6001600160a01b038216600090815260226020526040902054818111614b64576001600160a01b038316600081815260226020908152604080832092909255815192835282018390528051600080516020615aff8339815191529281900390910190a150613a90565b614b6e8183614329565b6001600160a01b0384166000818152602260209081526040918290209390935580519182529181018490528151600080516020615aff833981519152929181900390910190a1505050565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614c0857600080fd5b505afa158015614c1c573d6000803e3d6000fd5b505050506040513d6020811015614c3257600080fd5b50516001600160a01b03909216600090815260208052604090209190915550565b600080614c70612710611658614c698287614329565b8790614239565b90506000614c7e8583614329565b6001600160a01b0387166000908152602b6020526040902054909150614ca490826142d1565b6001600160a01b0387166000908152602b60205260409020557f47cd9dda0e50ce30bcaaacd0488452b596221c07ac402a581cfae4d3933cac2b86614ce9818461167e565b604080516001600160a01b0390931683526020830191909152818101849052519081900360600190a150949350505050565b614d2f6001600160a01b03841682846152ec565b604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015614d7557600080fd5b505afa158015614d89573d6000803e3d6000fd5b505050506040513d6020811015614d9f57600080fd5b50516001600160a01b0390931660009081526020805260409020929092555050565b6001600160a01b038216600090815260226020526040902054614de490826142d1565b6001600160a01b0383166000908152602260209081526040808320939093556023905220548015614e36576001600160a01b038316600090815260226020526040902054614e36908210156033614386565b604080516001600160a01b03851681526020810184905281517f64243679a443432e2293343b77d411ff6144370404618f00ca0d2025d9ca9882929181900390910190a1505050565b6000614e8a876116f2565b6000614e98898989876119e6565b6000818152602a60205260409020805491925090614eb9901515601f614386565b614ecb86826000015410156020614386565b614edd87826001015410156021614386565b600181015481546004830154600091614efa91611658908b614239565b6004840154909150614f0c9082614329565b6004840155614f1b8b8261533e565b50600080614f2d8d8d8d8d8d8d615557565b8554919350915089146150b3576001600160a01b038c1660009081526028602052604090205460038501558354614f64908a614329565b8085556001850154614f769190614720565b614f848d8d8d8b600161377b565b50508715614fb157614fa78c6120e186600101548661432990919063ffffffff16565b614fb18c8a614863565b600088614fc657614fc18c613f2a565b614fcf565b614fcf8c612c83565b9050600080516020615a75833981519152868f8f8f8f8f8f88614ff28c8c614329565b60408051998a526001600160a01b0398891660208b015296881689880152949096166060880152608087019290925260a0860152151560c085015260e084019290925261010083019190915251908190036101200190a18454600186015460028701546003880154600489015460058a0154604080518d81526020810197909752868101959095526060860193909352608085019190915260a084015260c083015251600080516020615a958339815191529181900360e00190a150615215565b87156150cd576150c38c846147e4565b6150cd8c8a614863565b6000886150e2576150dd8c613f2a565b6150eb565b6150eb8c612c83565b9050600080516020615a75833981519152868f8f8f8f8f8f8861510e8c8c614329565b60408051998a526001600160a01b0398891660208b015296881689880152949096166060880152608087019290925260a0860152151560c085015260e084019290925261010083019190915251908190036101200190a18454600186015460028701546003880154600489015460058a0154604080518d81526020810197909752868101959095526060860193909352608085019190915260a084015260c0830152517f73af1d417d82c240fdb6d319b34ad884487c6bf2845d98980cc52ad9171cb4559181900360e00190a1506000858152602a602052604081208181556001810182905560028101829055600381018290556004810182905560058101829055600601555b87615224576152248b8a6153f3565b811561526457871561523e5761523e8c6121088e856131a2565b600061524a8d836131a2565b90506152578d828a614d1b565b95506124a1945050505050565b5060009c9b505050505050505050505050565b6001600160a01b0381166000908152602660209081526040808320546024909252909120541015611832576040805162461bcd60e51b815260206004820152601a6024820152792b30bab63a1d103837b7b620b6b7bab73a101e10313ab33332b960311b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261372390849061574c565b604080518082018252601b81527a5661756c743a20696e73756666696369656e74207265736572766560281b6020808301919091526001600160a01b0385166000908152602590915291909120546153979183906154fd565b6001600160a01b03831660008181526025602090815260409182902093909355805191825291810183905281517f533cb5ed32be6a90284e96b5747a1bfc2d38fdb5768a6b5f67ff7d62144ed67b929181900390910190a15050565b6001600160a01b0382166000908152602c60205260409020548082111561543357506001600160a01b0382166000908152602c6020526040812055613a90565b61543d8183614329565b6001600160a01b0384166000908152602c6020526040902055505050565b600081836154e75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156154ac578181015183820152602001615494565b50505050905090810190601f1680156154d95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816154f357fe5b0495945050505050565b6000818484111561554f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156154ac578181015183820152602001615494565b505050900390565b6000806000615568898989876119e6565b6000818152602a60205260408120805460038201549394509092615590918c918a91906145c4565b90506000806000806155b18d876000015488600201548d8a600601546124e4565b875491955085935091506155c9906116588d84614239565b9250505060008280156155dc5750600082115b1561560c575060058401805482019055808861560c5760006155fe8e846131a2565b905061560a8e826149f9565b505b8215801561561a5750600082115b1561565e57600185015461562e9083614329565b6001860155886156525760006156448e846131a2565b90506156508e826148e2565b505b60058501805483900390555b8a156156865761566e818c6142d1565b6001860154909150615680908c614329565b60018601555b84548a14156156a957600185015461569f9082906142d1565b6000600187015590505b80848111156156c3576156bc8286614329565b90506156f7565b60018601546156d29086614329565b600187015589156156f75760006156e98f876131a2565b90506156f58f826149f9565b505b60408051888152851515602082015280820185905290517f3ff41bdde87755b687ae83d0221a232b6be51a803330ed9661c1b5d0105e0d8a9181900360600190a1909e909d509b505050505050505050505050565b60606157a1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166157fd9092919063ffffffff16565b805190915015613723578080602001905160208110156157c057600080fd5b50516137235760405162461bcd60e51b815260040180806020018281038252602a815260200180615b1f602a913960400191505060405180910390fd5b6060611b2684846000858561581185615918565b615862576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106158a15780518252601f199092019160209182019101615882565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615903576040519150601f19603f3d011682016040523d82523d6000602084013e615908565b606091505b50915091506124a182828661591e565b3b151590565b6060831561592d575081611ddc565b82511561593d5782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156154ac578181015183820152602001615494565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106159c55782800160ff198235161785556159f2565b828001600101855582156159f2579182015b828111156159f25782358255916020019190600101906159d7565b506159fe929150615a3f565b5090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156159fe5760008155600101615a4056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0093d75d64d1f84fc6f430a64fc578bdd4c1e090e90ea2d51773e626d19de56d3025e8a331a7394a9f09862048843323b00bdbada258f524f5ce624a45bf00aabb5661756c743a206c69717569646174696f6e20666565732065786365656420636f6c6c61746572616c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77e1e812596aac93a06ecc4ca627014d18e30f5c33b825160cc9d5c0ba61e452275361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645d0c0019d3d45fadeb74eff9d2c9924d146d000ac6bcf3c28bf0ac3c9baa011aa2646970667358221220228994fceccc81f6ccb2826931d9c6f81c91d3e29057a3bc4c057367e22010a264736f6c634300060c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
