JustPaste.it

EasyAuction.json

{
  "address": "0x0b7fFc1f4AD541A4Ed16b40D8c37f0929158D101",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "soldAuctioningTokens",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "soldBiddingTokens",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "clearingPriceOrder",
          "type": "bytes32"
        }
      ],
      "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": "buyAmount",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "sellAmount",
          "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"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "orderCancellationEndDate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "auctionEndDate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "_auctionedSellAmount",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "_minBuyAmount",
          "type": "uint96"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "minimumBiddingAmountPerOrder",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "minFundingThreshold",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "allowListContract",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "allowListData",
          "type": "bytes"
        }
      ],
      "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": "uint64",
          "name": "userId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "userAddress",
          "type": "address"
        }
      ],
      "name": "NewUser",
      "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": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "auctionAccessData",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "auctionAccessManager",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "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": "orderCancellationEndDate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "auctionEndDate",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "initialAuctionOrder",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "minimumBiddingAmountPerOrder",
          "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": "bool",
          "name": "minFundingThresholdNotReached",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "isAtomicClosureAllowed",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "feeNumerator",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minFundingThreshold",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "_sellOrders",
          "type": "bytes32[]"
        }

      ],
      "name": "cancelSellOrders",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "orders",
          "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": "orderCancellationEndDate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "auctionEndDate",
          "type": "uint256"
        },
        {
          "internalType": "uint96",
          "name": "_auctionedSellAmount",
          "type": "uint96"
        },
        {
          "internalType": "uint96",
          "name": "_minBuyAmount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "minimumBiddingAmountPerOrder",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minFundingThreshold",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "isAtomicClosureAllowed",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "accessManagerContract",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "accessManagerContractData",
          "type": "bytes"
        }
      ],
      "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": "bytes",
          "name": "allowListCallData",
          "type": "bytes"
        }
      ],
      "name": "placeSellOrders",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "userId",
          "type": "uint64"
        }
      ],
      "stateMutability": "nonpayable",
      "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": "bytes",
          "name": "allowListCallData",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "orderSubmitter",
          "type": "address"
        }
      ],
      "name": "placeSellOrdersOnBehalf",
      "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": "newFeeNumerator",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "newfeeReceiverAddress",
          "type": "address"
        }
      ],
      "name": "setFeeParameters",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        }
      ],
      "name": "settleAuction",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "clearingOrder",
          "type": "bytes32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "auctionId",
          "type": "uint256"
        },
        {
          "internalType": "uint96[]",
          "name": "_minBuyAmount",
          "type": "uint96[]"
        },
        {
          "internalType": "uint96[]",
          "name": "_sellAmount",
          "type": "uint96[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "_prevSellOrder",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes",
          "name": "allowListCallData",
          "type": "bytes"
        }
      ],
      "name": "settleAuctionAtomically",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x6093f70c46350202181e9b0edfcf8f0e966ddddeb8b24e8b73dd2ab636c1ce87",
  "receipt": {
    "to": null,
    "from": "0x8AB8530AEe3E5eD7Ecf5D7CA69c903Ed04595094",
    "contractAddress": "0x0b7fFc1f4AD541A4Ed16b40D8c37f0929158D101",
    "transactionIndex": 9,
    "gasUsed": "5135197",
    "logsBloom": "0x00000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000000000000020000000000000000000800000000000000000080100004802000400000000000000000000000000000000400000000000000000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000000000000000100000000020000000000000040000000000000000000000000000000000000000000000100000",
    "blockHash": "0x690253f65244e666a75d1ec45a6c9c9539742872eb52652a56125e04e9ed9af1",
    "transactionHash": "0x6093f70c46350202181e9b0edfcf8f0e966ddddeb8b24e8b73dd2ab636c1ce87",
    "logs": [
      {
        "transactionIndex": 9,
        "blockNumber": 14363322,
        "transactionHash": "0x6093f70c46350202181e9b0edfcf8f0e966ddddeb8b24e8b73dd2ab636c1ce87",
        "address": "0x0b7fFc1f4AD541A4Ed16b40D8c37f0929158D101",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x0000000000000000000000008ab8530aee3e5ed7ecf5d7ca69c903ed04595094"
        ],
        "data": "0x",
        "logIndex": 54,
        "blockHash": "0x690253f65244e666a75d1ec45a6c9c9539742872eb52652a56125e04e9ed9af1"
      },
      {
        "transactionIndex": 9,
        "blockNumber": 14363322,
        "transactionHash": "0x6093f70c46350202181e9b0edfcf8f0e966ddddeb8b24e8b73dd2ab636c1ce87",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x0000000000000000000000008ab8530aee3e5ed7ecf5d7ca69c903ed04595094",
          "0x000000000000000000000000bdbd4347b082d9d6bdf2da4555a37ce52a2e2120"
        ],
        "data": "0x00000000000000000000000000000000000000000000000000123e6f390962000000000000000000000000000000000000000000000000106efec5ba5e390d8700000000000000000000000000000000000000000000003679b743403c1608ea0000000000000000000000000000000000000000000000106eec874b252fab8700000000000000000000000000000000000000000000003679c981af751f6aea",
        "logIndex": 55,
        "blockHash": "0x690253f65244e666a75d1ec45a6c9c9539742872eb52652a56125e04e9ed9af1"
      }
    ],
    "blockNumber": 14363322,
    "cumulativeGasUsed": "6903753",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "solcInputHash": "54d8e702ed65c6e160abb9647d0a5c51",
  "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\":\"soldAuctioningTokens\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"soldBiddingTokens\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"clearingPriceOrder\",\"type\":\"bytes32\"}],\"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\":\"buyAmount\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"sellAmount\",\"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\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"orderCancellationEndDate\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"auctionEndDate\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"_auctionedSellAmount\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"_minBuyAmount\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minimumBiddingAmountPerOrder\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minFundingThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"allowListContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"allowListData\",\"type\":\"bytes\"}],\"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\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"userAddress\",\"type\":\"address\"}],\"name\":\"NewUser\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"auctionAccessData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"auctionAccessManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"orderCancellationEndDate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"auctionEndDate\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"initialAuctionOrder\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"minimumBiddingAmountPerOrder\",\"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\":\"bool\",\"name\":\"minFundingThresholdNotReached\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isAtomicClosureAllowed\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"feeNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minFundingThreshold\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"_sellOrders\",\"type\":\"bytes32[]\"}],\"name\":\"cancelSellOrders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"orders\",\"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\":\"orderCancellationEndDate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"auctionEndDate\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"_auctionedSellAmount\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"_minBuyAmount\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"minimumBiddingAmountPerOrder\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minFundingThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isAtomicClosureAllowed\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"accessManagerContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"accessManagerContractData\",\"type\":\"bytes\"}],\"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\":\"bytes\",\"name\":\"allowListCallData\",\"type\":\"bytes\"}],\"name\":\"placeSellOrders\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"userId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"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\":\"bytes\",\"name\":\"allowListCallData\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"orderSubmitter\",\"type\":\"address\"}],\"name\":\"placeSellOrdersOnBehalf\",\"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\":\"newFeeNumerator\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newfeeReceiverAddress\",\"type\":\"address\"}],\"name\":\"setFeeParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"}],\"name\":\"settleAuction\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"clearingOrder\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"auctionId\",\"type\":\"uint256\"},{\"internalType\":\"uint96[]\",\"name\":\"_minBuyAmount\",\"type\":\"uint96[]\"},{\"internalType\":\"uint96[]\",\"name\":\"_sellAmount\",\"type\":\"uint96[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_prevSellOrder\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"allowListCallData\",\"type\":\"bytes\"}],\"name\":\"settleAuctionAtomically\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"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\":\"pragma solidity >=0.6.8;\\r\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\\\";\\r\\nimport \\\"./libraries/IterableOrderedOrderSet.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/math/Math.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\nimport \\\"./libraries/IdToAddressBiMap.sol\\\";\\r\\nimport \\\"./libraries/SafeCast.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\r\\nimport \\\"./interfaces/AllowListVerifier.sol\\\";\\r\\n\\r\\ncontract EasyAuction is Ownable {\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint64;\\r\\n    using SafeMath for uint96;\\r\\n    using SafeMath for uint256;\\r\\n    using SafeCast for uint256;\\r\\n    using IterableOrderedOrderSet for IterableOrderedOrderSet.Data;\\r\\n    using IterableOrderedOrderSet for bytes32;\\r\\n    using IdToAddressBiMap for IdToAddressBiMap.Data;\\r\\n\\r\\n    modifier atStageOrderPlacement(uint256 auctionId) {\\r\\n        require(\\r\\n            block.timestamp < auctionData[auctionId].auctionEndDate,\\r\\n            \\\"no longer in order placement phase\\\"\\r\\n        );\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    modifier atStageOrderPlacementAndCancelation(uint256 auctionId) {\\r\\n        require(\\r\\n            block.timestamp < auctionData[auctionId].orderCancellationEndDate,\\r\\n            \\\"no longer in order placement and cancelation phase\\\"\\r\\n        );\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    modifier atStageSolutionSubmission(uint256 auctionId) {\\r\\n        {\\r\\n            uint256 auctionEndDate = auctionData[auctionId].auctionEndDate;\\r\\n            require(\\r\\n                auctionEndDate != 0 &&\\r\\n                    block.timestamp >= auctionEndDate &&\\r\\n                    auctionData[auctionId].clearingPriceOrder == bytes32(0),\\r\\n                \\\"Auction not in solution submission phase\\\"\\r\\n            );\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    modifier atStageFinished(uint256 auctionId) {\\r\\n        require(\\r\\n            auctionData[auctionId].clearingPriceOrder != bytes32(0),\\r\\n            \\\"Auction not yet finished\\\"\\r\\n        );\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    event NewSellOrder(\\r\\n        uint256 indexed auctionId,\\r\\n        uint64 indexed userId,\\r\\n        uint96 buyAmount,\\r\\n        uint96 sellAmount\\r\\n    );\\r\\n    event CancellationSellOrder(\\r\\n        uint256 indexed auctionId,\\r\\n        uint64 indexed userId,\\r\\n        uint96 buyAmount,\\r\\n        uint96 sellAmount\\r\\n    );\\r\\n    event ClaimedFromOrder(\\r\\n        uint256 indexed auctionId,\\r\\n        uint64 indexed userId,\\r\\n        uint96 buyAmount,\\r\\n        uint96 sellAmount\\r\\n    );\\r\\n    event NewUser(uint64 indexed userId, address indexed userAddress);\\r\\n    event NewAuction(\\r\\n        uint256 indexed auctionId,\\r\\n        IERC20 indexed _auctioningToken,\\r\\n        IERC20 indexed _biddingToken,\\r\\n        uint256 orderCancellationEndDate,\\r\\n        uint256 auctionEndDate,\\r\\n        uint64 userId,\\r\\n        uint96 _auctionedSellAmount,\\r\\n        uint96 _minBuyAmount,\\r\\n        uint256 minimumBiddingAmountPerOrder,\\r\\n        uint256 minFundingThreshold,\\r\\n        address allowListContract,\\r\\n        bytes allowListData\\r\\n    );\\r\\n    event AuctionCleared(\\r\\n        uint256 indexed auctionId,\\r\\n        uint96 soldAuctioningTokens,\\r\\n        uint96 soldBiddingTokens,\\r\\n        bytes32 clearingPriceOrder\\r\\n    );\\r\\n    event UserRegistration(address indexed user, uint64 userId);\\r\\n\\r\\n    struct AuctionData {\\r\\n        IERC20 auctioningToken;\\r\\n        IERC20 biddingToken;\\r\\n        uint256 orderCancellationEndDate;\\r\\n        uint256 auctionEndDate;\\r\\n        bytes32 initialAuctionOrder;\\r\\n        uint256 minimumBiddingAmountPerOrder;\\r\\n        uint256 interimSumBidAmount;\\r\\n        bytes32 interimOrder;\\r\\n        bytes32 clearingPriceOrder;\\r\\n        uint96 volumeClearingPriceOrder;\\r\\n        bool minFundingThresholdNotReached;\\r\\n        bool isAtomicClosureAllowed;\\r\\n        uint256 feeNumerator;\\r\\n        uint256 minFundingThreshold;\\r\\n    }\\r\\n    mapping(uint256 => IterableOrderedOrderSet.Data) internal sellOrders;\\r\\n    mapping(uint256 => AuctionData) public auctionData;\\r\\n    mapping(uint256 => address) public auctionAccessManager;\\r\\n    mapping(uint256 => bytes) public auctionAccessData;\\r\\n\\r\\n    IdToAddressBiMap.Data private registeredUsers;\\r\\n    uint64 public numUsers;\\r\\n    uint256 public auctionCounter;\\r\\n\\r\\n    constructor() public Ownable() {}\\r\\n\\r\\n    uint256 public feeNumerator = 0;\\r\\n    uint256 public constant FEE_DENOMINATOR = 1000;\\r\\n    uint64 public feeReceiverUserId = 1;\\r\\n\\r\\n    function setFeeParameters(\\r\\n        uint256 newFeeNumerator,\\r\\n        address newfeeReceiverAddress\\r\\n    ) public onlyOwner() {\\r\\n        require(\\r\\n            newFeeNumerator <= 15,\\r\\n            \\\"Fee is not allowed to be set higher than 1.5%\\\"\\r\\n        );\\r\\n        // caution: for currently running auctions, the feeReceiverUserId is changing as well.\\r\\n        feeReceiverUserId = getUserId(newfeeReceiverAddress);\\r\\n        feeNumerator = newFeeNumerator;\\r\\n    }\\r\\n\\r\\n    // @dev: function to intiate a new auction\\r\\n    // Warning: In case the auction is expected to raise more than\\r\\n    // 2^96 units of the biddingToken, don't start the auction, as\\r\\n    // it will not be settlable. This corresponds to about 79\\r\\n    // billion DAI.\\r\\n    //\\r\\n    // Prices between biddingToken and auctioningToken are expressed by a\\r\\n    // fraction whose components are stored as uint96.\\r\\n    function initiateAuction(\\r\\n        IERC20 _auctioningToken,\\r\\n        IERC20 _biddingToken,\\r\\n        uint256 orderCancellationEndDate,\\r\\n        uint256 auctionEndDate,\\r\\n        uint96 _auctionedSellAmount,\\r\\n        uint96 _minBuyAmount,\\r\\n        uint256 minimumBiddingAmountPerOrder,\\r\\n        uint256 minFundingThreshold,\\r\\n        bool isAtomicClosureAllowed,\\r\\n        address accessManagerContract,\\r\\n        bytes memory accessManagerContractData\\r\\n    ) public returns (uint256) {\\r\\n        // withdraws sellAmount + fees\\r\\n        _auctioningToken.safeTransferFrom(\\r\\n            msg.sender,\\r\\n            address(this),\\r\\n            _auctionedSellAmount.mul(FEE_DENOMINATOR.add(feeNumerator)).div(\\r\\n                FEE_DENOMINATOR\\r\\n            ) //[0]\\r\\n        );\\r\\n        require(_auctionedSellAmount > 0, \\\"cannot auction zero tokens\\\");\\r\\n        require(_minBuyAmount > 0, \\\"tokens cannot be auctioned for free\\\");\\r\\n        require(\\r\\n            minimumBiddingAmountPerOrder > 0,\\r\\n            \\\"minimumBiddingAmountPerOrder is not allowed to be zero\\\"\\r\\n        );\\r\\n        require(\\r\\n            orderCancellationEndDate <= auctionEndDate,\\r\\n            \\\"time periods are not configured correctly\\\"\\r\\n        );\\r\\n        require(\\r\\n            auctionEndDate > block.timestamp,\\r\\n            \\\"auction end date must be in the future\\\"\\r\\n        );\\r\\n        auctionCounter = auctionCounter.add(1);\\r\\n        sellOrders[auctionCounter].initializeEmptyList();\\r\\n        uint64 userId = getUserId(msg.sender);\\r\\n        auctionData[auctionCounter] = AuctionData(\\r\\n            _auctioningToken,\\r\\n            _biddingToken,\\r\\n            orderCancellationEndDate,\\r\\n            auctionEndDate,\\r\\n            IterableOrderedOrderSet.encodeOrder(\\r\\n                userId,\\r\\n                _minBuyAmount,\\r\\n                _auctionedSellAmount\\r\\n            ),\\r\\n            minimumBiddingAmountPerOrder,\\r\\n            0,\\r\\n            IterableOrderedOrderSet.QUEUE_START,\\r\\n            bytes32(0),\\r\\n            0,\\r\\n            false,\\r\\n            isAtomicClosureAllowed,\\r\\n            feeNumerator,\\r\\n            minFundingThreshold\\r\\n        );\\r\\n        auctionAccessManager[auctionCounter] = accessManagerContract;\\r\\n        auctionAccessData[auctionCounter] = accessManagerContractData;\\r\\n        emit NewAuction(\\r\\n            auctionCounter,\\r\\n            _auctioningToken,\\r\\n            _biddingToken,\\r\\n            orderCancellationEndDate,\\r\\n            auctionEndDate,\\r\\n            userId,\\r\\n            _auctionedSellAmount,\\r\\n            _minBuyAmount,\\r\\n            minimumBiddingAmountPerOrder,\\r\\n            minFundingThreshold,\\r\\n            accessManagerContract,\\r\\n            accessManagerContractData\\r\\n        );\\r\\n        return auctionCounter;\\r\\n    }\\r\\n\\r\\n    function placeSellOrders(\\r\\n        uint256 auctionId,\\r\\n        uint96[] memory _minBuyAmounts,\\r\\n        uint96[] memory _sellAmounts,\\r\\n        bytes32[] memory _prevSellOrders,\\r\\n        bytes calldata allowListCallData\\r\\n    ) external atStageOrderPlacement(auctionId) returns (uint64 userId) {\\r\\n        return\\r\\n            _placeSellOrders(\\r\\n                auctionId,\\r\\n                _minBuyAmounts,\\r\\n                _sellAmounts,\\r\\n                _prevSellOrders,\\r\\n                allowListCallData,\\r\\n                msg.sender\\r\\n            );\\r\\n    }\\r\\n\\r\\n    function placeSellOrdersOnBehalf(\\r\\n        uint256 auctionId,\\r\\n        uint96[] memory _minBuyAmounts,\\r\\n        uint96[] memory _sellAmounts,\\r\\n        bytes32[] memory _prevSellOrders,\\r\\n        bytes calldata allowListCallData,\\r\\n        address orderSubmitter\\r\\n    ) external atStageOrderPlacement(auctionId) returns (uint64 userId) {\\r\\n        return\\r\\n            _placeSellOrders(\\r\\n                auctionId,\\r\\n                _minBuyAmounts,\\r\\n                _sellAmounts,\\r\\n                _prevSellOrders,\\r\\n                allowListCallData,\\r\\n                orderSubmitter\\r\\n            );\\r\\n    }\\r\\n\\r\\n    function _placeSellOrders(\\r\\n        uint256 auctionId,\\r\\n        uint96[] memory _minBuyAmounts,\\r\\n        uint96[] memory _sellAmounts,\\r\\n        bytes32[] memory _prevSellOrders,\\r\\n        bytes calldata allowListCallData,\\r\\n        address orderSubmitter\\r\\n    ) internal returns (uint64 userId) {\\r\\n        {\\r\\n            address allowListManager = auctionAccessManager[auctionId];\\r\\n            if (allowListManager != address(0)) {\\r\\n                require(\\r\\n                    AllowListVerifier(allowListManager).isAllowed(\\r\\n                        orderSubmitter,\\r\\n                        auctionId,\\r\\n                        allowListCallData\\r\\n                    ) == AllowListVerifierHelper.MAGICVALUE,\\r\\n                    \\\"user not allowed to place order\\\"\\r\\n                );\\r\\n            }\\r\\n        }\\r\\n        {\\r\\n            (\\r\\n                ,\\r\\n                uint96 buyAmountOfInitialAuctionOrder,\\r\\n                uint96 sellAmountOfInitialAuctionOrder\\r\\n            ) = auctionData[auctionId].initialAuctionOrder.decodeOrder();\\r\\n            for (uint256 i = 0; i < _minBuyAmounts.length; i++) {\\r\\n                require(\\r\\n                    _minBuyAmounts[i].mul(buyAmountOfInitialAuctionOrder) <\\r\\n                        sellAmountOfInitialAuctionOrder.mul(_sellAmounts[i]),\\r\\n                    \\\"limit price not better than mimimal offer\\\"\\r\\n                );\\r\\n            }\\r\\n        }\\r\\n        uint256 sumOfSellAmounts = 0;\\r\\n        userId = getUserId(orderSubmitter);\\r\\n        uint256 minimumBiddingAmountPerOrder =\\r\\n            auctionData[auctionId].minimumBiddingAmountPerOrder;\\r\\n        for (uint256 i = 0; i < _minBuyAmounts.length; i++) {\\r\\n            require(\\r\\n                _minBuyAmounts[i] > 0,\\r\\n                \\\"_minBuyAmounts must be greater than 0\\\"\\r\\n            );\\r\\n            // orders should have a minimum bid size in order to limit the gas\\r\\n            // required to compute the final price of the auction.\\r\\n            require(\\r\\n                _sellAmounts[i] > minimumBiddingAmountPerOrder,\\r\\n                \\\"order too small\\\"\\r\\n            );\\r\\n            if (\\r\\n                sellOrders[auctionId].insert(\\r\\n                    IterableOrderedOrderSet.encodeOrder(\\r\\n                        userId,\\r\\n                        _minBuyAmounts[i],\\r\\n                        _sellAmounts[i]\\r\\n                    ),\\r\\n                    _prevSellOrders[i]\\r\\n                )\\r\\n            ) {\\r\\n                sumOfSellAmounts = sumOfSellAmounts.add(_sellAmounts[i]);\\r\\n                emit NewSellOrder(\\r\\n                    auctionId,\\r\\n                    userId,\\r\\n                    _minBuyAmounts[i],\\r\\n                    _sellAmounts[i]\\r\\n                );\\r\\n            }\\r\\n        }\\r\\n        auctionData[auctionId].biddingToken.safeTransferFrom(\\r\\n            msg.sender,\\r\\n            address(this),\\r\\n            sumOfSellAmounts\\r\\n        ); //[1]\\r\\n    }\\r\\n\\r\\n    function cancelSellOrders(uint256 auctionId, bytes32[] memory _sellOrders)\\r\\n        public\\r\\n        atStageOrderPlacementAndCancelation(auctionId)\\r\\n    {\\r\\n        uint64 userId = getUserId(msg.sender);\\r\\n        uint256 claimableAmount = 0;\\r\\n        for (uint256 i = 0; i < _sellOrders.length; i++) {\\r\\n            // Note: we keep the back pointer of the deleted element so that\\r\\n            // it can be used as a reference point to insert a new node.\\r\\n            bool success =\\r\\n                sellOrders[auctionId].removeKeepHistory(_sellOrders[i]);\\r\\n            if (success) {\\r\\n                (\\r\\n                    uint64 userIdOfIter,\\r\\n                    uint96 buyAmountOfIter,\\r\\n                    uint96 sellAmountOfIter\\r\\n                ) = _sellOrders[i].decodeOrder();\\r\\n                require(\\r\\n                    userIdOfIter == userId,\\r\\n                    \\\"Only the user can cancel his orders\\\"\\r\\n                );\\r\\n                claimableAmount = claimableAmount.add(sellAmountOfIter);\\r\\n                emit CancellationSellOrder(\\r\\n                    auctionId,\\r\\n                    userId,\\r\\n                    buyAmountOfIter,\\r\\n                    sellAmountOfIter\\r\\n                );\\r\\n            }\\r\\n        }\\r\\n        auctionData[auctionId].biddingToken.safeTransfer(\\r\\n            msg.sender,\\r\\n            claimableAmount\\r\\n        ); //[2]\\r\\n    }\\r\\n\\r\\n    function precalculateSellAmountSum(\\r\\n        uint256 auctionId,\\r\\n        uint256 iterationSteps\\r\\n    ) public atStageSolutionSubmission(auctionId) {\\r\\n        (, , uint96 auctioneerSellAmount) =\\r\\n            auctionData[auctionId].initialAuctionOrder.decodeOrder();\\r\\n        uint256 sumBidAmount = auctionData[auctionId].interimSumBidAmount;\\r\\n        bytes32 iterOrder = auctionData[auctionId].interimOrder;\\r\\n\\r\\n        for (uint256 i = 0; i < iterationSteps; i++) {\\r\\n            iterOrder = sellOrders[auctionId].next(iterOrder);\\r\\n            (, , uint96 sellAmountOfIter) = iterOrder.decodeOrder();\\r\\n            sumBidAmount = sumBidAmount.add(sellAmountOfIter);\\r\\n        }\\r\\n\\r\\n        require(\\r\\n            iterOrder != IterableOrderedOrderSet.QUEUE_END,\\r\\n            \\\"reached end of order list\\\"\\r\\n        );\\r\\n\\r\\n        // it is checked that not too many iteration steps were taken:\\r\\n        // require that the sum of SellAmounts times the price of the last order\\r\\n        // is not more than initially sold amount\\r\\n        (, uint96 buyAmountOfIter, uint96 sellAmountOfIter) =\\r\\n            iterOrder.decodeOrder();\\r\\n        require(\\r\\n            sumBidAmount.mul(buyAmountOfIter) <\\r\\n                auctioneerSellAmount.mul(sellAmountOfIter),\\r\\n            \\\"too many orders summed up\\\"\\r\\n        );\\r\\n\\r\\n        auctionData[auctionId].interimSumBidAmount = sumBidAmount;\\r\\n        auctionData[auctionId].interimOrder = iterOrder;\\r\\n    }\\r\\n\\r\\n    function settleAuctionAtomically(\\r\\n        uint256 auctionId,\\r\\n        uint96[] memory _minBuyAmount,\\r\\n        uint96[] memory _sellAmount,\\r\\n        bytes32[] memory _prevSellOrder,\\r\\n        bytes calldata allowListCallData\\r\\n    ) public atStageSolutionSubmission(auctionId) {\\r\\n        require(\\r\\n            auctionData[auctionId].isAtomicClosureAllowed,\\r\\n            \\\"not allowed to settle auction atomically\\\"\\r\\n        );\\r\\n        require(\\r\\n            _minBuyAmount.length == 1 && _sellAmount.length == 1,\\r\\n            \\\"Only one order can be placed atomically\\\"\\r\\n        );\\r\\n        uint64 userId = getUserId(msg.sender);\\r\\n        require(\\r\\n            auctionData[auctionId].interimOrder.smallerThan(\\r\\n                IterableOrderedOrderSet.encodeOrder(\\r\\n                    userId,\\r\\n                    _minBuyAmount[0],\\r\\n                    _sellAmount[0]\\r\\n                )\\r\\n            ),\\r\\n            \\\"precalculateSellAmountSum is already too advanced\\\"\\r\\n        );\\r\\n        _placeSellOrders(\\r\\n            auctionId,\\r\\n            _minBuyAmount,\\r\\n            _sellAmount,\\r\\n            _prevSellOrder,\\r\\n            allowListCallData,\\r\\n            msg.sender\\r\\n        );\\r\\n        settleAuction(auctionId);\\r\\n    }\\r\\n\\r\\n    // @dev function settling the auction and calculating the price\\r\\n    function settleAuction(uint256 auctionId)\\r\\n        public\\r\\n        atStageSolutionSubmission(auctionId)\\r\\n        returns (bytes32 clearingOrder)\\r\\n    {\\r\\n        (\\r\\n            uint64 auctioneerId,\\r\\n            uint96 minAuctionedBuyAmount,\\r\\n            uint96 fullAuctionedAmount\\r\\n        ) = auctionData[auctionId].initialAuctionOrder.decodeOrder();\\r\\n\\r\\n        uint256 currentBidSum = auctionData[auctionId].interimSumBidAmount;\\r\\n        bytes32 currentOrder = auctionData[auctionId].interimOrder;\\r\\n        uint256 buyAmountOfIter;\\r\\n        uint256 sellAmountOfIter;\\r\\n        uint96 fillVolumeOfAuctioneerOrder = fullAuctionedAmount;\\r\\n        // Sum order up, until fullAuctionedAmount is fully bought or queue end is reached\\r\\n        do {\\r\\n            bytes32 nextOrder = sellOrders[auctionId].next(currentOrder);\\r\\n            if (nextOrder == IterableOrderedOrderSet.QUEUE_END) {\\r\\n                break;\\r\\n            }\\r\\n            currentOrder = nextOrder;\\r\\n            (, buyAmountOfIter, sellAmountOfIter) = currentOrder.decodeOrder();\\r\\n            currentBidSum = currentBidSum.add(sellAmountOfIter);\\r\\n        } while (\\r\\n            currentBidSum.mul(buyAmountOfIter) <\\r\\n                fullAuctionedAmount.mul(sellAmountOfIter)\\r\\n        );\\r\\n\\r\\n        if (\\r\\n            currentBidSum > 0 &&\\r\\n            currentBidSum.mul(buyAmountOfIter) >=\\r\\n            fullAuctionedAmount.mul(sellAmountOfIter)\\r\\n        ) {\\r\\n            // All considered/summed orders are sufficient to close the auction fully\\r\\n            // at price between current and previous orders.\\r\\n            uint256 uncoveredBids =\\r\\n                currentBidSum.sub(\\r\\n                    fullAuctionedAmount.mul(sellAmountOfIter).div(\\r\\n                        buyAmountOfIter\\r\\n                    )\\r\\n                );\\r\\n\\r\\n            if (sellAmountOfIter >= uncoveredBids) {\\r\\n                //[13]\\r\\n                // Auction fully filled via partial match of currentOrder\\r\\n                uint256 sellAmountClearingOrder =\\r\\n                    sellAmountOfIter.sub(uncoveredBids);\\r\\n                auctionData[auctionId]\\r\\n                    .volumeClearingPriceOrder = sellAmountClearingOrder\\r\\n                    .toUint96();\\r\\n                currentBidSum = currentBidSum.sub(uncoveredBids);\\r\\n                clearingOrder = currentOrder;\\r\\n            } else {\\r\\n                //[14]\\r\\n                // Auction fully filled via price strictly between currentOrder and the order\\r\\n                // immediately before. For a proof, see the security-considerations.md\\r\\n                currentBidSum = currentBidSum.sub(sellAmountOfIter);\\r\\n                clearingOrder = IterableOrderedOrderSet.encodeOrder(\\r\\n                    0,\\r\\n                    fullAuctionedAmount,\\r\\n                    currentBidSum.toUint96()\\r\\n                );\\r\\n            }\\r\\n        } else {\\r\\n            // All considered/summed orders are not sufficient to close the auction fully at price of last order //[18]\\r\\n            // Either a higher price must be used or auction is only partially filled\\r\\n\\r\\n            if (currentBidSum > minAuctionedBuyAmount) {\\r\\n                //[15]\\r\\n                // Price higher than last order would fill the auction\\r\\n                clearingOrder = IterableOrderedOrderSet.encodeOrder(\\r\\n                    0,\\r\\n                    fullAuctionedAmount,\\r\\n                    currentBidSum.toUint96()\\r\\n                );\\r\\n            } else {\\r\\n                //[16]\\r\\n                // Even at the initial auction price, the auction is partially filled\\r\\n                clearingOrder = IterableOrderedOrderSet.encodeOrder(\\r\\n                    0,\\r\\n                    fullAuctionedAmount,\\r\\n                    minAuctionedBuyAmount\\r\\n                );\\r\\n                fillVolumeOfAuctioneerOrder = currentBidSum\\r\\n                    .mul(fullAuctionedAmount)\\r\\n                    .div(minAuctionedBuyAmount)\\r\\n                    .toUint96();\\r\\n            }\\r\\n        }\\r\\n        auctionData[auctionId].clearingPriceOrder = clearingOrder;\\r\\n\\r\\n        if (auctionData[auctionId].minFundingThreshold > currentBidSum) {\\r\\n            auctionData[auctionId].minFundingThresholdNotReached = true;\\r\\n        }\\r\\n        processFeesAndAuctioneerFunds(\\r\\n            auctionId,\\r\\n            fillVolumeOfAuctioneerOrder,\\r\\n            auctioneerId,\\r\\n            fullAuctionedAmount\\r\\n        );\\r\\n        emit AuctionCleared(\\r\\n            auctionId,\\r\\n            fillVolumeOfAuctioneerOrder,\\r\\n            uint96(currentBidSum),\\r\\n            clearingOrder\\r\\n        );\\r\\n        // Gas refunds\\r\\n        auctionAccessManager[auctionId] = address(0);\\r\\n        delete auctionAccessData[auctionId];\\r\\n        auctionData[auctionId].initialAuctionOrder = bytes32(0);\\r\\n        auctionData[auctionId].interimOrder = bytes32(0);\\r\\n        auctionData[auctionId].interimSumBidAmount = uint256(0);\\r\\n        auctionData[auctionId].minimumBiddingAmountPerOrder = uint256(0);\\r\\n    }\\r\\n\\r\\n    function claimFromParticipantOrder(\\r\\n        uint256 auctionId,\\r\\n        bytes32[] memory orders\\r\\n    )\\r\\n        public\\r\\n        atStageFinished(auctionId)\\r\\n        returns (\\r\\n            uint256 sumAuctioningTokenAmount,\\r\\n            uint256 sumBiddingTokenAmount\\r\\n        )\\r\\n    {\\r\\n        for (uint256 i = 0; i < orders.length; i++) {\\r\\n            // Note: we don't need to keep any information about the node since\\r\\n            // no new elements need to be inserted.\\r\\n            require(\\r\\n                sellOrders[auctionId].remove(orders[i]),\\r\\n                \\\"order is no longer claimable\\\"\\r\\n            );\\r\\n        }\\r\\n        AuctionData memory auction = auctionData[auctionId];\\r\\n        (, uint96 priceNumerator, uint96 priceDenominator) =\\r\\n            auction.clearingPriceOrder.decodeOrder();\\r\\n        (uint64 userId, , ) = orders[0].decodeOrder();\\r\\n        bool minFundingThresholdNotReached =\\r\\n            auctionData[auctionId].minFundingThresholdNotReached;\\r\\n        for (uint256 i = 0; i < orders.length; i++) {\\r\\n            (uint64 userIdOrder, uint96 buyAmount, uint96 sellAmount) =\\r\\n                orders[i].decodeOrder();\\r\\n            require(\\r\\n                userIdOrder == userId,\\r\\n                \\\"only allowed to claim for same user\\\"\\r\\n            );\\r\\n            if (minFundingThresholdNotReached) {\\r\\n                //[10]\\r\\n                sumBiddingTokenAmount = sumBiddingTokenAmount.add(sellAmount);\\r\\n            } else {\\r\\n                //[23]\\r\\n                if (orders[i] == auction.clearingPriceOrder) {\\r\\n                    //[25]\\r\\n                    sumAuctioningTokenAmount = sumAuctioningTokenAmount.add(\\r\\n                        auction\\r\\n                            .volumeClearingPriceOrder\\r\\n                            .mul(priceNumerator)\\r\\n                            .div(priceDenominator)\\r\\n                    );\\r\\n                    sumBiddingTokenAmount = sumBiddingTokenAmount.add(\\r\\n                        sellAmount.sub(auction.volumeClearingPriceOrder)\\r\\n                    );\\r\\n                } else {\\r\\n                    if (orders[i].smallerThan(auction.clearingPriceOrder)) {\\r\\n                        //[17]\\r\\n                        sumAuctioningTokenAmount = sumAuctioningTokenAmount.add(\\r\\n                            sellAmount.mul(priceNumerator).div(priceDenominator)\\r\\n                        );\\r\\n                    } else {\\r\\n                        //[24]\\r\\n                        sumBiddingTokenAmount = sumBiddingTokenAmount.add(\\r\\n                            sellAmount\\r\\n                        );\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            emit ClaimedFromOrder(auctionId, userId, buyAmount, sellAmount);\\r\\n        }\\r\\n        sendOutTokens(\\r\\n            auctionId,\\r\\n            sumAuctioningTokenAmount,\\r\\n            sumBiddingTokenAmount,\\r\\n            userId\\r\\n        ); //[3]\\r\\n    }\\r\\n\\r\\n    function processFeesAndAuctioneerFunds(\\r\\n        uint256 auctionId,\\r\\n        uint256 fillVolumeOfAuctioneerOrder,\\r\\n        uint64 auctioneerId,\\r\\n        uint96 fullAuctionedAmount\\r\\n    ) internal {\\r\\n        uint256 feeAmount =\\r\\n            fullAuctionedAmount.mul(auctionData[auctionId].feeNumerator).div(\\r\\n                FEE_DENOMINATOR\\r\\n            ); //[20]\\r\\n        if (auctionData[auctionId].minFundingThresholdNotReached) {\\r\\n            sendOutTokens(\\r\\n                auctionId,\\r\\n                fullAuctionedAmount.add(feeAmount),\\r\\n                0,\\r\\n                auctioneerId\\r\\n            ); //[4]\\r\\n        } else {\\r\\n            //[11]\\r\\n            (, uint96 priceNumerator, uint96 priceDenominator) =\\r\\n                auctionData[auctionId].clearingPriceOrder.decodeOrder();\\r\\n            uint256 unsettledAuctionTokens =\\r\\n                fullAuctionedAmount.sub(fillVolumeOfAuctioneerOrder);\\r\\n            uint256 auctioningTokenAmount =\\r\\n                unsettledAuctionTokens.add(\\r\\n                    feeAmount.mul(unsettledAuctionTokens).div(\\r\\n                        fullAuctionedAmount\\r\\n                    )\\r\\n                );\\r\\n            uint256 biddingTokenAmount =\\r\\n                fillVolumeOfAuctioneerOrder.mul(priceDenominator).div(\\r\\n                    priceNumerator\\r\\n                );\\r\\n            sendOutTokens(\\r\\n                auctionId,\\r\\n                auctioningTokenAmount,\\r\\n                biddingTokenAmount,\\r\\n                auctioneerId\\r\\n            ); //[5]\\r\\n            sendOutTokens(\\r\\n                auctionId,\\r\\n                feeAmount.mul(fillVolumeOfAuctioneerOrder).div(\\r\\n                    fullAuctionedAmount\\r\\n                ),\\r\\n                0,\\r\\n                feeReceiverUserId\\r\\n            ); //[7]\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function sendOutTokens(\\r\\n        uint256 auctionId,\\r\\n        uint256 auctioningTokenAmount,\\r\\n        uint256 biddingTokenAmount,\\r\\n        uint64 userId\\r\\n    ) internal {\\r\\n        address userAddress = registeredUsers.getAddressAt(userId);\\r\\n        if (auctioningTokenAmount > 0) {\\r\\n            auctionData[auctionId].auctioningToken.safeTransfer(\\r\\n                userAddress,\\r\\n                auctioningTokenAmount\\r\\n            );\\r\\n        }\\r\\n        if (biddingTokenAmount > 0) {\\r\\n            auctionData[auctionId].biddingToken.safeTransfer(\\r\\n                userAddress,\\r\\n                biddingTokenAmount\\r\\n            );\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function registerUser(address user) public returns (uint64 userId) {\\r\\n        numUsers = numUsers.add(1).toUint64();\\r\\n        require(\\r\\n            registeredUsers.insert(numUsers, user),\\r\\n            \\\"User already registered\\\"\\r\\n        );\\r\\n        userId = numUsers;\\r\\n        emit UserRegistration(user, userId);\\r\\n    }\\r\\n\\r\\n    function getUserId(address user) public returns (uint64 userId) {\\r\\n        if (registeredUsers.hasAddress(user)) {\\r\\n            userId = registeredUsers.getId(user);\\r\\n        } else {\\r\\n            userId = registerUser(user);\\r\\n            emit NewUser(userId, user);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function getSecondsRemainingInBatch(uint256 auctionId)\\r\\n        public\\r\\n        view\\r\\n        returns (uint256)\\r\\n    {\\r\\n        if (auctionData[auctionId].auctionEndDate < block.timestamp) {\\r\\n            return 0;\\r\\n        }\\r\\n        return auctionData[auctionId].auctionEndDate.sub(block.timestamp);\\r\\n    }\\r\\n\\r\\n    function containsOrder(uint256 auctionId, bytes32 order)\\r\\n        public\\r\\n        view\\r\\n        returns (bool)\\r\\n    {\\r\\n        return sellOrders[auctionId].contains(order);\\r\\n    }\\r\\n}\\r\\n\",\"keccak256\":\"0x7031506156d44cb54341486d9aab7d7cbe3b797897749e036ac62a92165e249f\"},\"contracts/interfaces/AllowListVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-or-later\\r\\npragma solidity >=0.6.8;\\r\\n\\r\\nlibrary AllowListVerifierHelper {\\r\\n    /// @dev Value returned by a call to `isAllowed` if the check\\r\\n    /// was successful. The value is defined as:\\r\\n    /// bytes4(keccak256(\\\"isAllowed(address,uint256,bytes)\\\"))\\r\\n    bytes4 internal constant MAGICVALUE = 0x19a05a7e;\\r\\n}\\r\\n\\r\\n///\\r\\n/// @dev Standardized interface for an allowList manager for easyAuction\\r\\n/// The interface was inspired by EIP-1271\\r\\ninterface AllowListVerifier {\\r\\n    /// @dev Should return whether the a specific user has access to an auction\\r\\n    /// by returning the magic value from AllowListVerifierHelper\\r\\n    function isAllowed(\\r\\n        address user,\\r\\n        uint256 auctionId,\\r\\n        bytes calldata callData\\r\\n    ) external view returns (bytes4);\\r\\n}\\r\\n\",\"keccak256\":\"0xe646b09ca1a8756d2b10c4d50370cecb6a88c4c63bf56a5f83af3794c7f41a80\",\"license\":\"LGPL-3.0-or-later\"},\"contracts/libraries/IdToAddressBiMap.sol\":{\"content\":\"pragma solidity ^0.6.0;\\r\\n\\r\\n///////////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n// Contract does not have test coverage, as it was nearly copied from:\\r\\n// https://github.com/gnosis/solidity-data-structures/blob/master/contracts/libraries/IdToAddressBiMap.sol\\r\\n// The only change is uint16 -> uint64\\r\\n///////////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n\\r\\nlibrary IdToAddressBiMap {\\r\\n    struct Data {\\r\\n        mapping(uint64 => address) idToAddress;\\r\\n        mapping(address => uint64) addressToId;\\r\\n    }\\r\\n\\r\\n    function hasId(Data storage self, uint64 id) internal view returns (bool) {\\r\\n        return self.idToAddress[id + 1] != address(0);\\r\\n    }\\r\\n\\r\\n    function hasAddress(Data storage self, address addr)\\r\\n        internal\\r\\n        view\\r\\n        returns (bool)\\r\\n    {\\r\\n        return self.addressToId[addr] != 0;\\r\\n    }\\r\\n\\r\\n    function getAddressAt(Data storage self, uint64 id)\\r\\n        internal\\r\\n        view\\r\\n        returns (address)\\r\\n    {\\r\\n        require(hasId(self, id), \\\"Must have ID to get Address\\\");\\r\\n        return self.idToAddress[id + 1];\\r\\n    }\\r\\n\\r\\n    function getId(Data storage self, address addr)\\r\\n        internal\\r\\n        view\\r\\n        returns (uint64)\\r\\n    {\\r\\n        require(hasAddress(self, addr), \\\"Must have Address to get ID\\\");\\r\\n        return self.addressToId[addr] - 1;\\r\\n    }\\r\\n\\r\\n    function insert(\\r\\n        Data storage self,\\r\\n        uint64 id,\\r\\n        address addr\\r\\n    ) internal returns (bool) {\\r\\n        require(addr != address(0), \\\"Cannot insert zero address\\\");\\r\\n        require(id != uint64(-1), \\\"Cannot insert max uint64\\\");\\r\\n        // Ensure bijectivity of the mappings\\r\\n        if (\\r\\n            self.addressToId[addr] != 0 ||\\r\\n            self.idToAddress[id + 1] != address(0)\\r\\n        ) {\\r\\n            return false;\\r\\n        }\\r\\n        self.idToAddress[id + 1] = addr;\\r\\n        self.addressToId[addr] = id + 1;\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\",\"keccak256\":\"0x44c23c11087ac487704504e99658ae1303d1cad5d5ba0b171a61adf04e2cd5ea\"},\"contracts/libraries/IterableOrderedOrderSet.sol\":{\"content\":\"pragma solidity >=0.6.8;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\r\\n\\r\\nlibrary IterableOrderedOrderSet {\\r\\n    using SafeMath for uint96;\\r\\n    using IterableOrderedOrderSet for bytes32;\\r\\n\\r\\n    // represents smallest possible value for an order under comparison of fn smallerThan()\\r\\n    bytes32 internal constant QUEUE_START =\\r\\n        0x0000000000000000000000000000000000000000000000000000000000000001;\\r\\n    // represents highest possible value for an order under comparison of fn smallerThan()\\r\\n    bytes32 internal constant QUEUE_END =\\r\\n        0xffffffffffffffffffffffffffffffffffffffff000000000000000000000001;\\r\\n\\r\\n    /// The struct is used to implement a modified version of a doubly linked\\r\\n    /// list with sorted elements. The list starts from QUEUE_START to\\r\\n    /// QUEUE_END, and each node keeps track of its predecessor and successor.\\r\\n    /// Nodes can be added or removed.\\r\\n    ///\\r\\n    /// `next` and `prev` have a different role. The list is supposed to be\\r\\n    /// traversed with `next`. If `next` is empty, the node is not part of the\\r\\n    /// list. However, `prev` might be set for elements that are not in the\\r\\n    /// list, which is why it should not be used for traversing. Having a `prev`\\r\\n    /// set for elements not in the list is used to keep track of the history of\\r\\n    /// the position in the list of a removed element.\\r\\n    struct Data {\\r\\n        mapping(bytes32 => bytes32) nextMap;\\r\\n        mapping(bytes32 => bytes32) prevMap;\\r\\n    }\\r\\n\\r\\n    struct Order {\\r\\n        uint64 owner;\\r\\n        uint96 buyAmount;\\r\\n        uint96 sellAmount;\\r\\n    }\\r\\n\\r\\n    function initializeEmptyList(Data storage self) internal {\\r\\n        self.nextMap[QUEUE_START] = QUEUE_END;\\r\\n        self.prevMap[QUEUE_END] = QUEUE_START;\\r\\n    }\\r\\n\\r\\n    function isEmpty(Data storage self) internal view returns (bool) {\\r\\n        return self.nextMap[QUEUE_START] == QUEUE_END;\\r\\n    }\\r\\n\\r\\n    function insert(\\r\\n        Data storage self,\\r\\n        bytes32 elementToInsert,\\r\\n        bytes32 elementBeforeNewOne\\r\\n    ) internal returns (bool) {\\r\\n        (, , uint96 denominator) = decodeOrder(elementToInsert);\\r\\n        require(denominator != uint96(0), \\\"Inserting zero is not supported\\\");\\r\\n        require(\\r\\n            elementToInsert != QUEUE_START && elementToInsert != QUEUE_END,\\r\\n            \\\"Inserting element is not valid\\\"\\r\\n        );\\r\\n        if (contains(self, elementToInsert)) {\\r\\n            return false;\\r\\n        }\\r\\n        if (\\r\\n            elementBeforeNewOne != QUEUE_START &&\\r\\n            self.prevMap[elementBeforeNewOne] == bytes32(0)\\r\\n        ) {\\r\\n            return false;\\r\\n        }\\r\\n        if (!elementBeforeNewOne.smallerThan(elementToInsert)) {\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        // `elementBeforeNewOne` might have been removed during the time it\\r\\n        // took to the transaction calling this function to be mined, so\\r\\n        // the new order cannot be appended directly to this. We follow the\\r\\n        // history of previous links backwards until we find an element in\\r\\n        // the list from which to start our search.\\r\\n        // Note that following the link backwards returns elements that are\\r\\n        // before `elementBeforeNewOne` in sorted order.\\r\\n        while (self.nextMap[elementBeforeNewOne] == bytes32(0)) {\\r\\n            elementBeforeNewOne = self.prevMap[elementBeforeNewOne];\\r\\n        }\\r\\n\\r\\n        // `elementBeforeNewOne` belongs now to the linked list. We search the\\r\\n        // largest entry that is smaller than the element to insert.\\r\\n        bytes32 previous;\\r\\n        bytes32 current = elementBeforeNewOne;\\r\\n        do {\\r\\n            previous = current;\\r\\n            current = self.nextMap[current];\\r\\n        } while (current.smallerThan(elementToInsert));\\r\\n        // Note: previous < elementToInsert < current\\r\\n        self.nextMap[previous] = elementToInsert;\\r\\n        self.prevMap[current] = elementToInsert;\\r\\n        self.prevMap[elementToInsert] = previous;\\r\\n        self.nextMap[elementToInsert] = current;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    /// The element is removed from the linked list, but the node retains\\r\\n    /// information on which predecessor it had, so that a node in the chain\\r\\n    /// can be reached by following the predecessor chain of deleted elements.\\r\\n    function removeKeepHistory(Data storage self, bytes32 elementToRemove)\\r\\n        internal\\r\\n        returns (bool)\\r\\n    {\\r\\n        if (!contains(self, elementToRemove)) {\\r\\n            return false;\\r\\n        }\\r\\n        bytes32 previousElement = self.prevMap[elementToRemove];\\r\\n        bytes32 nextElement = self.nextMap[elementToRemove];\\r\\n        self.nextMap[previousElement] = nextElement;\\r\\n        self.prevMap[nextElement] = previousElement;\\r\\n        self.nextMap[elementToRemove] = bytes32(0);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    /// Remove an element from the chain, clearing all related storage.\\r\\n    /// Note that no elements should be inserted using as a reference point a\\r\\n    /// node deleted after calling `remove`, since an element in the `prev`\\r\\n    /// chain might be missing.\\r\\n    function remove(Data storage self, bytes32 elementToRemove)\\r\\n        internal\\r\\n        returns (bool)\\r\\n    {\\r\\n        bool result = removeKeepHistory(self, elementToRemove);\\r\\n        if (result) {\\r\\n            self.prevMap[elementToRemove] = bytes32(0);\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    function contains(Data storage self, bytes32 value)\\r\\n        internal\\r\\n        view\\r\\n        returns (bool)\\r\\n    {\\r\\n        if (value == QUEUE_START) {\\r\\n            return false;\\r\\n        }\\r\\n        // Note: QUEUE_END is not contained in the list since it has no\\r\\n        // successor.\\r\\n        return self.nextMap[value] != bytes32(0);\\r\\n    }\\r\\n\\r\\n    // @dev orders are ordered by\\r\\n    // 1. their price - buyAmount/sellAmount\\r\\n    // 2. by the sellAmount\\r\\n    // 3. their userId,\\r\\n    function smallerThan(bytes32 orderLeft, bytes32 orderRight)\\r\\n        internal\\r\\n        pure\\r\\n        returns (bool)\\r\\n    {\\r\\n        (\\r\\n            uint64 userIdLeft,\\r\\n            uint96 priceNumeratorLeft,\\r\\n            uint96 priceDenominatorLeft\\r\\n        ) = decodeOrder(orderLeft);\\r\\n        (\\r\\n            uint64 userIdRight,\\r\\n            uint96 priceNumeratorRight,\\r\\n            uint96 priceDenominatorRight\\r\\n        ) = decodeOrder(orderRight);\\r\\n\\r\\n        if (\\r\\n            priceNumeratorLeft.mul(priceDenominatorRight) <\\r\\n            priceNumeratorRight.mul(priceDenominatorLeft)\\r\\n        ) return true;\\r\\n        if (\\r\\n            priceNumeratorLeft.mul(priceDenominatorRight) >\\r\\n            priceNumeratorRight.mul(priceDenominatorLeft)\\r\\n        ) return false;\\r\\n\\r\\n        if (priceNumeratorLeft < priceNumeratorRight) return true;\\r\\n        if (priceNumeratorLeft > priceNumeratorRight) return false;\\r\\n        require(\\r\\n            userIdLeft != userIdRight,\\r\\n            \\\"user is not allowed to place same order twice\\\"\\r\\n        );\\r\\n        if (userIdLeft < userIdRight) {\\r\\n            return true;\\r\\n        }\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    function first(Data storage self) internal view returns (bytes32) {\\r\\n        require(!isEmpty(self), \\\"Trying to get first from empty set\\\");\\r\\n        return self.nextMap[QUEUE_START];\\r\\n    }\\r\\n\\r\\n    function next(Data storage self, bytes32 value)\\r\\n        internal\\r\\n        view\\r\\n        returns (bytes32)\\r\\n    {\\r\\n        require(value != QUEUE_END, \\\"Trying to get next of last element\\\");\\r\\n        bytes32 nextElement = self.nextMap[value];\\r\\n        require(\\r\\n            nextElement != bytes32(0),\\r\\n            \\\"Trying to get next of non-existent element\\\"\\r\\n        );\\r\\n        return nextElement;\\r\\n    }\\r\\n\\r\\n    function decodeOrder(bytes32 _orderData)\\r\\n        internal\\r\\n        pure\\r\\n        returns (\\r\\n            uint64 userId,\\r\\n            uint96 buyAmount,\\r\\n            uint96 sellAmount\\r\\n        )\\r\\n    {\\r\\n        // Note: converting to uint discards the binary digits that do not fit\\r\\n        // the type.\\r\\n        userId = uint64(uint256(_orderData) >> 192);\\r\\n        buyAmount = uint96(uint256(_orderData) >> 96);\\r\\n        sellAmount = uint96(uint256(_orderData));\\r\\n    }\\r\\n\\r\\n    function encodeOrder(\\r\\n        uint64 userId,\\r\\n        uint96 buyAmount,\\r\\n        uint96 sellAmount\\r\\n    ) internal pure returns (bytes32) {\\r\\n        return\\r\\n            bytes32(\\r\\n                (uint256(userId) << 192) +\\r\\n                    (uint256(buyAmount) << 96) +\\r\\n                    uint256(sellAmount)\\r\\n            );\\r\\n    }\\r\\n}\\r\\n\",\"keccak256\":\"0x9510258dca14a3327710d516a1b5c0e7147e20ac8f5a29a98048d97878ff1dac\"},\"contracts/libraries/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Logic was copied and modified from here: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/SafeCast.sol\\r\\n */\\r\\nlibrary SafeCast {\\r\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\r\\n        require(value < 2**96, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\r\\n        return uint96(value);\\r\\n    }\\r\\n\\r\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\r\\n        require(value < 2**64, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\r\\n        return uint64(value);\\r\\n    }\\r\\n}\\r\\n\",\"keccak256\":\"0xe9d43c6764bad8042246919c329bb1cf5385ba190374f64f135982b8d1c0bbdd\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x608060405260006009556001600a60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055503480156200004057600080fd5b50600062000053620000f760201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620000ff565b600033905090565b615b6e806200010f6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637882deaf116100c3578063d73792a91161007c578063d73792a914610ccf578063e4a59ef414610ced578063e86dea4a14610d45578063ec20d0bb14610d63578063f2fde38b14610fe0578063f59c2f061461102457610158565b80637882deaf146106425780637ed18b701461071f5780638da5cb5b146107e157806391cfc1d414610815578063a7e7664414610a54578063d225269c14610a7257610158565b80633e12905f116101155780633e12905f1461046157806340b20b091461049957806355fc62d2146104e75780635cefb291146105c257806363c699a4146105ea578063715018a61461063857610158565b80630a4cd6c91461015d57806315d37b4b146102f157806319a50f49146103335780632199d5cd1461035b5780632b956ff7146103bd5780632e9936111461041f575b600080fd5b6102db600480360361016081101561017457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080356bffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561025557600080fd5b82018360208201111561026757600080fd5b8035906020019184600183028401116401000000008311171561028957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506110cb565b6040518082815260200191505060405180910390f35b61031d6004803603602081101561030757600080fd5b810190808035906020019092919050505061178a565b6040518082815260200191505060405180910390f35b61033b6117e4565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61039d6004803603602081101561037157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117fe565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6103ff600480360360208110156103d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611978565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61044b6004803603602081101561043557600080fd5b8101908080359060200190929190505050611a0d565b6040518082815260200191505060405180910390f35b6104976004803603604081101561047757600080fd5b810190808035906020019092919080359060200190929190505050611fb4565b005b6104e5600480360360408110156104af57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122d6565b005b610513600480360360208110156104fd57600080fd5b8101908080359060200190929190505050612434565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a8152602001898152602001888152602001878152602001866bffffffffffffffffffffffff168152602001851515815260200184151581526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b6105ca612512565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6106206004803603604081101561060057600080fd5b81019080803590602001909291908035906020019092919050505061252c565b60405180821515815260200191505060405180910390f35b61064061255b565b005b6107026004803603604081101561065857600080fd5b81019080803590602001909291908035906020019064010000000081111561067f57600080fd5b82018360208201111561069157600080fd5b803590602001918460208302840111640100000000831117156106b357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506126e1565b604051808381526020018281526020019250505060405180910390f35b6107df6004803603604081101561073557600080fd5b81019080803590602001909291908035906020019064010000000081111561075c57600080fd5b82018360208201111561076e57600080fd5b8035906020019184602083028401116401000000008311171561079057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612d2d565b005b6107e9612f90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a52600480360360a081101561082b57600080fd5b81019080803590602001909291908035906020019064010000000081111561085257600080fd5b82018360208201111561086457600080fd5b8035906020019184602083028401116401000000008311171561088657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156108e657600080fd5b8201836020820111156108f857600080fd5b8035906020019184602083028401116401000000008311171561091a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561097a57600080fd5b82018360208201111561098c57600080fd5b803590602001918460208302840111640100000000831117156109ae57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a0e57600080fd5b820183602082011115610a2057600080fd5b80359060200191846001830284011164010000000083111715610a4257600080fd5b9091929391929390505050612fb9565b005b610a5c613221565b6040518082815260200191505060405180910390f35b610caf600480360360a0811015610a8857600080fd5b810190808035906020019092919080359060200190640100000000811115610aaf57600080fd5b820183602082011115610ac157600080fd5b80359060200191846020830284011164010000000083111715610ae357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b4357600080fd5b820183602082011115610b5557600080fd5b80359060200191846020830284011164010000000083111715610b7757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610bd757600080fd5b820183602082011115610be957600080fd5b80359060200191846020830284011164010000000083111715610c0b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c6b57600080fd5b820183602082011115610c7d57600080fd5b80359060200191846001830284011164010000000083111715610c9f57600080fd5b9091929391929390505050613227565b604051808267ffffffffffffffff16815260200191505060405180910390f35b610cd76132b4565b6040518082815260200191505060405180910390f35b610d1960048036036020811015610d0357600080fd5b81019080803590602001909291905050506132ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d4d6132ed565b6040518082815260200191505060405180910390f35b610fc0600480360360c0811015610d7957600080fd5b810190808035906020019092919080359060200190640100000000811115610da057600080fd5b820183602082011115610db257600080fd5b80359060200191846020830284011164010000000083111715610dd457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e3457600080fd5b820183602082011115610e4657600080fd5b80359060200191846020830284011164010000000083111715610e6857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ec857600080fd5b820183602082011115610eda57600080fd5b80359060200191846020830284011164010000000083111715610efc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610f5c57600080fd5b820183602082011115610f6e57600080fd5b80359060200191846001830284011164010000000083111715610f9057600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132f3565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61102260048036036020811015610ff657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613381565b005b6110506004803603602081101561103a57600080fd5b810190808035906020019092919050505061358c565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611090578082015181840152602081019050611075565b50505050905090810190601f1680156110bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000611144333061111d6103e861110f6110f26009546103e861363c90919063ffffffff16565b8e6bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8f73ffffffffffffffffffffffffffffffffffffffff16613794909392919063ffffffff16565b6000886bffffffffffffffffffffffff16116111c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f63616e6e6f742061756374696f6e207a65726f20746f6b656e7300000000000081525060200191505060405180910390fd5b6000876bffffffffffffffffffffffff161161122f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806158406023913960400191505060405180910390fd5b60008611611288576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806159a66036913960400191505060405180910390fd5b888a11156112e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615ac46029913960400191505060405180910390fd5b428911611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061592f6026913960400191505060405180910390fd5b61134f600160085461363c90919063ffffffff16565b600881905550611372600160006008548152602001908152602001600020613855565b600061137d33611978565b9050604051806101c001604052808e73ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b81526020016113da838b8d6138da565b815260200188815260200160008152602001600160001b81526020016000801b815260200160006bffffffffffffffffffffffff168152602001600015158152602001861515815260200160095481526020018781525060026000600854815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555061014082015181600901600c6101000a81548160ff02191690831515021790555061016082015181600901600d6101000a81548160ff02191690831515021790555061018082015181600a01556101a082015181600b01559050508360036000600854815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460006008548152602001908152602001600020908051906020019061162b9291906155dc565b508b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff166008547f728d0fed13687f1840de94f5ae640eae49b43eda26b7ffe97e55e79a0de6e40c8e8e868f8f8f8f8e8e604051808a81526020018981526020018867ffffffffffffffff168152602001876bffffffffffffffffffffffff168152602001866bffffffffffffffffffffffff1681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611733578082015181840152602081019050611718565b50505050905090810190601f1680156117605780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a46008549150509b9a5050505050505050505050565b600042600260008481526020019081526020016000206003015410156117b357600090506117df565b6117dc42600260008581526020019081526020016000206003015461391b90919063ffffffff16565b90505b919050565b600760009054906101000a900467ffffffffffffffff1681565b600061183c6118376001600760009054906101000a900467ffffffffffffffff1667ffffffffffffffff1661363c90919063ffffffff16565b613965565b600760006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550611890600760009054906101000a900467ffffffffffffffff168360056139d09092919063ffffffff16565b611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5573657220616c7265616479207265676973746572656400000000000000000081525060200191505060405180910390fd5b600760009054906101000a900467ffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff167f6838f67cb358c332087b73dbe769a6c869a5f87225236c16dda5d0013a77074c82604051808267ffffffffffffffff16815260200191505060405180910390a2919050565b600061198e826005613cf690919063ffffffff16565b156119ae576119a7826005613d6390919063ffffffff16565b9050611a08565b6119b7826117fe565b90508173ffffffffffffffffffffffffffffffffffffffff168167ffffffffffffffff167f969d438b19b6b5fb3c0d3c6f16867e519fcec4233799d6be29d1c00f2045ba2660405160405180910390a35b919050565b60008160006002600083815260200190815260200160002060030154905060008114158015611a3c5750804210155b8015611a6057506000801b6002600084815260200190815260200160002060080154145b611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a466028913960400191505060405180910390fd5b506000806000611ada6002600088815260200190815260200160002060040154613e42565b92509250925060006002600088815260200190815260200160002060060154905060006002600089815260200190815260200160002060070154905060008060008590505b6000611b4685600160008f8152602001908152602001600020613e6890919063ffffffff16565b90507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b811415611b795750611c02565b809450611b8585613e42565b909150816bffffffffffffffffffffffff169150806bffffffffffffffffffffffff1690508094508195505050611bc5838761363c90919063ffffffff16565b955050611be982876bffffffffffffffffffffffff166136c490919063ffffffff16565b611bfc84876136c490919063ffffffff16565b10611b1f575b600085118015611c445750611c2e82876bffffffffffffffffffffffff166136c490919063ffffffff16565b611c4184876136c490919063ffffffff16565b10155b15611d4d576000611c90611c8185611c73868b6bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8761391b90919063ffffffff16565b9050808310611d1b576000611cae828561391b90919063ffffffff16565b9050611cb981613f66565b600260008f815260200190815260200160002060090160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611d10828861391b90919063ffffffff16565b9650859b5050611d47565b611d2e838761391b90919063ffffffff16565b9550611d44600088611d3f89613f66565b6138da565b9a505b50611dd9565b866bffffffffffffffffffffffff16851115611d7e57611d77600087611d7288613f66565b6138da565b9950611dd8565b611d8a600087896138da565b9950611dd5611dd0886bffffffffffffffffffffffff16611dc2896bffffffffffffffffffffffff16896136c490919063ffffffff16565b61374a90919063ffffffff16565b613f66565b90505b5b89600260008d81526020019081526020016000206008018190555084600260008d8152602001908152602001600020600b01541115611e42576001600260008d8152602001908152602001600020600901600c6101000a81548160ff0219169083151502179055505b611e5c8b826bffffffffffffffffffffffff168a89613fd5565b8a7f4d160a2a345f2faeb9ac2e65272820b8ca5473b80aabef416bdf7e07ee7f591082878d60405180846bffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff168152602001828152602001935050505060405180910390a26000600360008d815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008c81526020019081526020016000206000611f32919061565c565b6000801b600260008d8152602001908152602001600020600401819055506000801b600260008d8152602001908152602001600020600701819055506000600260008d8152602001908152602001600020600601819055506000600260008d815260200190815260200160002060050181905550505050505050505050919050565b8160006002600083815260200190815260200160002060030154905060008114158015611fe15750804210155b801561200557506000801b6002600084815260200190815260200160002060080154145b61205a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a466028913960400191505060405180910390fd5b50600061207c6002600086815260200190815260200160002060040154613e42565b9250505060006002600086815260200190815260200160002060060154905060006002600087815260200190815260200160002060070154905060005b85811015612128576120e682600160008a8152602001908152602001600020613e6890919063ffffffff16565b915060006120f383613e42565b92505050612118816bffffffffffffffffffffffff168561363c90919063ffffffff16565b93505080806001019150506120b9565b507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b8114156121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7265616368656420656e64206f66206f72646572206c6973740000000000000081525060200191505060405180910390fd5b6000806121ce83613e42565b9250925050612202816bffffffffffffffffffffffff16866bffffffffffffffffffffffff166136c490919063ffffffff16565b612223836bffffffffffffffffffffffff16866136c490919063ffffffff16565b10612296576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f6f206d616e79206f72646572732073756d6d65642075700000000000000081525060200191505060405180910390fd5b83600260008a81526020019081526020016000206006018190555082600260008a8152602001908152602001600020600701819055505050505050505050565b6122de6141c7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461239e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f8211156123f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615902602d913960400191505060405180910390fd5b61240181611978565b600a60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816009819055505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a90046bffffffffffffffffffffffff169080600901600c9054906101000a900460ff169080600901600d9054906101000a900460ff169080600a01549080600b015490508e565b600a60009054906101000a900467ffffffffffffffff1681565b600061255382600160008681526020019081526020016000206141cf90919063ffffffff16565b905092915050565b6125636141c7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612623576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080836000801b60026000838152602001908152602001600020600801541415612774576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f41756374696f6e206e6f74207965742066696e6973686564000000000000000081525060200191505060405180910390fd5b60005b8451811015612837576127b885828151811061278f57fe5b60200260200101516001600089815260200190815260200160002061420b90919063ffffffff16565b61282a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6f72646572206973206e6f206c6f6e67657220636c61696d61626c650000000081525060200191505060405180910390fd5b8080600101915050612777565b506128406156a4565b60026000878152602001908152602001600020604051806101c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160098201600c9054906101000a900460ff1615151515815260200160098201600d9054906101000a900460ff16151515158152602001600a8201548152602001600b8201548152505090506000806129ec836101000151613e42565b92509250506000612a1088600081518110612a0357fe5b6020026020010151613e42565b505090506000600260008b8152602001908152602001600020600901600c9054906101000a900460ff16905060005b8951811015612d13576000806000612a698d8581518110612a5c57fe5b6020026020010151613e42565b9250925092508567ffffffffffffffff168367ffffffffffffffff1614612adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615a236023913960400191505060405180910390fd5b8415612b0957612b02816bffffffffffffffffffffffff168c61363c90919063ffffffff16565b9a50612c9c565b8861010001518d8581518110612b1b57fe5b60200260200101511415612bde57612b8f612b80886bffffffffffffffffffffffff16612b728b6bffffffffffffffffffffffff168d61012001516bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8d61363c90919063ffffffff16565b9b50612bd7612bc88a61012001516bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661391b90919063ffffffff16565b8c61363c90919063ffffffff16565b9a50612c9b565b612c098961010001518e8681518110612bf357fe5b602002602001015161424890919063ffffffff16565b15612c7657612c6f612c60886bffffffffffffffffffffffff16612c528b6bffffffffffffffffffffffff16856bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8d61363c90919063ffffffff16565b9b50612c9a565b612c97816bffffffffffffffffffffffff168c61363c90919063ffffffff16565b9a505b5b5b8567ffffffffffffffff168e7f3f2c83616e48a2f8b3c9cc26499e2e5c61643714dac49027d82cf6732f96a91a848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35050508080600101915050612a3f565b50612d208a898985614466565b5050505050509250929050565b8160026000828152602001908152602001600020600201544210612d9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158636032913960400191505060405180910390fd5b6000612da733611978565b90506000805b8451811015612f27576000612df0868381518110612dc757fe5b6020026020010151600160008a815260200190815260200160002061455b90919063ffffffff16565b90508015612f19576000806000612e19898681518110612e0c57fe5b6020026020010151613e42565b9250925092508667ffffffffffffffff168367ffffffffffffffff1614612e8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806157f76023913960400191505060405180910390fd5b612eac816bffffffffffffffffffffffff168761363c90919063ffffffff16565b95508667ffffffffffffffff168a7f7edae327fe79804b2f38bd490d874a0d188d3ae8911b303205abe47400086ac4848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35050505b508080600101915050612dad565b50612f8933826002600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146069092919063ffffffff16565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8560006002600083815260200190815260200160002060030154905060008114158015612fe65750804210155b801561300a57506000801b6002600084815260200190815260200160002060080154145b61305f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a466028913960400191505060405180910390fd5b5060026000888152602001908152602001600020600901600d9054906101000a900460ff166130d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061579e6028913960400191505060405180910390fd5b600186511480156130eb575060018551145b613140576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806159556027913960400191505060405180910390fd5b600061314b33611978565b90506131a8613183828960008151811061316157fe5b60200260200101518960008151811061317657fe5b60200260200101516138da565b600260008b81526020019081526020016000206007015461424890919063ffffffff16565b6131fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806157c66031913960400191505060405180910390fd5b61320c888888888888336146a8565b5061321688611a0d565b505050505050505050565b60085481565b60008660026000828152602001908152602001600020600301544210613298576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615b176022913960400191505060405180910390fd5b6132a7888888888888336146a8565b9150509695505050505050565b6103e881565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60008760026000828152602001908152602001600020600301544210613364576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615b176022913960400191505060405180910390fd5b613373898989898989896146a8565b915050979650505050505050565b6133896141c7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156134cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061581a6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60046020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156136345780601f1061360957610100808354040283529160200191613634565b820191906000526020600020905b81548152906001019060200180831161361757829003601f168201915b505050505081565b6000808284019050838110156136ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156136d75760009050613744565b60008284029050828482816136e857fe5b041461373f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806159dc6021913960400191505060405180910390fd5b809150505b92915050565b600061378c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614cc0565b905092915050565b61384f846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614d86565b50505050565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b816000016000600160001b815260200190815260200160002081905550600160001b8160010160007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b81526020019081526020016000208190555050565b6000816bffffffffffffffffffffffff166060846bffffffffffffffffffffffff16901b60c08667ffffffffffffffff16901b010160001b90509392505050565b600061395d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614e75565b905092915050565b60006801000000000000000082106139c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806159fd6026913960400191505060405180910390fd5b819050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f7420696e73657274207a65726f206164647265737300000000000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff168367ffffffffffffffff161415613b1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f7420696e73657274206d61782075696e743634000000000000000081525060200191505060405180910390fd5b60008460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141580613c065750600073ffffffffffffffffffffffffffffffffffffffff168460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613c145760009050613cef565b818460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600183018460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600190505b9392505050565b6000808360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415905092915050565b6000613d6f8383613cf6565b613de1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d7573742068617665204164647265737320746f20676574204944000000000081525060200191505060405180910390fd5b60018360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1603905092915050565b600080600060c08460001c901c925060608460001c901c91508360001c90509193909250565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b821415613ee6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158ba6022913960400191505060405180910390fd5b60008360000160008481526020019081526020016000205490506000801b811415613f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061597c602a913960400191505060405180910390fd5b8091505092915050565b60006c010000000000000000000000008210613fcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806157786026913960400191505060405180910390fd5b819050919050565b60006140226103e861401460026000898152602001908152602001600020600a0154856bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b905060026000868152602001908152602001600020600901600c9054906101000a900460ff161561407f5761407a8561407283856bffffffffffffffffffffffff1661363c90919063ffffffff16565b600086614466565b6141c0565b6000806140a16002600089815260200190815260200160002060080154613e42565b925092505060006140c987866bffffffffffffffffffffffff1661391b90919063ffffffff16565b90506000614112614103876bffffffffffffffffffffffff166140f585896136c490919063ffffffff16565b61374a90919063ffffffff16565b8361363c90919063ffffffff16565b90506000614157856bffffffffffffffffffffffff16614149866bffffffffffffffffffffffff168c6136c490919063ffffffff16565b61374a90919063ffffffff16565b90506141658a83838b614466565b6141ba8a61419c896bffffffffffffffffffffffff1661418e8d8b6136c490919063ffffffff16565b61374a90919063ffffffff16565b6000600a60009054906101000a900467ffffffffffffffff16614466565b50505050505b5050505050565b600033905090565b6000600160001b8214156141e65760009050614205565b6000801b83600001600084815260200190815260200160002054141590505b92915050565b600080614218848461455b565b9050801561423e576000801b846001016000858152602001908152602001600020819055505b8091505092915050565b60008060008061425786613e42565b925092509250600080600061426b88613e42565b9250925092506142a0846bffffffffffffffffffffffff16836bffffffffffffffffffffffff166136c490919063ffffffff16565b6142cf826bffffffffffffffffffffffff16876bffffffffffffffffffffffff166136c490919063ffffffff16565b10156142e45760019650505050505050614460565b614313846bffffffffffffffffffffffff16836bffffffffffffffffffffffff166136c490919063ffffffff16565b614342826bffffffffffffffffffffffff16876bffffffffffffffffffffffff166136c490919063ffffffff16565b11156143575760009650505050505050614460565b816bffffffffffffffffffffffff16856bffffffffffffffffffffffff16101561438a5760019650505050505050614460565b816bffffffffffffffffffffffff16856bffffffffffffffffffffffff1611156143bd5760009650505050505050614460565b8267ffffffffffffffff168667ffffffffffffffff16141561442a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615a6e602d913960400191505060405180910390fd5b8267ffffffffffffffff168667ffffffffffffffff1610156144555760019650505050505050614460565b600096505050505050505b92915050565b600061447c826005614f3590919063ffffffff16565b905060008411156144e9576144e881856002600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146069092919063ffffffff16565b5b60008311156145545761455381846002600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146069092919063ffffffff16565b5b5050505050565b600061456783836141cf565b6145745760009050614600565b60008360010160008481526020019081526020016000205490506000846000016000858152602001908152602001600020549050808560000160008481526020019081526020016000208190555081856001016000838152602001908152602001600020819055506000801b856000016000868152602001908152602001600020819055506001925050505b92915050565b6146a38363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614d86565b505050565b600080600360008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146148ad576319a05a7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff166319a05a7e858c89896040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060206040518083038186803b1580156147df57600080fd5b505afa1580156147f3573d6000803e3d6000fd5b505050506040513d602081101561480957600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146148ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f75736572206e6f7420616c6c6f77656420746f20706c616365206f726465720081525060200191505060405180910390fd5b5b506000806148d0600260008c815260200190815260200160002060040154613e42565b925092505060005b89518110156149c8576149238982815181106148f057fe5b60200260200101516bffffffffffffffffffffffff16836bffffffffffffffffffffffff166136c490919063ffffffff16565b614965846bffffffffffffffffffffffff168c848151811061494157fe5b60200260200101516bffffffffffffffffffffffff166136c490919063ffffffff16565b106149bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a9b6029913960400191505060405180910390fd5b80806001019150506148d8565b50505060006149d683611978565b91506000600260008b815260200190815260200160002060050154905060005b8951811015614c4f5760008a8281518110614a0d57fe5b60200260200101516bffffffffffffffffffffffff1611614a79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158956025913960400191505060405180910390fd5b81898281518110614a8657fe5b60200260200101516bffffffffffffffffffffffff1611614b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6f7264657220746f6f20736d616c6c000000000000000000000000000000000081525060200191505060405180910390fd5b614b79614b43858c8481518110614b2257fe5b60200260200101518c8581518110614b3657fe5b60200260200101516138da565b898381518110614b4f57fe5b6020026020010151600160008f81526020019081526020016000206150089092919063ffffffff16565b15614c4257614bb2898281518110614b8d57fe5b60200260200101516bffffffffffffffffffffffff168461363c90919063ffffffff16565b92508367ffffffffffffffff168b7f9304f2fc7ed6d42c0400e678dbc7283e1e9054889c3afea5f965adff66ef9eac8c8481518110614bed57fe5b60200260200101518c8581518110614c0157fe5b602002602001015160405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35b80806001019150506149f6565b50614cb3333084600260008f815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613794909392919063ffffffff16565b5050979650505050505050565b60008083118290614d6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d31578082015181840152602081019050614d16565b50505050905090810190601f168015614d5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614d7857fe5b049050809150509392505050565b6060614de8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166152b69092919063ffffffff16565b9050600081511115614e7057808060200190516020811015614e0957600080fd5b8101908080519060200190929190505050614e6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615aed602a913960400191505060405180910390fd5b5b505050565b6000838311158290614f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ee7578082015181840152602081019050614ecc565b50505050905090810190601f168015614f145780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000614f4183836152ce565b614fb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d757374206861766520494420746f206765742041646472657373000000000081525060200191505060405180910390fd5b8260000160006001840167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008061501484613e42565b9250505060006bffffffffffffffffffffffff16816bffffffffffffffffffffffff1614156150ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e73657274696e67207a65726f206973206e6f7420737570706f727465640081525060200191505060405180910390fd5b600160001b84141580156150e257507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b8414155b615154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e73657274696e6720656c656d656e74206973206e6f742076616c6964000081525060200191505060405180910390fd5b61515e85856141cf565b1561516d5760009150506152af565b600160001b831415801561519857506000801b85600101600085815260200190815260200160002054145b156151a75760009150506152af565b6151ba848461424890919063ffffffff16565b6151c85760009150506152af565b5b6000801b856000016000858152602001908152602001600020541415615206578460010160008481526020019081526020016000205492506151c9565b6000808490505b80915086600001600082815260200190815260200160002054905061523b868261424890919063ffffffff16565b61520d578587600001600084815260200190815260200160002081905550858760010160008381526020019081526020016000208190555081876001016000888152602001908152602001600020819055508087600001600088815260200190815260200160002081905550600193505050505b9392505050565b60606152c58484600085615354565b90509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168360000160006001850167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b6060824710156153af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158dc6026913960400191505060405180910390fd5b6153b8856154fd565b61542a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061547a5780518252602082019150602081019050602083039250615457565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146154dc576040519150601f19603f3d011682016040523d82523d6000602084013e6154e1565b606091505b50915091506154f1828286615510565b92505050949350505050565b600080823b905060008111915050919050565b60608315615520578290506155d5565b6000835111156155335782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561559a57808201518184015260208101905061557f565b50505050905090810190601f1680156155c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061561d57805160ff191683800117855561564b565b8280016001018555821561564b579182015b8281111561564a57825182559160200191906001019061562f565b5b509050615658919061575a565b5090565b50805460018160011615610100020316600290046000825580601f1061568257506156a1565b601f0160209004906000526020600020908101906156a0919061575a565b5b50565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600080191681526020016000815260200160008152602001600080191681526020016000801916815260200160006bffffffffffffffffffffffff16815260200160001515815260200160001515815260200160008152602001600081525090565b5b8082111561577357600081600090555060010161575b565b509056fe53616665436173743a2076616c756520646f65736e27742066697420696e20393620626974736e6f7420616c6c6f77656420746f20736574746c652061756374696f6e2061746f6d6963616c6c7970726563616c63756c61746553656c6c416d6f756e7453756d20697320616c726561647920746f6f20616476616e6365644f6e6c792074686520757365722063616e2063616e63656c20686973206f72646572734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373746f6b656e732063616e6e6f742062652061756374696f6e656420666f7220667265656e6f206c6f6e67657220696e206f7264657220706c6163656d656e7420616e642063616e63656c6174696f6e2070686173655f6d696e427579416d6f756e7473206d7573742062652067726561746572207468616e2030547279696e6720746f20676574206e657874206f66206c61737420656c656d656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c466565206973206e6f7420616c6c6f77656420746f2062652073657420686967686572207468616e20312e352561756374696f6e20656e642064617465206d75737420626520696e20746865206675747572654f6e6c79206f6e65206f726465722063616e20626520706c616365642061746f6d6963616c6c79547279696e6720746f20676574206e657874206f66206e6f6e2d6578697374656e7420656c656d656e746d696e696d756d42696464696e67416d6f756e745065724f72646572206973206e6f7420616c6c6f77656420746f206265207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20363420626974736f6e6c7920616c6c6f77656420746f20636c61696d20666f722073616d65207573657241756374696f6e206e6f7420696e20736f6c7574696f6e207375626d697373696f6e20706861736575736572206973206e6f7420616c6c6f77656420746f20706c6163652073616d65206f726465722074776963656c696d6974207072696365206e6f7420626574746572207468616e206d696d696d616c206f6666657274696d6520706572696f647320617265206e6f7420636f6e6669677572656420636f72726563746c795361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646e6f206c6f6e67657220696e206f7264657220706c6163656d656e74207068617365a2646970667358221220a1b0a65b396448cc82d973638197a701b4848b6a5a363a8674167fb0c7d421ff64736f6c634300060c0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637882deaf116100c3578063d73792a91161007c578063d73792a914610ccf578063e4a59ef414610ced578063e86dea4a14610d45578063ec20d0bb14610d63578063f2fde38b14610fe0578063f59c2f061461102457610158565b80637882deaf146106425780637ed18b701461071f5780638da5cb5b146107e157806391cfc1d414610815578063a7e7664414610a54578063d225269c14610a7257610158565b80633e12905f116101155780633e12905f1461046157806340b20b091461049957806355fc62d2146104e75780635cefb291146105c257806363c699a4146105ea578063715018a61461063857610158565b80630a4cd6c91461015d57806315d37b4b146102f157806319a50f49146103335780632199d5cd1461035b5780632b956ff7146103bd5780632e9936111461041f575b600080fd5b6102db600480360361016081101561017457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080356bffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561025557600080fd5b82018360208201111561026757600080fd5b8035906020019184600183028401116401000000008311171561028957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506110cb565b6040518082815260200191505060405180910390f35b61031d6004803603602081101561030757600080fd5b810190808035906020019092919050505061178a565b6040518082815260200191505060405180910390f35b61033b6117e4565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61039d6004803603602081101561037157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117fe565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6103ff600480360360208110156103d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611978565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61044b6004803603602081101561043557600080fd5b8101908080359060200190929190505050611a0d565b6040518082815260200191505060405180910390f35b6104976004803603604081101561047757600080fd5b810190808035906020019092919080359060200190929190505050611fb4565b005b6104e5600480360360408110156104af57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122d6565b005b610513600480360360208110156104fd57600080fd5b8101908080359060200190929190505050612434565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a8152602001898152602001888152602001878152602001866bffffffffffffffffffffffff168152602001851515815260200184151581526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b6105ca612512565b604051808267ffffffffffffffff16815260200191505060405180910390f35b6106206004803603604081101561060057600080fd5b81019080803590602001909291908035906020019092919050505061252c565b60405180821515815260200191505060405180910390f35b61064061255b565b005b6107026004803603604081101561065857600080fd5b81019080803590602001909291908035906020019064010000000081111561067f57600080fd5b82018360208201111561069157600080fd5b803590602001918460208302840111640100000000831117156106b357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506126e1565b604051808381526020018281526020019250505060405180910390f35b6107df6004803603604081101561073557600080fd5b81019080803590602001909291908035906020019064010000000081111561075c57600080fd5b82018360208201111561076e57600080fd5b8035906020019184602083028401116401000000008311171561079057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612d2d565b005b6107e9612f90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a52600480360360a081101561082b57600080fd5b81019080803590602001909291908035906020019064010000000081111561085257600080fd5b82018360208201111561086457600080fd5b8035906020019184602083028401116401000000008311171561088657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156108e657600080fd5b8201836020820111156108f857600080fd5b8035906020019184602083028401116401000000008311171561091a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561097a57600080fd5b82018360208201111561098c57600080fd5b803590602001918460208302840111640100000000831117156109ae57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a0e57600080fd5b820183602082011115610a2057600080fd5b80359060200191846001830284011164010000000083111715610a4257600080fd5b9091929391929390505050612fb9565b005b610a5c613221565b6040518082815260200191505060405180910390f35b610caf600480360360a0811015610a8857600080fd5b810190808035906020019092919080359060200190640100000000811115610aaf57600080fd5b820183602082011115610ac157600080fd5b80359060200191846020830284011164010000000083111715610ae357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b4357600080fd5b820183602082011115610b5557600080fd5b80359060200191846020830284011164010000000083111715610b7757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610bd757600080fd5b820183602082011115610be957600080fd5b80359060200191846020830284011164010000000083111715610c0b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c6b57600080fd5b820183602082011115610c7d57600080fd5b80359060200191846001830284011164010000000083111715610c9f57600080fd5b9091929391929390505050613227565b604051808267ffffffffffffffff16815260200191505060405180910390f35b610cd76132b4565b6040518082815260200191505060405180910390f35b610d1960048036036020811015610d0357600080fd5b81019080803590602001909291905050506132ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d4d6132ed565b6040518082815260200191505060405180910390f35b610fc0600480360360c0811015610d7957600080fd5b810190808035906020019092919080359060200190640100000000811115610da057600080fd5b820183602082011115610db257600080fd5b80359060200191846020830284011164010000000083111715610dd457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e3457600080fd5b820183602082011115610e4657600080fd5b80359060200191846020830284011164010000000083111715610e6857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ec857600080fd5b820183602082011115610eda57600080fd5b80359060200191846020830284011164010000000083111715610efc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610f5c57600080fd5b820183602082011115610f6e57600080fd5b80359060200191846001830284011164010000000083111715610f9057600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132f3565b604051808267ffffffffffffffff16815260200191505060405180910390f35b61102260048036036020811015610ff657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613381565b005b6110506004803603602081101561103a57600080fd5b810190808035906020019092919050505061358c565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611090578082015181840152602081019050611075565b50505050905090810190601f1680156110bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000611144333061111d6103e861110f6110f26009546103e861363c90919063ffffffff16565b8e6bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8f73ffffffffffffffffffffffffffffffffffffffff16613794909392919063ffffffff16565b6000886bffffffffffffffffffffffff16116111c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f63616e6e6f742061756374696f6e207a65726f20746f6b656e7300000000000081525060200191505060405180910390fd5b6000876bffffffffffffffffffffffff161161122f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806158406023913960400191505060405180910390fd5b60008611611288576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806159a66036913960400191505060405180910390fd5b888a11156112e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615ac46029913960400191505060405180910390fd5b428911611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061592f6026913960400191505060405180910390fd5b61134f600160085461363c90919063ffffffff16565b600881905550611372600160006008548152602001908152602001600020613855565b600061137d33611978565b9050604051806101c001604052808e73ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b81526020016113da838b8d6138da565b815260200188815260200160008152602001600160001b81526020016000801b815260200160006bffffffffffffffffffffffff168152602001600015158152602001861515815260200160095481526020018781525060026000600854815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555061014082015181600901600c6101000a81548160ff02191690831515021790555061016082015181600901600d6101000a81548160ff02191690831515021790555061018082015181600a01556101a082015181600b01559050508360036000600854815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460006008548152602001908152602001600020908051906020019061162b9291906155dc565b508b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff166008547f728d0fed13687f1840de94f5ae640eae49b43eda26b7ffe97e55e79a0de6e40c8e8e868f8f8f8f8e8e604051808a81526020018981526020018867ffffffffffffffff168152602001876bffffffffffffffffffffffff168152602001866bffffffffffffffffffffffff1681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611733578082015181840152602081019050611718565b50505050905090810190601f1680156117605780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a46008549150509b9a5050505050505050505050565b600042600260008481526020019081526020016000206003015410156117b357600090506117df565b6117dc42600260008581526020019081526020016000206003015461391b90919063ffffffff16565b90505b919050565b600760009054906101000a900467ffffffffffffffff1681565b600061183c6118376001600760009054906101000a900467ffffffffffffffff1667ffffffffffffffff1661363c90919063ffffffff16565b613965565b600760006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550611890600760009054906101000a900467ffffffffffffffff168360056139d09092919063ffffffff16565b611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5573657220616c7265616479207265676973746572656400000000000000000081525060200191505060405180910390fd5b600760009054906101000a900467ffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff167f6838f67cb358c332087b73dbe769a6c869a5f87225236c16dda5d0013a77074c82604051808267ffffffffffffffff16815260200191505060405180910390a2919050565b600061198e826005613cf690919063ffffffff16565b156119ae576119a7826005613d6390919063ffffffff16565b9050611a08565b6119b7826117fe565b90508173ffffffffffffffffffffffffffffffffffffffff168167ffffffffffffffff167f969d438b19b6b5fb3c0d3c6f16867e519fcec4233799d6be29d1c00f2045ba2660405160405180910390a35b919050565b60008160006002600083815260200190815260200160002060030154905060008114158015611a3c5750804210155b8015611a6057506000801b6002600084815260200190815260200160002060080154145b611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a466028913960400191505060405180910390fd5b506000806000611ada6002600088815260200190815260200160002060040154613e42565b92509250925060006002600088815260200190815260200160002060060154905060006002600089815260200190815260200160002060070154905060008060008590505b6000611b4685600160008f8152602001908152602001600020613e6890919063ffffffff16565b90507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b811415611b795750611c02565b809450611b8585613e42565b909150816bffffffffffffffffffffffff169150806bffffffffffffffffffffffff1690508094508195505050611bc5838761363c90919063ffffffff16565b955050611be982876bffffffffffffffffffffffff166136c490919063ffffffff16565b611bfc84876136c490919063ffffffff16565b10611b1f575b600085118015611c445750611c2e82876bffffffffffffffffffffffff166136c490919063ffffffff16565b611c4184876136c490919063ffffffff16565b10155b15611d4d576000611c90611c8185611c73868b6bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8761391b90919063ffffffff16565b9050808310611d1b576000611cae828561391b90919063ffffffff16565b9050611cb981613f66565b600260008f815260200190815260200160002060090160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611d10828861391b90919063ffffffff16565b9650859b5050611d47565b611d2e838761391b90919063ffffffff16565b9550611d44600088611d3f89613f66565b6138da565b9a505b50611dd9565b866bffffffffffffffffffffffff16851115611d7e57611d77600087611d7288613f66565b6138da565b9950611dd8565b611d8a600087896138da565b9950611dd5611dd0886bffffffffffffffffffffffff16611dc2896bffffffffffffffffffffffff16896136c490919063ffffffff16565b61374a90919063ffffffff16565b613f66565b90505b5b89600260008d81526020019081526020016000206008018190555084600260008d8152602001908152602001600020600b01541115611e42576001600260008d8152602001908152602001600020600901600c6101000a81548160ff0219169083151502179055505b611e5c8b826bffffffffffffffffffffffff168a89613fd5565b8a7f4d160a2a345f2faeb9ac2e65272820b8ca5473b80aabef416bdf7e07ee7f591082878d60405180846bffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff168152602001828152602001935050505060405180910390a26000600360008d815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008c81526020019081526020016000206000611f32919061565c565b6000801b600260008d8152602001908152602001600020600401819055506000801b600260008d8152602001908152602001600020600701819055506000600260008d8152602001908152602001600020600601819055506000600260008d815260200190815260200160002060050181905550505050505050505050919050565b8160006002600083815260200190815260200160002060030154905060008114158015611fe15750804210155b801561200557506000801b6002600084815260200190815260200160002060080154145b61205a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a466028913960400191505060405180910390fd5b50600061207c6002600086815260200190815260200160002060040154613e42565b9250505060006002600086815260200190815260200160002060060154905060006002600087815260200190815260200160002060070154905060005b85811015612128576120e682600160008a8152602001908152602001600020613e6890919063ffffffff16565b915060006120f383613e42565b92505050612118816bffffffffffffffffffffffff168561363c90919063ffffffff16565b93505080806001019150506120b9565b507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b8114156121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7265616368656420656e64206f66206f72646572206c6973740000000000000081525060200191505060405180910390fd5b6000806121ce83613e42565b9250925050612202816bffffffffffffffffffffffff16866bffffffffffffffffffffffff166136c490919063ffffffff16565b612223836bffffffffffffffffffffffff16866136c490919063ffffffff16565b10612296576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f6f206d616e79206f72646572732073756d6d65642075700000000000000081525060200191505060405180910390fd5b83600260008a81526020019081526020016000206006018190555082600260008a8152602001908152602001600020600701819055505050505050505050565b6122de6141c7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461239e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f8211156123f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615902602d913960400191505060405180910390fd5b61240181611978565b600a60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816009819055505050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a90046bffffffffffffffffffffffff169080600901600c9054906101000a900460ff169080600901600d9054906101000a900460ff169080600a01549080600b015490508e565b600a60009054906101000a900467ffffffffffffffff1681565b600061255382600160008681526020019081526020016000206141cf90919063ffffffff16565b905092915050565b6125636141c7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612623576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080836000801b60026000838152602001908152602001600020600801541415612774576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f41756374696f6e206e6f74207965742066696e6973686564000000000000000081525060200191505060405180910390fd5b60005b8451811015612837576127b885828151811061278f57fe5b60200260200101516001600089815260200190815260200160002061420b90919063ffffffff16565b61282a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6f72646572206973206e6f206c6f6e67657220636c61696d61626c650000000081525060200191505060405180910390fd5b8080600101915050612777565b506128406156a4565b60026000878152602001908152602001600020604051806101c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160098201600c9054906101000a900460ff1615151515815260200160098201600d9054906101000a900460ff16151515158152602001600a8201548152602001600b8201548152505090506000806129ec836101000151613e42565b92509250506000612a1088600081518110612a0357fe5b6020026020010151613e42565b505090506000600260008b8152602001908152602001600020600901600c9054906101000a900460ff16905060005b8951811015612d13576000806000612a698d8581518110612a5c57fe5b6020026020010151613e42565b9250925092508567ffffffffffffffff168367ffffffffffffffff1614612adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615a236023913960400191505060405180910390fd5b8415612b0957612b02816bffffffffffffffffffffffff168c61363c90919063ffffffff16565b9a50612c9c565b8861010001518d8581518110612b1b57fe5b60200260200101511415612bde57612b8f612b80886bffffffffffffffffffffffff16612b728b6bffffffffffffffffffffffff168d61012001516bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8d61363c90919063ffffffff16565b9b50612bd7612bc88a61012001516bffffffffffffffffffffffff16836bffffffffffffffffffffffff1661391b90919063ffffffff16565b8c61363c90919063ffffffff16565b9a50612c9b565b612c098961010001518e8681518110612bf357fe5b602002602001015161424890919063ffffffff16565b15612c7657612c6f612c60886bffffffffffffffffffffffff16612c528b6bffffffffffffffffffffffff16856bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b8d61363c90919063ffffffff16565b9b50612c9a565b612c97816bffffffffffffffffffffffff168c61363c90919063ffffffff16565b9a505b5b5b8567ffffffffffffffff168e7f3f2c83616e48a2f8b3c9cc26499e2e5c61643714dac49027d82cf6732f96a91a848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35050508080600101915050612a3f565b50612d208a898985614466565b5050505050509250929050565b8160026000828152602001908152602001600020600201544210612d9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158636032913960400191505060405180910390fd5b6000612da733611978565b90506000805b8451811015612f27576000612df0868381518110612dc757fe5b6020026020010151600160008a815260200190815260200160002061455b90919063ffffffff16565b90508015612f19576000806000612e19898681518110612e0c57fe5b6020026020010151613e42565b9250925092508667ffffffffffffffff168367ffffffffffffffff1614612e8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806157f76023913960400191505060405180910390fd5b612eac816bffffffffffffffffffffffff168761363c90919063ffffffff16565b95508667ffffffffffffffff168a7f7edae327fe79804b2f38bd490d874a0d188d3ae8911b303205abe47400086ac4848460405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35050505b508080600101915050612dad565b50612f8933826002600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146069092919063ffffffff16565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8560006002600083815260200190815260200160002060030154905060008114158015612fe65750804210155b801561300a57506000801b6002600084815260200190815260200160002060080154145b61305f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615a466028913960400191505060405180910390fd5b5060026000888152602001908152602001600020600901600d9054906101000a900460ff166130d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061579e6028913960400191505060405180910390fd5b600186511480156130eb575060018551145b613140576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806159556027913960400191505060405180910390fd5b600061314b33611978565b90506131a8613183828960008151811061316157fe5b60200260200101518960008151811061317657fe5b60200260200101516138da565b600260008b81526020019081526020016000206007015461424890919063ffffffff16565b6131fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806157c66031913960400191505060405180910390fd5b61320c888888888888336146a8565b5061321688611a0d565b505050505050505050565b60085481565b60008660026000828152602001908152602001600020600301544210613298576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615b176022913960400191505060405180910390fd5b6132a7888888888888336146a8565b9150509695505050505050565b6103e881565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60008760026000828152602001908152602001600020600301544210613364576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615b176022913960400191505060405180910390fd5b613373898989898989896146a8565b915050979650505050505050565b6133896141c7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156134cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061581a6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60046020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156136345780601f1061360957610100808354040283529160200191613634565b820191906000526020600020905b81548152906001019060200180831161361757829003601f168201915b505050505081565b6000808284019050838110156136ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156136d75760009050613744565b60008284029050828482816136e857fe5b041461373f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806159dc6021913960400191505060405180910390fd5b809150505b92915050565b600061378c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614cc0565b905092915050565b61384f846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614d86565b50505050565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b816000016000600160001b815260200190815260200160002081905550600160001b8160010160007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b81526020019081526020016000208190555050565b6000816bffffffffffffffffffffffff166060846bffffffffffffffffffffffff16901b60c08667ffffffffffffffff16901b010160001b90509392505050565b600061395d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614e75565b905092915050565b60006801000000000000000082106139c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806159fd6026913960400191505060405180910390fd5b819050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f7420696e73657274207a65726f206164647265737300000000000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff168367ffffffffffffffff161415613b1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f7420696e73657274206d61782075696e743634000000000000000081525060200191505060405180910390fd5b60008460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141580613c065750600073ffffffffffffffffffffffffffffffffffffffff168460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15613c145760009050613cef565b818460000160006001860167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600183018460010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600190505b9392505050565b6000808360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415905092915050565b6000613d6f8383613cf6565b613de1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d7573742068617665204164647265737320746f20676574204944000000000081525060200191505060405180910390fd5b60018360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1603905092915050565b600080600060c08460001c901c925060608460001c901c91508360001c90509193909250565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b821415613ee6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158ba6022913960400191505060405180910390fd5b60008360000160008481526020019081526020016000205490506000801b811415613f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061597c602a913960400191505060405180910390fd5b8091505092915050565b60006c010000000000000000000000008210613fcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806157786026913960400191505060405180910390fd5b819050919050565b60006140226103e861401460026000898152602001908152602001600020600a0154856bffffffffffffffffffffffff166136c490919063ffffffff16565b61374a90919063ffffffff16565b905060026000868152602001908152602001600020600901600c9054906101000a900460ff161561407f5761407a8561407283856bffffffffffffffffffffffff1661363c90919063ffffffff16565b600086614466565b6141c0565b6000806140a16002600089815260200190815260200160002060080154613e42565b925092505060006140c987866bffffffffffffffffffffffff1661391b90919063ffffffff16565b90506000614112614103876bffffffffffffffffffffffff166140f585896136c490919063ffffffff16565b61374a90919063ffffffff16565b8361363c90919063ffffffff16565b90506000614157856bffffffffffffffffffffffff16614149866bffffffffffffffffffffffff168c6136c490919063ffffffff16565b61374a90919063ffffffff16565b90506141658a83838b614466565b6141ba8a61419c896bffffffffffffffffffffffff1661418e8d8b6136c490919063ffffffff16565b61374a90919063ffffffff16565b6000600a60009054906101000a900467ffffffffffffffff16614466565b50505050505b5050505050565b600033905090565b6000600160001b8214156141e65760009050614205565b6000801b83600001600084815260200190815260200160002054141590505b92915050565b600080614218848461455b565b9050801561423e576000801b846001016000858152602001908152602001600020819055505b8091505092915050565b60008060008061425786613e42565b925092509250600080600061426b88613e42565b9250925092506142a0846bffffffffffffffffffffffff16836bffffffffffffffffffffffff166136c490919063ffffffff16565b6142cf826bffffffffffffffffffffffff16876bffffffffffffffffffffffff166136c490919063ffffffff16565b10156142e45760019650505050505050614460565b614313846bffffffffffffffffffffffff16836bffffffffffffffffffffffff166136c490919063ffffffff16565b614342826bffffffffffffffffffffffff16876bffffffffffffffffffffffff166136c490919063ffffffff16565b11156143575760009650505050505050614460565b816bffffffffffffffffffffffff16856bffffffffffffffffffffffff16101561438a5760019650505050505050614460565b816bffffffffffffffffffffffff16856bffffffffffffffffffffffff1611156143bd5760009650505050505050614460565b8267ffffffffffffffff168667ffffffffffffffff16141561442a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615a6e602d913960400191505060405180910390fd5b8267ffffffffffffffff168667ffffffffffffffff1610156144555760019650505050505050614460565b600096505050505050505b92915050565b600061447c826005614f3590919063ffffffff16565b905060008411156144e9576144e881856002600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146069092919063ffffffff16565b5b60008311156145545761455381846002600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146069092919063ffffffff16565b5b5050505050565b600061456783836141cf565b6145745760009050614600565b60008360010160008481526020019081526020016000205490506000846000016000858152602001908152602001600020549050808560000160008481526020019081526020016000208190555081856001016000838152602001908152602001600020819055506000801b856000016000868152602001908152602001600020819055506001925050505b92915050565b6146a38363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614d86565b505050565b600080600360008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146148ad576319a05a7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff166319a05a7e858c89896040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060206040518083038186803b1580156147df57600080fd5b505afa1580156147f3573d6000803e3d6000fd5b505050506040513d602081101561480957600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146148ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f75736572206e6f7420616c6c6f77656420746f20706c616365206f726465720081525060200191505060405180910390fd5b5b506000806148d0600260008c815260200190815260200160002060040154613e42565b925092505060005b89518110156149c8576149238982815181106148f057fe5b60200260200101516bffffffffffffffffffffffff16836bffffffffffffffffffffffff166136c490919063ffffffff16565b614965846bffffffffffffffffffffffff168c848151811061494157fe5b60200260200101516bffffffffffffffffffffffff166136c490919063ffffffff16565b106149bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a9b6029913960400191505060405180910390fd5b80806001019150506148d8565b50505060006149d683611978565b91506000600260008b815260200190815260200160002060050154905060005b8951811015614c4f5760008a8281518110614a0d57fe5b60200260200101516bffffffffffffffffffffffff1611614a79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158956025913960400191505060405180910390fd5b81898281518110614a8657fe5b60200260200101516bffffffffffffffffffffffff1611614b0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6f7264657220746f6f20736d616c6c000000000000000000000000000000000081525060200191505060405180910390fd5b614b79614b43858c8481518110614b2257fe5b60200260200101518c8581518110614b3657fe5b60200260200101516138da565b898381518110614b4f57fe5b6020026020010151600160008f81526020019081526020016000206150089092919063ffffffff16565b15614c4257614bb2898281518110614b8d57fe5b60200260200101516bffffffffffffffffffffffff168461363c90919063ffffffff16565b92508367ffffffffffffffff168b7f9304f2fc7ed6d42c0400e678dbc7283e1e9054889c3afea5f965adff66ef9eac8c8481518110614bed57fe5b60200260200101518c8581518110614c0157fe5b602002602001015160405180836bffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681526020019250505060405180910390a35b80806001019150506149f6565b50614cb3333084600260008f815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613794909392919063ffffffff16565b5050979650505050505050565b60008083118290614d6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d31578082015181840152602081019050614d16565b50505050905090810190601f168015614d5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614d7857fe5b049050809150509392505050565b6060614de8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166152b69092919063ffffffff16565b9050600081511115614e7057808060200190516020811015614e0957600080fd5b8101908080519060200190929190505050614e6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615aed602a913960400191505060405180910390fd5b5b505050565b6000838311158290614f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ee7578082015181840152602081019050614ecc565b50505050905090810190601f168015614f145780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000614f4183836152ce565b614fb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d757374206861766520494420746f206765742041646472657373000000000081525060200191505060405180910390fd5b8260000160006001840167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008061501484613e42565b9250505060006bffffffffffffffffffffffff16816bffffffffffffffffffffffff1614156150ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e73657274696e67207a65726f206973206e6f7420737570706f727465640081525060200191505060405180910390fd5b600160001b84141580156150e257507fffffffffffffffffffffffffffffffffffffffff00000000000000000000000160001b8414155b615154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e73657274696e6720656c656d656e74206973206e6f742076616c6964000081525060200191505060405180910390fd5b61515e85856141cf565b1561516d5760009150506152af565b600160001b831415801561519857506000801b85600101600085815260200190815260200160002054145b156151a75760009150506152af565b6151ba848461424890919063ffffffff16565b6151c85760009150506152af565b5b6000801b856000016000858152602001908152602001600020541415615206578460010160008481526020019081526020016000205492506151c9565b6000808490505b80915086600001600082815260200190815260200160002054905061523b868261424890919063ffffffff16565b61520d578587600001600084815260200190815260200160002081905550858760010160008381526020019081526020016000208190555081876001016000888152602001908152602001600020819055508087600001600088815260200190815260200160002081905550600193505050505b9392505050565b60606152c58484600085615354565b90509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168360000160006001850167ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b6060824710156153af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158dc6026913960400191505060405180910390fd5b6153b8856154fd565b61542a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061547a5780518252602082019150602081019050602083039250615457565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146154dc576040519150601f19603f3d011682016040523d82523d6000602084013e6154e1565b606091505b50915091506154f1828286615510565b92505050949350505050565b600080823b905060008111915050919050565b60608315615520578290506155d5565b6000835111156155335782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561559a57808201518184015260208101905061557f565b50505050905090810190601f1680156155c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061561d57805160ff191683800117855561564b565b8280016001018555821561564b579182015b8281111561564a57825182559160200191906001019061562f565b5b509050615658919061575a565b5090565b50805460018160011615610100020316600290046000825580601f1061568257506156a1565b601f0160209004906000526020600020908101906156a0919061575a565b5b50565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600080191681526020016000815260200160008152602001600080191681526020016000801916815260200160006bffffffffffffffffffffffff16815260200160001515815260200160001515815260200160008152602001600081525090565b5b8082111561577357600081600090555060010161575b565b509056fe53616665436173743a2076616c756520646f65736e27742066697420696e20393620626974736e6f7420616c6c6f77656420746f20736574746c652061756374696f6e2061746f6d6963616c6c7970726563616c63756c61746553656c6c416d6f756e7453756d20697320616c726561647920746f6f20616476616e6365644f6e6c792074686520757365722063616e2063616e63656c20686973206f72646572734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373746f6b656e732063616e6e6f742062652061756374696f6e656420666f7220667265656e6f206c6f6e67657220696e206f7264657220706c6163656d656e7420616e642063616e63656c6174696f6e2070686173655f6d696e427579416d6f756e7473206d7573742062652067726561746572207468616e2030547279696e6720746f20676574206e657874206f66206c61737420656c656d656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c466565206973206e6f7420616c6c6f77656420746f2062652073657420686967686572207468616e20312e352561756374696f6e20656e642064617465206d75737420626520696e20746865206675747572654f6e6c79206f6e65206f726465722063616e20626520706c616365642061746f6d6963616c6c79547279696e6720746f20676574206e657874206f66206e6f6e2d6578697374656e7420656c656d656e746d696e696d756d42696464696e67416d6f756e745065724f72646572206973206e6f7420616c6c6f77656420746f206265207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20363420626974736f6e6c7920616c6c6f77656420746f20636c61696d20666f722073616d65207573657241756374696f6e206e6f7420696e20736f6c7574696f6e207375626d697373696f6e20706861736575736572206973206e6f7420616c6c6f77656420746f20706c6163652073616d65206f726465722074776963656c696d6974207072696365206e6f7420626574746572207468616e206d696d696d616c206f6666657274696d6520706572696f647320617265206e6f7420636f6e6669677572656420636f72726563746c795361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646e6f206c6f6e67657220696e206f7264657220706c6163656d656e74207068617365a2646970667358221220a1b0a65b396448cc82d973638197a701b4848b6a5a363a8674167fb0c7d421ff64736f6c634300060c0033",
  "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": 1675,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "sellOrders",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_uint256,t_struct(Data)3614_storage)"
      },
      {
        "astId": 1679,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "auctionData",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_struct(AuctionData)1671_storage)"
      },
      {
        "astId": 1683,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "auctionAccessManager",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_address)"
      },
      {
        "astId": 1687,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "auctionAccessData",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_uint256,t_bytes_storage)"
      },
      {
        "astId": 1689,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "registeredUsers",
        "offset": 0,
        "slot": "5",
        "type": "t_struct(Data)3423_storage"
      },
      {
        "astId": 1691,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "numUsers",
        "offset": 0,
        "slot": "7",
        "type": "t_uint64"
      },
      {
        "astId": 1693,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "auctionCounter",
        "offset": 0,
        "slot": "8",
        "type": "t_uint256"
      },
      {
        "astId": 1702,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "feeNumerator",
        "offset": 0,
        "slot": "9",
        "type": "t_uint256"
      },
      {
        "astId": 1708,
        "contract": "contracts/EasyAuction.sol:EasyAuction",
        "label": "feeReceiverUserId",
        "offset": 0,
        "slot": "10",
        "type": "t_uint64"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_contract(IERC20)981": {
        "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_address)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_uint256,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_uint256,t_struct(AuctionData)1671_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct EasyAuction.AuctionData)",
        "numberOfBytes": "32",
        "value": "t_struct(AuctionData)1671_storage"
      },
      "t_mapping(t_uint256,t_struct(Data)3614_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct IterableOrderedOrderSet.Data)",
        "numberOfBytes": "32",
        "value": "t_struct(Data)3614_storage"
      },
      "t_mapping(t_uint64,t_address)": {
        "encoding": "mapping",
        "key": "t_uint64",
        "label": "mapping(uint64 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_struct(AuctionData)1671_storage": {
        "encoding": "inplace",
        "label": "struct EasyAuction.AuctionData",
        "members": [
          {
            "astId": 1644,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "auctioningToken",
            "offset": 0,
            "slot": "0",
            "type": "t_contract(IERC20)981"
          },
          {
            "astId": 1646,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "biddingToken",
            "offset": 0,
            "slot": "1",
            "type": "t_contract(IERC20)981"
          },
          {
            "astId": 1648,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "orderCancellationEndDate",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 1650,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "auctionEndDate",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 1652,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "initialAuctionOrder",
            "offset": 0,
            "slot": "4",
            "type": "t_bytes32"
          },
          {
            "astId": 1654,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "minimumBiddingAmountPerOrder",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          },
          {
            "astId": 1656,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "interimSumBidAmount",
            "offset": 0,
            "slot": "6",
            "type": "t_uint256"
          },
          {
            "astId": 1658,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "interimOrder",
            "offset": 0,
            "slot": "7",
            "type": "t_bytes32"
          },
          {
            "astId": 1660,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "clearingPriceOrder",
            "offset": 0,
            "slot": "8",
            "type": "t_bytes32"
          },
          {
            "astId": 1662,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "volumeClearingPriceOrder",
            "offset": 0,
            "slot": "9",
            "type": "t_uint96"
          },
          {
            "astId": 1664,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "minFundingThresholdNotReached",
            "offset": 12,
            "slot": "9",
            "type": "t_bool"
          },
          {
            "astId": 1666,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "isAtomicClosureAllowed",
            "offset": 13,
            "slot": "9",
            "type": "t_bool"
          },
          {
            "astId": 1668,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "feeNumerator",
            "offset": 0,
            "slot": "10",
            "type": "t_uint256"
          },
          {
            "astId": 1670,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "minFundingThreshold",
            "offset": 0,
            "slot": "11",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "384"
      },
      "t_struct(Data)3423_storage": {
        "encoding": "inplace",
        "label": "struct IdToAddressBiMap.Data",
        "members": [
          {
            "astId": 3418,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "idToAddress",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_uint64,t_address)"
          },
          {
            "astId": 3422,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "addressToId",
            "offset": 0,
            "slot": "1",
            "type": "t_mapping(t_address,t_uint64)"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(Data)3614_storage": {
        "encoding": "inplace",
        "label": "struct IterableOrderedOrderSet.Data",
        "members": [
          {
            "astId": 3609,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "nextMap",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_bytes32,t_bytes32)"
          },
          {
            "astId": 3613,
            "contract": "contracts/EasyAuction.sol:EasyAuction",
            "label": "prevMap",
            "offset": 0,
            "slot": "1",
            "type": "t_mapping(t_bytes32,t_bytes32)"
          }
        ],
        "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"
      }
    }
  }
}