Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@sushiswap/furo / deployments / moonbeam / FuroVesting.json
Size: Mime:
{
  "address": "0x0689640d190b10765f09310fCfE9C670eDe4E25B",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IBentoBoxMinimal",
          "name": "_bentoBox",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_wETH",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "InvalidStart",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidStepSetting",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotVestReceiver",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "ownerAmount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "recipientAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "toBentoBox",
          "type": "bool"
        }
      ],
      "name": "CancelVesting",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "start",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "cliffDuration",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "stepDuration",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "steps",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "cliffShares",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "stepShares",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "fromBentoBox",
          "type": "bool"
        }
      ],
      "name": "CreateVesting",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "LogUpdateOwner",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "toBentoBox",
          "type": "bool"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "PERCENTAGE_PRECISION",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bentoBox",
      "outputs": [
        {
          "internalType": "contract IBentoBoxMinimal",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claimOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "contract IERC20",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "start",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "cliffDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "stepDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "steps",
              "type": "uint32"
            },
            {
              "internalType": "uint128",
              "name": "stepPercentage",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "amount",
              "type": "uint128"
            },
            {
              "internalType": "bool",
              "name": "fromBentoBox",
              "type": "bool"
            }
          ],
          "internalType": "struct IFuroVesting.VestParams",
          "name": "vestParams",
          "type": "tuple"
        }
      ],
      "name": "createVesting",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "depositedShares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "stepShares",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "cliffShares",
          "type": "uint128"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setBentoBoxApproval",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_fetcher",
          "type": "address"
        }
      ],
      "name": "setTokenURIFetcher",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "toBentoBox",
          "type": "bool"
        }
      ],
      "name": "stopVesting",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenURIFetcher",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "direct",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "renounce",
          "type": "bool"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "updateOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        }
      ],
      "name": "vestBalance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "vestIds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "vests",
      "outputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "start",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "cliffDuration",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "stepDuration",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "steps",
          "type": "uint32"
        },
        {
          "internalType": "uint128",
          "name": "cliffShares",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "stepShares",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "claimed",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "wETH",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "vestId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "taskData",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "toBentoBox",
          "type": "bool"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x95a48368c954afc46c3adefb31a8a24f5c3a236a63b8772fdfeb13c7c7243971",
  "receipt": {
    "to": null,
    "from": "0x9346e1966E0510b3491Fe04297bcb33c9e4729D5",
    "contractAddress": "0x0689640d190b10765f09310fCfE9C670eDe4E25B",
    "transactionIndex": 3,
    "gasUsed": "3182942",
    "logsBloom": "0x00008000000000000000000000000000000000010000000000800000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800020008002000000001000000000000000000000000000000000000020008000000000000000800000000000000000000000000000000400000000000000000000000000000000000004000000000020000000000000000000000000000000000100000000000000000000000800000000000000008000000000000000000080000000000000000000000000000000000000000000020000000000000000000000000000000000000002000000000000000000000000000",
    "blockHash": "0x25d8e2c7554f046146f12f0496b4498704f3cb22037c6ac90bde6fea5b031c84",
    "transactionHash": "0x95a48368c954afc46c3adefb31a8a24f5c3a236a63b8772fdfeb13c7c7243971",
    "logs": [
      {
        "transactionIndex": 3,
        "blockNumber": 1188335,
        "transactionHash": "0x95a48368c954afc46c3adefb31a8a24f5c3a236a63b8772fdfeb13c7c7243971",
        "address": "0x0689640d190b10765f09310fCfE9C670eDe4E25B",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x0000000000000000000000009346e1966e0510b3491fe04297bcb33c9e4729d5"
        ],
        "data": "0x",
        "logIndex": 22,
        "blockHash": "0x25d8e2c7554f046146f12f0496b4498704f3cb22037c6ac90bde6fea5b031c84"
      },
      {
        "transactionIndex": 3,
        "blockNumber": 1188335,
        "transactionHash": "0x95a48368c954afc46c3adefb31a8a24f5c3a236a63b8772fdfeb13c7c7243971",
        "address": "0x80C7DD17B01855a6D2347444a0FCC36136a314de",
        "topics": [
          "0xdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb",
          "0x0000000000000000000000000689640d190b10765f09310fcfe9c670ede4e25b"
        ],
        "data": "0x",
        "logIndex": 23,
        "blockHash": "0x25d8e2c7554f046146f12f0496b4498704f3cb22037c6ac90bde6fea5b031c84"
      }
    ],
    "blockNumber": 1188335,
    "cumulativeGasUsed": "3604897",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x80C7DD17B01855a6D2347444a0FCC36136a314de",
    "0xAcc15dC74880C9944775448304B263D191c6077F"
  ],
  "numDeployments": 1,
  "solcInputHash": "a9c4c4ae423bd631ac9e9f357b754869",
  "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IBentoBoxMinimal\",\"name\":\"_bentoBox\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_wETH\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidStart\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStepSetting\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotVestReceiver\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ownerAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"recipientAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"toBentoBox\",\"type\":\"bool\"}],\"name\":\"CancelVesting\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"start\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"cliffDuration\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stepDuration\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"steps\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"cliffShares\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"stepShares\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"fromBentoBox\",\"type\":\"bool\"}],\"name\":\"CreateVesting\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"LogUpdateOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"toBentoBox\",\"type\":\"bool\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"PERCENTAGE_PRECISION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bentoBox\",\"outputs\":[{\"internalType\":\"contract IBentoBoxMinimal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"start\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"cliffDuration\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stepDuration\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"steps\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"stepPercentage\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"fromBentoBox\",\"type\":\"bool\"}],\"internalType\":\"struct IFuroVesting.VestParams\",\"name\":\"vestParams\",\"type\":\"tuple\"}],\"name\":\"createVesting\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"depositedShares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"stepShares\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"cliffShares\",\"type\":\"uint128\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setBentoBoxApproval\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_fetcher\",\"type\":\"address\"}],\"name\":\"setTokenURIFetcher\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"toBentoBox\",\"type\":\"bool\"}],\"name\":\"stopVesting\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURIFetcher\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"updateOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"}],\"name\":\"vestBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vestIds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"vests\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"start\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"cliffDuration\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stepDuration\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"steps\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"cliffShares\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"stepShares\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"claimed\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"vestId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"taskData\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"toBentoBox\",\"type\":\"bool\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/base/FuroVesting.sol\":\"FuroVesting\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a >= b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a / b + (a % b == 0 ? 0 : 1);\\n    }\\n}\\n\",\"keccak256\":\"0xc995bddbca1ae19788db9f8b61e63385edd3fddf89693b612d5abd1a275974d2\",\"license\":\"MIT\"},\"@rari-capital/solmate/src/tokens/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)\\n/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.\\nabstract contract ERC721 {\\n    /*///////////////////////////////////////////////////////////////\\n                                 EVENTS\\n    //////////////////////////////////////////////////////////////*/\\n\\n    event Transfer(address indexed from, address indexed to, uint256 indexed id);\\n\\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id);\\n\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /*///////////////////////////////////////////////////////////////\\n                          METADATA STORAGE/LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    string public name;\\n\\n    string public symbol;\\n\\n    function tokenURI(uint256 id) public view virtual returns (string memory);\\n\\n    /*///////////////////////////////////////////////////////////////\\n                            ERC721 STORAGE                        \\n    //////////////////////////////////////////////////////////////*/\\n\\n    mapping(address => uint256) public balanceOf;\\n\\n    mapping(uint256 => address) public ownerOf;\\n\\n    mapping(uint256 => address) public getApproved;\\n\\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\\n\\n    /*///////////////////////////////////////////////////////////////\\n                              CONSTRUCTOR\\n    //////////////////////////////////////////////////////////////*/\\n\\n    constructor(string memory _name, string memory _symbol) {\\n        name = _name;\\n        symbol = _symbol;\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                              ERC721 LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function approve(address spender, uint256 id) public virtual {\\n        address owner = ownerOf[id];\\n\\n        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], \\\"NOT_AUTHORIZED\\\");\\n\\n        getApproved[id] = spender;\\n\\n        emit Approval(owner, spender, id);\\n    }\\n\\n    function setApprovalForAll(address operator, bool approved) public virtual {\\n        isApprovedForAll[msg.sender][operator] = approved;\\n\\n        emit ApprovalForAll(msg.sender, operator, approved);\\n    }\\n\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 id\\n    ) public virtual {\\n        require(from == ownerOf[id], \\\"WRONG_FROM\\\");\\n\\n        require(to != address(0), \\\"INVALID_RECIPIENT\\\");\\n\\n        require(\\n            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],\\n            \\\"NOT_AUTHORIZED\\\"\\n        );\\n\\n        // Underflow of the sender's balance is impossible because we check for\\n        // ownership above and the recipient's balance can't realistically overflow.\\n        unchecked {\\n            balanceOf[from]--;\\n\\n            balanceOf[to]++;\\n        }\\n\\n        ownerOf[id] = to;\\n\\n        delete getApproved[id];\\n\\n        emit Transfer(from, to, id);\\n    }\\n\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 id\\n    ) public virtual {\\n        transferFrom(from, to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, \\\"\\\") ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 id,\\n        bytes memory data\\n    ) public virtual {\\n        transferFrom(from, to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                              ERC165 LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {\\n        return\\n            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165\\n            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721\\n            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                       INTERNAL MINT/BURN LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function _mint(address to, uint256 id) internal virtual {\\n        require(to != address(0), \\\"INVALID_RECIPIENT\\\");\\n\\n        require(ownerOf[id] == address(0), \\\"ALREADY_MINTED\\\");\\n\\n        // Counter overflow is incredibly unrealistic.\\n        unchecked {\\n            balanceOf[to]++;\\n        }\\n\\n        ownerOf[id] = to;\\n\\n        emit Transfer(address(0), to, id);\\n    }\\n\\n    function _burn(uint256 id) internal virtual {\\n        address owner = ownerOf[id];\\n\\n        require(ownerOf[id] != address(0), \\\"NOT_MINTED\\\");\\n\\n        // Ownership check above ensures no underflow.\\n        unchecked {\\n            balanceOf[owner]--;\\n        }\\n\\n        delete ownerOf[id];\\n\\n        delete getApproved[id];\\n\\n        emit Transfer(owner, address(0), id);\\n    }\\n\\n    /*///////////////////////////////////////////////////////////////\\n                       INTERNAL SAFE MINT LOGIC\\n    //////////////////////////////////////////////////////////////*/\\n\\n    function _safeMint(address to, uint256 id) internal virtual {\\n        _mint(to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, \\\"\\\") ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n\\n    function _safeMint(\\n        address to,\\n        uint256 id,\\n        bytes memory data\\n    ) internal virtual {\\n        _mint(to, id);\\n\\n        require(\\n            to.code.length == 0 ||\\n                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==\\n                ERC721TokenReceiver.onERC721Received.selector,\\n            \\\"UNSAFE_RECIPIENT\\\"\\n        );\\n    }\\n}\\n\\n/// @notice A generic interface for a contract which properly accepts ERC721 tokens.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)\\ninterface ERC721TokenReceiver {\\n    function onERC721Received(\\n        address operator,\\n        address from,\\n        uint256 id,\\n        bytes calldata data\\n    ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xf97378ab999188b3d5d97037fabbecbc726892c74cba6536899b852eb4756d6a\",\"license\":\"AGPL-3.0-only\"},\"contracts/base/FuroVesting.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\nimport \\\"../interfaces/IFuroVesting.sol\\\";\\n\\ncontract FuroVesting is\\n    IFuroVesting,\\n    ERC721(\\\"Furo Vesting\\\", \\\"FUROVEST\\\"),\\n    Multicall,\\n    BoringOwnable\\n{\\n    IBentoBoxMinimal public immutable bentoBox;\\n    address public immutable wETH;\\n\\n    address public tokenURIFetcher;\\n\\n    mapping(uint256 => Vest) public vests;\\n\\n    uint256 public vestIds;\\n\\n    uint256 public constant PERCENTAGE_PRECISION = 1e18;\\n\\n    // custom errors\\n    error InvalidStart();\\n    error NotOwner();\\n    error NotVestReceiver();\\n    error InvalidStepSetting();\\n\\n    constructor(IBentoBoxMinimal _bentoBox, address _wETH) {\\n        bentoBox = _bentoBox;\\n        wETH = _wETH;\\n        vestIds = 1;\\n        _bentoBox.registerProtocol();\\n    }\\n\\n    function setTokenURIFetcher(address _fetcher) external onlyOwner {\\n        tokenURIFetcher = _fetcher;\\n    }\\n\\n    function tokenURI(uint256 id) public view override returns (string memory) {\\n        return ITokenURIFetcher(tokenURIFetcher).fetchTokenURIData(id);\\n    }\\n\\n    function setBentoBoxApproval(\\n        address user,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external payable override {\\n        bentoBox.setMasterContractApproval(\\n            user,\\n            address(this),\\n            approved,\\n            v,\\n            r,\\n            s\\n        );\\n    }\\n\\n    function createVesting(VestParams calldata vestParams)\\n        external\\n        payable\\n        override\\n        returns (\\n            uint256 depositedShares,\\n            uint256 vestId,\\n            uint128 stepShares,\\n            uint128 cliffShares\\n        )\\n    {\\n        if (vestParams.start < block.timestamp) revert InvalidStart();\\n        if (vestParams.stepPercentage > PERCENTAGE_PRECISION)\\n            revert InvalidStepSetting();\\n        if (vestParams.stepDuration == 0 || vestParams.steps == 0)\\n            revert InvalidStepSetting();\\n\\n        depositedShares = _depositToken(\\n            address(vestParams.token),\\n            msg.sender,\\n            address(this),\\n            vestParams.amount,\\n            vestParams.fromBentoBox\\n        );\\n        stepShares = uint128(\\n            (vestParams.stepPercentage * depositedShares) / PERCENTAGE_PRECISION\\n        );\\n        cliffShares = uint128(\\n            depositedShares - (stepShares * vestParams.steps)\\n        );\\n\\n        vestId = vestIds++;\\n        _mint(vestParams.recipient, vestId);\\n\\n        vests[vestId] = Vest({\\n            owner: msg.sender,\\n            token: address(vestParams.token) == address(0)\\n                ? IERC20(wETH)\\n                : vestParams.token,\\n            start: vestParams.start,\\n            cliffDuration: vestParams.cliffDuration,\\n            stepDuration: vestParams.stepDuration,\\n            steps: vestParams.steps,\\n            cliffShares: cliffShares,\\n            stepShares: stepShares,\\n            claimed: 0\\n        });\\n\\n        emit CreateVesting(\\n            vestId,\\n            vestParams.token,\\n            msg.sender,\\n            vestParams.recipient,\\n            vestParams.start,\\n            vestParams.cliffDuration,\\n            vestParams.stepDuration,\\n            vestParams.steps,\\n            cliffShares,\\n            stepShares,\\n            vestParams.fromBentoBox\\n        );\\n    }\\n\\n    function withdraw(\\n        uint256 vestId,\\n        bytes calldata taskData,\\n        bool toBentoBox\\n    ) external override {\\n        Vest storage vest = vests[vestId];\\n        address recipient = ownerOf[vestId];\\n        if (recipient != msg.sender) revert NotVestReceiver();\\n        uint256 canClaim = _balanceOf(vest) - vest.claimed;\\n\\n        if (canClaim == 0) return;\\n\\n        vest.claimed += uint128(canClaim);\\n\\n        _transferToken(\\n            address(vest.token),\\n            address(this),\\n            recipient,\\n            canClaim,\\n            toBentoBox\\n        );\\n\\n        if (taskData.length != 0) ITasker(recipient).onTaskReceived(taskData);\\n\\n        emit Withdraw(vestId, vest.token, canClaim, toBentoBox);\\n    }\\n\\n    function stopVesting(uint256 vestId, bool toBentoBox) external override {\\n        Vest memory vest = vests[vestId];\\n\\n        if (vest.owner != msg.sender) revert NotOwner();\\n\\n        uint256 amountVested = _balanceOf(vest);\\n        uint256 canClaim = amountVested - vest.claimed;\\n        uint256 returnShares = (vest.cliffShares +\\n            (vest.steps * vest.stepShares)) - amountVested;\\n\\n        delete vests[vestId];\\n\\n        _transferToken(\\n            address(vest.token),\\n            address(this),\\n            ownerOf[vestId],\\n            canClaim,\\n            toBentoBox\\n        );\\n\\n        _transferToken(\\n            address(vest.token),\\n            address(this),\\n            msg.sender,\\n            returnShares,\\n            toBentoBox\\n        );\\n        emit CancelVesting(\\n            vestId,\\n            returnShares,\\n            canClaim,\\n            vest.token,\\n            toBentoBox\\n        );\\n    }\\n\\n    function vestBalance(uint256 vestId)\\n        external\\n        view\\n        override\\n        returns (uint256)\\n    {\\n        Vest memory vest = vests[vestId];\\n        return _balanceOf(vest) - vest.claimed;\\n    }\\n\\n    function _balanceOf(Vest memory vest)\\n        internal\\n        view\\n        returns (uint256 claimable)\\n    {\\n        uint256 timeAfterCliff = vest.start + vest.cliffDuration;\\n\\n        if (block.timestamp < timeAfterCliff) {\\n            return claimable;\\n        }\\n\\n        uint256 passedSinceCliff = block.timestamp - timeAfterCliff;\\n\\n        uint256 stepPassed = Math.min(\\n            vest.steps,\\n            passedSinceCliff / vest.stepDuration\\n        );\\n\\n        claimable = vest.cliffShares + (vest.stepShares * stepPassed);\\n    }\\n\\n    function updateOwner(uint256 vestId, address newOwner) external override {\\n        Vest storage vest = vests[vestId];\\n        if (vest.owner != msg.sender) revert NotOwner();\\n        vest.owner = newOwner;\\n        emit LogUpdateOwner(vestId, newOwner);\\n    }\\n\\n    function _depositToken(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        bool fromBentoBox\\n    ) internal returns (uint256 depositedShares) {\\n        if (fromBentoBox) {\\n            depositedShares = bentoBox.toShare(token, amount, false);\\n            bentoBox.transfer(token, from, to, depositedShares);\\n        } else {\\n            (, depositedShares) = bentoBox.deposit{\\n                value: token == address(0) ? amount : 0\\n            }(token, from, to, amount, 0);\\n        }\\n    }\\n\\n    function _transferToken(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 shares,\\n        bool toBentoBox\\n    ) internal {\\n        if (toBentoBox) {\\n            bentoBox.transfer(token, from, to, shares);\\n        } else {\\n            bentoBox.withdraw(token, from, to, 0, shares);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x77727f1bc84aed90249b2c5fa8094109bd042418a49d7af3857a6fd772519e1f\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IBentoBoxMinimal.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\n/// @notice Minimal BentoBox vault interface.\\n/// @dev `token` is aliased as `address` from `IERC20` for simplicity.\\ninterface IBentoBoxMinimal {\\n    /// @notice Balance per ERC-20 token per account in shares.\\n    function balanceOf(address, address) external view returns (uint256);\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        address token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    /// @dev Helper function to represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        address token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    /// @notice Registers this contract so that users can approve it for BentoBox.\\n    function registerProtocol() external;\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        address token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        address token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    function transfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\",\"keccak256\":\"0x3e135c9c5030751760c2a558bda7c699bc0525b15fdea6f084075dc2804064c9\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender)\\n        external\\n        view\\n        returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(\\n        address indexed owner,\\n        address indexed spender,\\n        uint256 value\\n    );\\n\\n    /// @notice EIP 2612\\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\",\"keccak256\":\"0xec0a527d973f9a1d9395f6a548acf2c7edd49cb3db50d1bb5e8d74486c18e46f\",\"license\":\"MIT\"},\"contracts/interfaces/IFuroVesting.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\nimport \\\"./ITasker.sol\\\";\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./ITokenURIFetcher.sol\\\";\\nimport \\\"./IBentoBoxMinimal.sol\\\";\\nimport \\\"../utils/Multicall.sol\\\";\\nimport \\\"../utils/BoringOwnable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport \\\"@rari-capital/solmate/src/tokens/ERC721.sol\\\";\\n\\ninterface IFuroVesting {\\n    function setBentoBoxApproval(\\n        address user,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external payable;\\n\\n    function createVesting(VestParams calldata vestParams)\\n        external\\n        payable\\n        returns (\\n            uint256 depositedShares,\\n            uint256 vestId,\\n            uint128 stepShares,\\n            uint128 cliffShares\\n        );\\n\\n    function withdraw(\\n        uint256 vestId,\\n        bytes memory taskData,\\n        bool toBentoBox\\n    ) external;\\n\\n    function stopVesting(uint256 vestId, bool toBentoBox) external;\\n\\n    function vestBalance(uint256 vestId) external view returns (uint256);\\n\\n    function updateOwner(uint256 vestId, address newOwner) external;\\n\\n    struct VestParams {\\n        IERC20 token;\\n        address recipient;\\n        uint32 start;\\n        uint32 cliffDuration;\\n        uint32 stepDuration;\\n        uint32 steps;\\n        uint128 stepPercentage;\\n        uint128 amount;\\n        bool fromBentoBox;\\n    }\\n\\n    struct Vest {\\n        address owner;\\n        IERC20 token;\\n        uint32 start;\\n        uint32 cliffDuration;\\n        uint32 stepDuration;\\n        uint32 steps;\\n        uint128 cliffShares;\\n        uint128 stepShares;\\n        uint128 claimed;\\n    }\\n\\n    event CreateVesting(\\n        uint256 indexed vestId,\\n        IERC20 token,\\n        address indexed owner,\\n        address indexed recipient,\\n        uint32 start,\\n        uint32 cliffDuration,\\n        uint32 stepDuration,\\n        uint32 steps,\\n        uint128 cliffShares,\\n        uint128 stepShares,\\n        bool fromBentoBox\\n    );\\n\\n    event Withdraw(\\n        uint256 indexed vestId,\\n        IERC20 indexed token,\\n        uint256 indexed amount,\\n        bool toBentoBox\\n    );\\n\\n    event CancelVesting(\\n        uint256 indexed vestId,\\n        uint256 indexed ownerAmount,\\n        uint256 indexed recipientAmount,\\n        IERC20 token,\\n        bool toBentoBox\\n    );\\n\\n    event LogUpdateOwner(uint256 indexed vestId, address indexed newOwner);\\n}\\n\",\"keccak256\":\"0x94029cc91403f8d77e404d9a8ec1c1febb97aafddcc642d1199c528f5cb11f3e\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITasker.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\ninterface ITasker {\\n    function onTaskReceived(\\n        bytes calldata data\\n    ) external;\\n}\\n\",\"keccak256\":\"0x11e5f363d8e6250c7e34e2845a2f1f6a33085a07efa286fd047fe9d5aa9e0a02\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITokenURIFetcher.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity 0.8.10;\\n\\ninterface ITokenURIFetcher {\\n    function fetchTokenURIData(uint256 id)\\n        external\\n        view\\n        returns (string memory);\\n}\\n\",\"keccak256\":\"0x96bff838b3cf677bcdcc63618f7991be418601bdf854ca8247e3d942c665d68f\",\"license\":\"GPL-3.0-or-later\"},\"contracts/utils/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.12;\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(\\n        address indexed previousOwner,\\n        address indexed newOwner\\n    );\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(\\n                newOwner != address(0) || renounce,\\n                \\\"Ownable: zero address\\\"\\n            );\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(\\n            msg.sender == _pendingOwner,\\n            \\\"Ownable: caller != pending owner\\\"\\n        );\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\",\"keccak256\":\"0x6ceaca1fef363dd2a8a71e48b1f73aeb673cf08c9336378e8dc40b23615336b9\",\"license\":\"MIT\"},\"contracts/utils/Multicall.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity 0.8.10;\\n\\n/// @title Multicall\\n/// @notice Enables calling multiple methods in a single call to the contract\\nabstract contract Multicall {\\n    function multicall(bytes[] calldata data)\\n        public\\n        payable\\n        returns (bytes[] memory results)\\n    {\\n        results = new bytes[](data.length);\\n        for (uint256 i = 0; i < data.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(\\n                data[i]\\n            );\\n\\n            if (!success) {\\n                // Next 5 lines from https://ethereum.stackexchange.com/a/83577\\n                if (result.length < 68) revert();\\n                assembly {\\n                    result := add(result, 0x04)\\n                }\\n                revert(abi.decode(result, (string)));\\n            }\\n\\n            results[i] = result;\\n        }\\n    }\\n}\",\"keccak256\":\"0x45f781fda06ef92136bdf1b418bcff631c619015b8001d9eebbacb2f91fcfa51\",\"license\":\"GPL-2.0-or-later\"}},\"version\":1}",
  "bytecode": "0x60c06040523480156200001157600080fd5b50604051620039ac380380620039ac833981016040819052620000349162000216565b604080518082018252600c81526b4675726f2056657374696e6760a01b60208083019182528351808501909452600884526711955493d59154d560c21b908401528151919291620000889160009162000157565b5080516200009e90600190602084019062000157565b5050600680546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160a01b03808316608081905290821660a0526001600a556040805163577268d960e11b8152905163aee4d1b29160048082019260009290919082900301818387803b1580156200013657600080fd5b505af11580156200014b573d6000803e3d6000fd5b50505050505062000292565b828054620001659062000255565b90600052602060002090601f016020900481019282620001895760008555620001d4565b82601f10620001a457805160ff1916838001178555620001d4565b82800160010185558215620001d4579182015b82811115620001d4578251825591602001919060010190620001b7565b50620001e2929150620001e6565b5090565b5b80821115620001e25760008155600101620001e7565b6001600160a01b03811681146200021357600080fd5b50565b600080604083850312156200022a57600080fd5b82516200023781620001fd565b60208401519092506200024a81620001fd565b809150509250929050565b600181811c908216806200026a57607f821691505b602082108114156200028c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516136c3620002e9600039600081816107f601526121f40152600081816105a4015281816115910152818161269a0152818161275e0152818161282f015281816128f9015261297301526136c36000f3fe6080604052600436106101d85760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c397814610731578063e985e9c51461075e578063e9d163c914610799578063f2428621146107e457600080fd5b8063b3a2b2cf146106b5578063b88d4fde146106d5578063c87b56dd146106f5578063e256888f1461071557600080fd5b806395d89b41116100d157806395d89b4114610640578063a203db8e14610655578063a22cb46514610675578063ac9650d81461069557600080fd5b80636b2ace871461059257806370a08231146105c65780637192711f146105f35780638da5cb5b1461061357600080fd5b806323b872dd1161017a578063489bb0b211610149578063489bb0b2146103af5780634e71e0c8146103c257806351def556146103d75780636352211e1461054f57600080fd5b806323b872dd146103395780632bcea7361461035957806340e76eff1461036f57806342842e0e1461038f57600080fd5b806307d88aad116101b657806307d88aad14610256578063081812fc146102a8578063095ea7b3146102eb57806319f771711461030b57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063078dfbe714610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612c41565b610818565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102276108fd565b6040516102099190612cd4565b34801561024057600080fd5b5061025461024f366004612d1e565b61098b565b005b34801561026257600080fd5b506008546102839073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b3480156102b457600080fd5b506102836102c3366004612d63565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f757600080fd5b50610254610306366004612d7c565b610b7c565b34801561031757600080fd5b5061032b610326366004612d63565b610cc6565b604051908152602001610209565b34801561034557600080fd5b50610254610354366004612da8565b610ded565b34801561036557600080fd5b5061032b600a5481565b34801561037b57600080fd5b5061025461038a366004612de9565b6110b4565b34801561039b57600080fd5b506102546103aa366004612da8565b6113c2565b6102546103bd366004612e76565b611527565b3480156103ce57600080fd5b506102546115f4565b3480156103e357600080fd5b506104d06103f2366004612d63565b600960205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff928316939282169263ffffffff740100000000000000000000000000000000000000008404811693780100000000000000000000000000000000000000000000000081048216937c0100000000000000000000000000000000000000000000000000000000909104821692918216916fffffffffffffffffffffffffffffffff640100000000909104811691808216917001000000000000000000000000000000009091041689565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b1681529990981660208a015263ffffffff96871697890197909752938516606088015291841660808701529290921660a08501526fffffffffffffffffffffffffffffffff91821660c0850152811660e08401521661010082015261012001610209565b34801561055b57600080fd5b5061028361056a366004612d63565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561059e57600080fd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d257600080fd5b5061032b6105e1366004612ed5565b60026020526000908152604090205481565b3480156105ff57600080fd5b5061025461060e366004612ef2565b61170b565b34801561061f57600080fd5b506006546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561064c57600080fd5b506102276117d9565b34801561066157600080fd5b50610254610670366004612f22565b6117e6565b34801561068157600080fd5b50610254610690366004612f4e565b611aa9565b6106a86106a3366004612f7a565b611b40565b6040516102099190612fef565b3480156106c157600080fd5b506102546106d0366004612ed5565b611cb2565b3480156106e157600080fd5b506102546106f0366004613133565b611d7a565b34801561070157600080fd5b50610227610710366004612d63565b611ecb565b34801561072157600080fd5b5061032b670de0b6b3a764000081565b34801561073d57600080fd5b506007546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561076a57600080fd5b506101fd6107793660046131e2565b600560209081526000928352604080842090915290825290205460ff1681565b6107ac6107a7366004613210565b611f81565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff91821692840192909252166060820152608001610209565b3480156107f057600080fd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806108ab57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806108f757507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805461090a90613229565b80601f016020809104026020016040519081016040528092919081815260200182805461093690613229565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610b365773ffffffffffffffffffffffffffffffffffffffff8316151580610a385750805b610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610bdf575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600960209081526040808320815161012081018352815473ffffffffffffffffffffffffffffffffffffffff908116825260018301549081169482019490945263ffffffff74010000000000000000000000000000000000000000850481169382019390935278010000000000000000000000000000000000000000000000008404831660608201527c010000000000000000000000000000000000000000000000000000000090930482166080840152600281015491821660a08401526fffffffffffffffffffffffffffffffff640100000000909204821660c08401526003015480821660e08401527001000000000000000000000000000000009004166101008201819052610ddc82612584565b610de691906132a6565b9392505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216610efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f41575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f7c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600084815260096020908152604080832060039092529091205473ffffffffffffffffffffffffffffffffffffffff1633811461111d576040517fe1c6117100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546040805161012081018252845473ffffffffffffffffffffffffffffffffffffffff90811682526001860154908116602083015274010000000000000000000000000000000000000000810463ffffffff9081169383019390935278010000000000000000000000000000000000000000000000008104831660608301527c0100000000000000000000000000000000000000000000000000000000900482166080820152600285015491821660a08201526fffffffffffffffffffffffffffffffff640100000000909204821660c082015281831660e082015270010000000000000000000000000000000090920416610100820181905260009161122790612584565b61123191906132a6565b905080611240575050506113bc565b808360030160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661126f91906132bd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506112d68360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630848488612638565b8415611363576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063330df2829061133090899089906004016132f1565b600060405180830381600087803b15801561134a57600080fd5b505af115801561135e573d6000803e3d6000fd5b505050505b60018301546040518515158152829173ffffffffffffffffffffffffffffffffffffffff169089907fff942d249898505febb2a9a00118e27567c084b9497d0aa3ba5e332c235b4f389060200160405180910390a45050505b50505050565b6113cd838383610ded565b73ffffffffffffffffffffffffffffffffffffffff82163b15806114c157506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff16338114611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b6000828152600960205260409020805473ffffffffffffffffffffffffffffffffffffffff163314611769576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184907fca0251ba80971adc7e92434b097ca40450b2a317013c51c5c5cb6ae74500bb0090600090a3505050565b6001805461090a90613229565b600082815260096020908152604091829020825161012081018452815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401549182169483019490945263ffffffff74010000000000000000000000000000000000000000820481169583019590955278010000000000000000000000000000000000000000000000008104851660608301527c0100000000000000000000000000000000000000000000000000000000900484166080820152600282015493841660a08201526fffffffffffffffffffffffffffffffff640100000000909404841660c082015260039091015480841660e08301527001000000000000000000000000000000009004909216610100830152331461192e576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061193982612584565b905060008261010001516fffffffffffffffffffffffffffffffff168261196091906132a6565b90506000828460e001518560a0015163ffffffff1661197f919061335b565b8560c0015161198e91906132bd565b6fffffffffffffffffffffffffffffffff166119aa91906132a6565b600087815260096020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168255600182018590556002820180549091169055600390810184905588830151925290912054919250611a2d91309073ffffffffffffffffffffffffffffffffffffffff168589612638565b611a3e846020015130338489612638565b8181877f061c75052be1ee7232bc654d7f489af163c983bb99c5affe5e8fc2e5225cb577876020015189604051611a9992919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a4505050505050565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611b5b57611b5b61306f565b604051908082528060200260200182016040528015611b8e57816020015b6060815260200190600190039081611b795790505b50905060005b82811015611cab5760008030868685818110611bb257611bb2613393565b9050602002810190611bc491906133c2565b604051611bd292919061342e565b600060405180830381855af49150503d8060008114611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b509150915081611c7857604481511015611c2b57600080fd5b60048101905080806020019051810190611c45919061343e565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a089190612cd4565b80848481518110611c8b57611c8b613393565b602002602001018190525050508080611ca3906134ac565b915050611b94565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a08565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611d85848484610ded565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611e6557506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611dfe9033908990889088906004016134e5565b6020604051808303816000875af1158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e41919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6113bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6008546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015611f3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108f7919081019061343e565b600080808042611f97606087016040880161352e565b63ffffffff161015611fd5576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a7640000611fee60e0870160c08801613554565b6fffffffffffffffffffffffffffffffff161115612038576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61204860a086016080870161352e565b63ffffffff16158061206d575061206560c0860160a0870161352e565b63ffffffff16155b156120a4576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120f06120b46020870187612ed5565b33306120c76101008a0160e08b01613554565b6fffffffffffffffffffffffffffffffff166120eb6101208b016101008c01613586565b6127d4565b9350670de0b6b3a76400008461210c60e0880160c08901613554565b6fffffffffffffffffffffffffffffffff1661212891906135a1565b61213291906135de565b915061214460c0860160a0870161352e565b6121549063ffffffff168361335b565b612170906fffffffffffffffffffffffffffffffff16856132a6565b600a80549192506000612182836134ac565b9091555092506121a161219b6040870160208801612ed5565b84612a61565b6040805161012081019091523381526020808201906000906121c590890189612ed5565b73ffffffffffffffffffffffffffffffffffffffff16146121f2576121ed6020880188612ed5565b612214565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff16815260200161223f606088016040890161352e565b63ffffffff16815260200161225a608088016060890161352e565b63ffffffff16815260200161227560a088016080890161352e565b63ffffffff16815260200161229060c0880160a0890161352e565b63ffffffff90811682526fffffffffffffffffffffffffffffffff80851660208085019190915286821660408086019190915260006060958601819052898152600983528190208651815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178355888501516001840180548b8701519a8c015160808d01518b167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff918c167801000000000000000000000000000000000000000000000000029190911677ffffffffffffffffffffffffffffffffffffffffffffffff9c8c1674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931694909616939093171799909916929092179190911790965560a087015160028201805460c08a0151871664010000000002981691909616179590951790935560e085015161010090950151821670010000000000000000000000000000000002949091169390931760039092019190915561246891908701908701612ed5565b73ffffffffffffffffffffffffffffffffffffffff1633847f603bb53f65550199ed7346ba18d49bcb7ec77162b3167b272f8cd19b20d9510b6124ae60208a018a612ed5565b6124be60608b0160408c0161352e565b6124ce60808c0160608d0161352e565b6124de60a08d0160808e0161352e565b6124ee60c08e0160a08f0161352e565b898b8f6101000160208101906125049190613586565b6040805173ffffffffffffffffffffffffffffffffffffffff909916895263ffffffff97881660208a0152958716958801959095529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a08501529190911660c0830152151560e08201526101000160405180910390a49193509193565b6000808260600151836040015161259b9190613619565b63ffffffff169050804210156125b15750919050565b60006125bd82426132a6565b905060006125ea8560a0015163ffffffff16866080015163ffffffff16846125e591906135de565b612bfa565b9050808560e001516fffffffffffffffffffffffffffffffff1661260e91906135a1565b8560c001516fffffffffffffffffffffffffffffffff1661262f9190613638565b95945050505050565b80156126fb576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050506127cd565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af11580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190613650565b50505b5050505050565b6000811561295c576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa158015612876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289a9190613674565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050505061262f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c908816156129a95760006129ab565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612a31573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a569190613650565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612c095781610de6565b5090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612c3e57600080fd5b50565b600060208284031215612c5357600080fd5b8135610de681612c10565b60005b83811015612c79578181015183820152602001612c61565b838111156113bc5750506000910152565b60008151808452612ca2816020860160208601612c5e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610de66020830184612c8a565b73ffffffffffffffffffffffffffffffffffffffff81168114612c3e57600080fd5b80358015158114612d1957600080fd5b919050565b600080600060608486031215612d3357600080fd5b8335612d3e81612ce7565b9250612d4c60208501612d09565b9150612d5a60408501612d09565b90509250925092565b600060208284031215612d7557600080fd5b5035919050565b60008060408385031215612d8f57600080fd5b8235612d9a81612ce7565b946020939093013593505050565b600080600060608486031215612dbd57600080fd5b8335612dc881612ce7565b92506020840135612dd881612ce7565b929592945050506040919091013590565b60008060008060608587031215612dff57600080fd5b84359350602085013567ffffffffffffffff80821115612e1e57600080fd5b818701915087601f830112612e3257600080fd5b813581811115612e4157600080fd5b886020828501011115612e5357600080fd5b602083019550809450505050612e6b60408601612d09565b905092959194509250565b600080600080600060a08688031215612e8e57600080fd5b8535612e9981612ce7565b9450612ea760208701612d09565b9350604086013560ff81168114612ebd57600080fd5b94979396509394606081013594506080013592915050565b600060208284031215612ee757600080fd5b8135610de681612ce7565b60008060408385031215612f0557600080fd5b823591506020830135612f1781612ce7565b809150509250929050565b60008060408385031215612f3557600080fd5b82359150612f4560208401612d09565b90509250929050565b60008060408385031215612f6157600080fd5b8235612f6c81612ce7565b9150612f4560208401612d09565b60008060208385031215612f8d57600080fd5b823567ffffffffffffffff80821115612fa557600080fd5b818501915085601f830112612fb957600080fd5b813581811115612fc857600080fd5b8660208260051b8501011115612fdd57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613062577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613050858351612c8a565b94509285019290850190600101613016565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130e5576130e561306f565b604052919050565b600067ffffffffffffffff8211156131075761310761306f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561314957600080fd5b843561315481612ce7565b9350602085013561316481612ce7565b925060408501359150606085013567ffffffffffffffff81111561318757600080fd5b8501601f8101871361319857600080fd5b80356131ab6131a6826130ed565b61309e565b8181528860208385010111156131c057600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156131f557600080fd5b823561320081612ce7565b91506020830135612f1781612ce7565b6000610120828403121561322357600080fd5b50919050565b600181811c9082168061323d57607f821691505b60208210811415613223577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156132b8576132b8613277565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156132e8576132e8613277565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006020828403121561335057600080fd5b8151610de681612c10565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561338a5761338a613277565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126133f757600080fd5b83018035915067ffffffffffffffff82111561341257600080fd5b60200191503681900382131561342757600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561345057600080fd5b815167ffffffffffffffff81111561346757600080fd5b8201601f8101841361347857600080fd5b80516134866131a6826130ed565b81815285602083850101111561349b57600080fd5b61262f826020830160208601612c5e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134de576134de613277565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526135246080830184612c8a565b9695505050505050565b60006020828403121561354057600080fd5b813563ffffffff81168114610de657600080fd5b60006020828403121561356657600080fd5b81356fffffffffffffffffffffffffffffffff81168114610de657600080fd5b60006020828403121561359857600080fd5b610de682612d09565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135d9576135d9613277565b500290565b600082613614577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168083038211156132e8576132e8613277565b6000821982111561364b5761364b613277565b500190565b6000806040838503121561366357600080fd5b505080516020909101519092909150565b60006020828403121561368657600080fd5b505191905056fea2646970667358221220a2531ca023eb50ca3dde83ced20cfa01768dcc3c81b0e4f9a744260954a2118164736f6c634300080a0033",
  "deployedBytecode": "0x6080604052600436106101d85760003560e01c80636b2ace8711610102578063b3a2b2cf11610095578063e30c397811610064578063e30c397814610731578063e985e9c51461075e578063e9d163c914610799578063f2428621146107e457600080fd5b8063b3a2b2cf146106b5578063b88d4fde146106d5578063c87b56dd146106f5578063e256888f1461071557600080fd5b806395d89b41116100d157806395d89b4114610640578063a203db8e14610655578063a22cb46514610675578063ac9650d81461069557600080fd5b80636b2ace871461059257806370a08231146105c65780637192711f146105f35780638da5cb5b1461061357600080fd5b806323b872dd1161017a578063489bb0b211610149578063489bb0b2146103af5780634e71e0c8146103c257806351def556146103d75780636352211e1461054f57600080fd5b806323b872dd146103395780632bcea7361461035957806340e76eff1461036f57806342842e0e1461038f57600080fd5b806307d88aad116101b657806307d88aad14610256578063081812fc146102a8578063095ea7b3146102eb57806319f771711461030b57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063078dfbe714610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612c41565b610818565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102276108fd565b6040516102099190612cd4565b34801561024057600080fd5b5061025461024f366004612d1e565b61098b565b005b34801561026257600080fd5b506008546102839073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b3480156102b457600080fd5b506102836102c3366004612d63565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f757600080fd5b50610254610306366004612d7c565b610b7c565b34801561031757600080fd5b5061032b610326366004612d63565b610cc6565b604051908152602001610209565b34801561034557600080fd5b50610254610354366004612da8565b610ded565b34801561036557600080fd5b5061032b600a5481565b34801561037b57600080fd5b5061025461038a366004612de9565b6110b4565b34801561039b57600080fd5b506102546103aa366004612da8565b6113c2565b6102546103bd366004612e76565b611527565b3480156103ce57600080fd5b506102546115f4565b3480156103e357600080fd5b506104d06103f2366004612d63565b600960205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff928316939282169263ffffffff740100000000000000000000000000000000000000008404811693780100000000000000000000000000000000000000000000000081048216937c0100000000000000000000000000000000000000000000000000000000909104821692918216916fffffffffffffffffffffffffffffffff640100000000909104811691808216917001000000000000000000000000000000009091041689565b6040805173ffffffffffffffffffffffffffffffffffffffff9a8b1681529990981660208a015263ffffffff96871697890197909752938516606088015291841660808701529290921660a08501526fffffffffffffffffffffffffffffffff91821660c0850152811660e08401521661010082015261012001610209565b34801561055b57600080fd5b5061028361056a366004612d63565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801561059e57600080fd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d257600080fd5b5061032b6105e1366004612ed5565b60026020526000908152604090205481565b3480156105ff57600080fd5b5061025461060e366004612ef2565b61170b565b34801561061f57600080fd5b506006546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561064c57600080fd5b506102276117d9565b34801561066157600080fd5b50610254610670366004612f22565b6117e6565b34801561068157600080fd5b50610254610690366004612f4e565b611aa9565b6106a86106a3366004612f7a565b611b40565b6040516102099190612fef565b3480156106c157600080fd5b506102546106d0366004612ed5565b611cb2565b3480156106e157600080fd5b506102546106f0366004613133565b611d7a565b34801561070157600080fd5b50610227610710366004612d63565b611ecb565b34801561072157600080fd5b5061032b670de0b6b3a764000081565b34801561073d57600080fd5b506007546102839073ffffffffffffffffffffffffffffffffffffffff1681565b34801561076a57600080fd5b506101fd6107793660046131e2565b600560209081526000928352604080842090915290825290205460ff1681565b6107ac6107a7366004613210565b611f81565b6040805194855260208501939093526fffffffffffffffffffffffffffffffff91821692840192909252166060820152608001610209565b3480156107f057600080fd5b506102837f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806108ab57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806108f757507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805461090a90613229565b80601f016020809104026020016040519081016040528092919081815260200182805461093690613229565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b505050505081565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8115610b365773ffffffffffffffffffffffffffffffffffffffff8316151580610a385750805b610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600780549091169055505050565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1633811480610bdf575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b610c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600960209081526040808320815161012081018352815473ffffffffffffffffffffffffffffffffffffffff908116825260018301549081169482019490945263ffffffff74010000000000000000000000000000000000000000850481169382019390935278010000000000000000000000000000000000000000000000008404831660608201527c010000000000000000000000000000000000000000000000000000000090930482166080840152600281015491821660a08401526fffffffffffffffffffffffffffffffff640100000000909204821660c08401526003015480821660e08401527001000000000000000000000000000000009004166101008201819052610ddc82612584565b610de691906132a6565b9392505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216610efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b3373ffffffffffffffffffffffffffffffffffffffff84161480610f41575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610f7c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600084815260096020908152604080832060039092529091205473ffffffffffffffffffffffffffffffffffffffff1633811461111d576040517fe1c6117100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546040805161012081018252845473ffffffffffffffffffffffffffffffffffffffff90811682526001860154908116602083015274010000000000000000000000000000000000000000810463ffffffff9081169383019390935278010000000000000000000000000000000000000000000000008104831660608301527c0100000000000000000000000000000000000000000000000000000000900482166080820152600285015491821660a08201526fffffffffffffffffffffffffffffffff640100000000909204821660c082015281831660e082015270010000000000000000000000000000000090920416610100820181905260009161122790612584565b61123191906132a6565b905080611240575050506113bc565b808360030160108282829054906101000a90046fffffffffffffffffffffffffffffffff1661126f91906132bd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506112d68360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630848488612638565b8415611363576040517f330df28200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063330df2829061133090899089906004016132f1565b600060405180830381600087803b15801561134a57600080fd5b505af115801561135e573d6000803e3d6000fd5b505050505b60018301546040518515158152829173ffffffffffffffffffffffffffffffffffffffff169089907fff942d249898505febb2a9a00118e27567c084b9497d0aa3ba5e332c235b4f389060200160405180910390a45050505b50505050565b6113cd838383610ded565b73ffffffffffffffffffffffffffffffffffffffff82163b15806114c157506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6040517fc0a47c9300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152306024830152851515604483015260ff851660648301526084820184905260a482018390527f0000000000000000000000000000000000000000000000000000000000000000169063c0a47c939060c401600060405180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff16338114611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152606401610a08565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600780549091169055565b6000828152600960205260409020805473ffffffffffffffffffffffffffffffffffffffff163314611769576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184907fca0251ba80971adc7e92434b097ca40450b2a317013c51c5c5cb6ae74500bb0090600090a3505050565b6001805461090a90613229565b600082815260096020908152604091829020825161012081018452815473ffffffffffffffffffffffffffffffffffffffff90811680835260018401549182169483019490945263ffffffff74010000000000000000000000000000000000000000820481169583019590955278010000000000000000000000000000000000000000000000008104851660608301527c0100000000000000000000000000000000000000000000000000000000900484166080820152600282015493841660a08201526fffffffffffffffffffffffffffffffff640100000000909404841660c082015260039091015480841660e08301527001000000000000000000000000000000009004909216610100830152331461192e576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061193982612584565b905060008261010001516fffffffffffffffffffffffffffffffff168261196091906132a6565b90506000828460e001518560a0015163ffffffff1661197f919061335b565b8560c0015161198e91906132bd565b6fffffffffffffffffffffffffffffffff166119aa91906132a6565b600087815260096020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168255600182018590556002820180549091169055600390810184905588830151925290912054919250611a2d91309073ffffffffffffffffffffffffffffffffffffffff168589612638565b611a3e846020015130338489612638565b8181877f061c75052be1ee7232bc654d7f489af163c983bb99c5affe5e8fc2e5225cb577876020015189604051611a9992919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a4505050505050565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608167ffffffffffffffff811115611b5b57611b5b61306f565b604051908082528060200260200182016040528015611b8e57816020015b6060815260200190600190039081611b795790505b50905060005b82811015611cab5760008030868685818110611bb257611bb2613393565b9050602002810190611bc491906133c2565b604051611bd292919061342e565b600060405180830381855af49150503d8060008114611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b509150915081611c7857604481511015611c2b57600080fd5b60048101905080806020019051810190611c45919061343e565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a089190612cd4565b80848481518110611c8b57611c8b613393565b602002602001018190525050508080611ca3906134ac565b915050611b94565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a08565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611d85848484610ded565b73ffffffffffffffffffffffffffffffffffffffff83163b1580611e6557506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611dfe9033908990889088906004016134e5565b6020604051808303816000875af1158015611e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e41919061333e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6113bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a08565b6008546040517fc981fac40000000000000000000000000000000000000000000000000000000081526004810183905260609173ffffffffffffffffffffffffffffffffffffffff169063c981fac490602401600060405180830381865afa158015611f3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108f7919081019061343e565b600080808042611f97606087016040880161352e565b63ffffffff161015611fd5576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a7640000611fee60e0870160c08801613554565b6fffffffffffffffffffffffffffffffff161115612038576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61204860a086016080870161352e565b63ffffffff16158061206d575061206560c0860160a0870161352e565b63ffffffff16155b156120a4576040517fd276d51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120f06120b46020870187612ed5565b33306120c76101008a0160e08b01613554565b6fffffffffffffffffffffffffffffffff166120eb6101208b016101008c01613586565b6127d4565b9350670de0b6b3a76400008461210c60e0880160c08901613554565b6fffffffffffffffffffffffffffffffff1661212891906135a1565b61213291906135de565b915061214460c0860160a0870161352e565b6121549063ffffffff168361335b565b612170906fffffffffffffffffffffffffffffffff16856132a6565b600a80549192506000612182836134ac565b9091555092506121a161219b6040870160208801612ed5565b84612a61565b6040805161012081019091523381526020808201906000906121c590890189612ed5565b73ffffffffffffffffffffffffffffffffffffffff16146121f2576121ed6020880188612ed5565b612214565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff16815260200161223f606088016040890161352e565b63ffffffff16815260200161225a608088016060890161352e565b63ffffffff16815260200161227560a088016080890161352e565b63ffffffff16815260200161229060c0880160a0890161352e565b63ffffffff90811682526fffffffffffffffffffffffffffffffff80851660208085019190915286821660408086019190915260006060958601819052898152600983528190208651815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178355888501516001840180548b8701519a8c015160808d01518b167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff918c167801000000000000000000000000000000000000000000000000029190911677ffffffffffffffffffffffffffffffffffffffffffffffff9c8c1674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931694909616939093171799909916929092179190911790965560a087015160028201805460c08a0151871664010000000002981691909616179590951790935560e085015161010090950151821670010000000000000000000000000000000002949091169390931760039092019190915561246891908701908701612ed5565b73ffffffffffffffffffffffffffffffffffffffff1633847f603bb53f65550199ed7346ba18d49bcb7ec77162b3167b272f8cd19b20d9510b6124ae60208a018a612ed5565b6124be60608b0160408c0161352e565b6124ce60808c0160608d0161352e565b6124de60a08d0160808e0161352e565b6124ee60c08e0160a08f0161352e565b898b8f6101000160208101906125049190613586565b6040805173ffffffffffffffffffffffffffffffffffffffff909916895263ffffffff97881660208a0152958716958801959095529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a08501529190911660c0830152151560e08201526101000160405180910390a49193509193565b6000808260600151836040015161259b9190613619565b63ffffffff169050804210156125b15750919050565b60006125bd82426132a6565b905060006125ea8560a0015163ffffffff16866080015163ffffffff16846125e591906135de565b612bfa565b9050808560e001516fffffffffffffffffffffffffffffffff1661260e91906135a1565b8560c001516fffffffffffffffffffffffffffffffff1661262f9190613638565b95945050505050565b80156126fb576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015285811660248301528481166044830152606482018490527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050506127cd565b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152848116604483015260006064830152608482018490527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af11580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190613650565b50505b5050505050565b6000811561295c576040517fda5139ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201859052600060448301527f0000000000000000000000000000000000000000000000000000000000000000169063da5139ca90606401602060405180830381865afa158015612876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289a9190613674565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301528681166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050505061262f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c908816156129a95760006129ab565b845b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808b166004830152808a16602483015288166044820152606481018790526000608482015260a401604080518083038185885af1158015612a31573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a569190613650565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a08565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a08565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612c095781610de6565b5090919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612c3e57600080fd5b50565b600060208284031215612c5357600080fd5b8135610de681612c10565b60005b83811015612c79578181015183820152602001612c61565b838111156113bc5750506000910152565b60008151808452612ca2816020860160208601612c5e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610de66020830184612c8a565b73ffffffffffffffffffffffffffffffffffffffff81168114612c3e57600080fd5b80358015158114612d1957600080fd5b919050565b600080600060608486031215612d3357600080fd5b8335612d3e81612ce7565b9250612d4c60208501612d09565b9150612d5a60408501612d09565b90509250925092565b600060208284031215612d7557600080fd5b5035919050565b60008060408385031215612d8f57600080fd5b8235612d9a81612ce7565b946020939093013593505050565b600080600060608486031215612dbd57600080fd5b8335612dc881612ce7565b92506020840135612dd881612ce7565b929592945050506040919091013590565b60008060008060608587031215612dff57600080fd5b84359350602085013567ffffffffffffffff80821115612e1e57600080fd5b818701915087601f830112612e3257600080fd5b813581811115612e4157600080fd5b886020828501011115612e5357600080fd5b602083019550809450505050612e6b60408601612d09565b905092959194509250565b600080600080600060a08688031215612e8e57600080fd5b8535612e9981612ce7565b9450612ea760208701612d09565b9350604086013560ff81168114612ebd57600080fd5b94979396509394606081013594506080013592915050565b600060208284031215612ee757600080fd5b8135610de681612ce7565b60008060408385031215612f0557600080fd5b823591506020830135612f1781612ce7565b809150509250929050565b60008060408385031215612f3557600080fd5b82359150612f4560208401612d09565b90509250929050565b60008060408385031215612f6157600080fd5b8235612f6c81612ce7565b9150612f4560208401612d09565b60008060208385031215612f8d57600080fd5b823567ffffffffffffffff80821115612fa557600080fd5b818501915085601f830112612fb957600080fd5b813581811115612fc857600080fd5b8660208260051b8501011115612fdd57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613062577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613050858351612c8a565b94509285019290850190600101613016565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130e5576130e561306f565b604052919050565b600067ffffffffffffffff8211156131075761310761306f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000806000806080858703121561314957600080fd5b843561315481612ce7565b9350602085013561316481612ce7565b925060408501359150606085013567ffffffffffffffff81111561318757600080fd5b8501601f8101871361319857600080fd5b80356131ab6131a6826130ed565b61309e565b8181528860208385010111156131c057600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156131f557600080fd5b823561320081612ce7565b91506020830135612f1781612ce7565b6000610120828403121561322357600080fd5b50919050565b600181811c9082168061323d57607f821691505b60208210811415613223577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156132b8576132b8613277565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156132e8576132e8613277565b01949350505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60006020828403121561335057600080fd5b8151610de681612c10565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561338a5761338a613277565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126133f757600080fd5b83018035915067ffffffffffffffff82111561341257600080fd5b60200191503681900382131561342757600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561345057600080fd5b815167ffffffffffffffff81111561346757600080fd5b8201601f8101841361347857600080fd5b80516134866131a6826130ed565b81815285602083850101111561349b57600080fd5b61262f826020830160208601612c5e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134de576134de613277565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526135246080830184612c8a565b9695505050505050565b60006020828403121561354057600080fd5b813563ffffffff81168114610de657600080fd5b60006020828403121561356657600080fd5b81356fffffffffffffffffffffffffffffffff81168114610de657600080fd5b60006020828403121561359857600080fd5b610de682612d09565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135d9576135d9613277565b500290565b600082613614577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168083038211156132e8576132e8613277565b6000821982111561364b5761364b613277565b500190565b6000806040838503121561366357600080fd5b505080516020909101519092909150565b60006020828403121561368657600080fd5b505191905056fea2646970667358221220a2531ca023eb50ca3dde83ced20cfa01768dcc3c81b0e4f9a744260954a2118164736f6c634300080a0033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "transferOwnership(address,bool,bool)": {
        "params": {
          "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
          "newOwner": "Address of the new owner.",
          "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "claimOwnership()": {
        "notice": "Needs to be called by `pendingOwner` to claim ownership."
      },
      "transferOwnership(address,bool,bool)": {
        "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 116,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "name",
        "offset": 0,
        "slot": "0",
        "type": "t_string_storage"
      },
      {
        "astId": 118,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "symbol",
        "offset": 0,
        "slot": "1",
        "type": "t_string_storage"
      },
      {
        "astId": 129,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "balanceOf",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 133,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "ownerOf",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_address)"
      },
      {
        "astId": 137,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "getApproved",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_uint256,t_address)"
      },
      {
        "astId": 143,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "isApprovedForAll",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
      },
      {
        "astId": 2868,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "owner",
        "offset": 0,
        "slot": "6",
        "type": "t_address"
      },
      {
        "astId": 2870,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "pendingOwner",
        "offset": 0,
        "slot": "7",
        "type": "t_address"
      },
      {
        "astId": 1440,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "tokenURIFetcher",
        "offset": 0,
        "slot": "8",
        "type": "t_address"
      },
      {
        "astId": 1445,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "vests",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_uint256,t_struct(Vest)2555_storage)"
      },
      {
        "astId": 1447,
        "contract": "contracts/base/FuroVesting.sol:FuroVesting",
        "label": "vestIds",
        "offset": 0,
        "slot": "10",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_contract(IERC20)2276": {
        "encoding": "inplace",
        "label": "contract IERC20",
        "numberOfBytes": "20"
      },
      "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_bool))": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => mapping(address => bool))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_bool)"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_uint256,t_address)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_uint256,t_struct(Vest)2555_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct IFuroVesting.Vest)",
        "numberOfBytes": "32",
        "value": "t_struct(Vest)2555_storage"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(Vest)2555_storage": {
        "encoding": "inplace",
        "label": "struct IFuroVesting.Vest",
        "members": [
          {
            "astId": 2537,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "owner",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 2540,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "token",
            "offset": 0,
            "slot": "1",
            "type": "t_contract(IERC20)2276"
          },
          {
            "astId": 2542,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "start",
            "offset": 20,
            "slot": "1",
            "type": "t_uint32"
          },
          {
            "astId": 2544,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "cliffDuration",
            "offset": 24,
            "slot": "1",
            "type": "t_uint32"
          },
          {
            "astId": 2546,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "stepDuration",
            "offset": 28,
            "slot": "1",
            "type": "t_uint32"
          },
          {
            "astId": 2548,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "steps",
            "offset": 0,
            "slot": "2",
            "type": "t_uint32"
          },
          {
            "astId": 2550,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "cliffShares",
            "offset": 4,
            "slot": "2",
            "type": "t_uint128"
          },
          {
            "astId": 2552,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "stepShares",
            "offset": 0,
            "slot": "3",
            "type": "t_uint128"
          },
          {
            "astId": 2554,
            "contract": "contracts/base/FuroVesting.sol:FuroVesting",
            "label": "claimed",
            "offset": 16,
            "slot": "3",
            "type": "t_uint128"
          }
        ],
        "numberOfBytes": "128"
      },
      "t_uint128": {
        "encoding": "inplace",
        "label": "uint128",
        "numberOfBytes": "16"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint32": {
        "encoding": "inplace",
        "label": "uint32",
        "numberOfBytes": "4"
      }
    }
  }
}