{
  "address": "0x55a9d7BCd53FF54B146C52Ec52b94C183636DA93",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "priceNumerator",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "priceDenominator",
          "type": "uint96"
        }
      ],
      "name": "AuctionCleared",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "sellAmount",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "buyAmount",
          "type": "uint96"
        }
      ],
      "name": "CancellationSellOrder",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "buyAmount",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "sellAmount",
          "type": "uint96"
        }
      ],
      "name": "ClaimedFromOrder",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "contract IERC20",
          "name": "_auctioningToken",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "contract IERC20",
          "name": "_biddingToken",
          "type": "address"
        }
      ],
      "name": "NewAuction",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "buyAmount",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "sellAmount",
          "type": "uint96"
        }
      ],
      "name": "NewSellOrder",
      "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": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        }
      ],
      "name": "UserRegistration",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "FEE_DENOMINATOR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "auctionCounter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "auctionData",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "auctioningToken",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "biddingToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "auctionEndDate",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "initialAuctionOrder",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "minimumBiddingAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "interimSumBidAmount",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "interimOrder",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "clearingPriceOrder",
          "type": "bytes32"
        },
        {
          "internalType": "uint96",
          "name": "volumeClearingPriceOrder",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "feeNumerator",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "_sellOrders",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "_prevSellOrders",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "_fallbackPrevSellOrders",
          "type": "bytes32[]"
        }
      ],
      "name": "cancelSellOrders",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "orders",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "previousOrders",
          "type": "bytes32[]"
        }
      ],
      "name": "claimFromParticipantOrder",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "sumAuctioningTokenAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "sumBiddingTokenAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "order",
          "type": "bytes32"
        }
      ],
      "name": "containsOrder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeNumerator",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeReceiverUserId",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        }
      ],
      "name": "getSecondsRemainingInBatch",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        }
      ],
      "name": "getUserId",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "_auctioningToken",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "_biddingToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "duration",
          "type": "uint256"
        },
        {
          "internalType": "uint96",
          "name": "_auctionedSellAmount",
          "type": "uint96"
        },
        {
          "internalType": "uint96",
          "name": "_minBuyAmount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "minimumBiddingAmount",
          "type": "uint256"
        }
      ],
      "name": "initiateAuction",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "numUsers",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "uint96[]",
          "name": "_minBuyAmounts",
          "type": "uint96[]"
        },
        {
          "internalType": "uint96[]",
          "name": "_sellAmounts",
          "type": "uint96[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "_prevSellOrders",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "_fallbackPrevSellOrders",
          "type": "bytes32[]"
        }
      ],
      "name": "placeSellOrders",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "iterationSteps",
          "type": "uint256"
        }
      ],
      "name": "precalculateSellAmountSum",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        }
      ],
      "name": "registerUser",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "sellOrders",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "size",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newFeeNumerator",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "newfeeReceiverAddress",
          "type": "address"
        }
      ],
      "name": "setFeeParameters",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "price",
          "type": "bytes32"
        }
      ],
      "name": "verifyPrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x5501f0ba00cc321ea8b7dd8ecb2e064fbe4625eb45c20c1e379d4d31a250c636",
  "receipt": {
    "to": null,
    "from": "0xfB696e9E9e5038DDc78592082689B149AB3a19d5",
    "contractAddress": "0x55a9d7BCd53FF54B146C52Ec52b94C183636DA93",
    "transactionIndex": 5,
    "gasUsed": "4395340",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000800000000400000000020000000000000000000800000000080000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000020000000000000000000000000000000000000001000000000004000000000000000",
    "blockHash": "0xd25d10afb0e4f80d1a0ee6e708de016a3f17dd599fd7a046d75a0d5e71143e68",
    "transactionHash": "0x5501f0ba00cc321ea8b7dd8ecb2e064fbe4625eb45c20c1e379d4d31a250c636",
    "logs": [
      {
        "transactionIndex": 5,
        "blockNumber": 7782307,
        "transactionHash": "0x5501f0ba00cc321ea8b7dd8ecb2e064fbe4625eb45c20c1e379d4d31a250c636",
        "address": "0x55a9d7BCd53FF54B146C52Ec52b94C183636DA93",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x000000000000000000000000fb696e9e9e5038ddc78592082689b149ab3a19d5"
        ],
        "data": "0x",
        "logIndex": 7,
        "blockHash": "0xd25d10afb0e4f80d1a0ee6e708de016a3f17dd599fd7a046d75a0d5e71143e68"
      }
    ],
    "blockNumber": 7782307,
    "cumulativeGasUsed": "5044658",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "solcInputHash": "83e6ba0f85a932b060a11bdaadd92899",
  "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"priceNumerator\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"priceDenominator\",\"type\":\"uint96\"}],\"name\":\"AuctionCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"sellAmount\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"buyAmount\",\"type\":\"uint96\"}],\"name\":\"CancellationSellOrder\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"buyAmount\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"sellAmount\",\"type\":\"uint96\"}],\"name\":\"ClaimedFromOrder\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"_auctioningToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"_biddingToken\",\"type\":\"address\"}],\"name\":\"NewAuction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"buyAmount\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"sellAmount\",\"type\":\"uint96\"}],\"name\":\"NewSellOrder\",\"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\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"}],\"name\":\"UserRegistration\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"auctionCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"auctionData\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"auctioningToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"biddingToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"auctionEndDate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"initialAuctionOrder\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"minimumBiddingAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"interimSumBidAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"interimOrder\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"clearingPriceOrder\",\"type\":\"bytes32\"},{\"internalType\":\"uint96\",\"name\":\"volumeClearingPriceOrder\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"feeNumerator\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"_sellOrders\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_prevSellOrders\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_fallbackPrevSellOrders\",\"type\":\"bytes32[]\"}],\"name\":\"cancelSellOrders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"orders\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"previousOrders\",\"type\":\"bytes32[]\"}],\"name\":\"claimFromParticipantOrder\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"sumAuctioningTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sumBiddingTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"order\",\"type\":\"bytes32\"}],\"name\":\"containsOrder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeReceiverUserId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"}],\"name\":\"getSecondsRemainingInBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"getUserId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"_auctioningToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_biddingToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"_auctionedSellAmount\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"_minBuyAmount\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"minimumBiddingAmount\",\"type\":\"uint256\"}],\"name\":\"initiateAuction\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numUsers\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"uint96[]\",\"name\":\"_minBuyAmounts\",\"type\":\"uint96[]\"},{\"internalType\":\"uint96[]\",\"name\":\"_sellAmounts\",\"type\":\"uint96[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_prevSellOrders\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_fallbackPrevSellOrders\",\"type\":\"bytes32[]\"}],\"name\":\"placeSellOrders\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"iterationSteps\",\"type\":\"uint256\"}],\"name\":\"precalculateSellAmountSum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"registerUser\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sellOrders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newFeeNumerator\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newfeeReceiverAddress\",\"type\":\"address\"}],\"name\":\"setFeeParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"price\",\"type\":\"bytes32\"}],\"name\":\"verifyPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/EasyAuction.sol\":\"EasyAuction\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/GSN/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../GSN/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor () internal {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(_owner == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n}\\n\",\"keccak256\":\"0xf7c39c7e6d06ed3bda90cfefbcbf2ddc32c599c3d6721746546ad64946efccaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <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, so we distribute\\n        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);\\n    }\\n}\\n\",\"keccak256\":\"0x363bd3b45201f07c9b71c2edc96533468cf14a3d029fabd82fddceb1eb3ebd9c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"../../math/SafeMath.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    using SafeMath for uint256;\\n    using Address for address;\\n\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf12dfbe97e6276980b83d2830bb0eb75e0cf4f3e626c2471137f82158ae6a0fc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8\",\"license\":\"MIT\"},\"contracts/EasyAuction.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-or-newer\\npragma solidity >=0.6.8;\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\\\";\\nimport \\\"./libraries/IterableOrderedOrderSet.sol\\\";\\nimport \\\"@openzeppelin/contracts/math/Math.sol\\\";\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\nimport \\\"./libraries/IdToAddressBiMap.sol\\\";\\nimport \\\"./libraries/SafeCast.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract EasyAuction is Ownable {\\n    using SafeERC20 for IERC20;\\n    using SafeMath for uint64;\\n    using SafeMath for uint96;\\n    using SafeMath for uint256;\\n    using SafeCast for uint256;\\n    using IterableOrderedOrderSet for IterableOrderedOrderSet.Data;\\n    using IterableOrderedOrderSet for bytes32;\\n    using IdToAddressBiMap for IdToAddressBiMap.Data;\\n\\n    modifier atStageOrderPlacement(uint256 auctionId) {\\n        require(\\n            block.timestamp < auctionData[auctionId].auctionEndDate,\\n            \\\"no longer in order placement phase\\\"\\n        );\\n        _;\\n    }\\n\\n    modifier atStageSolutionSubmission(uint256 auctionId) {\\n        require(\\n            block.timestamp > auctionData[auctionId].auctionEndDate &&\\n                auctionData[auctionId].clearingPriceOrder == bytes32(0),\\n            \\\"Auction not in solution submission phase\\\"\\n        );\\n        _;\\n    }\\n\\n    modifier atStageFinished(uint256 auctionId) {\\n        require(\\n            auctionData[auctionId].clearingPriceOrder != bytes32(0),\\n            \\\"Auction not yet finished\\\"\\n        );\\n        _;\\n    }\\n\\n    event NewSellOrder(\\n        uint256 indexed auctionId,\\n        uint64 indexed userId,\\n        uint96 buyAmount,\\n        uint96 sellAmount\\n    );\\n    event CancellationSellOrder(\\n        uint256 indexed auctionId,\\n        uint64 indexed userId,\\n        uint96 sellAmount,\\n        uint96 buyAmount\\n    );\\n    event ClaimedFromOrder(\\n        uint256 indexed auctionId,\\n        uint64 indexed userId,\\n        uint96 buyAmount,\\n        uint96 sellAmount\\n    );\\n    event NewAuction(\\n        uint256 indexed auctionId,\\n        IERC20 indexed _auctioningToken,\\n        IERC20 indexed _biddingToken\\n    );\\n    event AuctionCleared(\\n        uint256 indexed auctionId,\\n        uint96 priceNumerator,\\n        uint96 priceDenominator\\n    );\\n    event UserRegistration(address indexed user, uint64 userId);\\n\\n    struct AuctionData {\\n        IERC20 auctioningToken;\\n        IERC20 biddingToken;\\n        uint256 auctionEndDate;\\n        bytes32 initialAuctionOrder;\\n        uint256 minimumBiddingAmount;\\n        uint256 interimSumBidAmount;\\n        bytes32 interimOrder;\\n        bytes32 clearingPriceOrder;\\n        uint96 volumeClearingPriceOrder;\\n        uint256 feeNumerator;\\n    }\\n    mapping(uint256 => IterableOrderedOrderSet.Data) public sellOrders;\\n    mapping(uint256 => AuctionData) public auctionData;\\n    IdToAddressBiMap.Data private registeredUsers;\\n    uint64 public numUsers;\\n    uint256 public auctionCounter;\\n\\n    constructor() public Ownable() {}\\n\\n    uint256 public feeNumerator = 0;\\n    uint256 public constant FEE_DENOMINATOR = 1000;\\n    uint64 public feeReceiverUserId = 0;\\n\\n    function setFeeParameters(\\n        uint256 newFeeNumerator,\\n        address newfeeReceiverAddress\\n    ) public onlyOwner() {\\n        require(\\n            newFeeNumerator <= 15,\\n            \\\"Fee is not allowed to be set higher than 1.5%\\\"\\n        );\\n        // caution: for currently running auctions, the feeReceiverUserId is changing as well.\\n        feeReceiverUserId = getUserId(newfeeReceiverAddress);\\n        feeNumerator = newFeeNumerator;\\n    }\\n\\n    function initiateAuction(\\n        IERC20 _auctioningToken,\\n        IERC20 _biddingToken,\\n        uint256 duration,\\n        uint96 _auctionedSellAmount,\\n        uint96 _minBuyAmount,\\n        uint256 minimumBiddingAmount\\n    ) public returns (uint256) {\\n        uint64 userId = getUserId(msg.sender);\\n\\n        // withdraws sellAmount + fees\\n        _auctioningToken.safeTransferFrom(\\n            msg.sender,\\n            address(this),\\n            _auctionedSellAmount.mul(FEE_DENOMINATOR.add(feeNumerator)).div(\\n                FEE_DENOMINATOR\\n            )\\n        );\\n        require(\\n            minimumBiddingAmount > 0,\\n            \\\"minimumBiddingAmount is not allowed to be zero\\\"\\n        );\\n        auctionCounter++;\\n        auctionData[auctionCounter] = AuctionData(\\n            _auctioningToken,\\n            _biddingToken,\\n            block.timestamp + duration,\\n            IterableOrderedOrderSet.encodeOrder(\\n                userId,\\n                _minBuyAmount,\\n                _auctionedSellAmount\\n            ),\\n            minimumBiddingAmount,\\n            0,\\n            bytes32(0),\\n            bytes32(0),\\n            0,\\n            feeNumerator\\n        );\\n        emit NewAuction(auctionCounter, _auctioningToken, _biddingToken);\\n        return auctionCounter;\\n    }\\n\\n    function placeSellOrders(\\n        uint256 auctionId,\\n        uint96[] memory _minBuyAmounts,\\n        uint96[] memory _sellAmounts,\\n        bytes32[] memory _prevSellOrders,\\n        bytes32[] memory _fallbackPrevSellOrders\\n    ) public atStageOrderPlacement(auctionId) returns (uint64 userId) {\\n        {\\n            // Run verifications of all orders\\n            (\\n                ,\\n                uint96 buyAmountOfInitialAuctionOrder,\\n                uint96 sellAmountOfInitialAuctionOrder\\n            ) = auctionData[auctionId].initialAuctionOrder.decodeOrder();\\n            for (uint256 i = 0; i < _minBuyAmounts.length; i++) {\\n                require(\\n                    _minBuyAmounts[i].mul(buyAmountOfInitialAuctionOrder) <\\n                        sellAmountOfInitialAuctionOrder.mul(_sellAmounts[i]),\\n                    \\\"limit price not better than mimimal offer\\\"\\n                );\\n                // orders should have a minimum bid size in order to limit the gas\\n                // required to compute the final price of the auction.\\n                require(\\n                    _sellAmounts[i] >\\n                        auctionData[auctionId].minimumBiddingAmount,\\n                    \\\"order too small\\\"\\n                );\\n            }\\n        }\\n        uint256 sumOfSellAmounts = 0;\\n        userId = getUserId(msg.sender);\\n        for (uint256 i = 0; i < _minBuyAmounts.length; i++) {\\n            bool success =\\n                sellOrders[auctionId].insertWithHighSuccessRate(\\n                    IterableOrderedOrderSet.encodeOrder(\\n                        userId,\\n                        _minBuyAmounts[i],\\n                        _sellAmounts[i]\\n                    ),\\n                    _prevSellOrders[i],\\n                    _fallbackPrevSellOrders[i]\\n                );\\n            if (success) {\\n                sumOfSellAmounts = sumOfSellAmounts.add(_sellAmounts[i]);\\n                emit NewSellOrder(\\n                    auctionId,\\n                    userId,\\n                    _minBuyAmounts[i],\\n                    _sellAmounts[i]\\n                );\\n            }\\n        }\\n        auctionData[auctionId].biddingToken.safeTransferFrom(\\n            msg.sender,\\n            address(this),\\n            sumOfSellAmounts\\n        );\\n    }\\n\\n    function cancelSellOrders(\\n        uint256 auctionId,\\n        bytes32[] memory _sellOrders,\\n        bytes32[] memory _prevSellOrders,\\n        bytes32[] memory _fallbackPrevSellOrders\\n    ) public atStageOrderPlacement(auctionId) {\\n        uint64 userId = getUserId(msg.sender);\\n        uint256 claimableAmount = 0;\\n        for (uint256 i = 0; i < _sellOrders.length; i++) {\\n            bool success =\\n                sellOrders[auctionId].removeWithHighSuccessRate(\\n                    _sellOrders[i],\\n                    _prevSellOrders[i],\\n                    _fallbackPrevSellOrders[i]\\n                );\\n            if (success) {\\n                (\\n                    uint64 userIdOfIter,\\n                    uint96 buyAmountOfIter,\\n                    uint96 sellAmountOfIter\\n                ) = _sellOrders[i].decodeOrder();\\n                require(\\n                    userIdOfIter == userId,\\n                    \\\"Only the user can cancel his orders\\\"\\n                );\\n                claimableAmount = claimableAmount.add(sellAmountOfIter);\\n                emit CancellationSellOrder(\\n                    auctionId,\\n                    userId,\\n                    buyAmountOfIter,\\n                    sellAmountOfIter\\n                );\\n            }\\n        }\\n        auctionData[auctionId].biddingToken.safeTransfer(\\n            msg.sender,\\n            claimableAmount\\n        );\\n    }\\n\\n    function precalculateSellAmountSum(\\n        uint256 auctionId,\\n        uint256 iterationSteps\\n    ) public atStageSolutionSubmission(auctionId) {\\n        (, , uint96 auctioneerSellAmount) =\\n            auctionData[auctionId].initialAuctionOrder.decodeOrder();\\n        uint256 sumBidAmount = auctionData[auctionId].interimSumBidAmount;\\n        bytes32 iterOrder = auctionData[auctionId].interimOrder;\\n        if (iterOrder == bytes32(0)) {\\n            iterOrder = IterableOrderedOrderSet.QUEUE_START;\\n        }\\n\\n        for (uint256 i = 0; i < iterationSteps; i++) {\\n            iterOrder = sellOrders[auctionId].next(iterOrder);\\n            (, , uint96 sellAmountOfIter) = iterOrder.decodeOrder();\\n            sumBidAmount = sumBidAmount.add(sellAmountOfIter);\\n        }\\n\\n        // it is checked that not too many iteration steps were taken:\\n        // require that the sum of SellAmounts times the price of the last order\\n        // is not more than intially sold amount\\n        (, uint96 buyAmountOfIter, uint96 sellAmountOfIter) =\\n            iterOrder.decodeOrder();\\n        require(\\n            sumBidAmount.mul(buyAmountOfIter) <\\n                auctioneerSellAmount.mul(sellAmountOfIter),\\n            \\\"too many orders summed up\\\"\\n        );\\n\\n        auctionData[auctionId].interimSumBidAmount = sumBidAmount;\\n        auctionData[auctionId].interimOrder = iterOrder;\\n    }\\n\\n    // @dev function verifiying the auction price\\n    // @parameter price: This should either be a price encoded as an order\\n    // with userId = 0, priceNumerator = buyAmount, priceDenominator = sellAmount\\n    // or it should reference to the particular order settled only partially within\\n    // this auction.\\n    function verifyPrice(uint256 auctionId, bytes32 price)\\n        public\\n        atStageSolutionSubmission(auctionId)\\n    {\\n        (, uint96 priceNumerator, uint96 priceDenominator) =\\n            price.decodeOrder();\\n        (\\n            uint64 auctioneerId,\\n            uint96 auctioneerBuyAmount,\\n            uint96 auctioneerSellAmount\\n        ) = auctionData[auctionId].initialAuctionOrder.decodeOrder();\\n        require(priceNumerator > 0, \\\"price must be postive\\\");\\n        uint256 sumBidAmount = auctionData[auctionId].interimSumBidAmount;\\n        bytes32 iterOrder = auctionData[auctionId].interimOrder;\\n        if (iterOrder == bytes32(0)) {\\n            iterOrder = IterableOrderedOrderSet.QUEUE_START;\\n        }\\n        if (sellOrders[auctionId].size > 0) {\\n            iterOrder = sellOrders[auctionId].next(iterOrder);\\n            while (iterOrder != price && iterOrder.smallerThan(price)) {\\n                (, , uint96 sellAmountOfIter) = iterOrder.decodeOrder();\\n                sumBidAmount = sumBidAmount.add(sellAmountOfIter);\\n                iterOrder = sellOrders[auctionId].next(iterOrder);\\n            }\\n        }\\n        uint256 sumBuyAmount =\\n            sumBidAmount.mul(priceNumerator).div(priceDenominator);\\n        if (price == iterOrder) {\\n            // case 1: one sellOrder is partically filled\\n            // The partially filled order is the iterOrder, if:\\n            // 1) The sumBuyAmounts is not bigger than the intitial order's sell amount\\n            // i.e, sellAmount >= sumBuyAmount\\n            // 2) The volume of the particial order is not bigger than its sell volume\\n            // i.e. auctionData[auctionId].volumeClearingPriceOrder <= sellAmountOfIter,\\n            (, , uint96 sellAmountOfIter) = iterOrder.decodeOrder();\\n            uint256 clearingOrderBuyAmount =\\n                auctioneerSellAmount.sub(sumBuyAmount);\\n            // Attention: This conversion can prevent closing auctions, if rounding down\\n            // to uint96 does fail. Should not happen, unless token has more than 18 digits\\n            // or prices are huge.\\n            auctionData[auctionId].volumeClearingPriceOrder = (\\n                clearingOrderBuyAmount.mul(priceDenominator).div(priceNumerator)\\n            )\\n                .toUint96();\\n            require(\\n                auctionData[auctionId].volumeClearingPriceOrder <=\\n                    sellAmountOfIter,\\n                \\\"order can not be clearing order\\\"\\n            );\\n            auctionData[auctionId].clearingPriceOrder = iterOrder;\\n        } else {\\n            if (sumBuyAmount < auctioneerSellAmount) {\\n                // case 2: initialAuction order is partically filled\\n                // We require that the price was the initialOrderLimit price's inverse\\n                // as this ensures that the for-loop iterated through all orders\\n                // and all orders are considered\\n                require(\\n                    priceNumerator.mul(auctioneerBuyAmount) ==\\n                        auctioneerSellAmount.mul(priceDenominator),\\n                    \\\"supplied price must be inverse initialOrderLimit\\\"\\n                );\\n                auctionData[auctionId].volumeClearingPriceOrder = sumBuyAmount\\n                    .toUint96();\\n                auctionData[auctionId]\\n                    .clearingPriceOrder = IterableOrderedOrderSet.encodeOrder(\\n                    auctioneerId,\\n                    priceNumerator,\\n                    priceDenominator\\n                );\\n            } else {\\n                // case 3: no order is partically filled\\n                // In this case the sumBuyAmount must be equal to\\n                // the sellAmount of the initialAuctionOrder, without\\n                // any rounding errors.\\n                // This price is always existing as we can choose\\n                // priceNumerator = sellAmount and priceDenominator = sumSellAmount\\n                auctionData[auctionId].clearingPriceOrder = price;\\n                require(\\n                    sumBuyAmount == auctioneerSellAmount,\\n                    \\\"price is not clearing price\\\"\\n                );\\n                require(\\n                    priceNumerator.mul(auctioneerBuyAmount) <=\\n                        auctioneerSellAmount.mul(priceDenominator),\\n                    \\\"clearing price is better than initialAuctionOrder\\\"\\n                );\\n            }\\n        }\\n\\n        emit AuctionCleared(auctionId, priceNumerator, priceDenominator);\\n        if (auctionData[auctionId].feeNumerator > 0) {\\n            claimFees(auctionId);\\n        }\\n        claimAuctioneerFunds(auctionId);\\n    }\\n\\n    function claimFromParticipantOrder(\\n        uint256 auctionId,\\n        bytes32[] memory orders,\\n        bytes32[] memory previousOrders\\n    )\\n        public\\n        atStageFinished(auctionId)\\n        returns (\\n            uint256 sumAuctioningTokenAmount,\\n            uint256 sumBiddingTokenAmount\\n        )\\n    {\\n        AuctionData memory auction = auctionData[auctionId];\\n        (, uint96 priceNumerator, uint96 priceDenominator) =\\n            auction.clearingPriceOrder.decodeOrder();\\n        (uint64 userId, , ) = orders[0].decodeOrder();\\n        for (uint256 i = 0; i < orders.length; i++) {\\n            require(\\n                sellOrders[auctionId].remove(orders[i], previousOrders[i]),\\n                \\\"order is no longer claimable\\\"\\n            );\\n            (uint64 userIdOrder, uint96 buyAmount, uint96 sellAmount) =\\n                orders[i].decodeOrder();\\n            require(\\n                userIdOrder == userId,\\n                \\\"only allowed to claim for same user\\\"\\n            );\\n            if (orders[i] == auction.clearingPriceOrder) {\\n                sumAuctioningTokenAmount = sumAuctioningTokenAmount.add(\\n                    auction.volumeClearingPriceOrder.mul(priceNumerator).div(\\n                        priceDenominator\\n                    )\\n                );\\n                sumBiddingTokenAmount = sumBiddingTokenAmount.add(\\n                    sellAmount.sub(auction.volumeClearingPriceOrder)\\n                );\\n            } else {\\n                if (orders[i].smallerThan(auction.clearingPriceOrder)) {\\n                    sumAuctioningTokenAmount = sumAuctioningTokenAmount.add(\\n                        sellAmount.mul(priceNumerator).div(priceDenominator)\\n                    );\\n                } else {\\n                    sumBiddingTokenAmount = sumBiddingTokenAmount.add(\\n                        sellAmount\\n                    );\\n                }\\n            }\\n            emit ClaimedFromOrder(auctionId, userId, buyAmount, sellAmount);\\n        }\\n        sendOutTokens(\\n            auctionId,\\n            sumAuctioningTokenAmount,\\n            sumBiddingTokenAmount,\\n            userId\\n        );\\n    }\\n\\n    function claimAuctioneerFunds(uint256 auctionId)\\n        internal\\n        returns (uint256 auctioningTokenAmount, uint256 biddingTokenAmount)\\n    {\\n        (uint64 auctioneerId, uint96 buyAmount, uint96 sellAmount) =\\n            auctionData[auctionId].initialAuctionOrder.decodeOrder();\\n        auctionData[auctionId].initialAuctionOrder = bytes32(0);\\n        (, uint96 priceNumerator, uint96 priceDenominator) =\\n            auctionData[auctionId].clearingPriceOrder.decodeOrder();\\n        if (priceNumerator.mul(buyAmount) == priceDenominator.mul(sellAmount)) {\\n            // In this case we have a partial match of the initialSellOrder\\n            auctioningTokenAmount = sellAmount.sub(\\n                auctionData[auctionId].volumeClearingPriceOrder\\n            );\\n            biddingTokenAmount = auctionData[auctionId]\\n                .volumeClearingPriceOrder\\n                .mul(priceDenominator)\\n                .div(priceNumerator);\\n        } else {\\n            biddingTokenAmount = sellAmount.mul(priceDenominator).div(\\n                priceNumerator\\n            );\\n        }\\n        sendOutTokens(\\n            auctionId,\\n            auctioningTokenAmount,\\n            biddingTokenAmount,\\n            auctioneerId\\n        );\\n    }\\n\\n    function claimFees(uint256 auctionId) internal {\\n        (uint64 auctioneerId, uint96 buyAmount, uint96 sellAmount) =\\n            auctionData[auctionId].initialAuctionOrder.decodeOrder();\\n        (, uint96 priceNumerator, uint96 priceDenominator) =\\n            auctionData[auctionId].clearingPriceOrder.decodeOrder();\\n        uint256 feeAmount =\\n            sellAmount.mul(auctionData[auctionId].feeNumerator).div(\\n                FEE_DENOMINATOR\\n            );\\n        if (priceNumerator.mul(buyAmount) == priceDenominator.mul(sellAmount)) {\\n            // In this case we have a partial match of the initialSellOrder\\n            uint256 auctioningTokenAmount =\\n                sellAmount.sub(auctionData[auctionId].volumeClearingPriceOrder);\\n            sendOutTokens(\\n                auctionId,\\n                feeAmount.mul(auctioningTokenAmount).div(sellAmount),\\n                0,\\n                feeReceiverUserId\\n            );\\n            sendOutTokens(\\n                auctionId,\\n                feeAmount.mul(sellAmount.sub(auctioningTokenAmount)).div(\\n                    sellAmount\\n                ),\\n                0,\\n                auctioneerId\\n            );\\n        } else {\\n            sendOutTokens(auctionId, feeAmount, 0, feeReceiverUserId);\\n        }\\n    }\\n\\n    function sendOutTokens(\\n        uint256 auctionId,\\n        uint256 auctioningTokenAmount,\\n        uint256 biddingTokenAmount,\\n        uint64 userId\\n    ) internal {\\n        address userAddress = registeredUsers.getAddressAt(userId);\\n        if (auctioningTokenAmount > 0) {\\n            auctionData[auctionId].auctioningToken.safeTransfer(\\n                userAddress,\\n                auctioningTokenAmount\\n            );\\n        }\\n        if (biddingTokenAmount > 0) {\\n            auctionData[auctionId].biddingToken.safeTransfer(\\n                userAddress,\\n                biddingTokenAmount\\n            );\\n        }\\n    }\\n\\n    function registerUser(address user) public returns (uint64 userId) {\\n        require(\\n            registeredUsers.insert(numUsers, user),\\n            \\\"User already registered\\\"\\n        );\\n        userId = numUsers;\\n        numUsers = numUsers.add(1).toUint64();\\n        emit UserRegistration(user, userId);\\n    }\\n\\n    function getUserId(address user) public returns (uint64 userId) {\\n        if (registeredUsers.hasAddress(user)) {\\n            return registeredUsers.getId(user);\\n        } else {\\n            return registerUser(user);\\n        }\\n    }\\n\\n    function getSecondsRemainingInBatch(uint256 auctionId)\\n        public\\n        view\\n        returns (uint256)\\n    {\\n        if (auctionData[auctionId].auctionEndDate < block.timestamp) {\\n            return 0;\\n        }\\n        return auctionData[auctionId].auctionEndDate.sub(block.timestamp);\\n    }\\n\\n    function containsOrder(uint256 auctionId, bytes32 order)\\n        public\\n        view\\n        returns (bool)\\n    {\\n        return sellOrders[auctionId].contains(order);\\n    }\\n}\\n\",\"keccak256\":\"0x8c7029f6df4d6aed63e19df235b9ed9714b9e54f9cf10c97bad43394d33ed311\",\"license\":\"LGPL-3.0-or-newer\"},\"contracts/libraries/IdToAddressBiMap.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-or-newer\\npragma solidity ^0.6.0;\\n\\nlibrary IdToAddressBiMap {\\n    struct Data {\\n        mapping(uint64 => address) idToAddress;\\n        mapping(address => uint64) addressToId;\\n    }\\n\\n    function hasId(Data storage self, uint64 id) internal view returns (bool) {\\n        return self.idToAddress[id + 1] != address(0);\\n    }\\n\\n    function hasAddress(Data storage self, address addr)\\n        internal\\n        view\\n        returns (bool)\\n    {\\n        return self.addressToId[addr] != 0;\\n    }\\n\\n    function getAddressAt(Data storage self, uint64 id)\\n        internal\\n        view\\n        returns (address)\\n    {\\n        require(hasId(self, id), \\\"Must have ID to get Address\\\");\\n        return self.idToAddress[id + 1];\\n    }\\n\\n    function getId(Data storage self, address addr)\\n        internal\\n        view\\n        returns (uint64)\\n    {\\n        require(hasAddress(self, addr), \\\"Must have Address to get ID\\\");\\n        return self.addressToId[addr] - 1;\\n    }\\n\\n    function insert(\\n        Data storage self,\\n        uint64 id,\\n        address addr\\n    ) internal returns (bool) {\\n        require(addr != address(0), \\\"Cannot insert zero address\\\");\\n        require(id != uint64(-1), \\\"Cannot insert max uint64\\\");\\n        // Ensure bijectivity of the mappings\\n        if (\\n            self.addressToId[addr] != 0 ||\\n            self.idToAddress[id + 1] != address(0)\\n        ) {\\n            return false;\\n        }\\n        self.idToAddress[id + 1] = addr;\\n        self.addressToId[addr] = id + 1;\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x0d404b2e03864d7a388840e30bfb6da0ddd3dd2f152097894838b72d86e30a39\",\"license\":\"LGPL-3.0-or-newer\"},\"contracts/libraries/IterableOrderedOrderSet.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-or-newer\\npragma solidity >=0.6.8;\\n\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\n\\nlibrary IterableOrderedOrderSet {\\n    using SafeMath for uint96;\\n    using IterableOrderedOrderSet for bytes32;\\n\\n    // represents smallest possible value for an order under comparison of fn smallerThan()\\n    bytes32 internal constant QUEUE_START =\\n        0x0000000000000000000000000000000000000000000000000000000000000001;\\n    // represents highest possible value for an order under comparison of fn smallerThan()\\n    bytes32 internal constant QUEUE_END =\\n        0xffffffffffffffffffffffffffffffffffffffff000000000000000000000001;\\n\\n    struct Data {\\n        mapping(bytes32 => bytes32) nextMap;\\n        uint256 size;\\n    }\\n\\n    struct Order {\\n        uint64 owner;\\n        uint96 buyAmount;\\n        uint96 sellAmount;\\n    }\\n\\n    function insertWithHighSuccessRate(\\n        Data storage self,\\n        bytes32 elementToInsert,\\n        bytes32 elementBeforeNewOne,\\n        bytes32 secondElementBeforeNewOne\\n    ) internal returns (bool success) {\\n        success = insert(self, elementToInsert, elementBeforeNewOne);\\n        if (!success) {\\n            success = insert(self, elementToInsert, secondElementBeforeNewOne);\\n        }\\n    }\\n\\n    function insert(\\n        Data storage self,\\n        bytes32 elementToInsert,\\n        bytes32 elementBeforeNewOne\\n    ) internal returns (bool) {\\n        (, , uint96 denominator) = decodeOrder(elementToInsert);\\n        require(denominator != uint96(0), \\\"Inserting zero is not supported\\\");\\n        require(\\n            !(elementToInsert == QUEUE_START || elementToInsert == QUEUE_END),\\n            \\\"Inserting element is not valid\\\"\\n        );\\n        if (contains(self, elementToInsert)) {\\n            return false;\\n        }\\n        if (\\n            !(elementBeforeNewOne == QUEUE_START ||\\n                contains(self, elementBeforeNewOne))\\n        ) {\\n            return false;\\n        }\\n        bool foundposition = false;\\n        if (self.size == 0) {\\n            self.nextMap[QUEUE_START] = elementToInsert;\\n            self.nextMap[elementToInsert] = QUEUE_END;\\n        } else {\\n            bytes32 elementBeforeNewOneIteration = elementBeforeNewOne;\\n            while (!foundposition) {\\n                if (elementBeforeNewOneIteration.smallerThan(elementToInsert)) {\\n                    if (\\n                        !self.nextMap[elementBeforeNewOneIteration].smallerThan(\\n                            elementToInsert\\n                        )\\n                    ) {\\n                        // Since we have:\\n                        // elementBeforeNewOneIteration<elementToInsert)<self.nextMap[elementBeforeNewOneIteration]\\n                        // the right place was found and the element gets inserted\\n                        bytes32 tmp =\\n                            self.nextMap[elementBeforeNewOneIteration];\\n                        self.nextMap[\\n                            elementBeforeNewOneIteration\\n                        ] = elementToInsert;\\n                        self.nextMap[elementToInsert] = tmp;\\n                        foundposition = true;\\n                    } else {\\n                        // Getting next order after the current elementBeforeNewOne.\\n                        // This can naturally occur, if new orders were inserted\\n                        // between time of on-chain execution and order sending\\n                        elementBeforeNewOneIteration = self.nextMap[\\n                            elementBeforeNewOneIteration\\n                        ];\\n                    }\\n                } else {\\n                    // elementBeforeNewOne was biggerThan elementToInsert\\n                    return false;\\n                }\\n            }\\n        }\\n        self.size++;\\n        return true;\\n    }\\n\\n    function removeWithHighSuccessRate(\\n        Data storage self,\\n        bytes32 elementToRemove,\\n        bytes32 elementBeforeRemoval,\\n        bytes32 secondElementBeforeRemoval\\n    ) internal returns (bool success) {\\n        success = remove(self, elementToRemove, elementBeforeRemoval);\\n        if (!success) {\\n            success = remove(self, elementToRemove, secondElementBeforeRemoval);\\n        }\\n    }\\n\\n    function remove(\\n        Data storage self,\\n        bytes32 elementToRemove,\\n        bytes32 elementBeforeRemoval\\n    ) internal returns (bool) {\\n        if (\\n            !contains(self, elementToRemove) ||\\n            (elementBeforeRemoval != QUEUE_START &&\\n                !contains(self, elementBeforeRemoval))\\n        ) {\\n            return false;\\n        }\\n        bytes32 elementBeforeRemovalIteration = elementBeforeRemoval;\\n        while (self.nextMap[elementBeforeRemovalIteration] != elementToRemove) {\\n            if (elementBeforeRemovalIteration == QUEUE_END) {\\n                return false;\\n            }\\n            elementBeforeRemovalIteration = self.nextMap[\\n                elementBeforeRemovalIteration\\n            ];\\n        }\\n        self.nextMap[elementBeforeRemovalIteration] = self.nextMap[\\n            elementToRemove\\n        ];\\n        self.nextMap[elementToRemove] = bytes32(0);\\n        self.size--;\\n        return true;\\n    }\\n\\n    function contains(Data storage self, bytes32 value)\\n        internal\\n        view\\n        returns (bool)\\n    {\\n        if (value == QUEUE_START || value == QUEUE_END) {\\n            return false;\\n        }\\n        return self.nextMap[value] != bytes32(0);\\n    }\\n\\n    // @dev orders are ordered by\\n    // 1. their price - buyAmount/sellAmount and\\n    // 2. their userId,\\n    function smallerThan(bytes32 orderLeft, bytes32 orderRight)\\n        internal\\n        pure\\n        returns (bool)\\n    {\\n        (\\n            uint64 userIdLeft,\\n            uint96 priceNumeratorLeft,\\n            uint96 priceDenominatorLeft\\n        ) = decodeOrder(orderLeft);\\n        (\\n            uint64 userIdRight,\\n            uint96 priceNumeratorRight,\\n            uint96 priceDenominatorRight\\n        ) = decodeOrder(orderRight);\\n\\n        if (\\n            priceNumeratorLeft.mul(priceDenominatorRight) <\\n            priceNumeratorRight.mul(priceDenominatorLeft)\\n        ) return true;\\n        if (\\n            priceNumeratorLeft.mul(priceDenominatorRight) >\\n            priceNumeratorRight.mul(priceDenominatorLeft)\\n        ) return false;\\n\\n        require(\\n            userIdLeft != userIdRight,\\n            \\\"user is not allowed to place same order twice\\\"\\n        );\\n        if (userIdLeft < userIdRight) {\\n            return true;\\n        }\\n        return false;\\n    }\\n\\n    function first(Data storage self) internal view returns (bytes32) {\\n        require(self.size > 0, \\\"Trying to get first from empty set\\\");\\n        return self.nextMap[QUEUE_START];\\n    }\\n\\n    function next(Data storage self, bytes32 value)\\n        internal\\n        view\\n        returns (bytes32)\\n    {\\n        require(\\n            value != QUEUE_END,\\n            \\\"Trying to get next of non-existent element\\\"\\n        );\\n        require(\\n            self.nextMap[value] != bytes32(0),\\n            \\\"Trying to get next of last element\\\"\\n        );\\n        return self.nextMap[value];\\n    }\\n\\n    function decodeOrder(bytes32 _orderData)\\n        internal\\n        pure\\n        returns (\\n            uint64 userId,\\n            uint96 buyAmount,\\n            uint96 sellAmount\\n        )\\n    {\\n        userId = uint64(uint256(_orderData) / 2**192);\\n        buyAmount = uint96((uint256(_orderData) % 2**192) / 2**96);\\n        sellAmount = uint96((uint256(_orderData) % 2**96));\\n    }\\n\\n    function encodeOrder(\\n        uint64 userId,\\n        uint96 buyAmount,\\n        uint96 sellAmount\\n    ) internal pure returns (bytes32) {\\n        return\\n            bytes32(\\n                uint256(userId) *\\n                    2**192 +\\n                    uint256(buyAmount) *\\n                    2**96 +\\n                    uint256(sellAmount)\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0x01c3e4c5fe36afbad7c24521f103429d55787d012bbc4a6d439b802ee808765a\",\"license\":\"LGPL-3.0-or-newer\"},\"contracts/libraries/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Logic was copied and modified from here: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/SafeCast.sol\\n */\\nlibrary SafeCast {\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        require(value < 2**96, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n        return uint96(value);\\n    }\\n\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n}\\n\",\"keccak256\":\"0x9f12a3c511cd8ea260bc8faa7d2e4d59a823328ef07c26af506385aa3e92b200\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x608060405260006007556000600860006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055503480156200004057600080fd5b50600062000053620000f760201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620000ff565b600033905090565b614e5d806200010f6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635cefb291116100b8578063a7e766441161007c578063a7e76644146109e3578063c1110dd614610a01578063d73792a914610b72578063e86dea4a14610b90578063f2fde38b14610bae578063f9f0751a14610bf257610137565b80635cefb2911461087357806363c699a41461089b578063715018a6146108e957806375d3c2d6146108f35780638da5cb5b146109af57610137565b80633e12905f116100ff5780633e12905f1461045457806340b20b091461048c57806342eb3573146104da5780634a8393f31461077657806355fc62d2146107b857610137565b806315d37b4b1461013c57806319a50f491461017e5780632199d5cd146101a65780632b956ff7146102085780632f2a5f6b1461026a575b600080fd5b6101686004803603602081101561015257600080fd5b8101908080359060200190929190505050610c2a565b6040518082815260200191505060405180910390f35b610186610c84565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6101e8600480360360208110156101bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c9e565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61024a6004803603602081101561021e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e18565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6104526004803603608081101561028057600080fd5b8101908080359060200190929190803590602001906401000000008111156102a757600080fd5b8201836020820111156102b957600080fd5b803590602001918460208302840111640100000000831117156102db57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561033b57600080fd5b82018360208201111561034d57600080fd5b8035906020019184602083028401116401000000008311171561036f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103cf57600080fd5b8201836020820111156103e157600080fd5b8035906020019184602083028401116401000000008311171561040357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610e5f565b005b61048a6004803603604081101561046a57600080fd5b8101908080359060200190929190803590602001909291905050506110ee565b005b6104d8600480360360408110156104a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611376565b005b610756600480360360a08110156104f057600080fd5b81019080803590602001909291908035906020019064010000000081111561051757600080fd5b82018360208201111561052957600080fd5b8035906020019184602083028401116401000000008311171561054b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156105ab57600080fd5b8201836020820111156105bd57600080fd5b803590602001918460208302840111640100000000831117156105df57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561063f57600080fd5b82018360208201111561065157600080fd5b8035906020019184602083028401116401000000008311171561067357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106d357600080fd5b8201836020820111156106e557600080fd5b8035906020019184602083028401116401000000008311171561070757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506114d4565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6107a26004803603602081101561078c57600080fd5b81019080803590602001909291905050506118f1565b6040518082815260200191505060405180910390f35b6107e4600480360360208110156107ce57600080fd5b810190808035906020019092919050505061190f565b604051808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001898152602001888152602001878152602001868152602001858152602001848152602001836bffffffffffffffffffffffff1681526020018281526020019a505050505050505050505060405180910390f35b61087b6119bb565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6108d1600480360360408110156108b157600080fd5b8101908080359060200190929190803590602001909291905050506119d5565b60405180821515815260200191505060405180910390f35b6108f1611a04565b005b610999600480360360c081101561090957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080356bffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff16906020019092919080359060200190929190505050611b8a565b6040518082815260200191505060405180910390f35b6109b7611ea2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109eb611ecb565b6040518082815260200191505060405180910390f35b610b5560048036036060811015610a1757600080fd5b810190808035906020019092919080359060200190640100000000811115610a3e57600080fd5b820183602082011115610a5057600080fd5b80359060200191846020830284011164010000000083111715610a7257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ad257600080fd5b820183602082011115610ae457600080fd5b80359060200191846020830284011164010000000083111715610b0657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611ed1565b604051808381526020018281526020019250505060405180910390f35b610b7a612474565b6040518082815260200191505060405180910390f35b610b9861247a565b6040518082815260200191505060405180910390f35b610bf060048036036020811015610bc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612480565b005b610c2860048036036040811015610c0857600080fd5b81019080803590602001909291908035906020019092919050505061268b565b005b60004260026000848152602001908152602001600020600201541015610c535760009050610c7f565b610c7c426002600085815260200190815260200160002060020154612e1490919063ffffffff16565b90505b919050565b600560009054906101000a900467ffffffffffffffff1681565b6000610ccc600560009054906101000a900467ffffffffffffffff16836003612e5e9092919063ffffffff16565b610d3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5573657220616c7265616479207265676973746572656400000000000000000081525060200191505060405180910390fd5b600560009054906101000a900467ffffffffffffffff169050610d93610d8e6001600560009054906101000a900467ffffffffffffffff1667ffffffffffffffff1661318490919063ffffffff16565b61320c565b600560006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f6838f67cb358c332087b73dbe769a6c869a5f87225236c16dda5d0013a77074c82604051808267ffffffffffffffff16815260200191505060405180910390a2919050565b6000610e2e82600361327790919063ffffffff16565b15610e4e57610e478260036132e490919063ffffffff16565b9050610e5a565b610e5782610c9e565b90505b919050565b8360026000828152602001908152602001600020600201544210610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e066022913960400191505060405180910390fd5b6000610ed933610e18565b90506000805b8651811015611083576000610f4c888381518110610ef957fe5b6020026020010151888481518110610f0d57fe5b6020026020010151888581518110610f2157fe5b6020026020010151600160008e81526020019081526020016000206133c3909392919063ffffffff16565b90508015611075576000806000610f758b8681518110610f6857fe5b60200260200101516133ed565b9250925092508667ffffffffffffffff168367ffffffffffffffff1614610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614b7d6023913960400191505060405180910390fd5b611008816bffffffffffffffffffffffff168761318490919063ffffffff16565b95508667ffffffffffffffff168c7f7edae327fe79804b2f38bd490d874a0d188d3ae8911b303205abe47400086ac4848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35050505b508080600101915050610edf565b506110e53382600260008b815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661347b9092919063ffffffff16565b50505050505050565b8160026000828152602001908152602001600020600201544211801561112c57506000801b6002600083815260200190815260200160002060070154145b611181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614d5e6028913960400191505060405180910390fd5b60006111a260026000868152602001908152602001600020600301546133ed565b925050506000600260008681526020019081526020016000206005015490506000600260008781526020019081526020016000206006015490506000801b8114156111ef57600160001b90505b60005b858110156112615761121f82600160008a815260200190815260200160002061351d90919063ffffffff16565b9150600061122c836133ed565b92505050611251816bffffffffffffffffffffffff168561318490919063ffffffff16565b93505080806001019150506111f2565b5060008061126e836133ed565b92509250506112a2816bffffffffffffffffffffffff16866bffffffffffffffffffffffff1661362a90919063ffffffff16565b6112c3836bffffffffffffffffffffffff168661362a90919063ffffffff16565b10611336576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f6f206d616e79206f72646572732073756d6d65642075700000000000000081525060200191505060405180910390fd5b83600260008a81526020019081526020016000206005018190555082600260008a8152602001908152602001600020600601819055505050505050505050565b61137e6136b0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461143e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f821115611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614c6c602d913960400191505060405180910390fd5b6114a181610e18565b600860006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816007819055505050565b60008560026000828152602001908152602001600020600201544210611545576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e066022913960400191505060405180910390fd5b600080611567600260008b8152602001908152602001600020600301546133ed565b925092505060005b885181101561170b576115ba88828151811061158757fe5b60200260200101516bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b6115fc846bffffffffffffffffffffffff168b84815181106115d857fe5b60200260200101516bffffffffffffffffffffffff1661362a90919063ffffffff16565b10611652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614db36029913960400191505060405180910390fd5b600260008b81526020019081526020016000206004015488828151811061167557fe5b60200260200101516bffffffffffffffffffffffff16116116fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6f7264657220746f6f20736d616c6c000000000000000000000000000000000081525060200191505060405180910390fd5b808060010191505061156f565b505050600061171933610e18565b925060005b87518110156118825760006117a861175d868b858151811061173c57fe5b60200260200101518b868151811061175057fe5b60200260200101516136b8565b88848151811061176957fe5b602002602001015188858151811061177d57fe5b6020026020010151600160008f815260200190815260200160002061371b909392919063ffffffff16565b90508015611874576117e48883815181106117bf57fe5b60200260200101516bffffffffffffffffffffffff168461318490919063ffffffff16565b92508467ffffffffffffffff168a7f9304f2fc7ed6d42c0400e678dbc7283e1e9054889c3afea5f965adff66ef9eac8b858151811061181f57fe5b60200260200101518b868151811061183357fe5b602002602001015160405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35b50808060010191505061171e565b506118e6333083600260008d815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613745909392919063ffffffff16565b505095945050505050565b60016020528060005260406000206000915090508060010154905081565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a90046bffffffffffffffffffffffff1690806009015490508a565b600860009054906101000a900467ffffffffffffffff1681565b60006119fc826001600086815260200190815260200160002061380690919063ffffffff16565b905092915050565b611a0c6136b0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611acc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080611b9633610e18565b9050611c0f3330611be86103e8611bda611bbd6007546103e861318490919063ffffffff16565b8b6bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b8b73ffffffffffffffffffffffffffffffffffffffff16613745909392919063ffffffff16565b60008311611c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614bc6602e913960400191505060405180910390fd5b6006600081548092919060010191905055506040518061014001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018742018152602001611cd18387896136b8565b8152602001848152602001600081526020016000801b81526020016000801b815260200160006bffffffffffffffffffffffff16815260200160075481525060026000600654815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555061012082015181600901559050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff166006547f15dd9639accd24fcb10b44fe33886ce03e228e4e6ba1f65791edf66fa4acfa0360405160405180910390a46006549150509695505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065481565b600080846000801b60026000838152602001908152602001600020600701541415611f64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f41756374696f6e206e6f74207965742066696e6973686564000000000000000081525060200191505060405180910390fd5b611f6c614ac0565b60026000888152602001908152602001600020604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160098201548152505090506000806120cd8360e001516133ed565b925092505060006120f1896000815181106120e457fe5b60200260200101516133ed565b5050905060005b895181101561245a5761214e8a828151811061211057fe5b60200260200101518a838151811061212457fe5b6020026020010151600160008f81526020019081526020016000206138b99092919063ffffffff16565b6121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6f72646572206973206e6f206c6f6e67657220636c61696d61626c650000000081525060200191505060405180910390fd5b60008060006121e18d85815181106121d457fe5b60200260200101516133ed565b9250925092508467ffffffffffffffff168367ffffffffffffffff1614612253576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614d3b6023913960400191505060405180910390fd5b8760e001518d858151811061226457fe5b60200260200101511415612327576122d86122c9876bffffffffffffffffffffffff166122bb8a6bffffffffffffffffffffffff168c61010001516bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b8c61318490919063ffffffff16565b9a506123206123118961010001516bffffffffffffffffffffffff16836bffffffffffffffffffffffff16612e1490919063ffffffff16565b8b61318490919063ffffffff16565b99506123e3565b6123518860e001518e868151811061233b57fe5b60200260200101516139d890919063ffffffff16565b156123be576123b76123a8876bffffffffffffffffffffffff1661239a8a6bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b8c61318490919063ffffffff16565b9a506123e2565b6123df816bffffffffffffffffffffffff168b61318490919063ffffffff16565b99505b5b8467ffffffffffffffff168e7f3f2c83616e48a2f8b3c9cc26499e2e5c61643714dac49027d82cf6732f96a91a848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a350505080806001019150506120f8565b506124678a888884613b90565b5050505050935093915050565b6103e881565b60075481565b6124886136b0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612548576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614ba06026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b816002600082815260200190815260200160002060020154421180156126c957506000801b6002600083815260200190815260200160002060070154145b61271e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614d5e6028913960400191505060405180910390fd5b60008061272a846133ed565b92509250506000806000612753600260008a8152602001908152602001600020600301546133ed565b9250925092506000856bffffffffffffffffffffffff16116127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7072696365206d75737420626520706f7374697665000000000000000000000081525060200191505060405180910390fd5b6000600260008a81526020019081526020016000206005015490506000600260008b81526020019081526020016000206006015490506000801b81141561282657600160001b90505b6000600160008c81526020019081526020016000206001015411156128f15761286a81600160008d815260200190815260200160002061351d90919063ffffffff16565b90505b88811415801561288c575061288b89826139d890919063ffffffff16565b5b156128f057600061289c826133ed565b925050506128c1816bffffffffffffffffffffffff168461318490919063ffffffff16565b92506128e882600160008e815260200190815260200160002061351d90919063ffffffff16565b91505061286d565b5b6000612934876bffffffffffffffffffffffff166129268a6bffffffffffffffffffffffff168661362a90919063ffffffff16565b61386f90919063ffffffff16565b9050818a1415612ae1576000612949836133ed565b92505050600061297083876bffffffffffffffffffffffff16612e1490919063ffffffff16565b90506129bb6129b68b6bffffffffffffffffffffffff166129a88c6bffffffffffffffffffffffff168561362a90919063ffffffff16565b61386f90919063ffffffff16565b613c85565b600260008f815260200190815260200160002060080160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550816bffffffffffffffffffffffff16600260008f815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff161115612abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f726465722063616e206e6f7420626520636c656172696e67206f726465720081525060200191505060405180910390fd5b83600260008f8152602001908152602001600020600701819055505050612d77565b836bffffffffffffffffffffffff16811015612c2257612b26876bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b612b55866bffffffffffffffffffffffff168a6bffffffffffffffffffffffff1661362a90919063ffffffff16565b14612bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614bf46030913960400191505060405180910390fd5b612bb481613c85565b600260008d815260200190815260200160002060080160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550612c038689896136b8565b600260008d815260200190815260200160002060070181905550612d76565b89600260008d815260200190815260200160002060070181905550836bffffffffffffffffffffffff168114612cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7072696365206973206e6f7420636c656172696e67207072696365000000000081525060200191505060405180910390fd5b612cef876bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b612d1e866bffffffffffffffffffffffff168a6bffffffffffffffffffffffff1661362a90919063ffffffff16565b1115612d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c996031913960400191505060405180910390fd5b5b5b8a7f8e633245b93c41d24c82377f869edd0ac49ea9084bb0fa0265125a7b1df7fc95898960405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a26000600260008d8152602001908152602001600020600901541115612dfc57612dfb8b613cf4565b5b612e058b613f40565b50505050505050505050505050565b6000612e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614161565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f7420696e73657274207a65726f206164647265737300000000000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff168367ffffffffffffffff161415612fac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f7420696e73657274206d61782075696e743634000000000000000081525060200191505060405180910390fd5b60008460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415806130945750600073ffffffffffffffffffffffffffffffffffffffff168460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156130a2576000905061317d565b818460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600183018460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600190505b9392505050565b600080828401905083811015613202576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600068010000000000000000821061326f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614d156026913960400191505060405180910390fd5b819050919050565b6000808360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415905092915050565b60006132f08383613277565b613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d7573742068617665204164647265737320746f20676574204944000000000081525060200191505060405180910390fd5b60018360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1603905092915050565b60006133d08585856138b9565b9050806133e5576133e28585846138b9565b90505b949350505050565b600080600078010000000000000000000000000000000000000000000000008460001c8161341757fe5b0492506c0100000000000000000000000078010000000000000000000000000000000000000000000000008560001c8161344d57fe5b068161345557fe5b0491506c010000000000000000000000008460001c8161347157fe5b0690509193909250565b6135188363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614221565b505050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b82141561359b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614cca602a913960400191505060405180910390fd5b6000801b83600001600084815260200190815260200160002054141561360c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614c246022913960400191505060405180910390fd5b82600001600083815260200190815260200160002054905092915050565b60008083141561363d57600090506136aa565b600082840290508284828161364e57fe5b04146136a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614cf46021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b6000816bffffffffffffffffffffffff166c01000000000000000000000000846bffffffffffffffffffffffff160278010000000000000000000000000000000000000000000000008667ffffffffffffffff1602010160001b90509392505050565b6000613728858585614310565b90508061373d5761373a858584614310565b90505b949350505050565b613800846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614221565b50505050565b6000600160001b82148061383c57507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b82145b1561384a5760009050613869565b6000801b83600001600084815260200190815260200160002054141590505b92915050565b60006138b183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614601565b905092915050565b60006138c58484613806565b15806138e85750600160001b82141580156138e757506138e58483613806565b155b5b156138f657600090506139d1565b60008290505b83856000016000838152602001908152602001600020541461396a577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b81141561394d5760009150506139d1565b8460000160008281526020019081526020016000205490506138fc565b84600001600085815260200190815260200160002054856000016000838152602001908152602001600020819055506000801b8560000160008681526020019081526020016000208190555084600101600081548092919060019003919050555060019150505b9392505050565b6000806000806139e7866133ed565b92509250925060008060006139fb886133ed565b925092509250613a30846bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b613a5f826bffffffffffffffffffffffff16876bffffffffffffffffffffffff1661362a90919063ffffffff16565b1015613a745760019650505050505050613b8a565b613aa3846bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b613ad2826bffffffffffffffffffffffff16876bffffffffffffffffffffffff1661362a90919063ffffffff16565b1115613ae75760009650505050505050613b8a565b8267ffffffffffffffff168667ffffffffffffffff161415613b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614d86602d913960400191505060405180910390fd5b8267ffffffffffffffff168667ffffffffffffffff161015613b7f5760019650505050505050613b8a565b600096505050505050505b92915050565b6000613ba68260036146c790919063ffffffff16565b90506000841115613c1357613c1281856002600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661347b9092919063ffffffff16565b5b6000831115613c7e57613c7d81846002600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661347b9092919063ffffffff16565b5b5050505050565b60006c010000000000000000000000008210613cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614b576026913960400191505060405180910390fd5b819050919050565b6000806000613d1860026000868152602001908152602001600020600301546133ed565b925092509250600080613d4060026000888152602001908152602001600020600701546133ed565b92509250506000613d926103e8613d84600260008b815260200190815260200160002060090154876bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b9050613dc3846bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b613df2866bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b1415613f13576000613e57600260008a815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16866bffffffffffffffffffffffff16612e1490919063ffffffff16565b9050613eae88613e90876bffffffffffffffffffffffff16613e82858761362a90919063ffffffff16565b61386f90919063ffffffff16565b6000600860009054906101000a900467ffffffffffffffff16613b90565b613f0d88613f05876bffffffffffffffffffffffff16613ef7613ee8868b6bffffffffffffffffffffffff16612e1490919063ffffffff16565b8761362a90919063ffffffff16565b61386f90919063ffffffff16565b60008a613b90565b50613f37565b613f3687826000600860009054906101000a900467ffffffffffffffff16613b90565b5b50505050505050565b6000806000806000613f6760026000888152602001908152602001600020600301546133ed565b9250925092506000801b6002600088815260200190815260200160002060030181905550600080613fad600260008a8152602001908152602001600020600701546133ed565b9250925050613fe1836bffffffffffffffffffffffff16826bffffffffffffffffffffffff1661362a90919063ffffffff16565b614010856bffffffffffffffffffffffff16846bffffffffffffffffffffffff1661362a90919063ffffffff16565b14156140f957614073600260008a815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16846bffffffffffffffffffffffff16612e1490919063ffffffff16565b96506140f2826bffffffffffffffffffffffff166140e4836bffffffffffffffffffffffff16600260008d815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b955061414b565b614148826bffffffffffffffffffffffff1661413a836bffffffffffffffffffffffff16866bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b95505b61415788888888613b90565b5050505050915091565b600083831115829061420e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141d35780820151818401526020810190506141b8565b50505050905090810190601f1680156142005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060614283826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661479a9092919063ffffffff16565b905060008151111561430b578080602001905160208110156142a457600080fd5b810190808051906020019092919050505061430a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614ddc602a913960400191505060405180910390fd5b5b505050565b60008061431c846133ed565b9250505060006bffffffffffffffffffffffff16816bffffffffffffffffffffffff1614156143b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e73657274696e67207a65726f206973206e6f7420737570706f727465640081525060200191505060405180910390fd5b600160001b8414806143e757507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b84145b1561445a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e73657274696e6720656c656d656e74206973206e6f742076616c6964000081525060200191505060405180910390fd5b6144648585613806565b156144735760009150506145fa565b600160001b83148061448b575061448a8584613806565b5b6144995760009150506145fa565b600080866001015414156145075784866000016000600160001b8152602001908152602001600020819055507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b866000016000878152602001908152602001600020819055506145df565b60008490505b816145dd5761452586826139d890919063ffffffff16565b156145cc5761455286886000016000848152602001908152602001600020546139d890919063ffffffff16565b6145ae5760008760000160008381526020019081526020016000205490508688600001600084815260200190815260200160002081905550808860000160008981526020019081526020016000208190555060019250506145c7565b8660000160008281526020019081526020016000205490505b6145d8565b600093505050506145fa565b61450d565b505b85600101600081548092919060010191905055506001925050505b9392505050565b600080831182906146ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614672578082015181840152602081019050614657565b50505050905090810190601f16801561469f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816146b957fe5b049050809150509392505050565b60006146d383836147b2565b614745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d757374206861766520494420746f206765742041646472657373000000000081525060200191505060405180910390fd5b8260000160006001840167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60606147a98484600085614838565b90509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168360000160006001850167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b606082471015614893576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c466026913960400191505060405180910390fd5b61489c856149e1565b61490e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061495e578051825260208201915060208101905060208303925061493b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149c0576040519150601f19603f3d011682016040523d82523d6000602084013e6149c5565b606091505b50915091506149d58282866149f4565b92505050949350505050565b600080823b905060008111915050919050565b60608315614a0457829050614ab9565b600083511115614a175782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a7e578082015181840152602081019050614a63565b50505050905090810190601f168015614aab5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806101400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681526020016000815260200160008152602001600080191681526020016000801916815260200160006bffffffffffffffffffffffff16815260200160008152509056fe53616665436173743a2076616c756520646f65736e27742066697420696e20393620626974734f6e6c792074686520757365722063616e2063616e63656c20686973206f72646572734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736d696e696d756d42696464696e67416d6f756e74206973206e6f7420616c6c6f77656420746f206265207a65726f737570706c696564207072696365206d75737420626520696e766572736520696e697469616c4f726465724c696d6974547279696e6720746f20676574206e657874206f66206c61737420656c656d656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c466565206973206e6f7420616c6c6f77656420746f2062652073657420686967686572207468616e20312e3525636c656172696e6720707269636520697320626574746572207468616e20696e697469616c41756374696f6e4f72646572547279696e6720746f20676574206e657874206f66206e6f6e2d6578697374656e7420656c656d656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20363420626974736f6e6c7920616c6c6f77656420746f20636c61696d20666f722073616d65207573657241756374696f6e206e6f7420696e20736f6c7574696f6e207375626d697373696f6e20706861736575736572206973206e6f7420616c6c6f77656420746f20706c6163652073616d65206f726465722074776963656c696d6974207072696365206e6f7420626574746572207468616e206d696d696d616c206f666665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646e6f206c6f6e67657220696e206f7264657220706c6163656d656e74207068617365a26469706673582212201a0ab2844bd8e211988aa3db39524835428ca706ba91899387dfcb345fcceb8f64736f6c634300060c0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101375760003560e01c80635cefb291116100b8578063a7e766441161007c578063a7e76644146109e3578063c1110dd614610a01578063d73792a914610b72578063e86dea4a14610b90578063f2fde38b14610bae578063f9f0751a14610bf257610137565b80635cefb2911461087357806363c699a41461089b578063715018a6146108e957806375d3c2d6146108f35780638da5cb5b146109af57610137565b80633e12905f116100ff5780633e12905f1461045457806340b20b091461048c57806342eb3573146104da5780634a8393f31461077657806355fc62d2146107b857610137565b806315d37b4b1461013c57806319a50f491461017e5780632199d5cd146101a65780632b956ff7146102085780632f2a5f6b1461026a575b600080fd5b6101686004803603602081101561015257600080fd5b8101908080359060200190929190505050610c2a565b6040518082815260200191505060405180910390f35b610186610c84565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6101e8600480360360208110156101bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c9e565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61024a6004803603602081101561021e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e18565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6104526004803603608081101561028057600080fd5b8101908080359060200190929190803590602001906401000000008111156102a757600080fd5b8201836020820111156102b957600080fd5b803590602001918460208302840111640100000000831117156102db57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561033b57600080fd5b82018360208201111561034d57600080fd5b8035906020019184602083028401116401000000008311171561036f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103cf57600080fd5b8201836020820111156103e157600080fd5b8035906020019184602083028401116401000000008311171561040357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610e5f565b005b61048a6004803603604081101561046a57600080fd5b8101908080359060200190929190803590602001909291905050506110ee565b005b6104d8600480360360408110156104a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611376565b005b610756600480360360a08110156104f057600080fd5b81019080803590602001909291908035906020019064010000000081111561051757600080fd5b82018360208201111561052957600080fd5b8035906020019184602083028401116401000000008311171561054b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156105ab57600080fd5b8201836020820111156105bd57600080fd5b803590602001918460208302840111640100000000831117156105df57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561063f57600080fd5b82018360208201111561065157600080fd5b8035906020019184602083028401116401000000008311171561067357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106d357600080fd5b8201836020820111156106e557600080fd5b8035906020019184602083028401116401000000008311171561070757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506114d4565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6107a26004803603602081101561078c57600080fd5b81019080803590602001909291905050506118f1565b6040518082815260200191505060405180910390f35b6107e4600480360360208110156107ce57600080fd5b810190808035906020019092919050505061190f565b604051808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001898152602001888152602001878152602001868152602001858152602001848152602001836bffffffffffffffffffffffff1681526020018281526020019a505050505050505050505060405180910390f35b61087b6119bb565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6108d1600480360360408110156108b157600080fd5b8101908080359060200190929190803590602001909291905050506119d5565b60405180821515815260200191505060405180910390f35b6108f1611a04565b005b610999600480360360c081101561090957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080356bffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff16906020019092919080359060200190929190505050611b8a565b6040518082815260200191505060405180910390f35b6109b7611ea2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109eb611ecb565b6040518082815260200191505060405180910390f35b610b5560048036036060811015610a1757600080fd5b810190808035906020019092919080359060200190640100000000811115610a3e57600080fd5b820183602082011115610a5057600080fd5b80359060200191846020830284011164010000000083111715610a7257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ad257600080fd5b820183602082011115610ae457600080fd5b80359060200191846020830284011164010000000083111715610b0657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611ed1565b604051808381526020018281526020019250505060405180910390f35b610b7a612474565b6040518082815260200191505060405180910390f35b610b9861247a565b6040518082815260200191505060405180910390f35b610bf060048036036020811015610bc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612480565b005b610c2860048036036040811015610c0857600080fd5b81019080803590602001909291908035906020019092919050505061268b565b005b60004260026000848152602001908152602001600020600201541015610c535760009050610c7f565b610c7c426002600085815260200190815260200160002060020154612e1490919063ffffffff16565b90505b919050565b600560009054906101000a900467ffffffffffffffff1681565b6000610ccc600560009054906101000a900467ffffffffffffffff16836003612e5e9092919063ffffffff16565b610d3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5573657220616c7265616479207265676973746572656400000000000000000081525060200191505060405180910390fd5b600560009054906101000a900467ffffffffffffffff169050610d93610d8e6001600560009054906101000a900467ffffffffffffffff1667ffffffffffffffff1661318490919063ffffffff16565b61320c565b600560006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f6838f67cb358c332087b73dbe769a6c869a5f87225236c16dda5d0013a77074c82604051808267ffffffffffffffff16815260200191505060405180910390a2919050565b6000610e2e82600361327790919063ffffffff16565b15610e4e57610e478260036132e490919063ffffffff16565b9050610e5a565b610e5782610c9e565b90505b919050565b8360026000828152602001908152602001600020600201544210610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e066022913960400191505060405180910390fd5b6000610ed933610e18565b90506000805b8651811015611083576000610f4c888381518110610ef957fe5b6020026020010151888481518110610f0d57fe5b6020026020010151888581518110610f2157fe5b6020026020010151600160008e81526020019081526020016000206133c3909392919063ffffffff16565b90508015611075576000806000610f758b8681518110610f6857fe5b60200260200101516133ed565b9250925092508667ffffffffffffffff168367ffffffffffffffff1614610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614b7d6023913960400191505060405180910390fd5b611008816bffffffffffffffffffffffff168761318490919063ffffffff16565b95508667ffffffffffffffff168c7f7edae327fe79804b2f38bd490d874a0d188d3ae8911b303205abe47400086ac4848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35050505b508080600101915050610edf565b506110e53382600260008b815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661347b9092919063ffffffff16565b50505050505050565b8160026000828152602001908152602001600020600201544211801561112c57506000801b6002600083815260200190815260200160002060070154145b611181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614d5e6028913960400191505060405180910390fd5b60006111a260026000868152602001908152602001600020600301546133ed565b925050506000600260008681526020019081526020016000206005015490506000600260008781526020019081526020016000206006015490506000801b8114156111ef57600160001b90505b60005b858110156112615761121f82600160008a815260200190815260200160002061351d90919063ffffffff16565b9150600061122c836133ed565b92505050611251816bffffffffffffffffffffffff168561318490919063ffffffff16565b93505080806001019150506111f2565b5060008061126e836133ed565b92509250506112a2816bffffffffffffffffffffffff16866bffffffffffffffffffffffff1661362a90919063ffffffff16565b6112c3836bffffffffffffffffffffffff168661362a90919063ffffffff16565b10611336576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f6f206d616e79206f72646572732073756d6d65642075700000000000000081525060200191505060405180910390fd5b83600260008a81526020019081526020016000206005018190555082600260008a8152602001908152602001600020600601819055505050505050505050565b61137e6136b0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461143e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f821115611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614c6c602d913960400191505060405180910390fd5b6114a181610e18565b600860006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816007819055505050565b60008560026000828152602001908152602001600020600201544210611545576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e066022913960400191505060405180910390fd5b600080611567600260008b8152602001908152602001600020600301546133ed565b925092505060005b885181101561170b576115ba88828151811061158757fe5b60200260200101516bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b6115fc846bffffffffffffffffffffffff168b84815181106115d857fe5b60200260200101516bffffffffffffffffffffffff1661362a90919063ffffffff16565b10611652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614db36029913960400191505060405180910390fd5b600260008b81526020019081526020016000206004015488828151811061167557fe5b60200260200101516bffffffffffffffffffffffff16116116fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6f7264657220746f6f20736d616c6c000000000000000000000000000000000081525060200191505060405180910390fd5b808060010191505061156f565b505050600061171933610e18565b925060005b87518110156118825760006117a861175d868b858151811061173c57fe5b60200260200101518b868151811061175057fe5b60200260200101516136b8565b88848151811061176957fe5b602002602001015188858151811061177d57fe5b6020026020010151600160008f815260200190815260200160002061371b909392919063ffffffff16565b90508015611874576117e48883815181106117bf57fe5b60200260200101516bffffffffffffffffffffffff168461318490919063ffffffff16565b92508467ffffffffffffffff168a7f9304f2fc7ed6d42c0400e678dbc7283e1e9054889c3afea5f965adff66ef9eac8b858151811061181f57fe5b60200260200101518b868151811061183357fe5b602002602001015160405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35b50808060010191505061171e565b506118e6333083600260008d815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613745909392919063ffffffff16565b505095945050505050565b60016020528060005260406000206000915090508060010154905081565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a90046bffffffffffffffffffffffff1690806009015490508a565b600860009054906101000a900467ffffffffffffffff1681565b60006119fc826001600086815260200190815260200160002061380690919063ffffffff16565b905092915050565b611a0c6136b0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611acc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080611b9633610e18565b9050611c0f3330611be86103e8611bda611bbd6007546103e861318490919063ffffffff16565b8b6bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b8b73ffffffffffffffffffffffffffffffffffffffff16613745909392919063ffffffff16565b60008311611c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614bc6602e913960400191505060405180910390fd5b6006600081548092919060010191905055506040518061014001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018742018152602001611cd18387896136b8565b8152602001848152602001600081526020016000801b81526020016000801b815260200160006bffffffffffffffffffffffff16815260200160075481525060026000600654815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555061012082015181600901559050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff166006547f15dd9639accd24fcb10b44fe33886ce03e228e4e6ba1f65791edf66fa4acfa0360405160405180910390a46006549150509695505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065481565b600080846000801b60026000838152602001908152602001600020600701541415611f64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f41756374696f6e206e6f74207965742066696e6973686564000000000000000081525060200191505060405180910390fd5b611f6c614ac0565b60026000888152602001908152602001600020604051806101400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160098201548152505090506000806120cd8360e001516133ed565b925092505060006120f1896000815181106120e457fe5b60200260200101516133ed565b5050905060005b895181101561245a5761214e8a828151811061211057fe5b60200260200101518a838151811061212457fe5b6020026020010151600160008f81526020019081526020016000206138b99092919063ffffffff16565b6121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6f72646572206973206e6f206c6f6e67657220636c61696d61626c650000000081525060200191505060405180910390fd5b60008060006121e18d85815181106121d457fe5b60200260200101516133ed565b9250925092508467ffffffffffffffff168367ffffffffffffffff1614612253576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614d3b6023913960400191505060405180910390fd5b8760e001518d858151811061226457fe5b60200260200101511415612327576122d86122c9876bffffffffffffffffffffffff166122bb8a6bffffffffffffffffffffffff168c61010001516bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b8c61318490919063ffffffff16565b9a506123206123118961010001516bffffffffffffffffffffffff16836bffffffffffffffffffffffff16612e1490919063ffffffff16565b8b61318490919063ffffffff16565b99506123e3565b6123518860e001518e868151811061233b57fe5b60200260200101516139d890919063ffffffff16565b156123be576123b76123a8876bffffffffffffffffffffffff1661239a8a6bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b8c61318490919063ffffffff16565b9a506123e2565b6123df816bffffffffffffffffffffffff168b61318490919063ffffffff16565b99505b5b8467ffffffffffffffff168e7f3f2c83616e48a2f8b3c9cc26499e2e5c61643714dac49027d82cf6732f96a91a848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a350505080806001019150506120f8565b506124678a888884613b90565b5050505050935093915050565b6103e881565b60075481565b6124886136b0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612548576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614ba06026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b816002600082815260200190815260200160002060020154421180156126c957506000801b6002600083815260200190815260200160002060070154145b61271e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614d5e6028913960400191505060405180910390fd5b60008061272a846133ed565b92509250506000806000612753600260008a8152602001908152602001600020600301546133ed565b9250925092506000856bffffffffffffffffffffffff16116127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7072696365206d75737420626520706f7374697665000000000000000000000081525060200191505060405180910390fd5b6000600260008a81526020019081526020016000206005015490506000600260008b81526020019081526020016000206006015490506000801b81141561282657600160001b90505b6000600160008c81526020019081526020016000206001015411156128f15761286a81600160008d815260200190815260200160002061351d90919063ffffffff16565b90505b88811415801561288c575061288b89826139d890919063ffffffff16565b5b156128f057600061289c826133ed565b925050506128c1816bffffffffffffffffffffffff168461318490919063ffffffff16565b92506128e882600160008e815260200190815260200160002061351d90919063ffffffff16565b91505061286d565b5b6000612934876bffffffffffffffffffffffff166129268a6bffffffffffffffffffffffff168661362a90919063ffffffff16565b61386f90919063ffffffff16565b9050818a1415612ae1576000612949836133ed565b92505050600061297083876bffffffffffffffffffffffff16612e1490919063ffffffff16565b90506129bb6129b68b6bffffffffffffffffffffffff166129a88c6bffffffffffffffffffffffff168561362a90919063ffffffff16565b61386f90919063ffffffff16565b613c85565b600260008f815260200190815260200160002060080160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550816bffffffffffffffffffffffff16600260008f815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff161115612abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f726465722063616e206e6f7420626520636c656172696e67206f726465720081525060200191505060405180910390fd5b83600260008f8152602001908152602001600020600701819055505050612d77565b836bffffffffffffffffffffffff16811015612c2257612b26876bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b612b55866bffffffffffffffffffffffff168a6bffffffffffffffffffffffff1661362a90919063ffffffff16565b14612bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180614bf46030913960400191505060405180910390fd5b612bb481613c85565b600260008d815260200190815260200160002060080160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550612c038689896136b8565b600260008d815260200190815260200160002060070181905550612d76565b89600260008d815260200190815260200160002060070181905550836bffffffffffffffffffffffff168114612cc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7072696365206973206e6f7420636c656172696e67207072696365000000000081525060200191505060405180910390fd5b612cef876bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b612d1e866bffffffffffffffffffffffff168a6bffffffffffffffffffffffff1661362a90919063ffffffff16565b1115612d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614c996031913960400191505060405180910390fd5b5b5b8a7f8e633245b93c41d24c82377f869edd0ac49ea9084bb0fa0265125a7b1df7fc95898960405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a26000600260008d8152602001908152602001600020600901541115612dfc57612dfb8b613cf4565b5b612e058b613f40565b50505050505050505050505050565b6000612e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614161565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f7420696e73657274207a65726f206164647265737300000000000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff168367ffffffffffffffff161415612fac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f7420696e73657274206d61782075696e743634000000000000000081525060200191505060405180910390fd5b60008460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415806130945750600073ffffffffffffffffffffffffffffffffffffffff168460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156130a2576000905061317d565b818460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600183018460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600190505b9392505050565b600080828401905083811015613202576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600068010000000000000000821061326f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614d156026913960400191505060405180910390fd5b819050919050565b6000808360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415905092915050565b60006132f08383613277565b613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d7573742068617665204164647265737320746f20676574204944000000000081525060200191505060405180910390fd5b60018360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1603905092915050565b60006133d08585856138b9565b9050806133e5576133e28585846138b9565b90505b949350505050565b600080600078010000000000000000000000000000000000000000000000008460001c8161341757fe5b0492506c0100000000000000000000000078010000000000000000000000000000000000000000000000008560001c8161344d57fe5b068161345557fe5b0491506c010000000000000000000000008460001c8161347157fe5b0690509193909250565b6135188363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614221565b505050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b82141561359b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614cca602a913960400191505060405180910390fd5b6000801b83600001600084815260200190815260200160002054141561360c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614c246022913960400191505060405180910390fd5b82600001600083815260200190815260200160002054905092915050565b60008083141561363d57600090506136aa565b600082840290508284828161364e57fe5b04146136a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614cf46021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b6000816bffffffffffffffffffffffff166c01000000000000000000000000846bffffffffffffffffffffffff160278010000000000000000000000000000000000000000000000008667ffffffffffffffff1602010160001b90509392505050565b6000613728858585614310565b90508061373d5761373a858584614310565b90505b949350505050565b613800846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614221565b50505050565b6000600160001b82148061383c57507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b82145b1561384a5760009050613869565b6000801b83600001600084815260200190815260200160002054141590505b92915050565b60006138b183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614601565b905092915050565b60006138c58484613806565b15806138e85750600160001b82141580156138e757506138e58483613806565b155b5b156138f657600090506139d1565b60008290505b83856000016000838152602001908152602001600020541461396a577fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b81141561394d5760009150506139d1565b8460000160008281526020019081526020016000205490506138fc565b84600001600085815260200190815260200160002054856000016000838152602001908152602001600020819055506000801b8560000160008681526020019081526020016000208190555084600101600081548092919060019003919050555060019150505b9392505050565b6000806000806139e7866133ed565b92509250925060008060006139fb886133ed565b925092509250613a30846bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b613a5f826bffffffffffffffffffffffff16876bffffffffffffffffffffffff1661362a90919063ffffffff16565b1015613a745760019650505050505050613b8a565b613aa3846bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b613ad2826bffffffffffffffffffffffff16876bffffffffffffffffffffffff1661362a90919063ffffffff16565b1115613ae75760009650505050505050613b8a565b8267ffffffffffffffff168667ffffffffffffffff161415613b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614d86602d913960400191505060405180910390fd5b8267ffffffffffffffff168667ffffffffffffffff161015613b7f5760019650505050505050613b8a565b600096505050505050505b92915050565b6000613ba68260036146c790919063ffffffff16565b90506000841115613c1357613c1281856002600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661347b9092919063ffffffff16565b5b6000831115613c7e57613c7d81846002600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661347b9092919063ffffffff16565b5b5050505050565b60006c010000000000000000000000008210613cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614b576026913960400191505060405180910390fd5b819050919050565b6000806000613d1860026000868152602001908152602001600020600301546133ed565b925092509250600080613d4060026000888152602001908152602001600020600701546133ed565b92509250506000613d926103e8613d84600260008b815260200190815260200160002060090154876bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b9050613dc3846bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661362a90919063ffffffff16565b613df2866bffffffffffffffffffffffff16856bffffffffffffffffffffffff1661362a90919063ffffffff16565b1415613f13576000613e57600260008a815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16866bffffffffffffffffffffffff16612e1490919063ffffffff16565b9050613eae88613e90876bffffffffffffffffffffffff16613e82858761362a90919063ffffffff16565b61386f90919063ffffffff16565b6000600860009054906101000a900467ffffffffffffffff16613b90565b613f0d88613f05876bffffffffffffffffffffffff16613ef7613ee8868b6bffffffffffffffffffffffff16612e1490919063ffffffff16565b8761362a90919063ffffffff16565b61386f90919063ffffffff16565b60008a613b90565b50613f37565b613f3687826000600860009054906101000a900467ffffffffffffffff16613b90565b5b50505050505050565b6000806000806000613f6760026000888152602001908152602001600020600301546133ed565b9250925092506000801b6002600088815260200190815260200160002060030181905550600080613fad600260008a8152602001908152602001600020600701546133ed565b9250925050613fe1836bffffffffffffffffffffffff16826bffffffffffffffffffffffff1661362a90919063ffffffff16565b614010856bffffffffffffffffffffffff16846bffffffffffffffffffffffff1661362a90919063ffffffff16565b14156140f957614073600260008a815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16846bffffffffffffffffffffffff16612e1490919063ffffffff16565b96506140f2826bffffffffffffffffffffffff166140e4836bffffffffffffffffffffffff16600260008d815260200190815260200160002060080160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b955061414b565b614148826bffffffffffffffffffffffff1661413a836bffffffffffffffffffffffff16866bffffffffffffffffffffffff1661362a90919063ffffffff16565b61386f90919063ffffffff16565b95505b61415788888888613b90565b5050505050915091565b600083831115829061420e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141d35780820151818401526020810190506141b8565b50505050905090810190601f1680156142005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060614283826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661479a9092919063ffffffff16565b905060008151111561430b578080602001905160208110156142a457600080fd5b810190808051906020019092919050505061430a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614ddc602a913960400191505060405180910390fd5b5b505050565b60008061431c846133ed565b9250505060006bffffffffffffffffffffffff16816bffffffffffffffffffffffff1614156143b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e73657274696e67207a65726f206973206e6f7420737570706f727465640081525060200191505060405180910390fd5b600160001b8414806143e757507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b84145b1561445a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e73657274696e6720656c656d656e74206973206e6f742076616c6964000081525060200191505060405180910390fd5b6144648585613806565b156144735760009150506145fa565b600160001b83148061448b575061448a8584613806565b5b6144995760009150506145fa565b600080866001015414156145075784866000016000600160001b8152602001908152602001600020819055507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b866000016000878152602001908152602001600020819055506145df565b60008490505b816145dd5761452586826139d890919063ffffffff16565b156145cc5761455286886000016000848152602001908152602001600020546139d890919063ffffffff16565b6145ae5760008760000160008381526020019081526020016000205490508688600001600084815260200190815260200160002081905550808860000160008981526020019081526020016000208190555060019250506145c7565b8660000160008281526020019081526020016000205490505b6145d8565b600093505050506145fa565b61450d565b505b85600101600081548092919060010191905055506001925050505b9392505050565b600080831182906146ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614672578082015181840152602081019050614657565b50505050905090810190601f16801561469f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816146b957fe5b049050809150509392505050565b60006146d383836147b2565b614745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d757374206861766520494420746f206765742041646472657373000000000081525060200191505060405180910390fd5b8260000160006001840167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60606147a98484600085614838565b90509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168360000160006001850167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b606082471015614893576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c466026913960400191505060405180910390fd5b61489c856149e1565b61490e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061495e578051825260208201915060208101905060208303925061493b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149c0576040519150601f19603f3d011682016040523d82523d6000602084013e6149c5565b606091505b50915091506149d58282866149f4565b92505050949350505050565b600080823b905060008111915050919050565b60608315614a0457829050614ab9565b600083511115614a175782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a7e578082015181840152602081019050614a63565b50505050905090810190601f168015614aab5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806101400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681526020016000815260200160008152602001600080191681526020016000801916815260200160006bffffffffffffffffffffffff16815260200160008152509056fe53616665436173743a2076616c756520646f65736e27742066697420696e20393620626974734f6e6c792074686520757365722063616e2063616e63656c20686973206f72646572734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736d696e696d756d42696464696e67416d6f756e74206973206e6f7420616c6c6f77656420746f206265207a65726f737570706c696564207072696365206d75737420626520696e766572736520696e697469616c4f726465724c696d6974547279696e6720746f20676574206e657874206f66206c61737420656c656d656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c466565206973206e6f7420616c6c6f77656420746f2062652073657420686967686572207468616e20312e3525636c656172696e6720707269636520697320626574746572207468616e20696e697469616c41756374696f6e4f72646572547279696e6720746f20676574206e657874206f66206e6f6e2d6578697374656e7420656c656d656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20363420626974736f6e6c7920616c6c6f77656420746f20636c61696d20666f722073616d65207573657241756374696f6e206e6f7420696e20736f6c7574696f6e207375626d697373696f6e20706861736575736572206973206e6f7420616c6c6f77656420746f20706c6163652073616d65206f726465722074776963656c696d6974207072696365206e6f7420626574746572207468616e206d696d696d616c206f666665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646e6f206c6f6e67657220696e206f7264657220706c6163656d656e74207068617365a26469706673582212201a0ab2844bd8e211988aa3db39524835428ca706ba91899387dfcb345fcceb8f64736f6c634300060c0033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 30,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "_owner",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 1111,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "sellOrders",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_uint256,t_struct(Data)2623_storage)"
      },
      {
        "astId": 1115,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "auctionData",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_struct(AuctionData)1107_storage)"
      },
      {
        "astId": 1117,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "registeredUsers",
        "offset": 0,
        "slot": "3",
        "type": "t_struct(Data)2434_storage"
      },
      {
        "astId": 1119,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "numUsers",
        "offset": 0,
        "slot": "5",
        "type": "t_uint64"
      },
      {
        "astId": 1121,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "auctionCounter",
        "offset": 0,
        "slot": "6",
        "type": "t_uint256"
      },
      {
        "astId": 1130,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "feeNumerator",
        "offset": 0,
        "slot": "7",
        "type": "t_uint256"
      },
      {
        "astId": 1136,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "feeReceiverUserId",
        "offset": 0,
        "slot": "8",
        "type": "t_uint64"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_contract(IERC20)478": {
        "encoding": "inplace",
        "label": "contract IERC20",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_uint64)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint64)",
        "numberOfBytes": "32",
        "value": "t_uint64"
      },
      "t_mapping(t_bytes32,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_mapping(t_uint256,t_struct(AuctionData)1107_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct EasyAuction.AuctionData)",
        "numberOfBytes": "32",
        "value": "t_struct(AuctionData)1107_storage"
      },
      "t_mapping(t_uint256,t_struct(Data)2623_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct IterableOrderedOrderSet.Data)",
        "numberOfBytes": "32",
        "value": "t_struct(Data)2623_storage"
      },
      "t_mapping(t_uint64,t_address)": {
        "encoding": "mapping",
        "key": "t_uint64",
        "label": "mapping(uint64 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_struct(AuctionData)1107_storage": {
        "encoding": "inplace",
        "label": "struct EasyAuction.AuctionData",
        "members": [
          {
            "astId": 1088,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "auctioningToken",
            "offset": 0,
            "slot": "0",
            "type": "t_contract(IERC20)478"
          },
          {
            "astId": 1090,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "biddingToken",
            "offset": 0,
            "slot": "1",
            "type": "t_contract(IERC20)478"
          },
          {
            "astId": 1092,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "auctionEndDate",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 1094,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "initialAuctionOrder",
            "offset": 0,
            "slot": "3",
            "type": "t_bytes32"
          },
          {
            "astId": 1096,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "minimumBiddingAmount",
            "offset": 0,
            "slot": "4",
            "type": "t_uint256"
          },
          {
            "astId": 1098,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "interimSumBidAmount",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          },
          {
            "astId": 1100,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "interimOrder",
            "offset": 0,
            "slot": "6",
            "type": "t_bytes32"
          },
          {
            "astId": 1102,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "clearingPriceOrder",
            "offset": 0,
            "slot": "7",
            "type": "t_bytes32"
          },
          {
            "astId": 1104,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "volumeClearingPriceOrder",
            "offset": 0,
            "slot": "8",
            "type": "t_uint96"
          },
          {
            "astId": 1106,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "feeNumerator",
            "offset": 0,
            "slot": "9",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "320"
      },
      "t_struct(Data)2434_storage": {
        "encoding": "inplace",
        "label": "struct IdToAddressBiMap.Data",
        "members": [
          {
            "astId": 2429,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "idToAddress",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_uint64,t_address)"
          },
          {
            "astId": 2433,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "addressToId",
            "offset": 0,
            "slot": "1",
            "type": "t_mapping(t_address,t_uint64)"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(Data)2623_storage": {
        "encoding": "inplace",
        "label": "struct IterableOrderedOrderSet.Data",
        "members": [
          {
            "astId": 2620,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "nextMap",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_bytes32,t_bytes32)"
          },
          {
            "astId": 2622,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "size",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint64": {
        "encoding": "inplace",
        "label": "uint64",
        "numberOfBytes": "8"
      },
      "t_uint96": {
        "encoding": "inplace",
        "label": "uint96",
        "numberOfBytes": "12"
      }
    }
  }
}