{
  "address": "0xc2768beF7a6BB57F0FfA169a9ED4017c09696FF1",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "usdcAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "maiAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "lpAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "qiAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "quickswapRouterAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "qidaoFarmAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "qidaoPoolId",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "qi",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "usdc",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "lp",
          "type": "uint256"
        }
      ],
      "name": "CompoundRewards",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "wmatic",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        }
      ],
      "name": "HarvestedMatic",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateral",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "startingRatio",
          "type": "uint256"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "markup",
          "type": "uint256"
        }
      ],
      "name": "MarkupUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateralAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "Minted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateralAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "Withdrawal",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "LP_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MAI_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MARKUP_DECIMALS",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MARKUP_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "QIDAO_FARM_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "QIDAO_POOL_ID",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "QI_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "QUICKSWAP_ROUTER_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "REWARDS_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "USDC_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "burnFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "buyingPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claimRewards",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "collateralRatio",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "compoundRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "usdcAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lpAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLpReserves",
      "outputs": [
        {
          "internalType": "uint112",
          "name": "usdcReserves",
          "type": "uint112"
        },
        {
          "internalType": "uint112",
          "name": "maiReserves",
          "type": "uint112"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPendingRewardsAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "usdcAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startingRatio",
          "type": "uint256"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialized",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "markup",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "usdcAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minReceive",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "peAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "permit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "markup_",
          "type": "uint256"
        }
      ],
      "name": "setMarkup",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakedBalance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakedTokens",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "usdcAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maiAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakedValue",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "totalUSDC",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "swapFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "usdcPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "peAmount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x0644bbfab8c0a1cdc18d692af62d7cc0d062b7c8cf4b43a96f7ea13dcbb421bb",
  "receipt": {
    "to": null,
    "from": "0xA15EaB321F68FfE4800F1BA22dCD4bfDf644a809",
    "contractAddress": "0xc2768beF7a6BB57F0FfA169a9ED4017c09696FF1",
    "transactionIndex": 46,
    "gasUsed": "3550959",
    "logsBloom": "0x00000014000000000000000000000000000000000000200000000000000000000000000000000000080000000000000000108000000000000000000000000000000000000000000004000000000000800000000000000000000100000000000000000000020000000000000000000800000000000000000080000000000000000000000000000000000000000000000000000000002000000000000000000000200000040000100000000000000000000000000000000000001000000000004000000000800000000001000000000000000048000000002100100001000020000000000000000000000000002000000000002000000000000000000000100000",
    "blockHash": "0xec8457c6101b49a12db60e9dfbdcbf6f5bb1141a94c31db62feba7b3bc493798",
    "transactionHash": "0x0644bbfab8c0a1cdc18d692af62d7cc0d062b7c8cf4b43a96f7ea13dcbb421bb",
    "logs": [
      {
        "transactionIndex": 46,
        "blockNumber": 26395364,
        "transactionHash": "0x0644bbfab8c0a1cdc18d692af62d7cc0d062b7c8cf4b43a96f7ea13dcbb421bb",
        "address": "0xc2768beF7a6BB57F0FfA169a9ED4017c09696FF1",
        "topics": [
          "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809"
        ],
        "data": "0x",
        "logIndex": 145,
        "blockHash": "0xec8457c6101b49a12db60e9dfbdcbf6f5bb1141a94c31db62feba7b3bc493798"
      },
      {
        "transactionIndex": 46,
        "blockNumber": 26395364,
        "transactionHash": "0x0644bbfab8c0a1cdc18d692af62d7cc0d062b7c8cf4b43a96f7ea13dcbb421bb",
        "address": "0xc2768beF7a6BB57F0FfA169a9ED4017c09696FF1",
        "topics": [
          "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
          "0x74a064b2dec4aeb0b53e2d06f8e76ce531a17302a866fe51bc86d9a90b4e85e3",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809"
        ],
        "data": "0x",
        "logIndex": 146,
        "blockHash": "0xec8457c6101b49a12db60e9dfbdcbf6f5bb1141a94c31db62feba7b3bc493798"
      },
      {
        "transactionIndex": 46,
        "blockNumber": 26395364,
        "transactionHash": "0x0644bbfab8c0a1cdc18d692af62d7cc0d062b7c8cf4b43a96f7ea13dcbb421bb",
        "address": "0xc2768beF7a6BB57F0FfA169a9ED4017c09696FF1",
        "topics": [
          "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
          "0x5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809"
        ],
        "data": "0x",
        "logIndex": 147,
        "blockHash": "0xec8457c6101b49a12db60e9dfbdcbf6f5bb1141a94c31db62feba7b3bc493798"
      },
      {
        "transactionIndex": 46,
        "blockNumber": 26395364,
        "transactionHash": "0x0644bbfab8c0a1cdc18d692af62d7cc0d062b7c8cf4b43a96f7ea13dcbb421bb",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x000000000000000000000000a15eab321f68ffe4800f1ba22dcd4bfdf644a809",
          "0x00000000000000000000000026c80cc193b27d73d2c40943acec77f4da2c5bd8"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000276c6eb77cf18cc00000000000000000000000000000000000000000000008ef374b606bdcb0aa4000000000000000000000000000000000000000000000f6b93c4f8c2c474b44700000000000000000000000000000000000000000000008ef0fdef1b45fbf1d8000000000000000000000000000000000000000000000f6b963bbfae3c43cd13",
        "logIndex": 148,
        "blockHash": "0xec8457c6101b49a12db60e9dfbdcbf6f5bb1141a94c31db62feba7b3bc493798"
      }
    ],
    "blockNumber": 26395364,
    "cumulativeGasUsed": "9666056",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "Peronio",
    "PE",
    "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
    "0xa3Fa99A148fA48D14Ed51d610c367C61876997F1",
    "0x160532D2536175d65C03B97b0630A9802c274daD",
    "0x580A84C73811E1839F75d86d75d88cCa0c241fF4",
    "0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff",
    "0x574Fe4E8120C4Da1741b5Fd45584de7A5b521F0F",
    "1"
  ],
  "numDeployments": 1,
  "solcInputHash": "64f365930fca704292896b4fa2e86b92",
  "metadata": "{\"compiler\":{\"version\":\"0.8.4+commit.c7e474f2\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"usdcAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"maiAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lpAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"qiAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quickswapRouterAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"qidaoFarmAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"qidaoPoolId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"qi\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"usdc\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lp\",\"type\":\"uint256\"}],\"name\":\"CompoundRewards\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wmatic\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"collateral\",\"type\":\"uint256\"}],\"name\":\"HarvestedMatic\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"collateral\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingRatio\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"markup\",\"type\":\"uint256\"}],\"name\":\"MarkupUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LP_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAI_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MARKUP_DECIMALS\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MARKUP_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QIDAO_FARM_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QIDAO_POOL_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QI_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QUICKSWAP_ROUTER_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARDS_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"USDC_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"buyingPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"collateralRatio\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"compoundRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"usdcAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lpAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLpReserves\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"usdcReserves\",\"type\":\"uint112\"},{\"internalType\":\"uint112\",\"name\":\"maiReserves\",\"type\":\"uint112\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingRewardsAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"usdcAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startingRatio\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"markup\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"usdcAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minReceive\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"peAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"markup_\",\"type\":\"uint256\"}],\"name\":\"setMarkup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"usdcAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maiAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakedValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalUSDC\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"swapFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usdcPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"peAmount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Peronio.sol\":\"Peronio\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts_latest/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n *     require(hasRole(MY_ROLE, msg.sender));\\n *     ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n    struct RoleData {\\n        mapping(address => bool) members;\\n        bytes32 adminRole;\\n    }\\n\\n    mapping(bytes32 => RoleData) private _roles;\\n\\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n    /**\\n     * @dev Modifier that checks that an account has a specific role. Reverts\\n     * with a standardized message including the required role.\\n     *\\n     * The format of the revert reason is given by the following regular expression:\\n     *\\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n     *\\n     * _Available since v4.1._\\n     */\\n    modifier onlyRole(bytes32 role) {\\n        _checkRole(role, _msgSender());\\n        _;\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) public view override returns (bool) {\\n        return _roles[role].members[account];\\n    }\\n\\n    /**\\n     * @dev Revert with a standard message if `account` is missing `role`.\\n     *\\n     * The format of the revert reason is given by the following regular expression:\\n     *\\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n     */\\n    function _checkRole(bytes32 role, address account) internal view {\\n        if (!hasRole(role, account)) {\\n            revert(\\n                string(\\n                    abi.encodePacked(\\n                        \\\"AccessControl: account \\\",\\n                        Strings.toHexString(uint160(account), 20),\\n                        \\\" is missing role \\\",\\n                        Strings.toHexString(uint256(role), 32)\\n                    )\\n                )\\n            );\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {\\n        return _roles[role].adminRole;\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `account`.\\n     */\\n    function renounceRole(bytes32 role, address account) public virtual override {\\n        require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event. Note that unlike {grantRole}, this function doesn't perform any\\n     * checks on the calling account.\\n     *\\n     * [WARNING]\\n     * ====\\n     * This function should only be called from the constructor when setting\\n     * up the initial roles for the system.\\n     *\\n     * Using this function in any other way is effectively circumventing the admin\\n     * system imposed by {AccessControl}.\\n     * ====\\n     */\\n    function _setupRole(bytes32 role, address account) internal virtual {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Sets `adminRole` as ``role``'s admin role.\\n     *\\n     * Emits a {RoleAdminChanged} event.\\n     */\\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n        bytes32 previousAdminRole = getRoleAdmin(role);\\n        _roles[role].adminRole = adminRole;\\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n    }\\n\\n    function _grantRole(bytes32 role, address account) private {\\n        if (!hasRole(role, account)) {\\n            _roles[role].members[account] = true;\\n            emit RoleGranted(role, account, _msgSender());\\n        }\\n    }\\n\\n    function _revokeRole(bytes32 role, address account) private {\\n        if (hasRole(role, account)) {\\n            _roles[role].members[account] = false;\\n            emit RoleRevoked(role, account, _msgSender());\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x183481af1c40d2efb26b86f63d6fe9e22f24c87e436d60a69f261b38500e7cd6\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     *\\n     * _Available since v3.1._\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `account`.\\n     */\\n    function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xfe0edb09653ed10e8a1bfe03eb9b0ff06775666eee817a95bd3d0799f1ee2b44\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n    mapping(address => uint256) private _balances;\\n\\n    mapping(address => mapping(address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}.\\n     *\\n     * The default value of {decimals} is 18. To select a different value for\\n     * {decimals} you should overload it.\\n     *\\n     * All two of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    constructor(string memory name_, string memory symbol_) {\\n        _name = name_;\\n        _symbol = symbol_;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual override returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual override returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n     * overridden;\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual override returns (uint8) {\\n        return 18;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n\\n        uint256 currentAllowance = _allowances[sender][_msgSender()];\\n        require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n        unchecked {\\n            _approve(sender, _msgSender(), currentAllowance - amount);\\n        }\\n\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        uint256 currentAllowance = _allowances[_msgSender()][spender];\\n        require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n        unchecked {\\n            _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n        }\\n\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n     *\\n     * This internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        uint256 senderBalance = _balances[sender];\\n        require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        unchecked {\\n            _balances[sender] = senderBalance - amount;\\n        }\\n        _balances[recipient] += amount;\\n\\n        emit Transfer(sender, recipient, amount);\\n\\n        _afterTokenTransfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply += amount;\\n        _balances[account] += amount;\\n        emit Transfer(address(0), account, amount);\\n\\n        _afterTokenTransfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        uint256 accountBalance = _balances[account];\\n        require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        unchecked {\\n            _balances[account] = accountBalance - amount;\\n        }\\n        _totalSupply -= amount;\\n\\n        emit Transfer(account, address(0), amount);\\n\\n        _afterTokenTransfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(\\n        address owner,\\n        address spender,\\n        uint256 amount\\n    ) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal virtual {}\\n\\n    /**\\n     * @dev Hook that is called after any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * has been transferred to `to`.\\n     * - when `from` is zero, `amount` tokens have been minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _afterTokenTransfer(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/extensions/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\\n * tokens and those that they have an allowance for, in a way that can be\\n * recognized off-chain (via event analysis).\\n */\\nabstract contract ERC20Burnable is Context, ERC20 {\\n    /**\\n     * @dev Destroys `amount` tokens from the caller.\\n     *\\n     * See {ERC20-_burn}.\\n     */\\n    function burn(uint256 amount) public virtual {\\n        _burn(_msgSender(), amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, deducting from the caller's\\n     * allowance.\\n     *\\n     * See {ERC20-_burn} and {ERC20-allowance}.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have allowance for ``accounts``'s tokens of at least\\n     * `amount`.\\n     */\\n    function burnFrom(address account, uint256 amount) public virtual {\\n        uint256 currentAllowance = allowance(account, _msgSender());\\n        require(currentAllowance >= amount, \\\"ERC20: burn amount exceeds allowance\\\");\\n        unchecked {\\n            _approve(account, _msgSender(), currentAllowance - amount);\\n        }\\n        _burn(account, amount);\\n    }\\n}\\n\",\"keccak256\":\"0xf98cb1651a90d20ef77d8c1dd10d5fce4954e747603e5672a8292bd4368120dd\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the symbol of the token.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the decimals places of the token.\\n     */\\n    function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n    using Counters for Counters.Counter;\\n\\n    mapping(address => Counters.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _PERMIT_TYPEHASH =\\n        keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public virtual override {\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSA.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view virtual override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n\\n    /**\\n     * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n     *\\n     * _Available since v4.1._\\n     */\\n    function _useNonce(address owner) internal virtual returns (uint256 current) {\\n        Counters.Counter storage nonce = _nonces[owner];\\n        current = nonce.current();\\n        nonce.increment();\\n    }\\n}\\n\",\"keccak256\":\"0x7ce4684ee1fac31ee5671df82b30c10bd2ebf88add2f63524ed00618a8486907\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n     * given ``owner``'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x3aab711a5f9a5a5a394191e928cc8258e8a243e855bb0275e7834f9686383277\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    using Address for address;\\n\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 value\\n    ) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 value\\n    ) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(\\n        IERC20 token,\\n        address spender,\\n        uint256 value\\n    ) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        require(\\n            (value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(\\n        IERC20 token,\\n        address spender,\\n        uint256 value\\n    ) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(\\n        IERC20 token,\\n        address spender,\\n        uint256 value\\n    ) internal {\\n        unchecked {\\n            uint256 oldAllowance = token.allowance(address(this), spender);\\n            require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n            uint256 newAllowance = oldAllowance - value;\\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) {\\n            // Return data is optional\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        unchecked {\\n            counter._value += 1;\\n        }\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        uint256 value = counter._value;\\n        require(value > 0, \\\"Counter: decrement overflow\\\");\\n        unchecked {\\n            counter._value = value - 1;\\n        }\\n    }\\n\\n    function reset(Counter storage counter) internal {\\n        counter._value = 0;\\n    }\\n}\\n\",\"keccak256\":\"0x78450f4e3b722cce467b21e285f72ce5eaf361e9ba9dd2241a413926246773cd\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        while (value != 0) {\\n            digits -= 1;\\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n            value /= 10;\\n        }\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        if (value == 0) {\\n            return \\\"0x00\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 length = 0;\\n        while (temp != 0) {\\n            length++;\\n            temp >>= 8;\\n        }\\n        return toHexString(value, length);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x391d3ba97ab6856a16b225d6ee29617ad15ff00db70f3b4df1ab5ea33aa47c9d\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS,\\n        InvalidSignatureV\\n    }\\n\\n    function _throwError(RecoverError error) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert(\\\"ECDSA: invalid signature\\\");\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert(\\\"ECDSA: invalid signature 's' value\\\");\\n        } else if (error == RecoverError.InvalidSignatureV) {\\n            revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature` or error string. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n        // Check the signature length\\n        // - case 65: r,s,v signature (standard)\\n        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else if (signature.length == 64) {\\n            bytes32 r;\\n            bytes32 vs;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                vs := mload(add(signature, 0x40))\\n            }\\n            return tryRecover(hash, r, vs);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address, RecoverError) {\\n        bytes32 s;\\n        uint8 v;\\n        assembly {\\n            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n            v := add(shr(255, vs), 27)\\n        }\\n        return tryRecover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     *\\n     * _Available since v4.2._\\n     */\\n    function recover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address, RecoverError) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS);\\n        }\\n        if (v != 27 && v != 28) {\\n            return (address(0), RecoverError.InvalidSignatureV);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature);\\n        }\\n\\n        return (signer, RecoverError.NoError);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Typed Data, created from a\\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\\n     * to the one signed with the\\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n     * JSON-RPC method as part of EIP-712.\\n     *\\n     * See {recover}.\\n     */\\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n    }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n    /* solhint-disable var-name-mixedcase */\\n    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n    // invalidate the cached domain separator if the chain id changes.\\n    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n    uint256 private immutable _CACHED_CHAIN_ID;\\n\\n    bytes32 private immutable _HASHED_NAME;\\n    bytes32 private immutable _HASHED_VERSION;\\n    bytes32 private immutable _TYPE_HASH;\\n\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    constructor(string memory name, string memory version) {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        bytes32 typeHash = keccak256(\\n            \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n        );\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n        _CACHED_CHAIN_ID = block.chainid;\\n        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n        _TYPE_HASH = typeHash;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        if (block.chainid == _CACHED_CHAIN_ID) {\\n            return _CACHED_DOMAIN_SEPARATOR;\\n        } else {\\n            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n        }\\n    }\\n\\n    function _buildDomainSeparator(\\n        bytes32 typeHash,\\n        bytes32 nameHash,\\n        bytes32 versionHash\\n    ) private view returns (bytes32) {\\n        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n    }\\n}\\n\",\"keccak256\":\"0xba18d725602452307e5b278ed4566616c63792d89f3a0388a6f285428c26e681\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IERC165).interfaceId;\\n    }\\n}\\n\",\"keccak256\":\"0x5718c5df9bd67ac68a796961df938821bb5dc0cd4c6118d77e9145afb187409b\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\",\"license\":\"MIT\"},\"@openzeppelin/contracts_latest/utils/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n// CAUTION\\n// This version of SafeMath should only be used with Solidity 0.8 or later,\\n// because it relies on the compiler's built in overflow checks.\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations.\\n *\\n * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler\\n * now has built in overflow checking.\\n */\\nlibrary SafeMath {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            uint256 c = a + b;\\n            if (c < a) return (false, 0);\\n            return (true, c);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b > a) return (false, 0);\\n            return (true, a - b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n            // benefit is lost if 'b' is also tested.\\n            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n            if (a == 0) return (true, 0);\\n            uint256 c = a * b;\\n            if (c / a != b) return (false, 0);\\n            return (true, c);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b == 0) return (false, 0);\\n            return (true, a / b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b == 0) return (false, 0);\\n            return (true, a % b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a + b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a * b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b <= a, errorMessage);\\n            return a - b;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b > 0, errorMessage);\\n            return a / b;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b > 0, errorMessage);\\n            return a % b;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8666f020bd8fc9dc14f07e2ebc52b5f236ab4cdde7c77679b08cb2f94730043b\",\"license\":\"MIT\"},\"contracts/IPeronio.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.2;\\n\\ninterface IPeronio {\\n  function USDC_ADDRESS() external view returns (address);\\n\\n  function MAI_ADDRESS() external view returns (address);\\n\\n  function LP_ADDRESS() external view returns (address);\\n\\n  function QUICKSWAP_ROUTER_ADDRESS() external view returns (address);\\n\\n  function QIDAO_FARM_ADDRESS() external view returns (address);\\n\\n  function QI_ADDRESS() external view returns (address);\\n\\n  function QIDAO_POOL_ID() external view returns (uint256);\\n\\n  // Markup\\n  function MARKUP_DECIMALS() external view returns (uint8);\\n\\n  function markup() external view returns (uint256);\\n\\n  function swapFee() external view returns (uint256);\\n\\n  // Initialization can only be run once\\n  function initialized() external view returns (bool);\\n\\n  // Roles\\n  function MARKUP_ROLE() external view returns (bytes32);\\n\\n  function REWARDS_ROLE() external view returns (bytes32);\\n\\n  // Events\\n  event Initialized(address owner, uint256 collateral, uint256 startingRatio);\\n  event Minted(\\n    address indexed to,\\n    uint256 collateralAmount,\\n    uint256 tokenAmount\\n  );\\n  event Withdrawal(\\n    address indexed to,\\n    uint256 collateralAmount,\\n    uint256 tokenAmount\\n  );\\n  event MarkupUpdated(address operator, uint256 markup);\\n  event CompoundRewards(uint256 qi, uint256 usdc, uint256 lp);\\n  event HarvestedMatic(uint256 wmatic, uint256 collateral);\\n\\n  function decimals() external view returns (uint8);\\n\\n  function initialize(uint256 usdcAmount, uint256 startingRatio) external;\\n\\n  function setMarkup(uint256 markup_) external;\\n\\n  function mint(\\n    address to,\\n    uint256 usdcAmount,\\n    uint256 minReceive\\n  ) external returns (uint256 peAmount);\\n\\n  function withdraw(address to, uint256 peAmount) external;\\n\\n  function claimRewards() external;\\n\\n  function compoundRewards()\\n    external\\n    returns (uint256 usdcAmount, uint256 lpAmount);\\n\\n  function stakedBalance() external view returns (uint256);\\n\\n  function stakedValue() external view returns (uint256 totalUSDC);\\n\\n  function usdcPrice() external view returns (uint256);\\n\\n  function buyingPrice() external view returns (uint256);\\n\\n  function collateralRatio() external view returns (uint256);\\n\\n  function getPendingRewardsAmount() external view returns (uint256 amount);\\n\\n  function getLpReserves()\\n    external\\n    view\\n    returns (uint112 usdcReserves, uint112 maiReserves);\\n}\\n\",\"keccak256\":\"0x6108da56f527c5d32b687757b47795e67fba4142b2e9f98765af7698d83501bd\",\"license\":\"MIT\"},\"contracts/Peronio.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.2;\\n\\n// OpenZepellin imports\\nimport \\\"@openzeppelin/contracts_latest/utils/math/SafeMath.sol\\\";\\nimport \\\"@openzeppelin/contracts_latest/token/ERC20/utils/SafeERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts_latest/access/AccessControl.sol\\\";\\nimport \\\"@openzeppelin/contracts_latest/token/ERC20/extensions/draft-ERC20Permit.sol\\\";\\nimport \\\"@openzeppelin/contracts_latest/token/ERC20/extensions/ERC20Burnable.sol\\\";\\n\\n// QiDao\\nimport \\\"./qidao/IFarm.sol\\\";\\n\\n// UniSwap\\nimport \\\"./uniswap/interfaces/IUniswapV2Router02.sol\\\";\\nimport \\\"./uniswap/interfaces/IUniswapV2Pair.sol\\\";\\n\\n// Interface\\nimport \\\"./IPeronio.sol\\\";\\n\\ncontract Peronio is IPeronio, ERC20, ERC20Burnable, ERC20Permit, AccessControl {\\n  using SafeMath for uint256;\\n  using SafeERC20 for IERC20;\\n\\n  // USDC Token Address\\n  address public immutable override USDC_ADDRESS;\\n  // MAI Token Address\\n  address public immutable override MAI_ADDRESS;\\n\\n  // LP USDC/MAI Address from QuickSwap\\n  address public immutable override LP_ADDRESS;\\n\\n  // QuickSwap Router\\n  address public immutable override QUICKSWAP_ROUTER_ADDRESS;\\n\\n  // QiDao Farm\\n  address public immutable override QIDAO_FARM_ADDRESS;\\n  // QI Token Address\\n  address public immutable override QI_ADDRESS;\\n  // QiDao Pool ID\\n  uint256 public immutable override QIDAO_POOL_ID;\\n\\n  // Markup\\n  uint8 public constant override MARKUP_DECIMALS = 5;\\n  uint256 public override markup = 5 * 10**(MARKUP_DECIMALS - 2); // 5%\\n  uint256 public override swapFee = 15 * 10**(MARKUP_DECIMALS - 4); // 0.15%\\n\\n  // Initialization can only be run once\\n  bool public override initialized = false;\\n\\n  // Roles\\n  bytes32 public constant override MARKUP_ROLE = keccak256(\\\"MARKUP_ROLE\\\");\\n  bytes32 public constant override REWARDS_ROLE = keccak256(\\\"REWARDS_ROLE\\\");\\n\\n  constructor(\\n    string memory name,\\n    string memory symbol,\\n    address usdcAddress,\\n    address maiAddress,\\n    address lpAddress,\\n    address qiAddress,\\n    address quickswapRouterAddress,\\n    address qidaoFarmAddress,\\n    uint256 qidaoPoolId\\n  ) ERC20(name, symbol) ERC20Permit(name) {\\n    // Stablecoins\\n    USDC_ADDRESS = usdcAddress;\\n    MAI_ADDRESS = maiAddress;\\n\\n    // LP USDC/MAI Address\\n    LP_ADDRESS = lpAddress;\\n\\n    // Router\\n    QUICKSWAP_ROUTER_ADDRESS = quickswapRouterAddress;\\n\\n    // QiDao\\n    QIDAO_FARM_ADDRESS = qidaoFarmAddress;\\n    QIDAO_POOL_ID = qidaoPoolId;\\n    QI_ADDRESS = qiAddress;\\n\\n    // Grant roles\\n    _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());\\n    _setupRole(MARKUP_ROLE, _msgSender());\\n    _setupRole(REWARDS_ROLE, _msgSender());\\n  }\\n\\n  // Fixed 6 Decimals\\n  function decimals()\\n    public\\n    view\\n    virtual\\n    override(ERC20, IPeronio)\\n    returns (uint8)\\n  {\\n    return 6;\\n  }\\n\\n  // Sets initial minting. Can be runned just once\\n  function initialize(uint256 usdcAmount, uint256 startingRatio)\\n    external\\n    override\\n    onlyRole(DEFAULT_ADMIN_ROLE)\\n  {\\n    require(!initialized, \\\"Contract already initialized\\\");\\n\\n    // Get USDT from user\\n    IERC20(USDC_ADDRESS).safeTransferFrom(\\n      _msgSender(),\\n      address(this),\\n      usdcAmount\\n    );\\n\\n    // Unlmited ERC20 approval for Router\\n    uint256 unlimitedAmount = 2**256 - 1;\\n    IERC20(MAI_ADDRESS).approve(QUICKSWAP_ROUTER_ADDRESS, unlimitedAmount);\\n    IERC20(USDC_ADDRESS).approve(QUICKSWAP_ROUTER_ADDRESS, unlimitedAmount);\\n    IERC20(LP_ADDRESS).approve(QUICKSWAP_ROUTER_ADDRESS, unlimitedAmount);\\n    IERC20(QI_ADDRESS).approve(QUICKSWAP_ROUTER_ADDRESS, unlimitedAmount);\\n\\n    // Zaps into amUSDT\\n    _zapIn(usdcAmount);\\n\\n    usdcAmount = _stakedValue();\\n    // Mints exactly startingRatio for each USDC deposit\\n    _mint(_msgSender(), startingRatio.mul(usdcAmount));\\n\\n    // Lock contract to prevent to be initialized twice\\n    initialized = true;\\n    emit Initialized(_msgSender(), usdcAmount, startingRatio);\\n  }\\n\\n  // Sets markup for minting function\\n  function setMarkup(uint256 markup_) external override onlyRole(MARKUP_ROLE) {\\n    markup = markup_;\\n    emit MarkupUpdated(_msgSender(), markup_);\\n  }\\n\\n  // Mints new tokens providing proportional collateral (USDC)\\n  function mint(\\n    address to,\\n    uint256 usdcAmount,\\n    uint256 minReceive\\n  ) external override returns (uint256 peAmount) {\\n    // Gets current staked LP Tokens\\n    uint256 stakedAmount = _stakedBalance();\\n\\n    // Transfer Collateral Token (USDT) to this contract\\n    IERC20(USDC_ADDRESS).safeTransferFrom(\\n      _msgSender(),\\n      address(this),\\n      usdcAmount\\n    ); // Changed\\n\\n    // Zaps USDC directly into MAI/USDC Vault\\n    uint256 lpAmount = _zapIn(usdcAmount);\\n\\n    // Fee - Swap fee (+0.15% positive bonus)\\n    uint256 markupFee = lpAmount.mul(markup - swapFee).div(10**MARKUP_DECIMALS); // Calculate fee to substract\\n    lpAmount = lpAmount.sub(markupFee); // remove 5% fee\\n\\n    // Compute %\\n    uint256 ratio = lpAmount.mul(10e8).div(stakedAmount);\\n    peAmount = ratio.mul(totalSupply()).div(10e8);\\n\\n    require(peAmount > minReceive, \\\"Minimum required not met\\\");\\n    _mint(to, peAmount);\\n    emit Minted(_msgSender(), usdcAmount, peAmount);\\n  }\\n\\n  // Receives Main token burns it and returns Collateral Token proportionally\\n  function withdraw(address to, uint256 peAmount) external override {\\n    // Transfer collateral back to user wallet to current contract\\n    uint256 ratio = peAmount.mul(10e8).div(totalSupply());\\n    uint256 lpAmount = ratio.mul(_stakedBalance()).div(10e8);\\n\\n    uint256 usdcAmount;\\n    uint256 maiAmount;\\n\\n    (usdcAmount, maiAmount) = _zapOut(lpAmount);\\n\\n    // Swap MAI into USDC\\n    uint256 usdcTotal = usdcAmount + _swapMAItoUSDC(maiAmount);\\n\\n    //Burn tokens\\n    _burn(_msgSender(), peAmount);\\n\\n    // Transfer back Collateral Token (USDT) the user\\n    IERC20(USDC_ADDRESS).safeTransfer(to, usdcTotal);\\n\\n    emit Withdrawal(_msgSender(), usdcTotal, peAmount);\\n  }\\n\\n  // Claim QI rewards from Farm\\n  function claimRewards() external override onlyRole(REWARDS_ROLE) {\\n    IFarm(QIDAO_FARM_ADDRESS).deposit(QIDAO_POOL_ID, 0);\\n  }\\n\\n  // Reinvest the QI into the Farm\\n  function compoundRewards()\\n    external\\n    override\\n    onlyRole(REWARDS_ROLE)\\n    returns (uint256 usdcAmount, uint256 lpAmount)\\n  {\\n    uint256 amount = IERC20(QI_ADDRESS).balanceOf(address(this));\\n    address[] memory path = new address[](2);\\n    path[0] = QI_ADDRESS;\\n    path[1] = USDC_ADDRESS;\\n\\n    uint256[] memory amounts = IUniswapV2Router02(QUICKSWAP_ROUTER_ADDRESS)\\n      .swapExactTokensForTokens(\\n        amount,\\n        1,\\n        path,\\n        address(this),\\n        block.timestamp + 3600\\n      );\\n    usdcAmount = amounts[1];\\n    lpAmount = _zapIn(usdcAmount);\\n\\n    emit CompoundRewards(amount, usdcAmount, lpAmount);\\n  }\\n\\n  // Returns LP Amount staked in the Farm\\n  function stakedBalance() external view override returns (uint256) {\\n    return _stakedBalance();\\n  }\\n\\n  // Returns current staking value in USDC\\n  function stakedValue() external view override returns (uint256 totalUSDC) {\\n    return _stakedValue();\\n  }\\n\\n  // Returns current USDC and MAI token balances in the FARM\\n  function stakedTokens()\\n    external\\n    view\\n    returns (uint256 usdcAmount, uint256 maiAmount)\\n  {\\n    return _stakedTokens();\\n  }\\n\\n  // Gets current ratio: Total Supply / Collateral USDC Balance in vault\\n  function usdcPrice() external view override returns (uint256) {\\n    return (this.totalSupply().mul(10**decimals())).div(_stakedValue());\\n  }\\n\\n  // Gets current ratio: collateralRatio + markup\\n  function buyingPrice() external view override returns (uint256) {\\n    uint256 basePrice = _collateralRatio();\\n    uint256 fee = (basePrice.mul(markup)).div(10**MARKUP_DECIMALS);\\n    return basePrice + fee;\\n  }\\n\\n  // Gets current ratio: Collateral USDC Balance / Total Supply\\n  function collateralRatio() external view override returns (uint256) {\\n    return _collateralRatio();\\n  }\\n\\n  // Fetch pending rewards (QI) from Mai Farm\\n  function getPendingRewardsAmount()\\n    external\\n    view\\n    override\\n    returns (uint256 amount)\\n  {\\n    amount = _getPendingRewardsAmount();\\n  }\\n\\n  // Return all QuickSwap Liquidity Pool (MAI/USDC) reserves\\n  function getLpReserves()\\n    external\\n    view\\n    override\\n    returns (uint112 usdcReserves, uint112 maiReserves)\\n  {\\n    return _getLpReserves();\\n  }\\n\\n  // Collateral USDC Balance / Total Supply\\n  function _collateralRatio() internal view returns (uint256) {\\n    return _stakedValue().mul(10**decimals()).div(this.totalSupply());\\n  }\\n\\n  // Returns current staking value in USDC\\n  function _stakedValue() internal view returns (uint256 totalUSDC) {\\n    uint256 usdcReserves;\\n    uint256 maiReserves;\\n    uint256 usdcAmount;\\n    uint256 maiAmount;\\n    (usdcReserves, maiReserves) = _getLpReserves();\\n    (usdcAmount, maiAmount) = _stakedTokens();\\n\\n    // Simulate Swap\\n    totalUSDC = usdcAmount.add(\\n      _getAmountOut(maiAmount, maiReserves, usdcReserves)\\n    );\\n  }\\n\\n  // Return all QuickSwap Liquidity Pool (MAI/USDC) reserves\\n  function _getLpReserves()\\n    internal\\n    view\\n    returns (uint112 usdcReserves, uint112 maiReserves)\\n  {\\n    uint112 reserve0;\\n    uint112 reserve1;\\n    (reserve0, reserve1, ) = IUniswapV2Pair(LP_ADDRESS).getReserves();\\n    (usdcReserves, maiReserves) = USDC_ADDRESS < MAI_ADDRESS\\n      ? (reserve0, reserve1)\\n      : (reserve1, reserve0);\\n  }\\n\\n  // Returns current USDC and MAI token balances in the FARM\\n  function _stakedTokens()\\n    internal\\n    view\\n    returns (uint256 usdcAmount, uint256 maiAmount)\\n  {\\n    uint256 lpAmount = _stakedBalance();\\n    // Add 18 precision decimals\\n    uint256 ratio = lpAmount.mul(10e18).div(IERC20(LP_ADDRESS).totalSupply());\\n    uint112 usdcReserves;\\n    uint112 maiReserves;\\n\\n    (usdcReserves, maiReserves) = _getLpReserves();\\n\\n    // Remove 18 precision decimals\\n    usdcAmount = ratio.mul(usdcReserves).div(10e18);\\n    maiAmount = ratio.mul(maiReserves).div(10e18);\\n  }\\n\\n  // Returns LP Amount staked in the QiDao Farm\\n  function _stakedBalance() internal view returns (uint256) {\\n    return IFarm(QIDAO_FARM_ADDRESS).deposited(QIDAO_POOL_ID, address(this));\\n  }\\n\\n  // Zaps USDC into MAI/USDC Pool and mint into QiDao Farm\\n  function _zapIn(uint256 amount) internal returns (uint256 lpAmount) {\\n    // Provide USDC Liquidity (MAI/USDC) and get LP Tokens in return\\n    uint256 amountToSwap = amount.div(2);\\n    uint256 usdcAmount = amount.sub(amountToSwap);\\n    uint256 maiAmount = _swapUSDCtoMAI(amountToSwap);\\n\\n    lpAmount = _addLiquidity(usdcAmount, maiAmount);\\n\\n    // Stake LP Tokens\\n    _stakeLP(lpAmount);\\n  }\\n\\n  // Zaps out USDC from MAI/USDC Pool\\n  function _zapOut(uint256 lpAmount)\\n    internal\\n    returns (uint256 usdcAmount, uint256 maiAmount)\\n  {\\n    // Provide USDC Liquidity (MAI/USDC) and get LP Tokens in return\\n    _unstakeLP(lpAmount);\\n\\n    (usdcAmount, maiAmount) = _removeLiquidity(lpAmount);\\n  }\\n\\n  // Adds liquidity into the Quickswap pool MAI/USDC\\n  function _addLiquidity(uint256 usdcAmount, uint256 maiAmount)\\n    internal\\n    returns (uint256 lpAmount)\\n  {\\n    uint256 token0;\\n    uint256 token1;\\n\\n    // 5% Slippage\\n    uint256 minUSDCAmount = usdcAmount.mul(95).div(100);\\n    uint256 minMAIAmount = maiAmount.mul(95).div(100);\\n\\n    (token0, token1, lpAmount) = IUniswapV2Router02(QUICKSWAP_ROUTER_ADDRESS)\\n      .addLiquidity(\\n        USDC_ADDRESS,\\n        MAI_ADDRESS,\\n        usdcAmount,\\n        maiAmount,\\n        minUSDCAmount,\\n        minMAIAmount,\\n        address(this),\\n        block.timestamp + 3600\\n      );\\n  }\\n\\n  // Removes liquidity from Quickswap pool MAI/USDC\\n  function _removeLiquidity(uint256 lpAmount)\\n    internal\\n    returns (uint256 usdcAmount, uint256 maiAmount)\\n  {\\n    (usdcAmount, maiAmount) = IUniswapV2Router02(QUICKSWAP_ROUTER_ADDRESS)\\n      .removeLiquidity(\\n        USDC_ADDRESS,\\n        MAI_ADDRESS,\\n        lpAmount,\\n        1,\\n        1,\\n        address(this),\\n        block.timestamp + 3600\\n      );\\n  }\\n\\n  // Swaps MAI token into USDC on QuickSwap pool\\n  function _swapMAItoUSDC(uint256 amount)\\n    internal\\n    returns (uint256 usdcAmount)\\n  {\\n    address[] memory path = new address[](2);\\n    path[0] = MAI_ADDRESS;\\n    path[1] = USDC_ADDRESS;\\n\\n    uint256[] memory amounts = IUniswapV2Router02(QUICKSWAP_ROUTER_ADDRESS)\\n      .swapExactTokensForTokens(\\n        amount,\\n        1,\\n        path,\\n        address(this),\\n        block.timestamp + 3600\\n      );\\n    usdcAmount = amounts[1];\\n  }\\n\\n  // Swaps USDC into MAI on QuickSwap pool\\n  function _swapUSDCtoMAI(uint256 amount) internal returns (uint256 maiAmount) {\\n    address[] memory path = new address[](2);\\n    path[0] = USDC_ADDRESS;\\n    path[1] = MAI_ADDRESS;\\n\\n    uint256[] memory amounts = IUniswapV2Router02(QUICKSWAP_ROUTER_ADDRESS)\\n      .swapExactTokensForTokens(\\n        amount,\\n        1,\\n        path,\\n        address(this),\\n        block.timestamp + 3600\\n      );\\n    maiAmount = amounts[1];\\n  }\\n\\n  // Stake LP tokens (MAI/USDC) into QiDAO Farm\\n  function _stakeLP(uint256 lpAmount) internal {\\n    // Approve LP Tokens for QiDao Farm\\n    IERC20(LP_ADDRESS).approve(QIDAO_FARM_ADDRESS, lpAmount);\\n\\n    // Deposit LP Tokens into Farm\\n    IFarm(QIDAO_FARM_ADDRESS).deposit(QIDAO_POOL_ID, lpAmount);\\n  }\\n\\n  // Unstake LP tokens (MAI/USDC) into QiDAO Farm\\n  function _unstakeLP(uint256 lpAmount) internal {\\n    // Deposit LP Tokens into Farm\\n    IFarm(QIDAO_FARM_ADDRESS).withdraw(QIDAO_POOL_ID, lpAmount);\\n  }\\n\\n  // Returns LP Balance\\n  function _getLPBalanceAmount() internal view returns (uint256 lpAmount) {\\n    // Get current LP Balance\\n    lpAmount = IERC20(LP_ADDRESS).balanceOf(address(this));\\n  }\\n\\n  // Returns pending rewards (QI) amount from Mai Farm\\n  function _getPendingRewardsAmount() internal view returns (uint256 amount) {\\n    // Get rewards on Farm\\n    amount = IFarm(QIDAO_FARM_ADDRESS).pending(QIDAO_POOL_ID, address(this));\\n  }\\n\\n  // Returns QI Balance in the contract\\n  function _getRewardsAmount() internal view returns (uint256 amount) {\\n    // Get QI Dao balanced minted\\n    amount = IERC20(QI_ADDRESS).balanceOf(address(this));\\n  }\\n\\n  //**  UNISWAP Library Functions Below **/\\n  function _getAmountOut(\\n    uint256 amountIn,\\n    uint256 reserveIn,\\n    uint256 reserveOut\\n  ) internal pure returns (uint256 amountOut) {\\n    require(amountIn > 0, \\\"UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT\\\");\\n    require(\\n      reserveIn > 0 && reserveOut > 0,\\n      \\\"UniswapV2Library: INSUFFICIENT_LIQUIDITY\\\"\\n    );\\n    uint256 amountInWithFee = amountIn.mul(997);\\n    uint256 numerator = amountInWithFee.mul(reserveOut);\\n    uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);\\n    amountOut = numerator / denominator;\\n  }\\n}\\n\",\"keccak256\":\"0x5bcb3cee8a79111be4c18607ab45261c04057363e4b1903bfb1b2b7e15b18d8c\",\"license\":\"MIT\"},\"contracts/qidao/IFarm.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.2;\\n\\ninterface IFarm {\\n  function add(\\n    uint256 _allocPoint,\\n    address _lpToken,\\n    bool _withUpdate,\\n    uint16 _depositFeeBP\\n  ) external;\\n\\n  function deposit(uint256 _pid, uint256 _amount) external;\\n\\n  function deposited(uint256 _pid, address _user)\\n    external\\n    view\\n    returns (uint256);\\n\\n  function emergencyWithdraw(uint256 _pid) external;\\n\\n  function endBlock() external view returns (uint256);\\n\\n  function erc20() external view returns (address);\\n\\n  function feeAddress() external view returns (address);\\n\\n  function fund(uint256 _amount) external;\\n\\n  function massUpdatePools() external;\\n\\n  function owner() external view returns (address);\\n\\n  function paidOut() external view returns (uint256);\\n\\n  function pending(uint256 _pid, address _user) external view returns (uint256);\\n\\n  function poolInfo(uint256)\\n    external\\n    view\\n    returns (\\n      address lpToken,\\n      uint256 allocPoint,\\n      uint256 lastRewardBlock,\\n      uint256 accERC20PerShare,\\n      uint16 depositFeeBP\\n    );\\n\\n  function poolLength() external view returns (uint256);\\n\\n  function renounceOwnership() external;\\n\\n  function rewardPerBlock() external view returns (uint256);\\n\\n  function set(\\n    uint256 _pid,\\n    uint256 _allocPoint,\\n    bool _withUpdate\\n  ) external;\\n\\n  function setFeeAddress(address _feeAddress) external;\\n\\n  function startBlock() external view returns (uint256);\\n\\n  function totalAllocPoint() external view returns (uint256);\\n\\n  function totalPending() external view returns (uint256);\\n\\n  function transferOwnership(address newOwner) external;\\n\\n  function updatePool(uint256 _pid) external;\\n\\n  function userInfo(uint256, address)\\n    external\\n    view\\n    returns (uint256 amount, uint256 rewardDebt);\\n\\n  function withdraw(uint256 _pid, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0xf7bf0eff4d6a9cf173ab081c579e3cf59a24b231d222104f302223192b87aeb9\",\"license\":\"MIT\"},\"contracts/uniswap/interfaces/IUniswapV2Pair.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0;\\n\\ninterface IUniswapV2Pair {\\n    event Approval(address indexed owner, address indexed spender, uint value);\\n    event Transfer(address indexed from, address indexed to, uint value);\\n\\n    function name() external pure returns (string memory);\\n    function symbol() external pure returns (string memory);\\n    function decimals() external pure returns (uint8);\\n    function totalSupply() external view returns (uint);\\n    function balanceOf(address owner) external view returns (uint);\\n    function allowance(address owner, address spender) external view returns (uint);\\n\\n    function approve(address spender, uint value) external returns (bool);\\n    function transfer(address to, uint value) external returns (bool);\\n    function transferFrom(address from, address to, uint value) external returns (bool);\\n\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n    function PERMIT_TYPEHASH() external pure returns (bytes32);\\n    function nonces(address owner) external view returns (uint);\\n\\n    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    event Mint(address indexed sender, uint amount0, uint amount1);\\n    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);\\n    event Swap(\\n        address indexed sender,\\n        uint amount0In,\\n        uint amount1In,\\n        uint amount0Out,\\n        uint amount1Out,\\n        address indexed to\\n    );\\n    event Sync(uint112 reserve0, uint112 reserve1);\\n\\n    function MINIMUM_LIQUIDITY() external pure returns (uint);\\n    function factory() external view returns (address);\\n    function token0() external view returns (address);\\n    function token1() external view returns (address);\\n    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\\n    function price0CumulativeLast() external view returns (uint);\\n    function price1CumulativeLast() external view returns (uint);\\n    function kLast() external view returns (uint);\\n\\n    function mint(address to) external returns (uint liquidity);\\n    function burn(address to) external returns (uint amount0, uint amount1);\\n    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;\\n    function skim(address to) external;\\n    function sync() external;\\n\\n    function initialize(address, address) external;\\n}\",\"keccak256\":\"0x08f9a63b34855eec941be8d36a04424f1a1725a2c030373fcef3afeb480ca385\",\"license\":\"GPL-3.0\"},\"contracts/uniswap/interfaces/IUniswapV2Router01.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.2;\\n\\ninterface IUniswapV2Router01 {\\n    function factory() external pure returns (address);\\n    function WETH() external pure returns (address);\\n\\n    function addLiquidity(\\n        address tokenA,\\n        address tokenB,\\n        uint amountADesired,\\n        uint amountBDesired,\\n        uint amountAMin,\\n        uint amountBMin,\\n        address to,\\n        uint deadline\\n    ) external returns (uint amountA, uint amountB, uint liquidity);\\n    function addLiquidityETH(\\n        address token,\\n        uint amountTokenDesired,\\n        uint amountTokenMin,\\n        uint amountETHMin,\\n        address to,\\n        uint deadline\\n    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\\n    function removeLiquidity(\\n        address tokenA,\\n        address tokenB,\\n        uint liquidity,\\n        uint amountAMin,\\n        uint amountBMin,\\n        address to,\\n        uint deadline\\n    ) external returns (uint amountA, uint amountB);\\n    function removeLiquidityETH(\\n        address token,\\n        uint liquidity,\\n        uint amountTokenMin,\\n        uint amountETHMin,\\n        address to,\\n        uint deadline\\n    ) external returns (uint amountToken, uint amountETH);\\n    function removeLiquidityWithPermit(\\n        address tokenA,\\n        address tokenB,\\n        uint liquidity,\\n        uint amountAMin,\\n        uint amountBMin,\\n        address to,\\n        uint deadline,\\n        bool approveMax, uint8 v, bytes32 r, bytes32 s\\n    ) external returns (uint amountA, uint amountB);\\n    function removeLiquidityETHWithPermit(\\n        address token,\\n        uint liquidity,\\n        uint amountTokenMin,\\n        uint amountETHMin,\\n        address to,\\n        uint deadline,\\n        bool approveMax, uint8 v, bytes32 r, bytes32 s\\n    ) external returns (uint amountToken, uint amountETH);\\n    function swapExactTokensForTokens(\\n        uint amountIn,\\n        uint amountOutMin,\\n        address[] calldata path,\\n        address to,\\n        uint deadline\\n    ) external returns (uint[] memory amounts);\\n    function swapTokensForExactTokens(\\n        uint amountOut,\\n        uint amountInMax,\\n        address[] calldata path,\\n        address to,\\n        uint deadline\\n    ) external returns (uint[] memory amounts);\\n    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\\n        external\\n        payable\\n        returns (uint[] memory amounts);\\n    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\\n        external\\n        returns (uint[] memory amounts);\\n    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\\n        external\\n        returns (uint[] memory amounts);\\n    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\\n        external\\n        payable\\n        returns (uint[] memory amounts);\\n\\n    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);\\n    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);\\n    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);\\n    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\\n    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\\n}\",\"keccak256\":\"0x12091adc186fe351c639dc62aa0b691f78c7bea054c27bbb4b58acd02e1b2ce7\",\"license\":\"GPL-3.0\"},\"contracts/uniswap/interfaces/IUniswapV2Router02.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.2;\\n\\nimport './IUniswapV2Router01.sol';\\n\\ninterface IUniswapV2Router02 is IUniswapV2Router01 {\\n    function removeLiquidityETHSupportingFeeOnTransferTokens(\\n        address token,\\n        uint liquidity,\\n        uint amountTokenMin,\\n        uint amountETHMin,\\n        address to,\\n        uint deadline\\n    ) external returns (uint amountETH);\\n    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\\n        address token,\\n        uint liquidity,\\n        uint amountTokenMin,\\n        uint amountETHMin,\\n        address to,\\n        uint deadline,\\n        bool approveMax, uint8 v, bytes32 r, bytes32 s\\n    ) external returns (uint amountETH);\\n\\n    // function swapExactTokensForTokensSupportingFeeOnTransferTokens(\\n    //     uint amountIn,\\n    //     uint amountOutMin,\\n    //     address[] calldata path,\\n    //     address to,\\n    //     uint deadline\\n    // ) external;\\n    // function swapExactETHForTokensSupportingFeeOnTransferTokens(\\n    //     uint amountOutMin,\\n    //     address[] calldata path,\\n    //     address to,\\n    //     uint deadline\\n    // ) external payable;\\n    // function swapExactTokensForETHSupportingFeeOnTransferTokens(\\n    //     uint amountIn,\\n    //     uint amountOutMin,\\n    //     address[] calldata path,\\n    //     address to,\\n    //     uint deadline\\n    // ) external;\\n}\",\"keccak256\":\"0x5563b02a1d95cba6a6a344e848276937d3be5e2813bd1b50a8b92d6a9368ff90\",\"license\":\"GPL-3.0\"}},\"version\":1}",
  "bytecode": "0x6102206040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120526200003860026005620006a0565b6200004590600a620005b2565b620000529060056200067e565b6007556200006360046005620006a0565b6200007090600a620005b2565b6200007d90600f6200067e565b6008556009805460ff191690553480156200009757600080fd5b50604051620044e9380380620044e9833981016040819052620000ba9162000488565b8880604051806040016040528060018152602001603160f81b8152508b8b8160039080519060200190620000f092919062000312565b5080516200010690600490602084019062000312565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a01819052818301989098526060808201969096526080808201949094523081840152815180820390930183529093019092528151919095012090935250610100526001600160601b031989821b81166101405288821b81166101605287821b81166101805285821b81166101a05284821b81166101c0526102008490529086901b166101e05250620001e46000336200024b565b620002107f74a064b2dec4aeb0b53e2d06f8e76ce531a17302a866fe51bc86d9a90b4e85e3336200024b565b6200023c7f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd336200024b565b5050505050505050506200072f565b6200025782826200025b565b5050565b620002678282620002e5565b620002575760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002a13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b8280546200032090620006c6565b90600052602060002090601f0160209004810192826200034457600085556200038f565b82601f106200035f57805160ff19168380011785556200038f565b828001600101855582156200038f579182015b828111156200038f57825182559160200191906001019062000372565b506200039d929150620003a1565b5090565b5b808211156200039d5760008155600101620003a2565b80516001600160a01b0381168114620003d057600080fd5b919050565b600082601f830112620003e6578081fd5b81516001600160401b038082111562000403576200040362000719565b604051601f8301601f19908116603f011681019082821181831017156200042e576200042e62000719565b816040528381526020925086838588010111156200044a578485fd5b8491505b838210156200046d57858201830151818301840152908201906200044e565b838211156200047e57848385830101525b9695505050505050565b60008060008060008060008060006101208a8c031215620004a7578485fd5b89516001600160401b0380821115620004be578687fd5b620004cc8d838e01620003d5565b9a5060208c0151915080821115620004e2578687fd5b50620004f18c828d01620003d5565b9850506200050260408b01620003b8565b96506200051260608b01620003b8565b95506200052260808b01620003b8565b94506200053260a08b01620003b8565b93506200054260c08b01620003b8565b92506200055260e08b01620003b8565b91506101008a015190509295985092959850929598565b600181815b80851115620005aa5781600019048211156200058e576200058e62000703565b808516156200059c57918102915b93841c93908002906200056e565b509250929050565b6000620005c360ff841683620005ca565b9392505050565b600082620005db575060016200030c565b81620005ea575060006200030c565b81600181146200060357600281146200060e576200062e565b60019150506200030c565b60ff84111562000622576200062262000703565b50506001821b6200030c565b5060208310610133831016604e8410600b841016171562000653575081810a6200030c565b6200065f838362000569565b806000190482111562000676576200067662000703565b029392505050565b60008160001904831182151516156200069b576200069b62000703565b500290565b600060ff821660ff841680821015620006bd57620006bd62000703565b90039392505050565b600181811c90821680620006db57607f821691505b60208210811415620006fd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05161010051610120516101405160601c6101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c61020051613be5620009046000396000818161064301528181610b34015281816119bd01528181611ef201528181612b7801526131e601526000818161070b01528181610ebe01528181610f6801526116a401526000818161045e01528181610b61015281816119ec01528181611f2101528181612abd01528181612ba501526132130152600081816103790152818161102501528181611426015281816114ef015281816115b20152818161167501528181612692015281816129720152613257015260008181610690015281816115e1015281816122e0015281816123f40152612aec0152600081816105e4015281816114590152818161237f015281816125d5015281816128fd015281816129ba015261329f0152600081816105a00152818161083901528181610fca015281816113df0152818161151e0152818161181f015281816123a2015281816126370152818161289b01528181612999015261327e015260006111b201526000611fae01526000611ffd01526000611fd801526000611f5c01526000611f850152613be56000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c80638b9789c911610182578063c5a92656116100e9578063d56cf10f116100a2578063e4a301161161007c578063e4a30116146106f3578063e4b4bcbd14610706578063e56a93b81461072d578063f3fef3a31461073557600080fd5b8063d56cf10f1461068b578063dacee347146106b2578063dd62ed3e146106ba57600080fd5b8063c5a9265614610606578063ca4fb87c1461060f578063cb62900914610636578063d4f09d021461063e578063d505accf14610665578063d547741f1461067857600080fd5b8063a9059cbb1161013b578063a9059cbb14610558578063b282e0f91461056b578063b4eae1cb14610593578063bb09d9b71461059b578063c00c9f7f146105c2578063c2ba6a63146105df57600080fd5b80638b9789c9146104e85780638f839603146104fb57806391d148541461052257806395d89b4114610535578063a217fddf1461053d578063a457c2d71461054557600080fd5b80633644e5151161024157806349111617116101fa5780635da0d90a116101d45780635da0d90a1461049157806370a082311461049957806379cc6790146104c25780637ecebe00146104d557600080fd5b8063491116171461045957806354cf2aeb146104805780635b9f00161461048957600080fd5b80633644e5151461040857806336568abe14610410578063372500ab14610423578063395093511461042b578063399c04251461043e57806342966c681461044657600080fd5b806323b872dd1161029357806323b872dd146103615780632467e5ab14610374578063248a9ca3146103b35780632f2ff15d146103d6578063313ce567146103eb57806335092dad1461040057600080fd5b806301ffc9a7146102db57806306fdde0314610303578063095ea7b314610318578063156e29f61461032b578063158ef93e1461034c57806318160ddd14610359575b600080fd5b6102ee6102e936600461377c565b610748565b60405190151581526020015b60405180910390f35b61030b61077f565b6040516102fa919061390c565b6102ee610326366004613607565b610811565b61033e610339366004613630565b610827565b6040519081526020016102fa565b6009546102ee9060ff1681565b60025461033e565b6102ee61036f36600461355b565b61098c565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102fa565b61033e6103c1366004613742565b60009081526006602052604090206001015490565b6103e96103e436600461375a565b610a38565b005b60065b60405160ff90911681526020016102fa565b61033e610a63565b61033e610a72565b6103e961041e36600461375a565b610a7c565b6103e9610afa565b6102ee610439366004613607565b610bc9565b61033e610c05565b6103e9610454366004613742565b610c44565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b61033e60085481565b61033e610c51565b61033e610c5b565b61033e6104a736600461350f565b6001600160a01b031660009081526020819052604090205490565b6103e96104d0366004613607565b610c65565b61033e6104e336600461350f565b610ce6565b6103e96104f6366004613742565b610d04565b61033e7f74a064b2dec4aeb0b53e2d06f8e76ce531a17302a866fe51bc86d9a90b4e85e381565b6102ee61053036600461375a565b610d7b565b61030b610da6565b61033e600081565b6102ee610553366004613607565b610db5565b6102ee610566366004613607565b610e4e565b610573610e5b565b604080516001600160701b039384168152929091166020830152016102fa565b61033e610e6e565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b6105ca610e78565b604080519283526020830191909152016102fa565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b61033e60075481565b61033e7f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd81565b6105ca611153565b61033e7f000000000000000000000000000000000000000000000000000000000000000081565b6103e9610673366004613596565b61115e565b6103e961068636600461375a565b6112c2565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b61033e6112e8565b61033e6106c8366004613529565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103e961070136600461380a565b61137b565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b6103ee600581565b6103e9610743366004613607565b6117ab565b60006001600160e01b03198216637965db0b60e01b148061077957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461078e90613b4e565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba90613b4e565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061081e33848461188a565b50600192915050565b6000806108326119ae565b90506108697f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333087611a6f565b600061087485611ae0565b905060006108a76108876005600a613a2a565b6108a160085460075461089a9190613af4565b8590611b28565b90611b34565b90506108b38282611b40565b915060006108c9846108a185633b9aca00611b28565b90506108e6633b9aca006108a16108df60025490565b8490611b28565b945085851161093c5760405162461bcd60e51b815260206004820152601860248201527f4d696e696d756d207265717569726564206e6f74206d6574000000000000000060448201526064015b60405180910390fd5b6109468886611b4c565b604080518881526020810187905233917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a2505050509392505050565b6000610999848484611c2b565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610a1e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610933565b610a2b853385840361188a565b60019150505b9392505050565b600082815260066020526040902060010154610a548133611df9565b610a5e8383611e5d565b505050565b6000610a6d611ee3565b905090565b6000610a6d611f58565b6001600160a01b0381163314610aec5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610933565b610af6828261204b565b5050565b7f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd610b258133611df9565b604051631c57762b60e31b81527f00000000000000000000000000000000000000000000000000000000000000006004820152600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e2bbb158906044015b600060405180830381600087803b158015610bae57600080fd5b505af1158015610bc2573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161081e918590610c009086906139af565b61188a565b600080610c106120b2565b90506000610c31610c236005600a613a2a565b6007546108a1908590611b28565b9050610c3d81836139af565b9250505090565b610c4e338261213f565b50565b6000610a6d6119ae565b6000610a6d61228d565b6000610c7183336106c8565b905081811015610ccf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610933565b610cdc833384840361188a565b610a5e838361213f565b6001600160a01b038116600090815260056020526040812054610779565b7f74a064b2dec4aeb0b53e2d06f8e76ce531a17302a866fe51bc86d9a90b4e85e3610d2f8133611df9565b60078290557fd1a3ca5ae3a8b741052365aa0dabdd2bb79673a49f36b3528d216cc5f948f1fb33604080516001600160a01b039092168252602082018590520160405180910390a15050565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461078e90613b4e565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610e375760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610933565b610e44338585840361188a565b5060019392505050565b600061081e338484611c2b565b600080610e666122d8565b915091509091565b6000610a6d6120b2565b6000807f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd610ea68133611df9565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4091906137f2565b60408051600280825260608201835292935060009290916020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610fa857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061100a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526000907f0000000000000000000000000000000000000000000000000000000000000000166338ed1739846001853061105b42610e106139af565b6040518663ffffffff1660e01b815260040161107b95949392919061393f565b600060405180830381600087803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110d19190810190613662565b9050806001815181106110f457634e487b7160e01b600052603260045260246000fd5b6020026020010151955061110786611ae0565b60408051858152602081018990529081018290529095507fc35d86b8f236816fab54de6cb4b564fc7abbe78e7fa53fc10a3e5ff4b28da8219060600160405180910390a1505050509091565b600080610e666123de565b834211156111ae5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610933565b60007f00000000000000000000000000000000000000000000000000000000000000008888886111dd8c6124f1565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061123882612519565b9050600061124882878787612567565b9050896001600160a01b0316816001600160a01b0316146112ab5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610933565b6112b68a8a8a61188a565b50505050505050505050565b6000828152600660205260409020600101546112de8133611df9565b610a5e838361204b565b6000610a6d6112f561228d565b6108a16113046006600a613a2a565b306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561133d57600080fd5b505afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137591906137f2565b90611b28565b60006113878133611df9565b60095460ff16156113da5760405162461bcd60e51b815260206004820152601c60248201527f436f6e747261637420616c726561647920696e697469616c697a6564000000006044820152606401610933565b61140f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333086611a6f565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301819052917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b390604401602060405180830381600087803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d79190613722565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b15801561156257600080fd5b505af1158015611576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159a9190613722565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b15801561162557600080fd5b505af1158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190613722565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b1580156116e857600080fd5b505af11580156116fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117209190613722565b5061172a84611ae0565b5061173361228d565b9350611748336117438587611b28565b611b4c565b6009805460ff191660011790557f0f91882b50d9330af0b1d4998e6af7f2eaee90ce7e77ea54fea089af166d021d61177d3390565b604080516001600160a01b03909216825260208201879052810185905260600160405180910390a150505050565b60006117c76117b960025490565b6108a184633b9aca00611b28565b905060006117de633b9aca006108a161089a6119ae565b90506000806117ec8361258f565b909250905060006117fc826125ae565b61180690846139af565b9050611812338761213f565b6118466001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168883612772565b604080518281526020810188905233917fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb910160405180910390a250505050505050565b6001600160a01b0383166118ec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610933565b6001600160a01b03821661194d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610933565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405163511c188360e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a2383106906044015b60206040518083038186803b158015611a3757600080fd5b505afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906137f2565b6040516001600160a01b0380851660248301528316604482015260648101829052611ada9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127a2565b50505050565b600080611aee836002611b34565b90506000611afc8483611b40565b90506000611b0983612874565b9050611b15828261293d565b9350611b2084612aa6565b505050919050565b6000610a318284613ad5565b6000610a3182846139c7565b6000610a318284613af4565b6001600160a01b038216611ba25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610933565b8060026000828254611bb491906139af565b90915550506001600160a01b03821660009081526020819052604081208054839290611be19084906139af565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316611c8f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610933565b6001600160a01b038216611cf15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610933565b6001600160a01b03831660009081526020819052604090205481811015611d695760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610933565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611da09084906139af565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dec91815260200190565b60405180910390a3611ada565b611e038282610d7b565b610af657611e1b816001600160a01b03166014612bdc565b611e26836020612bdc565b604051602001611e37929190613897565b60408051601f198184030181529082905262461bcd60e51b82526109339160040161390c565b611e678282610d7b565b610af65760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e9f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60405163e4c75c2760e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e4c75c2790604401611a1f565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611fa757507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6120558282610d7b565b15610af65760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a6d306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120f057600080fd5b505afa158015612104573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212891906137f2565b6108a16121376006600a613a2a565b61137561228d565b6001600160a01b03821661219f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610933565b6001600160a01b038216600090815260208190526040902054818110156122135760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610933565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612242908490613af4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600080600080600061229d6122d8565b6001600160701b0391821695501692506122b56123de565b90925090506122cf6122c8828587612dbe565b8390612edd565b94505050505090565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561233757600080fd5b505afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f91906137a4565b5090925090506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081167f0000000000000000000000000000000000000000000000000000000000000000909116106123d05780826123d3565b81815b909590945092505050565b60008060006123eb6119ae565b905060006124957f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561244b57600080fd5b505afa15801561245f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248391906137f2565b6108a184678ac7230489e80000611b28565b90506000806124a26122d8565b90925090506124c6678ac7230489e800006108a1856001600160701b038616611b28565b95506124e7678ac7230489e800006108a1856001600160701b038516611b28565b9450505050509091565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000610779612526611f58565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061257887878787612ee9565b9150915061258581612fd6565b5095945050505050565b60008061259b836131d7565b6125a48361324a565b9094909350915050565b604080516002808252606082018352600092839291906020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061261557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061267757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526000907f0000000000000000000000000000000000000000000000000000000000000000166338ed173985600185306126c842610e106139af565b6040518663ffffffff1660e01b81526004016126e895949392919061393f565b600060405180830381600087803b15801561270257600080fd5b505af1158015612716573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261273e9190810190613662565b90508060018151811061276157634e487b7160e01b600052603260045260246000fd5b602002602001015192505050919050565b6040516001600160a01b038316602482015260448101829052610a5e90849063a9059cbb60e01b90606401611aa3565b60006127f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133749092919063ffffffff16565b805190915015610a5e57808060200190518101906128159190613722565b610a5e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610933565b604080516002808252606082018352600092839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106128db57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061267757634e487b7160e01b600052603260045260246000fd5b600080808061295260646108a188605f611b28565b9050600061296660646108a188605f611b28565b90506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663e8e337007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8787306129ea42610e106139af565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b158015612a6157600080fd5b505af1158015612a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a99919061384e565b9998505050505050505050565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b158015612b3057600080fd5b505af1158015612b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b689190613722565b50604051631c57762b60e31b81527f00000000000000000000000000000000000000000000000000000000000000006004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e2bbb15890604401610b94565b60606000612beb836002613ad5565b612bf69060026139af565b67ffffffffffffffff811115612c1c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c46576020820181803683370190505b509050600360fc1b81600081518110612c6f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612cac57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000612cd0846002613ad5565b612cdb9060016139af565b90505b6001811115612d6f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d1d57634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110612d4157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612d6881613b37565b9050612cde565b508315610a315760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610933565b6000808411612e235760405162461bcd60e51b815260206004820152602b60248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b6064820152608401610933565b600083118015612e335750600082115b612e905760405162461bcd60e51b815260206004820152602860248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604482015267495155494449545960c01b6064820152608401610933565b6000612e9e856103e5611b28565b90506000612eac8285611b28565b90506000612ec683612ec0886103e8611b28565b90612edd565b9050612ed281836139c7565b979650505050505050565b6000610a3182846139af565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612f205750600090506003612fcd565b8460ff16601b14158015612f3857508460ff16601c14155b15612f495750600090506004612fcd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612f9d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612fc657600060019250925050612fcd565b9150600090505b94509492505050565b6000816004811115612ff857634e487b7160e01b600052602160045260246000fd5b14156130015750565b600181600481111561302357634e487b7160e01b600052602160045260246000fd5b14156130715760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610933565b600281600481111561309357634e487b7160e01b600052602160045260246000fd5b14156130e15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610933565b600381600481111561310357634e487b7160e01b600052602160045260246000fd5b141561315c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610933565b600481600481111561317e57634e487b7160e01b600052602160045260246000fd5b1415610c4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610933565b604051630441a3e760e41b81527f00000000000000000000000000000000000000000000000000000000000000006004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063441a3e7090604401610b94565b6000806001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663baa2abde7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000086600180306132cf42610e106139af565b60405160e089901b6001600160e01b03191681526001600160a01b039788166004820152958716602487015260448601949094526064850192909252608484015290921660a482015260c481019190915260e4016040805180830381600087803b15801561333c57600080fd5b505af1158015613350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a4919061382b565b6060613383848460008561338b565b949350505050565b6060824710156133ec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610933565b843b61343a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610933565b600080866001600160a01b03168587604051613456919061387b565b60006040518083038185875af1925050503d8060008114613493576040519150601f19603f3d011682016040523d82523d6000602084013e613498565b606091505b5091509150612ed2828286606083156134b2575081610a31565b8251156134c25782518084602001fd5b8160405162461bcd60e51b8152600401610933919061390c565b80356001600160a01b03811681146134f357600080fd5b919050565b80516001600160701b03811681146134f357600080fd5b600060208284031215613520578081fd5b610a31826134dc565b6000806040838503121561353b578081fd5b613544836134dc565b9150613552602084016134dc565b90509250929050565b60008060006060848603121561356f578081fd5b613578846134dc565b9250613586602085016134dc565b9150604084013590509250925092565b600080600080600080600060e0888a0312156135b0578283fd5b6135b9886134dc565b96506135c7602089016134dc565b95506040880135945060608801359350608088013560ff811681146135ea578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613619578182fd5b613622836134dc565b946020939093013593505050565b600080600060608486031215613644578283fd5b61364d846134dc565b95602085013595506040909401359392505050565b60006020808385031215613674578182fd5b825167ffffffffffffffff8082111561368b578384fd5b818501915085601f83011261369e578384fd5b8151818111156136b0576136b0613b99565b8060051b604051601f19603f830116810181811085821117156136d5576136d5613b99565b604052828152858101935084860182860187018a10156136f3578788fd5b8795505b838610156137155780518552600195909501949386019386016136f7565b5098975050505050505050565b600060208284031215613733578081fd5b81518015158114610a31578182fd5b600060208284031215613753578081fd5b5035919050565b6000806040838503121561376c578182fd5b82359150613552602084016134dc565b60006020828403121561378d578081fd5b81356001600160e01b031981168114610a31578182fd5b6000806000606084860312156137b8578283fd5b6137c1846134f8565b92506137cf602085016134f8565b9150604084015163ffffffff811681146137e7578182fd5b809150509250925092565b600060208284031215613803578081fd5b5051919050565b6000806040838503121561381c578182fd5b50508035926020909101359150565b6000806040838503121561383d578182fd5b505080516020909101519092909150565b600080600060608486031215613862578081fd5b8351925060208401519150604084015190509250925092565b6000825161388d818460208701613b0b565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516138cf816017850160208801613b0b565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613900816028840160208801613b0b565b01602801949350505050565b602081526000825180602084015261392b816040850160208701613b0b565b601f01601f19169190910160400192915050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561398e5784516001600160a01b031683529383019391830191600101613969565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156139c2576139c2613b83565b500190565b6000826139e257634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115613a22578160001904821115613a0857613a08613b83565b80851615613a1557918102915b93841c93908002906139ec565b509250929050565b6000610a3160ff841683600082613a4357506001610779565b81613a5057506000610779565b8160018114613a665760028114613a7057613a8c565b6001915050610779565b60ff841115613a8157613a81613b83565b50506001821b610779565b5060208310610133831016604e8410600b8410161715613aaf575081810a610779565b613ab983836139e7565b8060001904821115613acd57613acd613b83565b029392505050565b6000816000190483118215151615613aef57613aef613b83565b500290565b600082821015613b0657613b06613b83565b500390565b60005b83811015613b26578181015183820152602001613b0e565b83811115611ada5750506000910152565b600081613b4657613b46613b83565b506000190190565b600181811c90821680613b6257607f821691505b6020821081141561251357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220b94f7545c09621f8d135b41acd6738880503c2018d8e7bb6135e203fe2bfa29464736f6c63430008040033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d65760003560e01c80638b9789c911610182578063c5a92656116100e9578063d56cf10f116100a2578063e4a301161161007c578063e4a30116146106f3578063e4b4bcbd14610706578063e56a93b81461072d578063f3fef3a31461073557600080fd5b8063d56cf10f1461068b578063dacee347146106b2578063dd62ed3e146106ba57600080fd5b8063c5a9265614610606578063ca4fb87c1461060f578063cb62900914610636578063d4f09d021461063e578063d505accf14610665578063d547741f1461067857600080fd5b8063a9059cbb1161013b578063a9059cbb14610558578063b282e0f91461056b578063b4eae1cb14610593578063bb09d9b71461059b578063c00c9f7f146105c2578063c2ba6a63146105df57600080fd5b80638b9789c9146104e85780638f839603146104fb57806391d148541461052257806395d89b4114610535578063a217fddf1461053d578063a457c2d71461054557600080fd5b80633644e5151161024157806349111617116101fa5780635da0d90a116101d45780635da0d90a1461049157806370a082311461049957806379cc6790146104c25780637ecebe00146104d557600080fd5b8063491116171461045957806354cf2aeb146104805780635b9f00161461048957600080fd5b80633644e5151461040857806336568abe14610410578063372500ab14610423578063395093511461042b578063399c04251461043e57806342966c681461044657600080fd5b806323b872dd1161029357806323b872dd146103615780632467e5ab14610374578063248a9ca3146103b35780632f2ff15d146103d6578063313ce567146103eb57806335092dad1461040057600080fd5b806301ffc9a7146102db57806306fdde0314610303578063095ea7b314610318578063156e29f61461032b578063158ef93e1461034c57806318160ddd14610359575b600080fd5b6102ee6102e936600461377c565b610748565b60405190151581526020015b60405180910390f35b61030b61077f565b6040516102fa919061390c565b6102ee610326366004613607565b610811565b61033e610339366004613630565b610827565b6040519081526020016102fa565b6009546102ee9060ff1681565b60025461033e565b6102ee61036f36600461355b565b61098c565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102fa565b61033e6103c1366004613742565b60009081526006602052604090206001015490565b6103e96103e436600461375a565b610a38565b005b60065b60405160ff90911681526020016102fa565b61033e610a63565b61033e610a72565b6103e961041e36600461375a565b610a7c565b6103e9610afa565b6102ee610439366004613607565b610bc9565b61033e610c05565b6103e9610454366004613742565b610c44565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b61033e60085481565b61033e610c51565b61033e610c5b565b61033e6104a736600461350f565b6001600160a01b031660009081526020819052604090205490565b6103e96104d0366004613607565b610c65565b61033e6104e336600461350f565b610ce6565b6103e96104f6366004613742565b610d04565b61033e7f74a064b2dec4aeb0b53e2d06f8e76ce531a17302a866fe51bc86d9a90b4e85e381565b6102ee61053036600461375a565b610d7b565b61030b610da6565b61033e600081565b6102ee610553366004613607565b610db5565b6102ee610566366004613607565b610e4e565b610573610e5b565b604080516001600160701b039384168152929091166020830152016102fa565b61033e610e6e565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b6105ca610e78565b604080519283526020830191909152016102fa565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b61033e60075481565b61033e7f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd81565b6105ca611153565b61033e7f000000000000000000000000000000000000000000000000000000000000000081565b6103e9610673366004613596565b61115e565b6103e961068636600461375a565b6112c2565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b61033e6112e8565b61033e6106c8366004613529565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103e961070136600461380a565b61137b565b61039b7f000000000000000000000000000000000000000000000000000000000000000081565b6103ee600581565b6103e9610743366004613607565b6117ab565b60006001600160e01b03198216637965db0b60e01b148061077957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461078e90613b4e565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba90613b4e565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061081e33848461188a565b50600192915050565b6000806108326119ae565b90506108697f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333087611a6f565b600061087485611ae0565b905060006108a76108876005600a613a2a565b6108a160085460075461089a9190613af4565b8590611b28565b90611b34565b90506108b38282611b40565b915060006108c9846108a185633b9aca00611b28565b90506108e6633b9aca006108a16108df60025490565b8490611b28565b945085851161093c5760405162461bcd60e51b815260206004820152601860248201527f4d696e696d756d207265717569726564206e6f74206d6574000000000000000060448201526064015b60405180910390fd5b6109468886611b4c565b604080518881526020810187905233917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff910160405180910390a2505050509392505050565b6000610999848484611c2b565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610a1e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610933565b610a2b853385840361188a565b60019150505b9392505050565b600082815260066020526040902060010154610a548133611df9565b610a5e8383611e5d565b505050565b6000610a6d611ee3565b905090565b6000610a6d611f58565b6001600160a01b0381163314610aec5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610933565b610af6828261204b565b5050565b7f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd610b258133611df9565b604051631c57762b60e31b81527f00000000000000000000000000000000000000000000000000000000000000006004820152600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e2bbb158906044015b600060405180830381600087803b158015610bae57600080fd5b505af1158015610bc2573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161081e918590610c009086906139af565b61188a565b600080610c106120b2565b90506000610c31610c236005600a613a2a565b6007546108a1908590611b28565b9050610c3d81836139af565b9250505090565b610c4e338261213f565b50565b6000610a6d6119ae565b6000610a6d61228d565b6000610c7183336106c8565b905081811015610ccf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610933565b610cdc833384840361188a565b610a5e838361213f565b6001600160a01b038116600090815260056020526040812054610779565b7f74a064b2dec4aeb0b53e2d06f8e76ce531a17302a866fe51bc86d9a90b4e85e3610d2f8133611df9565b60078290557fd1a3ca5ae3a8b741052365aa0dabdd2bb79673a49f36b3528d216cc5f948f1fb33604080516001600160a01b039092168252602082018590520160405180910390a15050565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461078e90613b4e565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610e375760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610933565b610e44338585840361188a565b5060019392505050565b600061081e338484611c2b565b600080610e666122d8565b915091509091565b6000610a6d6120b2565b6000807f5407862f04286ebe607684514c14b7fffc750b6bf52ba44ea49569174845a5bd610ea68133611df9565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4091906137f2565b60408051600280825260608201835292935060009290916020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610fa857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061100a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526000907f0000000000000000000000000000000000000000000000000000000000000000166338ed1739846001853061105b42610e106139af565b6040518663ffffffff1660e01b815260040161107b95949392919061393f565b600060405180830381600087803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110d19190810190613662565b9050806001815181106110f457634e487b7160e01b600052603260045260246000fd5b6020026020010151955061110786611ae0565b60408051858152602081018990529081018290529095507fc35d86b8f236816fab54de6cb4b564fc7abbe78e7fa53fc10a3e5ff4b28da8219060600160405180910390a1505050509091565b600080610e666123de565b834211156111ae5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610933565b60007f00000000000000000000000000000000000000000000000000000000000000008888886111dd8c6124f1565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061123882612519565b9050600061124882878787612567565b9050896001600160a01b0316816001600160a01b0316146112ab5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610933565b6112b68a8a8a61188a565b50505050505050505050565b6000828152600660205260409020600101546112de8133611df9565b610a5e838361204b565b6000610a6d6112f561228d565b6108a16113046006600a613a2a565b306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561133d57600080fd5b505afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137591906137f2565b90611b28565b60006113878133611df9565b60095460ff16156113da5760405162461bcd60e51b815260206004820152601c60248201527f436f6e747261637420616c726561647920696e697469616c697a6564000000006044820152606401610933565b61140f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333086611a6f565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301819052917f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b390604401602060405180830381600087803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d79190613722565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b15801561156257600080fd5b505af1158015611576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159a9190613722565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b15801561162557600080fd5b505af1158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190613722565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b1580156116e857600080fd5b505af11580156116fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117209190613722565b5061172a84611ae0565b5061173361228d565b9350611748336117438587611b28565b611b4c565b6009805460ff191660011790557f0f91882b50d9330af0b1d4998e6af7f2eaee90ce7e77ea54fea089af166d021d61177d3390565b604080516001600160a01b03909216825260208201879052810185905260600160405180910390a150505050565b60006117c76117b960025490565b6108a184633b9aca00611b28565b905060006117de633b9aca006108a161089a6119ae565b90506000806117ec8361258f565b909250905060006117fc826125ae565b61180690846139af565b9050611812338761213f565b6118466001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168883612772565b604080518281526020810188905233917fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb910160405180910390a250505050505050565b6001600160a01b0383166118ec5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610933565b6001600160a01b03821661194d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610933565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405163511c188360e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a2383106906044015b60206040518083038186803b158015611a3757600080fd5b505afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906137f2565b6040516001600160a01b0380851660248301528316604482015260648101829052611ada9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127a2565b50505050565b600080611aee836002611b34565b90506000611afc8483611b40565b90506000611b0983612874565b9050611b15828261293d565b9350611b2084612aa6565b505050919050565b6000610a318284613ad5565b6000610a3182846139c7565b6000610a318284613af4565b6001600160a01b038216611ba25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610933565b8060026000828254611bb491906139af565b90915550506001600160a01b03821660009081526020819052604081208054839290611be19084906139af565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316611c8f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610933565b6001600160a01b038216611cf15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610933565b6001600160a01b03831660009081526020819052604090205481811015611d695760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610933565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611da09084906139af565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dec91815260200190565b60405180910390a3611ada565b611e038282610d7b565b610af657611e1b816001600160a01b03166014612bdc565b611e26836020612bdc565b604051602001611e37929190613897565b60408051601f198184030181529082905262461bcd60e51b82526109339160040161390c565b611e678282610d7b565b610af65760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e9f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60405163e4c75c2760e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e4c75c2790604401611a1f565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611fa757507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6120558282610d7b565b15610af65760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a6d306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120f057600080fd5b505afa158015612104573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212891906137f2565b6108a16121376006600a613a2a565b61137561228d565b6001600160a01b03821661219f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610933565b6001600160a01b038216600090815260208190526040902054818110156122135760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610933565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612242908490613af4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600080600080600061229d6122d8565b6001600160701b0391821695501692506122b56123de565b90925090506122cf6122c8828587612dbe565b8390612edd565b94505050505090565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561233757600080fd5b505afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f91906137a4565b5090925090506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081167f0000000000000000000000000000000000000000000000000000000000000000909116106123d05780826123d3565b81815b909590945092505050565b60008060006123eb6119ae565b905060006124957f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561244b57600080fd5b505afa15801561245f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248391906137f2565b6108a184678ac7230489e80000611b28565b90506000806124a26122d8565b90925090506124c6678ac7230489e800006108a1856001600160701b038616611b28565b95506124e7678ac7230489e800006108a1856001600160701b038516611b28565b9450505050509091565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000610779612526611f58565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061257887878787612ee9565b9150915061258581612fd6565b5095945050505050565b60008061259b836131d7565b6125a48361324a565b9094909350915050565b604080516002808252606082018352600092839291906020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061261557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061267757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526000907f0000000000000000000000000000000000000000000000000000000000000000166338ed173985600185306126c842610e106139af565b6040518663ffffffff1660e01b81526004016126e895949392919061393f565b600060405180830381600087803b15801561270257600080fd5b505af1158015612716573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261273e9190810190613662565b90508060018151811061276157634e487b7160e01b600052603260045260246000fd5b602002602001015192505050919050565b6040516001600160a01b038316602482015260448101829052610a5e90849063a9059cbb60e01b90606401611aa3565b60006127f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133749092919063ffffffff16565b805190915015610a5e57808060200190518101906128159190613722565b610a5e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610933565b604080516002808252606082018352600092839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106128db57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061267757634e487b7160e01b600052603260045260246000fd5b600080808061295260646108a188605f611b28565b9050600061296660646108a188605f611b28565b90506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663e8e337007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8787306129ea42610e106139af565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b158015612a6157600080fd5b505af1158015612a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a99919061384e565b9998505050505050505050565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b158015612b3057600080fd5b505af1158015612b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b689190613722565b50604051631c57762b60e31b81527f00000000000000000000000000000000000000000000000000000000000000006004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e2bbb15890604401610b94565b60606000612beb836002613ad5565b612bf69060026139af565b67ffffffffffffffff811115612c1c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c46576020820181803683370190505b509050600360fc1b81600081518110612c6f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612cac57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000612cd0846002613ad5565b612cdb9060016139af565b90505b6001811115612d6f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612d1d57634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110612d4157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612d6881613b37565b9050612cde565b508315610a315760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610933565b6000808411612e235760405162461bcd60e51b815260206004820152602b60248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b6064820152608401610933565b600083118015612e335750600082115b612e905760405162461bcd60e51b815260206004820152602860248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604482015267495155494449545960c01b6064820152608401610933565b6000612e9e856103e5611b28565b90506000612eac8285611b28565b90506000612ec683612ec0886103e8611b28565b90612edd565b9050612ed281836139c7565b979650505050505050565b6000610a3182846139af565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612f205750600090506003612fcd565b8460ff16601b14158015612f3857508460ff16601c14155b15612f495750600090506004612fcd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612f9d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612fc657600060019250925050612fcd565b9150600090505b94509492505050565b6000816004811115612ff857634e487b7160e01b600052602160045260246000fd5b14156130015750565b600181600481111561302357634e487b7160e01b600052602160045260246000fd5b14156130715760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610933565b600281600481111561309357634e487b7160e01b600052602160045260246000fd5b14156130e15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610933565b600381600481111561310357634e487b7160e01b600052602160045260246000fd5b141561315c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610933565b600481600481111561317e57634e487b7160e01b600052602160045260246000fd5b1415610c4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610933565b604051630441a3e760e41b81527f00000000000000000000000000000000000000000000000000000000000000006004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063441a3e7090604401610b94565b6000806001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663baa2abde7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000086600180306132cf42610e106139af565b60405160e089901b6001600160e01b03191681526001600160a01b039788166004820152958716602487015260448601949094526064850192909252608484015290921660a482015260c481019190915260e4016040805180830381600087803b15801561333c57600080fd5b505af1158015613350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a4919061382b565b6060613383848460008561338b565b949350505050565b6060824710156133ec5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610933565b843b61343a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610933565b600080866001600160a01b03168587604051613456919061387b565b60006040518083038185875af1925050503d8060008114613493576040519150601f19603f3d011682016040523d82523d6000602084013e613498565b606091505b5091509150612ed2828286606083156134b2575081610a31565b8251156134c25782518084602001fd5b8160405162461bcd60e51b8152600401610933919061390c565b80356001600160a01b03811681146134f357600080fd5b919050565b80516001600160701b03811681146134f357600080fd5b600060208284031215613520578081fd5b610a31826134dc565b6000806040838503121561353b578081fd5b613544836134dc565b9150613552602084016134dc565b90509250929050565b60008060006060848603121561356f578081fd5b613578846134dc565b9250613586602085016134dc565b9150604084013590509250925092565b600080600080600080600060e0888a0312156135b0578283fd5b6135b9886134dc565b96506135c7602089016134dc565b95506040880135945060608801359350608088013560ff811681146135ea578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613619578182fd5b613622836134dc565b946020939093013593505050565b600080600060608486031215613644578283fd5b61364d846134dc565b95602085013595506040909401359392505050565b60006020808385031215613674578182fd5b825167ffffffffffffffff8082111561368b578384fd5b818501915085601f83011261369e578384fd5b8151818111156136b0576136b0613b99565b8060051b604051601f19603f830116810181811085821117156136d5576136d5613b99565b604052828152858101935084860182860187018a10156136f3578788fd5b8795505b838610156137155780518552600195909501949386019386016136f7565b5098975050505050505050565b600060208284031215613733578081fd5b81518015158114610a31578182fd5b600060208284031215613753578081fd5b5035919050565b6000806040838503121561376c578182fd5b82359150613552602084016134dc565b60006020828403121561378d578081fd5b81356001600160e01b031981168114610a31578182fd5b6000806000606084860312156137b8578283fd5b6137c1846134f8565b92506137cf602085016134f8565b9150604084015163ffffffff811681146137e7578182fd5b809150509250925092565b600060208284031215613803578081fd5b5051919050565b6000806040838503121561381c578182fd5b50508035926020909101359150565b6000806040838503121561383d578182fd5b505080516020909101519092909150565b600080600060608486031215613862578081fd5b8351925060208401519150604084015190509250925092565b6000825161388d818460208701613b0b565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516138cf816017850160208801613b0b565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613900816028840160208801613b0b565b01602801949350505050565b602081526000825180602084015261392b816040850160208701613b0b565b601f01601f19169190910160400192915050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561398e5784516001600160a01b031683529383019391830191600101613969565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156139c2576139c2613b83565b500190565b6000826139e257634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115613a22578160001904821115613a0857613a08613b83565b80851615613a1557918102915b93841c93908002906139ec565b509250929050565b6000610a3160ff841683600082613a4357506001610779565b81613a5057506000610779565b8160018114613a665760028114613a7057613a8c565b6001915050610779565b60ff841115613a8157613a81613b83565b50506001821b610779565b5060208310610133831016604e8410600b8410161715613aaf575081810a610779565b613ab983836139e7565b8060001904821115613acd57613acd613b83565b029392505050565b6000816000190483118215151615613aef57613aef613b83565b500290565b600082821015613b0657613b06613b83565b500390565b60005b83811015613b26578181015183820152602001613b0e565b83811115611ada5750506000910152565b600081613b4657613b46613b83565b506000190190565b600181811c90821680613b6257607f821691505b6020821081141561251357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220b94f7545c09621f8d135b41acd6738880503c2018d8e7bb6135e203fe2bfa29464736f6c63430008040033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "DOMAIN_SEPARATOR()": {
        "details": "See {IERC20Permit-DOMAIN_SEPARATOR}."
      },
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
      },
      "balanceOf(address)": {
        "details": "See {IERC20-balanceOf}."
      },
      "burn(uint256)": {
        "details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}."
      },
      "burnFrom(address,uint256)": {
        "details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`."
      },
      "decreaseAllowance(address,uint256)": {
        "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
      },
      "getRoleAdmin(bytes32)": {
        "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
      },
      "grantRole(bytes32,address)": {
        "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role."
      },
      "hasRole(bytes32,address)": {
        "details": "Returns `true` if `account` has been granted `role`."
      },
      "increaseAllowance(address,uint256)": {
        "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "nonces(address)": {
        "details": "See {IERC20Permit-nonces}."
      },
      "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
        "details": "See {IERC20Permit-permit}."
      },
      "renounceRole(bytes32,address)": {
        "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`."
      },
      "revokeRole(bytes32,address)": {
        "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}."
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "See {IERC20-totalSupply}."
      },
      "transfer(address,uint256)": {
        "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
      },
      "transferFrom(address,address,uint256)": {
        "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 499,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_balances",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 505,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_allowances",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 507,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_totalSupply",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 509,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_name",
        "offset": 0,
        "slot": "3",
        "type": "t_string_storage"
      },
      {
        "astId": 511,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_symbol",
        "offset": 0,
        "slot": "4",
        "type": "t_string_storage"
      },
      {
        "astId": 1217,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_nonces",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_address,t_struct(Counter)1948_storage)"
      },
      {
        "astId": 24,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "_roles",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)"
      },
      {
        "astId": 3995,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "markup",
        "offset": 0,
        "slot": "7",
        "type": "t_uint256"
      },
      {
        "astId": 4006,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "swapFee",
        "offset": 0,
        "slot": "8",
        "type": "t_uint256"
      },
      {
        "astId": 4010,
        "contract": "contracts/Peronio.sol:Peronio",
        "label": "initialized",
        "offset": 0,
        "slot": "9",
        "type": "t_bool"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => mapping(address => uint256))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_uint256)"
      },
      "t_mapping(t_address,t_struct(Counter)1948_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct Counters.Counter)",
        "numberOfBytes": "32",
        "value": "t_struct(Counter)1948_storage"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => struct AccessControl.RoleData)",
        "numberOfBytes": "32",
        "value": "t_struct(RoleData)19_storage"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(Counter)1948_storage": {
        "encoding": "inplace",
        "label": "struct Counters.Counter",
        "members": [
          {
            "astId": 1947,
            "contract": "contracts/Peronio.sol:Peronio",
            "label": "_value",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "32"
      },
      "t_struct(RoleData)19_storage": {
        "encoding": "inplace",
        "label": "struct AccessControl.RoleData",
        "members": [
          {
            "astId": 16,
            "contract": "contracts/Peronio.sol:Peronio",
            "label": "members",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_address,t_bool)"
          },
          {
            "astId": 18,
            "contract": "contracts/Peronio.sol:Peronio",
            "label": "adminRole",
            "offset": 0,
            "slot": "1",
            "type": "t_bytes32"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}