ETH Price: $2,406.60 (-4.09%)

Token

WebbItems (WEBBITEMS)
 

Overview

Max Total Supply

348 WEBBITEMS

Holders

206

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
DystoPunks: Deployer
Balance
0 WEBBITEMS
0xb9b6856efd128294a912d584366448bc3d4ea979
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

WebbItems is an interoperable pixel art MMORPG metaverse game giving utility to NFT projects. The game uses NFTs for in-game avatars, pets, lands, items, and quests.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WebbItems

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-05
*/

/*
SPDX-License-Identifier: GPL-3.0                                                                             
*/   

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev 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.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: contracts/WebbItems

pragma solidity ^0.8.0;

contract WebbItems is ERC721, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _itemCount;

    string _baseUri;

    bool public _isActive = false;
    bool public _isWhiteListOnly = true;

    mapping(address => bool) public _whiteList;
    mapping(address => uint256) public _whiteListAllocated;

    constructor() ERC721("WebbItems", "WEBBITEMS") {}

    function _baseURI() internal view override returns (string memory) {
        return _baseUri;
    }

    function setActive(bool isActive) external onlyOwner {
        _isActive = isActive;
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseUri = baseURI;
    }

    function setWhiteListOnly(bool isWhiteListOnlyActive) external onlyOwner {
        _isWhiteListOnly = isWhiteListOnlyActive;
    }

    function addToWhiteList(address [] calldata addresses, uint256 [] memory itemsAllocated) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _whiteList[addresses[i]] = true;
            _whiteListAllocated[addresses[i]] = itemsAllocated[i];
        }
    }

    function addToWhiteListSingle(address add, uint256 itemsAllocated) external onlyOwner {
        _whiteList[add] = true;
        _whiteListAllocated[add] = itemsAllocated;
    }

    function removeFromWhiteList(address [] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _whiteList[addresses[i]] = false;
            _whiteListAllocated[addresses[i]] = 0;
        }
    }

    function removeFromWhiteListSingle(address add) external onlyOwner {
        _whiteList[add] = false;
        _whiteListAllocated[add] = 0;
    }

    function devMint(uint256 quantity) external onlyOwner {
        for (uint256 i = 0; i < quantity; i++) {
            safeMint(msg.sender);
        }
    }

    function mintItems(uint256 quantity) external {
        require(_isActive, "contract is not open for minting");
        require(_isWhiteListOnly, "only available for approved users");
        require(_whiteList[msg.sender], "you are not an approved user");
        require(_whiteListAllocated[msg.sender] - quantity >= 0, "can't mint this many items");
        _whiteListAllocated[msg.sender] -= quantity;
        for (uint256 i = 0; i < quantity; i++) {
            safeMint(msg.sender);
        }
    }

    function safeMint(address to) internal {
        uint256 tokenId = _itemCount.current();
        _itemCount.increment();
        _safeMint(to, tokenId);
    }

    function totalSupply() public view returns (uint) {
        return _itemCount.current();
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isWhiteListOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whiteListAllocated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"itemsAllocated","type":"uint256[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"},{"internalType":"uint256","name":"itemsAllocated","type":"uint256"}],"name":"addToWhiteListSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"removeFromWhiteListSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isWhiteListOnlyActive","type":"bool"}],"name":"setWhiteListOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526009805461ffff19166101001790553480156200002057600080fd5b5060405180604001604052806009815260200168576562624974656d7360b81b81525060405180604001604052806009815260200168574542424954454d5360b81b81525081600090805190602001906200007d9291906200010c565b508051620000939060019060208401906200010c565b505050620000b0620000aa620000b660201b60201c565b620000ba565b620001ef565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011a90620001b2565b90600052602060002090601f0160209004810192826200013e576000855562000189565b82601f106200015957805160ff191683800117855562000189565b8280016001018555821562000189579182015b82811115620001895782518255916020019190600101906200016c565b50620001979291506200019b565b5090565b5b808211156200019757600081556001016200019c565b600281046001821680620001c757607f821691505b60208210811415620001e957634e487b7160e01b600052602260045260246000fd5b50919050565b61222f80620001ff6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b11560c5116100a2578063e985e9c511610071578063e985e9c5146103d2578063efc9878a146103e5578063f2fde38b146103f8578063f48e0bcb1461040b576101e5565b8063b11560c514610386578063b88d4fde14610399578063c87b56dd146103ac578063cb8a7b4d146103bf576101e5565b8063918dbcab116100de578063918dbcab1461034557806395d89b4114610358578063a22cb46514610360578063acec338a14610373576101e5565b806370a082311461031a578063715018a61461032d5780638da5cb5b146103355780638ec89e4f1461033d576101e5565b8063375a069a1161018757806352d4b9fb1161015657806352d4b9fb146102ce5780635367de6a146102e157806355f804b3146102f45780636352211e14610307576101e5565b8063375a069a146102985780633ccfd60b146102ab5780633fea92c5146102b357806342842e0e146102bb576101e5565b8063081812fc116101c3578063081812fc1461023b578063095ea7b31461025b57806318160ddd1461027057806323b872dd14610285576101e5565b806301ffc9a7146101ea57806305d60ffb1461021357806306fdde0314610226575b600080fd5b6101fd6101f83660046119eb565b61041e565b60405161020a9190611b2d565b60405180910390f35b6101fd610221366004611770565b610466565b61022e61047b565b60405161020a9190611b38565b61024e610249366004611a69565b61050d565b60405161020a9190611adc565b61026e610269366004611899565b610559565b005b6102786105f1565b60405161020a9190612095565b61026e6102933660046117bc565b610602565b61026e6102a6366004611a69565b61063a565b61026e6106a3565b6101fd610711565b61026e6102c93660046117bc565b61071f565b61026e6102dc366004611899565b61073a565b61026e6102ef366004611a69565b6107aa565b61026e610302366004611a23565b6108a6565b61024e610315366004611a69565b6108f8565b610278610328366004611770565b61092d565b61026e610971565b61024e6109bc565b6101fd6109cb565b61026e6103533660046119d1565b6109d4565b61022e610a2d565b61026e61036e366004611870565b610a3c565b61026e6103813660046119d1565b610b0a565b61026e6103943660046118c2565b610b5c565b61026e6103a73660046117f7565b610c70565b61022e6103ba366004611a69565b610caf565b6102786103cd366004611770565b610d32565b6101fd6103e036600461178a565b610d44565b61026e6103f3366004611770565b610d72565b61026e610406366004611770565b610ddd565b61026e610419366004611902565b610e4e565b60006001600160e01b031982166380ac58cd60e01b148061044f57506001600160e01b03198216635b5e139f60e01b145b8061045e575061045e82610f8a565b90505b919050565b600a6020526000908152604090205460ff1681565b60606000805461048a90612137565b80601f01602080910402602001604051908101604052809291908181526020018280546104b690612137565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b5050505050905090565b600061051882610fa3565b61053d5760405162461bcd60e51b815260040161053490611e47565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610564826108f8565b9050806001600160a01b0316836001600160a01b031614156105985760405162461bcd60e51b815260040161053490611f97565b806001600160a01b03166105aa610fc0565b6001600160a01b031614806105c657506105c6816103e0610fc0565b6105e25760405162461bcd60e51b815260040161053490611d22565b6105ec8383610fc4565b505050565b60006105fd6007611032565b905090565b61061361060d610fc0565b82611036565b61062f5760405162461bcd60e51b815260040161053490611fd8565b6105ec8383836110bb565b610642610fc0565b6001600160a01b03166106536109bc565b6001600160a01b0316146106795760405162461bcd60e51b815260040161053490611e93565b60005b8181101561069f5761068d336111e8565b8061069781612172565b91505061067c565b5050565b6106ab610fc0565b6001600160a01b03166106bc6109bc565b6001600160a01b0316146106e25760405162461bcd60e51b815260040161053490611e93565b6040514790339082156108fc029083906000818181858888f1935050505015801561069f573d6000803e3d6000fd5b600954610100900460ff1681565b6105ec83838360405180602001604052806000815250610c70565b610742610fc0565b6001600160a01b03166107536109bc565b6001600160a01b0316146107795760405162461bcd60e51b815260040161053490611e93565b6001600160a01b039091166000908152600a60209081526040808320805460ff19166001179055600b909152902055565b60095460ff166107cc5760405162461bcd60e51b815260040161053490612029565b600954610100900460ff166107f35760405162461bcd60e51b815260040161053490611b9d565b336000908152600a602052604090205460ff166108225760405162461bcd60e51b815260040161053490611f11565b336000908152600b602052604081205461083d9083906120f4565b101561085b5760405162461bcd60e51b81526004016105349061205e565b336000908152600b60205260408120805483929061087a9084906120f4565b90915550600090505b8181101561069f57610894336111e8565b8061089e81612172565b915050610883565b6108ae610fc0565b6001600160a01b03166108bf6109bc565b6001600160a01b0316146108e55760405162461bcd60e51b815260040161053490611e93565b805161069f90600890602084019061160f565b6000818152600260205260408120546001600160a01b03168061045e5760405162461bcd60e51b815260040161053490611dc9565b60006001600160a01b0382166109555760405162461bcd60e51b815260040161053490611d7f565b506001600160a01b031660009081526003602052604090205490565b610979610fc0565b6001600160a01b031661098a6109bc565b6001600160a01b0316146109b05760405162461bcd60e51b815260040161053490611e93565b6109ba600061120a565b565b6006546001600160a01b031690565b60095460ff1681565b6109dc610fc0565b6001600160a01b03166109ed6109bc565b6001600160a01b031614610a135760405162461bcd60e51b815260040161053490611e93565b600980549115156101000261ff0019909216919091179055565b60606001805461048a90612137565b610a44610fc0565b6001600160a01b0316826001600160a01b03161415610a755760405162461bcd60e51b815260040161053490611c9f565b8060056000610a82610fc0565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610ac6610fc0565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610afe9190611b2d565b60405180910390a35050565b610b12610fc0565b6001600160a01b0316610b236109bc565b6001600160a01b031614610b495760405162461bcd60e51b815260040161053490611e93565b6009805460ff1916911515919091179055565b610b64610fc0565b6001600160a01b0316610b756109bc565b6001600160a01b031614610b9b5760405162461bcd60e51b815260040161053490611e93565b60005b818110156105ec576000600a6000858585818110610bcc57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610be19190611770565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600b81858585818110610c2f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c449190611770565b6001600160a01b0316815260208101919091526040016000205580610c6881612172565b915050610b9e565b610c81610c7b610fc0565b83611036565b610c9d5760405162461bcd60e51b815260040161053490611fd8565b610ca98484848461125c565b50505050565b6060610cba82610fa3565b610cd65760405162461bcd60e51b815260040161053490611f48565b6000610ce061128f565b90506000815111610d005760405180602001604052806000815250610d2b565b80610d0a8461129e565b604051602001610d1b929190611aad565b6040516020818303038152906040525b9392505050565b600b6020526000908152604090205481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610d7a610fc0565b6001600160a01b0316610d8b6109bc565b6001600160a01b031614610db15760405162461bcd60e51b815260040161053490611e93565b6001600160a01b03166000908152600a60209081526040808320805460ff19169055600b909152812055565b610de5610fc0565b6001600160a01b0316610df66109bc565b6001600160a01b031614610e1c5760405162461bcd60e51b815260040161053490611e93565b6001600160a01b038116610e425760405162461bcd60e51b815260040161053490611bde565b610e4b8161120a565b50565b610e56610fc0565b6001600160a01b0316610e676109bc565b6001600160a01b031614610e8d5760405162461bcd60e51b815260040161053490611e93565b60005b82811015610ca9576001600a6000868685818110610ebe57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ed39190611770565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558151829082908110610f1d57634e487b7160e01b600052603260045260246000fd5b6020026020010151600b6000868685818110610f4957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f5e9190611770565b6001600160a01b0316815260208101919091526040016000205580610f8281612172565b915050610e90565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ff9826108f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5490565b600061104182610fa3565b61105d5760405162461bcd60e51b815260040161053490611cd6565b6000611068836108f8565b9050806001600160a01b0316846001600160a01b031614806110a35750836001600160a01b03166110988461050d565b6001600160a01b0316145b806110b357506110b38185610d44565b949350505050565b826001600160a01b03166110ce826108f8565b6001600160a01b0316146110f45760405162461bcd60e51b815260040161053490611ec8565b6001600160a01b03821661111a5760405162461bcd60e51b815260040161053490611c5b565b6111258383836105ec565b611130600082610fc4565b6001600160a01b03831660009081526003602052604081208054600192906111599084906120f4565b90915550506001600160a01b03821660009081526003602052604081208054600192906111879084906120c8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006111f46007611032565b905061120060076113b9565b61069f82826113c2565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112678484846110bb565b611273848484846113dc565b610ca95760405162461bcd60e51b815260040161053490611b4b565b60606008805461048a90612137565b6060816112c357506040805180820190915260018152600360fc1b6020820152610461565b8160005b81156112ed57806112d781612172565b91506112e69050600a836120e0565b91506112c7565b60008167ffffffffffffffff81111561131657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611340576020820181803683370190505b5090505b84156110b3576113556001836120f4565b9150611362600a8661218d565b61136d9060306120c8565b60f81b81838151811061139057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506113b2600a866120e0565b9450611344565b80546001019055565b61069f8282604051806020016040528060008152506114f7565b60006113f0846001600160a01b031661152a565b156114ec57836001600160a01b031663150b7a0261140c610fc0565b8786866040518563ffffffff1660e01b815260040161142e9493929190611af0565b602060405180830381600087803b15801561144857600080fd5b505af1925050508015611478575060408051601f3d908101601f1916820190925261147591810190611a07565b60015b6114d2573d8080156114a6576040519150601f19603f3d011682016040523d82523d6000602084013e6114ab565b606091505b5080516114ca5760405162461bcd60e51b815260040161053490611b4b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110b3565b506001949350505050565b6115018383611530565b61150e60008484846113dc565b6105ec5760405162461bcd60e51b815260040161053490611b4b565b3b151590565b6001600160a01b0382166115565760405162461bcd60e51b815260040161053490611e12565b61155f81610fa3565b1561157c5760405162461bcd60e51b815260040161053490611c24565b611588600083836105ec565b6001600160a01b03821660009081526003602052604081208054600192906115b19084906120c8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461161b90612137565b90600052602060002090601f01602090048101928261163d5760008555611683565b82601f1061165657805160ff1916838001178555611683565b82800160010185558215611683579182015b82811115611683578251825591602001919060010190611668565b5061168f929150611693565b5090565b5b8082111561168f5760008155600101611694565b600067ffffffffffffffff8311156116c2576116c26121cd565b6116d5601f8401601f191660200161209e565b90508281528383830111156116e957600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461046157600080fd5b60008083601f840112611728578182fd5b50813567ffffffffffffffff81111561173f578182fd5b602083019150836020808302850101111561175957600080fd5b9250929050565b8035801515811461046157600080fd5b600060208284031215611781578081fd5b610d2b82611700565b6000806040838503121561179c578081fd5b6117a583611700565b91506117b360208401611700565b90509250929050565b6000806000606084860312156117d0578081fd5b6117d984611700565b92506117e760208501611700565b9150604084013590509250925092565b6000806000806080858703121561180c578081fd5b61181585611700565b935061182360208601611700565b925060408501359150606085013567ffffffffffffffff811115611845578182fd5b8501601f81018713611855578182fd5b611864878235602084016116a8565b91505092959194509250565b60008060408385031215611882578182fd5b61188b83611700565b91506117b360208401611760565b600080604083850312156118ab578182fd5b6118b483611700565b946020939093013593505050565b600080602083850312156118d4578182fd5b823567ffffffffffffffff8111156118ea578283fd5b6118f685828601611717565b90969095509350505050565b600080600060408486031215611916578283fd5b833567ffffffffffffffff8082111561192d578485fd5b61193987838801611717565b9095509350602091508582013581811115611952578384fd5b8601601f81018813611962578384fd5b803582811115611974576119746121cd565b838102925061198484840161209e565b8181528481019083860185850187018c101561199e578788fd5b8795505b838610156119c05780358352600195909501949186019186016119a2565b508096505050505050509250925092565b6000602082840312156119e2578081fd5b610d2b82611760565b6000602082840312156119fc578081fd5b8135610d2b816121e3565b600060208284031215611a18578081fd5b8151610d2b816121e3565b600060208284031215611a34578081fd5b813567ffffffffffffffff811115611a4a578182fd5b8201601f81018413611a5a578182fd5b6110b3848235602084016116a8565b600060208284031215611a7a578081fd5b5035919050565b60008151808452611a9981602086016020860161210b565b601f01601f19169290920160200192915050565b60008351611abf81846020880161210b565b835190830190611ad381836020880161210b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b2390830184611a81565b9695505050505050565b901515815260200190565b600060208252610d2b6020830184611a81565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f6f6e6c7920617661696c61626c6520666f7220617070726f76656420757365726040820152607360f81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252601c908201527f796f7520617265206e6f7420616e20617070726f766564207573657200000000604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f636f6e7472616374206973206e6f74206f70656e20666f72206d696e74696e67604082015260600190565b6020808252601a908201527f63616e2774206d696e742074686973206d616e79206974656d73000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff811182821017156120c0576120c06121cd565b604052919050565b600082198211156120db576120db6121a1565b500190565b6000826120ef576120ef6121b7565b500490565b600082821015612106576121066121a1565b500390565b60005b8381101561212657818101518382015260200161210e565b83811115610ca95750506000910152565b60028104600182168061214b57607f821691505b6020821081141561216c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612186576121866121a1565b5060010190565b60008261219c5761219c6121b7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e4b57600080fdfea26469706673582212209a7318114226b55c1d28e93f6a8f204514e589dd76251468f1cddc1afa14517964736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b11560c5116100a2578063e985e9c511610071578063e985e9c5146103d2578063efc9878a146103e5578063f2fde38b146103f8578063f48e0bcb1461040b576101e5565b8063b11560c514610386578063b88d4fde14610399578063c87b56dd146103ac578063cb8a7b4d146103bf576101e5565b8063918dbcab116100de578063918dbcab1461034557806395d89b4114610358578063a22cb46514610360578063acec338a14610373576101e5565b806370a082311461031a578063715018a61461032d5780638da5cb5b146103355780638ec89e4f1461033d576101e5565b8063375a069a1161018757806352d4b9fb1161015657806352d4b9fb146102ce5780635367de6a146102e157806355f804b3146102f45780636352211e14610307576101e5565b8063375a069a146102985780633ccfd60b146102ab5780633fea92c5146102b357806342842e0e146102bb576101e5565b8063081812fc116101c3578063081812fc1461023b578063095ea7b31461025b57806318160ddd1461027057806323b872dd14610285576101e5565b806301ffc9a7146101ea57806305d60ffb1461021357806306fdde0314610226575b600080fd5b6101fd6101f83660046119eb565b61041e565b60405161020a9190611b2d565b60405180910390f35b6101fd610221366004611770565b610466565b61022e61047b565b60405161020a9190611b38565b61024e610249366004611a69565b61050d565b60405161020a9190611adc565b61026e610269366004611899565b610559565b005b6102786105f1565b60405161020a9190612095565b61026e6102933660046117bc565b610602565b61026e6102a6366004611a69565b61063a565b61026e6106a3565b6101fd610711565b61026e6102c93660046117bc565b61071f565b61026e6102dc366004611899565b61073a565b61026e6102ef366004611a69565b6107aa565b61026e610302366004611a23565b6108a6565b61024e610315366004611a69565b6108f8565b610278610328366004611770565b61092d565b61026e610971565b61024e6109bc565b6101fd6109cb565b61026e6103533660046119d1565b6109d4565b61022e610a2d565b61026e61036e366004611870565b610a3c565b61026e6103813660046119d1565b610b0a565b61026e6103943660046118c2565b610b5c565b61026e6103a73660046117f7565b610c70565b61022e6103ba366004611a69565b610caf565b6102786103cd366004611770565b610d32565b6101fd6103e036600461178a565b610d44565b61026e6103f3366004611770565b610d72565b61026e610406366004611770565b610ddd565b61026e610419366004611902565b610e4e565b60006001600160e01b031982166380ac58cd60e01b148061044f57506001600160e01b03198216635b5e139f60e01b145b8061045e575061045e82610f8a565b90505b919050565b600a6020526000908152604090205460ff1681565b60606000805461048a90612137565b80601f01602080910402602001604051908101604052809291908181526020018280546104b690612137565b80156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b5050505050905090565b600061051882610fa3565b61053d5760405162461bcd60e51b815260040161053490611e47565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610564826108f8565b9050806001600160a01b0316836001600160a01b031614156105985760405162461bcd60e51b815260040161053490611f97565b806001600160a01b03166105aa610fc0565b6001600160a01b031614806105c657506105c6816103e0610fc0565b6105e25760405162461bcd60e51b815260040161053490611d22565b6105ec8383610fc4565b505050565b60006105fd6007611032565b905090565b61061361060d610fc0565b82611036565b61062f5760405162461bcd60e51b815260040161053490611fd8565b6105ec8383836110bb565b610642610fc0565b6001600160a01b03166106536109bc565b6001600160a01b0316146106795760405162461bcd60e51b815260040161053490611e93565b60005b8181101561069f5761068d336111e8565b8061069781612172565b91505061067c565b5050565b6106ab610fc0565b6001600160a01b03166106bc6109bc565b6001600160a01b0316146106e25760405162461bcd60e51b815260040161053490611e93565b6040514790339082156108fc029083906000818181858888f1935050505015801561069f573d6000803e3d6000fd5b600954610100900460ff1681565b6105ec83838360405180602001604052806000815250610c70565b610742610fc0565b6001600160a01b03166107536109bc565b6001600160a01b0316146107795760405162461bcd60e51b815260040161053490611e93565b6001600160a01b039091166000908152600a60209081526040808320805460ff19166001179055600b909152902055565b60095460ff166107cc5760405162461bcd60e51b815260040161053490612029565b600954610100900460ff166107f35760405162461bcd60e51b815260040161053490611b9d565b336000908152600a602052604090205460ff166108225760405162461bcd60e51b815260040161053490611f11565b336000908152600b602052604081205461083d9083906120f4565b101561085b5760405162461bcd60e51b81526004016105349061205e565b336000908152600b60205260408120805483929061087a9084906120f4565b90915550600090505b8181101561069f57610894336111e8565b8061089e81612172565b915050610883565b6108ae610fc0565b6001600160a01b03166108bf6109bc565b6001600160a01b0316146108e55760405162461bcd60e51b815260040161053490611e93565b805161069f90600890602084019061160f565b6000818152600260205260408120546001600160a01b03168061045e5760405162461bcd60e51b815260040161053490611dc9565b60006001600160a01b0382166109555760405162461bcd60e51b815260040161053490611d7f565b506001600160a01b031660009081526003602052604090205490565b610979610fc0565b6001600160a01b031661098a6109bc565b6001600160a01b0316146109b05760405162461bcd60e51b815260040161053490611e93565b6109ba600061120a565b565b6006546001600160a01b031690565b60095460ff1681565b6109dc610fc0565b6001600160a01b03166109ed6109bc565b6001600160a01b031614610a135760405162461bcd60e51b815260040161053490611e93565b600980549115156101000261ff0019909216919091179055565b60606001805461048a90612137565b610a44610fc0565b6001600160a01b0316826001600160a01b03161415610a755760405162461bcd60e51b815260040161053490611c9f565b8060056000610a82610fc0565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610ac6610fc0565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610afe9190611b2d565b60405180910390a35050565b610b12610fc0565b6001600160a01b0316610b236109bc565b6001600160a01b031614610b495760405162461bcd60e51b815260040161053490611e93565b6009805460ff1916911515919091179055565b610b64610fc0565b6001600160a01b0316610b756109bc565b6001600160a01b031614610b9b5760405162461bcd60e51b815260040161053490611e93565b60005b818110156105ec576000600a6000858585818110610bcc57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610be19190611770565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600b81858585818110610c2f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c449190611770565b6001600160a01b0316815260208101919091526040016000205580610c6881612172565b915050610b9e565b610c81610c7b610fc0565b83611036565b610c9d5760405162461bcd60e51b815260040161053490611fd8565b610ca98484848461125c565b50505050565b6060610cba82610fa3565b610cd65760405162461bcd60e51b815260040161053490611f48565b6000610ce061128f565b90506000815111610d005760405180602001604052806000815250610d2b565b80610d0a8461129e565b604051602001610d1b929190611aad565b6040516020818303038152906040525b9392505050565b600b6020526000908152604090205481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610d7a610fc0565b6001600160a01b0316610d8b6109bc565b6001600160a01b031614610db15760405162461bcd60e51b815260040161053490611e93565b6001600160a01b03166000908152600a60209081526040808320805460ff19169055600b909152812055565b610de5610fc0565b6001600160a01b0316610df66109bc565b6001600160a01b031614610e1c5760405162461bcd60e51b815260040161053490611e93565b6001600160a01b038116610e425760405162461bcd60e51b815260040161053490611bde565b610e4b8161120a565b50565b610e56610fc0565b6001600160a01b0316610e676109bc565b6001600160a01b031614610e8d5760405162461bcd60e51b815260040161053490611e93565b60005b82811015610ca9576001600a6000868685818110610ebe57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ed39190611770565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558151829082908110610f1d57634e487b7160e01b600052603260045260246000fd5b6020026020010151600b6000868685818110610f4957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f5e9190611770565b6001600160a01b0316815260208101919091526040016000205580610f8281612172565b915050610e90565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ff9826108f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5490565b600061104182610fa3565b61105d5760405162461bcd60e51b815260040161053490611cd6565b6000611068836108f8565b9050806001600160a01b0316846001600160a01b031614806110a35750836001600160a01b03166110988461050d565b6001600160a01b0316145b806110b357506110b38185610d44565b949350505050565b826001600160a01b03166110ce826108f8565b6001600160a01b0316146110f45760405162461bcd60e51b815260040161053490611ec8565b6001600160a01b03821661111a5760405162461bcd60e51b815260040161053490611c5b565b6111258383836105ec565b611130600082610fc4565b6001600160a01b03831660009081526003602052604081208054600192906111599084906120f4565b90915550506001600160a01b03821660009081526003602052604081208054600192906111879084906120c8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006111f46007611032565b905061120060076113b9565b61069f82826113c2565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112678484846110bb565b611273848484846113dc565b610ca95760405162461bcd60e51b815260040161053490611b4b565b60606008805461048a90612137565b6060816112c357506040805180820190915260018152600360fc1b6020820152610461565b8160005b81156112ed57806112d781612172565b91506112e69050600a836120e0565b91506112c7565b60008167ffffffffffffffff81111561131657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611340576020820181803683370190505b5090505b84156110b3576113556001836120f4565b9150611362600a8661218d565b61136d9060306120c8565b60f81b81838151811061139057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506113b2600a866120e0565b9450611344565b80546001019055565b61069f8282604051806020016040528060008152506114f7565b60006113f0846001600160a01b031661152a565b156114ec57836001600160a01b031663150b7a0261140c610fc0565b8786866040518563ffffffff1660e01b815260040161142e9493929190611af0565b602060405180830381600087803b15801561144857600080fd5b505af1925050508015611478575060408051601f3d908101601f1916820190925261147591810190611a07565b60015b6114d2573d8080156114a6576040519150601f19603f3d011682016040523d82523d6000602084013e6114ab565b606091505b5080516114ca5760405162461bcd60e51b815260040161053490611b4b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110b3565b506001949350505050565b6115018383611530565b61150e60008484846113dc565b6105ec5760405162461bcd60e51b815260040161053490611b4b565b3b151590565b6001600160a01b0382166115565760405162461bcd60e51b815260040161053490611e12565b61155f81610fa3565b1561157c5760405162461bcd60e51b815260040161053490611c24565b611588600083836105ec565b6001600160a01b03821660009081526003602052604081208054600192906115b19084906120c8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461161b90612137565b90600052602060002090601f01602090048101928261163d5760008555611683565b82601f1061165657805160ff1916838001178555611683565b82800160010185558215611683579182015b82811115611683578251825591602001919060010190611668565b5061168f929150611693565b5090565b5b8082111561168f5760008155600101611694565b600067ffffffffffffffff8311156116c2576116c26121cd565b6116d5601f8401601f191660200161209e565b90508281528383830111156116e957600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461046157600080fd5b60008083601f840112611728578182fd5b50813567ffffffffffffffff81111561173f578182fd5b602083019150836020808302850101111561175957600080fd5b9250929050565b8035801515811461046157600080fd5b600060208284031215611781578081fd5b610d2b82611700565b6000806040838503121561179c578081fd5b6117a583611700565b91506117b360208401611700565b90509250929050565b6000806000606084860312156117d0578081fd5b6117d984611700565b92506117e760208501611700565b9150604084013590509250925092565b6000806000806080858703121561180c578081fd5b61181585611700565b935061182360208601611700565b925060408501359150606085013567ffffffffffffffff811115611845578182fd5b8501601f81018713611855578182fd5b611864878235602084016116a8565b91505092959194509250565b60008060408385031215611882578182fd5b61188b83611700565b91506117b360208401611760565b600080604083850312156118ab578182fd5b6118b483611700565b946020939093013593505050565b600080602083850312156118d4578182fd5b823567ffffffffffffffff8111156118ea578283fd5b6118f685828601611717565b90969095509350505050565b600080600060408486031215611916578283fd5b833567ffffffffffffffff8082111561192d578485fd5b61193987838801611717565b9095509350602091508582013581811115611952578384fd5b8601601f81018813611962578384fd5b803582811115611974576119746121cd565b838102925061198484840161209e565b8181528481019083860185850187018c101561199e578788fd5b8795505b838610156119c05780358352600195909501949186019186016119a2565b508096505050505050509250925092565b6000602082840312156119e2578081fd5b610d2b82611760565b6000602082840312156119fc578081fd5b8135610d2b816121e3565b600060208284031215611a18578081fd5b8151610d2b816121e3565b600060208284031215611a34578081fd5b813567ffffffffffffffff811115611a4a578182fd5b8201601f81018413611a5a578182fd5b6110b3848235602084016116a8565b600060208284031215611a7a578081fd5b5035919050565b60008151808452611a9981602086016020860161210b565b601f01601f19169290920160200192915050565b60008351611abf81846020880161210b565b835190830190611ad381836020880161210b565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b2390830184611a81565b9695505050505050565b901515815260200190565b600060208252610d2b6020830184611a81565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f6f6e6c7920617661696c61626c6520666f7220617070726f76656420757365726040820152607360f81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252601c908201527f796f7520617265206e6f7420616e20617070726f766564207573657200000000604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f636f6e7472616374206973206e6f74206f70656e20666f72206d696e74696e67604082015260600190565b6020808252601a908201527f63616e2774206d696e742074686973206d616e79206974656d73000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff811182821017156120c0576120c06121cd565b604052919050565b600082198211156120db576120db6121a1565b500190565b6000826120ef576120ef6121b7565b500490565b600082821015612106576121066121a1565b500390565b60005b8381101561212657818101518382015260200161210e565b83811115610ca95750506000910152565b60028104600182168061214b57607f821691505b6020821081141561216c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612186576121866121a1565b5060010190565b60008261219c5761219c6121b7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e4b57600080fdfea26469706673582212209a7318114226b55c1d28e93f6a8f204514e589dd76251468f1cddc1afa14517964736f6c63430008000033

Deployed Bytecode Sourcemap

35896:2884:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20146:305;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36133:42;;;;;;:::i;:::-;;:::i;21091:100::-;;;:::i;:::-;;;;;;;:::i;22650:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22173:411::-;;;;;;:::i;:::-;;:::i;:::-;;38528:96;;;:::i;:::-;;;;;;;:::i;23540:339::-;;;;;;:::i;:::-;;:::i;37671:158::-;;;;;;:::i;:::-;;:::i;38632:145::-;;;:::i;36089:35::-;;;:::i;23950:185::-;;;;;;:::i;:::-;;:::i;37065:179::-;;;;;;:::i;:::-;;:::i;37837:513::-;;;;;;:::i;:::-;;:::i;36511:99::-;;;;;;:::i;:::-;;:::i;20785:239::-;;;;;;:::i;:::-;;:::i;20515:208::-;;;;;;:::i;:::-;;:::i;33857:94::-;;;:::i;33206:87::-;;;:::i;36053:29::-;;;:::i;36618:132::-;;;;;;:::i;:::-;;:::i;21260:104::-;;;:::i;22943:295::-;;;;;;:::i;:::-;;:::i;36411:92::-;;;;;;:::i;:::-;;:::i;37252:255::-;;;;;;:::i;:::-;;:::i;24206:328::-;;;;;;:::i;:::-;;:::i;21435:334::-;;;;;;:::i;:::-;;:::i;36182:54::-;;;;;;:::i;:::-;;:::i;23309:164::-;;;;;;:::i;:::-;;:::i;37515:148::-;;;;;;:::i;:::-;;:::i;34106:192::-;;;;;;:::i;:::-;;:::i;36758:299::-;;;;;;:::i;:::-;;:::i;20146:305::-;20248:4;-1:-1:-1;;;;;;20285:40:0;;-1:-1:-1;;;20285:40:0;;:105;;-1:-1:-1;;;;;;;20342:48:0;;-1:-1:-1;;;20342:48:0;20285:105;:158;;;;20407:36;20431:11;20407:23;:36::i;:::-;20265:178;;20146:305;;;;:::o;36133:42::-;;;;;;;;;;;;;;;:::o;21091:100::-;21145:13;21178:5;21171:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21091:100;:::o;22650:221::-;22726:7;22754:16;22762:7;22754;:16::i;:::-;22746:73;;;;-1:-1:-1;;;22746:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;22839:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22839:24:0;;22650:221::o;22173:411::-;22254:13;22270:23;22285:7;22270:14;:23::i;:::-;22254:39;;22318:5;-1:-1:-1;;;;;22312:11:0;:2;-1:-1:-1;;;;;22312:11:0;;;22304:57;;;;-1:-1:-1;;;22304:57:0;;;;;;;:::i;:::-;22412:5;-1:-1:-1;;;;;22396:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22396:21:0;;:62;;;;22421:37;22438:5;22445:12;:10;:12::i;22421:37::-;22374:168;;;;-1:-1:-1;;;22374:168:0;;;;;;;:::i;:::-;22555:21;22564:2;22568:7;22555:8;:21::i;:::-;22173:411;;;:::o;38528:96::-;38572:4;38596:20;:10;:18;:20::i;:::-;38589:27;;38528:96;:::o;23540:339::-;23735:41;23754:12;:10;:12::i;:::-;23768:7;23735:18;:41::i;:::-;23727:103;;;;-1:-1:-1;;;23727:103:0;;;;;;;:::i;:::-;23843:28;23853:4;23859:2;23863:7;23843:9;:28::i;37671:158::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;37741:9:::1;37736:86;37760:8;37756:1;:12;37736:86;;;37790:20;37799:10;37790:8;:20::i;:::-;37770:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37736:86;;;;37671:158:::0;:::o;38632:145::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;38732:37:::1;::::0;38700:21:::1;::::0;38740:10:::1;::::0;38732:37;::::1;;;::::0;38700:21;;38682:15:::1;38732:37:::0;38682:15;38732:37;38700:21;38740:10;38732:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;36089:35:::0;;;;;;;;;:::o;23950:185::-;24088:39;24105:4;24111:2;24115:7;24088:39;;;;;;;;;;;;:16;:39::i;37065:179::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37162:15:0;;::::1;;::::0;;;:10:::1;:15;::::0;;;;;;;:22;;-1:-1:-1;;37162:22:0::1;37180:4;37162:22;::::0;;37195:19:::1;:24:::0;;;;;:41;37065:179::o;37837:513::-;37902:9;;;;37894:54;;;;-1:-1:-1;;;37894:54:0;;;;;;;:::i;:::-;37967:16;;;;;;;37959:62;;;;-1:-1:-1;;;37959:62:0;;;;;;;:::i;:::-;38051:10;38040:22;;;;:10;:22;;;;;;;;38032:63;;;;-1:-1:-1;;;38032:63:0;;;;;;;:::i;:::-;38134:10;38160:1;38114:31;;;:19;:31;;;;;;:42;;38148:8;;38114:42;:::i;:::-;:47;;38106:86;;;;-1:-1:-1;;;38106:86:0;;;;;;;:::i;:::-;38223:10;38203:31;;;;:19;:31;;;;;:43;;38238:8;;38203:31;:43;;38238:8;;38203:43;:::i;:::-;;;;-1:-1:-1;38262:9:0;;-1:-1:-1;38257:86:0;38281:8;38277:1;:12;38257:86;;;38311:20;38320:10;38311:8;:20::i;:::-;38291:3;;;;:::i;:::-;;;;38257:86;;36511:99;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;36584:18;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;20785:239::-:0;20857:7;20893:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20893:16:0;20928:19;20920:73;;;;-1:-1:-1;;;20920:73:0;;;;;;;:::i;20515:208::-;20587:7;-1:-1:-1;;;;;20615:19:0;;20607:74;;;;-1:-1:-1;;;20607:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;20699:16:0;;;;;:9;:16;;;;;;;20515:208::o;33857:94::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;33922:21:::1;33940:1;33922:9;:21::i;:::-;33857:94::o:0;33206:87::-;33279:6;;-1:-1:-1;;;;;33279:6:0;33206:87;:::o;36053:29::-;;;;;;:::o;36618:132::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;36702:16:::1;:40:::0;;;::::1;;;;-1:-1:-1::0;;36702:40:0;;::::1;::::0;;;::::1;::::0;;36618:132::o;21260:104::-;21316:13;21349:7;21342:14;;;;;:::i;22943:295::-;23058:12;:10;:12::i;:::-;-1:-1:-1;;;;;23046:24:0;:8;-1:-1:-1;;;;;23046:24:0;;;23038:62;;;;-1:-1:-1;;;23038:62:0;;;;;;;:::i;:::-;23158:8;23113:18;:32;23132:12;:10;:12::i;:::-;-1:-1:-1;;;;;23113:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23113:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23113:53:0;;;;;;;;;;;23197:12;:10;:12::i;:::-;-1:-1:-1;;;;;23182:48:0;;23221:8;23182:48;;;;;;:::i;:::-;;;;;;;;22943:295;;:::o;36411:92::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;36475:9:::1;:20:::0;;-1:-1:-1;;36475:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36411:92::o;37252:255::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;37347:9:::1;37342:158;37362:20:::0;;::::1;37342:158;;;37431:5;37404:10;:24;37415:9;;37425:1;37415:12;;;;;-1:-1:-1::0;;;37415:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37404:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;37404:24:0;;;:32;;-1:-1:-1;;37404:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;37451:19:::1;-1:-1:-1::0;37471:9:0;;37481:1;37471:12;;::::1;;;-1:-1:-1::0;;;37471:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37451:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;37451:33:0;:37;37384:3;::::1;::::0;::::1;:::i;:::-;;;;37342:158;;24206:328:::0;24381:41;24400:12;:10;:12::i;:::-;24414:7;24381:18;:41::i;:::-;24373:103;;;;-1:-1:-1;;;24373:103:0;;;;;;;:::i;:::-;24487:39;24501:4;24507:2;24511:7;24520:5;24487:13;:39::i;:::-;24206:328;;;;:::o;21435:334::-;21508:13;21542:16;21550:7;21542;:16::i;:::-;21534:76;;;;-1:-1:-1;;;21534:76:0;;;;;;;:::i;:::-;21623:21;21647:10;:8;:10::i;:::-;21623:34;;21699:1;21681:7;21675:21;:25;:86;;;;;;;;;;;;;;;;;21727:7;21736:18;:7;:16;:18::i;:::-;21710:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21675:86;21668:93;21435:334;-1:-1:-1;;;21435:334:0:o;36182:54::-;;;;;;;;;;;;;:::o;23309:164::-;-1:-1:-1;;;;;23430:25:0;;;23406:4;23430:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23309:164::o;37515:148::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37593:15:0::1;37611:5;37593:15:::0;;;:10:::1;:15;::::0;;;;;;;:23;;-1:-1:-1;;37593:23:0::1;::::0;;37627:19:::1;:24:::0;;;;;:28;37515:148::o;34106:192::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34195:22:0;::::1;34187:73;;;;-1:-1:-1::0;;;34187:73:0::1;;;;;;;:::i;:::-;34271:19;34281:8;34271:9;:19::i;:::-;34106:192:::0;:::o;36758:299::-;33437:12;:10;:12::i;:::-;-1:-1:-1;;;;;33426:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33426:23:0;;33418:68;;;;-1:-1:-1;;;33418:68:0;;;;;;;:::i;:::-;36882:9:::1;36877:173;36897:20:::0;;::::1;36877:173;;;36966:4;36939:10;:24;36950:9;;36960:1;36950:12;;;;;-1:-1:-1::0;;;36950:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36939:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36939:24:0;:31;;-1:-1:-1;;36939:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37021:17;;;;37036:1;;37021:17;::::1;;;-1:-1:-1::0;;;37021:17:0::1;;;;;;;;;;;;;;;36985:19;:33;37005:9;;37015:1;37005:12;;;;;-1:-1:-1::0;;;37005:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36985:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36985:33:0;:53;36919:3;::::1;::::0;::::1;:::i;:::-;;;;36877:173;;18728:157:::0;-1:-1:-1;;;;;;18837:40:0;;-1:-1:-1;;;18837:40:0;18728:157;;;:::o;26044:127::-;26109:4;26133:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26133:16:0;:30;;;26044:127::o;15777:98::-;15857:10;15777:98;:::o;30026:174::-;30101:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30101:29:0;-1:-1:-1;;;;;30101:29:0;;;;;;;;:24;;30155:23;30101:24;30155:14;:23::i;:::-;-1:-1:-1;;;;;30146:46:0;;;;;;;;;;;30026:174;;:::o;35244:114::-;35336:14;;35244:114::o;26338:348::-;26431:4;26456:16;26464:7;26456;:16::i;:::-;26448:73;;;;-1:-1:-1;;;26448:73:0;;;;;;;:::i;:::-;26532:13;26548:23;26563:7;26548:14;:23::i;:::-;26532:39;;26601:5;-1:-1:-1;;;;;26590:16:0;:7;-1:-1:-1;;;;;26590:16:0;;:51;;;;26634:7;-1:-1:-1;;;;;26610:31:0;:20;26622:7;26610:11;:20::i;:::-;-1:-1:-1;;;;;26610:31:0;;26590:51;:87;;;;26645:32;26662:5;26669:7;26645:16;:32::i;:::-;26582:96;26338:348;-1:-1:-1;;;;26338:348:0:o;29330:578::-;29489:4;-1:-1:-1;;;;;29462:31:0;:23;29477:7;29462:14;:23::i;:::-;-1:-1:-1;;;;;29462:31:0;;29454:85;;;;-1:-1:-1;;;29454:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29558:16:0;;29550:65;;;;-1:-1:-1;;;29550:65:0;;;;;;;:::i;:::-;29628:39;29649:4;29655:2;29659:7;29628:20;:39::i;:::-;29732:29;29749:1;29753:7;29732:8;:29::i;:::-;-1:-1:-1;;;;;29774:15:0;;;;;;:9;:15;;;;;:20;;29793:1;;29774:15;:20;;29793:1;;29774:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29805:13:0;;;;;;:9;:13;;;;;:18;;29822:1;;29805:13;:18;;29822:1;;29805:18;:::i;:::-;;;;-1:-1:-1;;29834:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29834:21:0;-1:-1:-1;;;;;29834:21:0;;;;;;;;;29873:27;;29834:16;;29873:27;;;;;;;29330:578;;;:::o;38358:162::-;38408:15;38426:20;:10;:18;:20::i;:::-;38408:38;;38457:22;:10;:20;:22::i;:::-;38490;38500:2;38504:7;38490:9;:22::i;34306:173::-;34381:6;;;-1:-1:-1;;;;;34398:17:0;;;-1:-1:-1;;;;;;34398:17:0;;;;;;;34431:40;;34381:6;;;34398:17;34381:6;;34431:40;;34362:16;;34431:40;34306:173;;:::o;25416:315::-;25573:28;25583:4;25589:2;25593:7;25573:9;:28::i;:::-;25620:48;25643:4;25649:2;25653:7;25662:5;25620:22;:48::i;:::-;25612:111;;;;-1:-1:-1;;;25612:111:0;;;;;;;:::i;36302:101::-;36354:13;36387:8;36380:15;;;;;:::i;16244:723::-;16300:13;16521:10;16517:53;;-1:-1:-1;16548:10:0;;;;;;;;;;;;-1:-1:-1;;;16548:10:0;;;;;;16517:53;16595:5;16580:12;16636:78;16643:9;;16636:78;;16669:8;;;;:::i;:::-;;-1:-1:-1;16692:10:0;;-1:-1:-1;16700:2:0;16692:10;;:::i;:::-;;;16636:78;;;16724:19;16756:6;16746:17;;;;;;-1:-1:-1;;;16746:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16746:17:0;;16724:39;;16774:154;16781:10;;16774:154;;16808:11;16818:1;16808:11;;:::i;:::-;;-1:-1:-1;16877:10:0;16885:2;16877:5;:10;:::i;:::-;16864:24;;:2;:24;:::i;:::-;16851:39;;16834:6;16841;16834:14;;;;;;-1:-1:-1;;;16834:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16834:56:0;;;;;;;;-1:-1:-1;16905:11:0;16914:2;16905:11;;:::i;:::-;;;16774:154;;35366:127;35455:19;;35473:1;35455:19;;;35366:127::o;27028:110::-;27104:26;27114:2;27118:7;27104:26;;;;;;;;;;;;:9;:26::i;30765:799::-;30920:4;30941:15;:2;-1:-1:-1;;;;;30941:13:0;;:15::i;:::-;30937:620;;;30993:2;-1:-1:-1;;;;;30977:36:0;;31014:12;:10;:12::i;:::-;31028:4;31034:7;31043:5;30977:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30977:72:0;;;;;;;;-1:-1:-1;;30977:72:0;;;;;;;;;;;;:::i;:::-;;;30973:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31219:13:0;;31215:272;;31262:60;;-1:-1:-1;;;31262:60:0;;;;;;;:::i;31215:272::-;31437:6;31431:13;31422:6;31418:2;31414:15;31407:38;30973:529;-1:-1:-1;;;;;;31100:51:0;-1:-1:-1;;;31100:51:0;;-1:-1:-1;31093:58:0;;30937:620;-1:-1:-1;31541:4:0;30765:799;;;;;;:::o;27365:321::-;27495:18;27501:2;27505:7;27495:5;:18::i;:::-;27546:54;27577:1;27581:2;27585:7;27594:5;27546:22;:54::i;:::-;27524:154;;;;-1:-1:-1;;;27524:154:0;;;;;;;:::i;7879:387::-;8202:20;8250:8;;;7879:387::o;28022:382::-;-1:-1:-1;;;;;28102:16:0;;28094:61;;;;-1:-1:-1;;;28094:61:0;;;;;;;:::i;:::-;28175:16;28183:7;28175;:16::i;:::-;28174:17;28166:58;;;;-1:-1:-1;;;28166:58:0;;;;;;;:::i;:::-;28237:45;28266:1;28270:2;28274:7;28237:20;:45::i;:::-;-1:-1:-1;;;;;28295:13:0;;;;;;:9;:13;;;;;:18;;28312:1;;28295:13;:18;;28312:1;;28295:18;:::i;:::-;;;;-1:-1:-1;;28324:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28324:21:0;-1:-1:-1;;;;;28324:21:0;;;;;;;;28363:33;;28324:16;;;28363:33;;28324:16;;28363:33;28022:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:404;;;741:3;734:4;726:6;722:17;718:27;708:2;;766:8;756;749:26;708:2;-1:-1:-1;796:20:1;;839:18;828:30;;825:2;;;878:8;868;861:26;825:2;922:4;914:6;910:17;898:29;;985:3;978:4;970;962:6;958:17;950:6;946:30;942:41;939:50;936:2;;;1002:1;999;992:12;936:2;698:314;;;;;:::o;1017:162::-;1084:20;;1140:13;;1133:21;1123:32;;1113:2;;1169:1;1166;1159:12;1184:198;;1296:2;1284:9;1275:7;1271:23;1267:32;1264:2;;;1317:6;1309;1302:22;1264:2;1345:31;1366:9;1345:31;:::i;1387:274::-;;;1516:2;1504:9;1495:7;1491:23;1487:32;1484:2;;;1537:6;1529;1522:22;1484:2;1565:31;1586:9;1565:31;:::i;:::-;1555:41;;1615:40;1651:2;1640:9;1636:18;1615:40;:::i;:::-;1605:50;;1474:187;;;;;:::o;1666:342::-;;;;1812:2;1800:9;1791:7;1787:23;1783:32;1780:2;;;1833:6;1825;1818:22;1780:2;1861:31;1882:9;1861:31;:::i;:::-;1851:41;;1911:40;1947:2;1936:9;1932:18;1911:40;:::i;:::-;1901:50;;1998:2;1987:9;1983:18;1970:32;1960:42;;1770:238;;;;;:::o;2013:702::-;;;;;2185:3;2173:9;2164:7;2160:23;2156:33;2153:2;;;2207:6;2199;2192:22;2153:2;2235:31;2256:9;2235:31;:::i;:::-;2225:41;;2285:40;2321:2;2310:9;2306:18;2285:40;:::i;:::-;2275:50;;2372:2;2361:9;2357:18;2344:32;2334:42;;2427:2;2416:9;2412:18;2399:32;2454:18;2446:6;2443:30;2440:2;;;2491:6;2483;2476:22;2440:2;2519:22;;2572:4;2564:13;;2560:27;-1:-1:-1;2550:2:1;;2606:6;2598;2591:22;2550:2;2634:75;2701:7;2696:2;2683:16;2678:2;2674;2670:11;2634:75;:::i;:::-;2624:85;;;2143:572;;;;;;;:::o;2720:268::-;;;2846:2;2834:9;2825:7;2821:23;2817:32;2814:2;;;2867:6;2859;2852:22;2814:2;2895:31;2916:9;2895:31;:::i;:::-;2885:41;;2945:37;2978:2;2967:9;2963:18;2945:37;:::i;2993:266::-;;;3122:2;3110:9;3101:7;3097:23;3093:32;3090:2;;;3143:6;3135;3128:22;3090:2;3171:31;3192:9;3171:31;:::i;:::-;3161:41;3249:2;3234:18;;;;3221:32;;-1:-1:-1;;;3080:179:1:o;3264:463::-;;;3411:2;3399:9;3390:7;3386:23;3382:32;3379:2;;;3432:6;3424;3417:22;3379:2;3477:9;3464:23;3510:18;3502:6;3499:30;3496:2;;;3547:6;3539;3532:22;3496:2;3591:76;3659:7;3650:6;3639:9;3635:22;3591:76;:::i;:::-;3686:8;;3565:102;;-1:-1:-1;3369:358:1;-1:-1:-1;;;;3369:358:1:o;3732:1333::-;;;;3921:2;3909:9;3900:7;3896:23;3892:32;3889:2;;;3942:6;3934;3927:22;3889:2;3987:9;3974:23;4016:18;4057:2;4049:6;4046:14;4043:2;;;4078:6;4070;4063:22;4043:2;4122:76;4190:7;4181:6;4170:9;4166:22;4122:76;:::i;:::-;4217:8;;-1:-1:-1;4096:102:1;-1:-1:-1;4271:2:1;;-1:-1:-1;4311:18:1;;;4298:32;4342:16;;;4339:2;;;4376:6;4368;4361:22;4339:2;4404:24;;4459:4;4451:13;;4447:27;-1:-1:-1;4437:2:1;;4493:6;4485;4478:22;4437:2;4534;4521:16;4556:2;4552;4549:10;4546:2;;;4562:18;;:::i;:::-;4609:2;4605;4601:11;4591:21;;4632:27;4655:2;4651;4647:11;4632:27;:::i;:::-;4693:15;;;4724:12;;;;4756:11;;;4786;;;4782:20;;4779:33;-1:-1:-1;4776:2:1;;;4830:6;4822;4815:22;4776:2;4857:6;4848:15;;4872:163;4886:2;4883:1;4880:9;4872:163;;;4943:17;;4931:30;;4904:1;4897:9;;;;;4981:12;;;;5013;;4872:163;;;4876:3;5054:5;5044:15;;;;;;;;3879:1186;;;;;:::o;5070:192::-;;5179:2;5167:9;5158:7;5154:23;5150:32;5147:2;;;5200:6;5192;5185:22;5147:2;5228:28;5246:9;5228:28;:::i;5267:257::-;;5378:2;5366:9;5357:7;5353:23;5349:32;5346:2;;;5399:6;5391;5384:22;5346:2;5443:9;5430:23;5462:32;5488:5;5462:32;:::i;5529:261::-;;5651:2;5639:9;5630:7;5626:23;5622:32;5619:2;;;5672:6;5664;5657:22;5619:2;5709:9;5703:16;5728:32;5754:5;5728:32;:::i;5795:482::-;;5917:2;5905:9;5896:7;5892:23;5888:32;5885:2;;;5938:6;5930;5923:22;5885:2;5983:9;5970:23;6016:18;6008:6;6005:30;6002:2;;;6053:6;6045;6038:22;6002:2;6081:22;;6134:4;6126:13;;6122:27;-1:-1:-1;6112:2:1;;6168:6;6160;6153:22;6112:2;6196:75;6263:7;6258:2;6245:16;6240:2;6236;6232:11;6196:75;:::i;6282:190::-;;6394:2;6382:9;6373:7;6369:23;6365:32;6362:2;;;6415:6;6407;6400:22;6362:2;-1:-1:-1;6443:23:1;;6352:120;-1:-1:-1;6352:120:1:o;6477:259::-;;6558:5;6552:12;6585:6;6580:3;6573:19;6601:63;6657:6;6650:4;6645:3;6641:14;6634:4;6627:5;6623:16;6601:63;:::i;:::-;6718:2;6697:15;-1:-1:-1;;6693:29:1;6684:39;;;;6725:4;6680:50;;6528:208;-1:-1:-1;;6528:208:1:o;6741:470::-;;6958:6;6952:13;6974:53;7020:6;7015:3;7008:4;7000:6;6996:17;6974:53;:::i;:::-;7090:13;;7049:16;;;;7112:57;7090:13;7049:16;7146:4;7134:17;;7112:57;:::i;:::-;7185:20;;6928:283;-1:-1:-1;;;;6928:283:1:o;7216:203::-;-1:-1:-1;;;;;7380:32:1;;;;7362:51;;7350:2;7335:18;;7317:102::o;7424:490::-;-1:-1:-1;;;;;7693:15:1;;;7675:34;;7745:15;;7740:2;7725:18;;7718:43;7792:2;7777:18;;7770:34;;;7840:3;7835:2;7820:18;;7813:31;;;7424:490;;7861:47;;7888:19;;7880:6;7861:47;:::i;:::-;7853:55;7627:287;-1:-1:-1;;;;;;7627:287:1:o;7919:187::-;8084:14;;8077:22;8059:41;;8047:2;8032:18;;8014:92::o;8111:221::-;;8260:2;8249:9;8242:21;8280:46;8322:2;8311:9;8307:18;8299:6;8280:46;:::i;8337:414::-;8539:2;8521:21;;;8578:2;8558:18;;;8551:30;8617:34;8612:2;8597:18;;8590:62;-1:-1:-1;;;8683:2:1;8668:18;;8661:48;8741:3;8726:19;;8511:240::o;8756:397::-;8958:2;8940:21;;;8997:2;8977:18;;;8970:30;9036:34;9031:2;9016:18;;9009:62;-1:-1:-1;;;9102:2:1;9087:18;;9080:31;9143:3;9128:19;;8930:223::o;9158:402::-;9360:2;9342:21;;;9399:2;9379:18;;;9372:30;9438:34;9433:2;9418:18;;9411:62;-1:-1:-1;;;9504:2:1;9489:18;;9482:36;9550:3;9535:19;;9332:228::o;9565:352::-;9767:2;9749:21;;;9806:2;9786:18;;;9779:30;9845;9840:2;9825:18;;9818:58;9908:2;9893:18;;9739:178::o;9922:400::-;10124:2;10106:21;;;10163:2;10143:18;;;10136:30;10202:34;10197:2;10182:18;;10175:62;-1:-1:-1;;;10268:2:1;10253:18;;10246:34;10312:3;10297:19;;10096:226::o;10327:349::-;10529:2;10511:21;;;10568:2;10548:18;;;10541:30;10607:27;10602:2;10587:18;;10580:55;10667:2;10652:18;;10501:175::o;10681:408::-;10883:2;10865:21;;;10922:2;10902:18;;;10895:30;10961:34;10956:2;10941:18;;10934:62;-1:-1:-1;;;11027:2:1;11012:18;;11005:42;11079:3;11064:19;;10855:234::o;11094:420::-;11296:2;11278:21;;;11335:2;11315:18;;;11308:30;11374:34;11369:2;11354:18;;11347:62;11445:26;11440:2;11425:18;;11418:54;11504:3;11489:19;;11268:246::o;11519:406::-;11721:2;11703:21;;;11760:2;11740:18;;;11733:30;11799:34;11794:2;11779:18;;11772:62;-1:-1:-1;;;11865:2:1;11850:18;;11843:40;11915:3;11900:19;;11693:232::o;11930:405::-;12132:2;12114:21;;;12171:2;12151:18;;;12144:30;12210:34;12205:2;12190:18;;12183:62;-1:-1:-1;;;12276:2:1;12261:18;;12254:39;12325:3;12310:19;;12104:231::o;12340:356::-;12542:2;12524:21;;;12561:18;;;12554:30;12620:34;12615:2;12600:18;;12593:62;12687:2;12672:18;;12514:182::o;12701:408::-;12903:2;12885:21;;;12942:2;12922:18;;;12915:30;12981:34;12976:2;12961:18;;12954:62;-1:-1:-1;;;13047:2:1;13032:18;;13025:42;13099:3;13084:19;;12875:234::o;13114:356::-;13316:2;13298:21;;;13335:18;;;13328:30;13394:34;13389:2;13374:18;;13367:62;13461:2;13446:18;;13288:182::o;13475:405::-;13677:2;13659:21;;;13716:2;13696:18;;;13689:30;13755:34;13750:2;13735:18;;13728:62;-1:-1:-1;;;13821:2:1;13806:18;;13799:39;13870:3;13855:19;;13649:231::o;13885:352::-;14087:2;14069:21;;;14126:2;14106:18;;;14099:30;14165;14160:2;14145:18;;14138:58;14228:2;14213:18;;14059:178::o;14242:411::-;14444:2;14426:21;;;14483:2;14463:18;;;14456:30;14522:34;14517:2;14502:18;;14495:62;-1:-1:-1;;;14588:2:1;14573:18;;14566:45;14643:3;14628:19;;14416:237::o;14658:397::-;14860:2;14842:21;;;14899:2;14879:18;;;14872:30;14938:34;14933:2;14918:18;;14911:62;-1:-1:-1;;;15004:2:1;14989:18;;14982:31;15045:3;15030:19;;14832:223::o;15060:413::-;15262:2;15244:21;;;15301:2;15281:18;;;15274:30;15340:34;15335:2;15320:18;;15313:62;-1:-1:-1;;;15406:2:1;15391:18;;15384:47;15463:3;15448:19;;15234:239::o;15478:356::-;15680:2;15662:21;;;15699:18;;;15692:30;15758:34;15753:2;15738:18;;15731:62;15825:2;15810:18;;15652:182::o;15839:350::-;16041:2;16023:21;;;16080:2;16060:18;;;16053:30;16119:28;16114:2;16099:18;;16092:56;16180:2;16165:18;;16013:176::o;16194:177::-;16340:25;;;16328:2;16313:18;;16295:76::o;16376:251::-;16446:2;16440:9;16476:17;;;16523:18;16508:34;;16544:22;;;16505:62;16502:2;;;16570:18;;:::i;:::-;16606:2;16599:22;16420:207;;-1:-1:-1;16420:207:1:o;16632:128::-;;16703:1;16699:6;16696:1;16693:13;16690:2;;;16709:18;;:::i;:::-;-1:-1:-1;16745:9:1;;16680:80::o;16765:120::-;;16831:1;16821:2;;16836:18;;:::i;:::-;-1:-1:-1;16870:9:1;;16811:74::o;16890:125::-;;16958:1;16955;16952:8;16949:2;;;16963:18;;:::i;:::-;-1:-1:-1;17000:9:1;;16939:76::o;17020:258::-;17092:1;17102:113;17116:6;17113:1;17110:13;17102:113;;;17192:11;;;17186:18;17173:11;;;17166:39;17138:2;17131:10;17102:113;;;17233:6;17230:1;17227:13;17224:2;;;-1:-1:-1;;17268:1:1;17250:16;;17243:27;17073:205::o;17283:380::-;17368:1;17358:12;;17415:1;17405:12;;;17426:2;;17480:4;17472:6;17468:17;17458:27;;17426:2;17533;17525:6;17522:14;17502:18;17499:38;17496:2;;;17579:10;17574:3;17570:20;17567:1;17560:31;17614:4;17611:1;17604:15;17642:4;17639:1;17632:15;17496:2;;17338:325;;;:::o;17668:135::-;;-1:-1:-1;;17728:17:1;;17725:2;;;17748:18;;:::i;:::-;-1:-1:-1;17795:1:1;17784:13;;17715:88::o;17808:112::-;;17866:1;17856:2;;17871:18;;:::i;:::-;-1:-1:-1;17905:9:1;;17846:74::o;17925:127::-;17986:10;17981:3;17977:20;17974:1;17967:31;18017:4;18014:1;18007:15;18041:4;18038:1;18031:15;18057:127;18118:10;18113:3;18109:20;18106:1;18099:31;18149:4;18146:1;18139:15;18173:4;18170:1;18163:15;18189:127;18250:10;18245:3;18241:20;18238:1;18231:31;18281:4;18278:1;18271:15;18305:4;18302:1;18295:15;18321:133;-1:-1:-1;;;;;;18397:32:1;;18387:43;;18377:2;;18444:1;18441;18434:12

Swarm Source

ipfs://9a7318114226b55c1d28e93f6a8f204514e589dd76251468f1cddc1afa145179
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.