ETH Price: $3,372.17 (-3.19%)
Gas: 3 Gwei

Token

Hooligan (HLG)
 

Overview

Max Total Supply

744 HLG

Holders

304

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Hooligan

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 8 of 18: Hooligan.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./SafeMath.sol";
import "./Strings.sol";

import "./ContentMixin.sol";
import "./NativeMetaTransaction.sol";

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract Hooligan is
    ERC721Enumerable,
    Ownable,
    ContextMixin,
    NativeMetaTransaction
{
    using SafeMath for uint256;
    using Strings for uint256;
    
    address proxyRegistryAddress;

    uint256 public startingIndexBlock;

    uint256 public startingIndex;

    uint256 public constant mintPrice = 60000000000000000; 

    uint256 public constant maxPurchase = 20;

    uint256 public MAX_SUPPLY;

    bool public saleIsActive = true;

    uint256 public SALE_TIMESTAMP;
    uint256 public REVEAL_TIMESTAMP;

    string private BASE_URI;

    address private brian = 0xCc806ea8292c904a3682cA86Ed4131fe02bC8e29;
    address private dev = 0xAE77beeda3c1BB43B1cAEaE04815F68e1c07e077;

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxNftSupply,
        uint256 saleStart,
        address proxyRegistryAddress_
    ) ERC721(name, symbol) {
        MAX_SUPPLY = maxNftSupply;
        SALE_TIMESTAMP = saleStart;
        REVEAL_TIMESTAMP = saleStart + (86400 * 9);
        proxyRegistryAddress = proxyRegistryAddress_;
    }

    function withdraw() public onlyOwner {
        payable(dev).transfer(address(this).balance.div(20));
        payable(brian).transfer(address(this).balance);
    }

    function reserve(address _to) public onlyOwner {
        uint256 supply = totalSupply();
        uint256 i;
        for (i = 0; i < 30; i++) {
            _safeMint(_to, supply + i);
        }
    }

    function setSaleTimestamp(uint256 saleTimeStamp) public onlyOwner {
        SALE_TIMESTAMP = saleTimeStamp;
    }

    function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {
        REVEAL_TIMESTAMP = revealTimeStamp;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        BASE_URI = baseURI;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function mint(uint256 numberOfTokens) public payable {
        require(saleIsActive && block.timestamp >= SALE_TIMESTAMP, "Sale must be active to mint");
        require(
            numberOfTokens <= maxPurchase,
            "Can only mint 20 tokens at a time"
        );
        require(
            totalSupply().add(numberOfTokens) <= MAX_SUPPLY,
            "Purchase would exceed max supply"
        );
        require(
            mintPrice.mul(numberOfTokens) <= msg.value,
            "Ether value sent is not correct"
        );

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 mintIndex = totalSupply();
            if (totalSupply() < MAX_SUPPLY) {
                _safeMint(msg.sender, mintIndex);
            }
        }

        if (
            startingIndexBlock == 0 &&
            (totalSupply() == MAX_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)
        ) {
            startingIndexBlock = block.number;
        }
    }

    function setStartingIndex() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");

        startingIndex = uint256(blockhash(startingIndexBlock)) % MAX_SUPPLY;
        if (block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint256(blockhash(block.number - 1)) % MAX_SUPPLY;
        }
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");

        startingIndexBlock = block.number;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return block.timestamp >= REVEAL_TIMESTAMP 
        ? string(abi.encodePacked(BASE_URI, _tokenId.toString(), ".json")) 
        : "https://ipfs.io/ipfs/QmczY2ZWNaYfq9NX2m8hy8ivFoRFkdsuuXN4ZitNn6imHX";
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    function contractURI() public pure returns (string memory) {
        return "https://ipfs.io/ipfs/QmPgi5g94h63tn7Ap2CWa2QjCesecSQS1SBJ7LXmG2k85V";
    }
}

File 1 of 18: Address.sol
// SPDX-License-Identifier: MIT

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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

File 2 of 18: ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 3 of 18: Context.sol
// SPDX-License-Identifier: MIT

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;
    }
}

File 4 of 18: EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 5 of 18: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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;
    }
}

File 6 of 18: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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(to).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 {}
}

File 7 of 18: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 9 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

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);
}

File 10 of 18: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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;
}

File 11 of 18: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 12 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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);
}

File 13 of 18: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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);
}

File 14 of 18: Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 15 of 18: NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

File 16 of 18: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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);
    }
}

File 17 of 18: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 18 of 18: Strings.sol
// SPDX-License-Identifier: MIT

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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxNftSupply","type":"uint256"},{"internalType":"uint256","name":"saleStart","type":"uint256"},{"internalType":"address","name":"proxyRegistryAddress_","type":"address"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipSaleState","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":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"reserve","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"revealTimeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleTimeStamp","type":"uint256"}],"name":"setSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

6080604052600a805460ff60a01b191690556011805460ff19166001179055601580546001600160a01b031990811673cc806ea8292c904a3682ca86ed4131fe02bc8e29179091556016805490911673ae77beeda3c1bb43b1caeae04815f68e1c07e0771790553480156200007357600080fd5b50604051620030a7380380620030a7833981016040819052620000969162000369565b845185908590620000af906000906020850190620001f6565b508051620000c5906001906020840190620001f6565b505050620000e2620000dc6200012960201b60201c565b62000145565b60108390556012829055620000fb82620bdd806200040b565b601355600d80546001600160a01b0319166001600160a01b0392909216919091179055506200046f92505050565b6000620001406200019760201b620016f31760201c565b905090565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600033301415620001f057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620001f39050565b50335b90565b828054620002049062000432565b90600052602060002090601f01602090048101928262000228576000855562000273565b82601f106200024357805160ff191683800117855562000273565b8280016001018555821562000273579182015b828111156200027357825182559160200191906001019062000256565b506200028192915062000285565b5090565b5b8082111562000281576000815560010162000286565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002c457600080fd5b81516001600160401b0380821115620002e157620002e16200029c565b604051601f8301601f19908116603f011681019082821181831017156200030c576200030c6200029c565b816040528381526020925086838588010111156200032957600080fd5b600091505b838210156200034d57858201830151818301840152908201906200032e565b838211156200035f5760008385830101525b9695505050505050565b600080600080600060a086880312156200038257600080fd5b85516001600160401b03808211156200039a57600080fd5b620003a889838a01620002b2565b96506020880151915080821115620003bf57600080fd5b50620003ce88828901620002b2565b6040880151606089015160808a0151929750909550935090506001600160a01b0381168114620003fd57600080fd5b809150509295509295909350565b600082198211156200042d57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200044757607f821691505b602082108114156200046957634e487b7160e01b600052602260045260246000fd5b50919050565b612c28806200047f6000396000f3fe6080604052600436106101f15760003560e01c80636817c76c116101095780636817c76c1461048f57806370a08231146104aa578063715018a6146104ca5780637a1cbd3f146104df5780637d17fcbe146104ff5780638da5cb5b1461051457806395d89b4114610529578063977b055b1461053e578063a0712d6814610553578063a22cb46514610566578063b88d4fde14610586578063c87b56dd146105a6578063cb774d47146105c6578063d927d863146105dc578063e36d6498146105f2578063e75179a414610608578063e8a3d48514610628578063e985e9c51461063d578063e98665501461065d578063eb8d244414610672578063f2fde38b1461068c57600080fd5b8063018a2c37146101f657806301ffc9a71461021857806306fdde031461024d578063081812fc1461026f578063095ea7b31461029c5780630c53c51c146102bc5780630f7e5970146102cf57806318160ddd146102fc57806318e20a381461031b57806320379ee51461033157806323b872dd146103465780632d0335ab146103665780632f745c591461039c57806332cb6b0c146103bc5780633408e470146103d257806334918dfd146103e55780633ccfd60b146103fa57806342842e0e1461040f5780634f6ccce71461042f57806355f804b31461044f5780636352211e1461046f575b600080fd5b34801561020257600080fd5b5061021661021136600461237d565b6106ac565b005b34801561022457600080fd5b506102386102333660046123ac565b6106f9565b60405190151581526020015b60405180910390f35b34801561025957600080fd5b50610262610724565b6040516102449190612421565b34801561027b57600080fd5b5061028f61028a36600461237d565b6107b6565b6040516102449190612434565b3480156102a857600080fd5b506102166102b736600461245d565b61083e565b6102626102ca366004612534565b610961565b3480156102db57600080fd5b50610262604051806040016040528060018152602001603160f81b81525081565b34801561030857600080fd5b506008545b604051908152602001610244565b34801561032757600080fd5b5061030d60135481565b34801561033d57600080fd5b50600b5461030d565b34801561035257600080fd5b506102166103613660046125b1565b610b4a565b34801561037257600080fd5b5061030d6103813660046125f2565b6001600160a01b03166000908152600c602052604090205490565b3480156103a857600080fd5b5061030d6103b736600461245d565b610b82565b3480156103c857600080fd5b5061030d60105481565b3480156103de57600080fd5b504661030d565b3480156103f157600080fd5b50610216610c18565b34801561040657600080fd5b50610216610c6b565b34801561041b57600080fd5b5061021661042a3660046125b1565b610d29565b34801561043b57600080fd5b5061030d61044a36600461237d565b610d44565b34801561045b57600080fd5b5061021661046a36600461260f565b610dd7565b34801561047b57600080fd5b5061028f61048a36600461237d565b610e2d565b34801561049b57600080fd5b5061030d66d529ae9e86000081565b3480156104b657600080fd5b5061030d6104c53660046125f2565b610ea4565b3480156104d657600080fd5b50610216610f2b565b3480156104eb57600080fd5b506102166104fa36600461237d565b610f76565b34801561050b57600080fd5b50610216610fba565b34801561052057600080fd5b5061028f61101f565b34801561053557600080fd5b5061026261102e565b34801561054a57600080fd5b5061030d601481565b61021661056136600461237d565b61103d565b34801561057257600080fd5b50610216610581366004612657565b61122d565b34801561059257600080fd5b506102166105a1366004612695565b61132b565b3480156105b257600080fd5b506102626105c136600461237d565b61136a565b3480156105d257600080fd5b5061030d600f5481565b3480156105e857600080fd5b5061030d60125481565b3480156105fe57600080fd5b5061030d600e5481565b34801561061457600080fd5b506102166106233660046125f2565b6113c5565b34801561063457600080fd5b50610262611442565b34801561064957600080fd5b50610238610658366004612700565b611462565b34801561066957600080fd5b50610216611536565b34801561067e57600080fd5b506011546102389060ff1681565b34801561069857600080fd5b506102166106a73660046125f2565b611646565b6106b4611750565b6001600160a01b03166106c561101f565b6001600160a01b0316146106f45760405162461bcd60e51b81526004016106eb9061272e565b60405180910390fd5b601355565b60006001600160e01b0319821663780e9d6360e01b148061071e575061071e8261175f565b92915050565b60606000805461073390612763565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90612763565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b60006107c1826117af565b6108225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106eb565b506000908152600460205260409020546001600160a01b031690565b600061084982610e2d565b9050806001600160a01b0316836001600160a01b031614156108b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106eb565b806001600160a01b03166108c9611750565b6001600160a01b031614806108e557506108e581610658611750565b6109525760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016106eb565b61095c83836117cc565b505050565b60408051606081810183526001600160a01b0388166000818152600c60209081529085902054845283015291810186905261099f878287878761183a565b6109f55760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016106eb565b6001600160a01b0387166000908152600c6020526040902054610a1990600161192a565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610a6990899033908a9061279e565b60405180910390a1600080306001600160a01b0316888a604051602001610a919291906127ef565b60408051601f1981840301815290829052610aab91612821565b6000604051808303816000865af19150503d8060008114610ae8576040519150601f19603f3d011682016040523d82523d6000602084013e610aed565b606091505b509150915081610b3e5760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b60448201526064016106eb565b98975050505050505050565b610b5b610b55611750565b8261193d565b610b775760405162461bcd60e51b81526004016106eb9061283d565b61095c8383836119ff565b6000610b8d83610ea4565b8210610bef5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106eb565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c20611750565b6001600160a01b0316610c3161101f565b6001600160a01b031614610c575760405162461bcd60e51b81526004016106eb9061272e565b6011805460ff19811660ff90911615179055565b610c73611750565b6001600160a01b0316610c8461101f565b6001600160a01b031614610caa5760405162461bcd60e51b81526004016106eb9061272e565b6016546001600160a01b03166108fc610cc4476014611baa565b6040518115909202916000818181858888f19350505050158015610cec573d6000803e3d6000fd5b506015546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610d26573d6000803e3d6000fd5b50565b61095c8383836040518060200160405280600081525061132b565b6000610d4f60085490565b8210610db25760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106eb565b60088281548110610dc557610dc561288e565b90600052602060002001549050919050565b610ddf611750565b6001600160a01b0316610df061101f565b6001600160a01b031614610e165760405162461bcd60e51b81526004016106eb9061272e565b8051610e299060149060208401906122e4565b5050565b6000818152600260205260408120546001600160a01b03168061071e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106eb565b60006001600160a01b038216610f0f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106eb565b506001600160a01b031660009081526003602052604090205490565b610f33611750565b6001600160a01b0316610f4461101f565b6001600160a01b031614610f6a5760405162461bcd60e51b81526004016106eb9061272e565b610f746000611bb6565b565b610f7e611750565b6001600160a01b0316610f8f61101f565b6001600160a01b031614610fb55760405162461bcd60e51b81526004016106eb9061272e565b601255565b610fc2611750565b6001600160a01b0316610fd361101f565b6001600160a01b031614610ff95760405162461bcd60e51b81526004016106eb9061272e565b600f54156110195760405162461bcd60e51b81526004016106eb906128a4565b43600e55565b600a546001600160a01b031690565b60606001805461073390612763565b60115460ff16801561105157506012544210155b61109b5760405162461bcd60e51b815260206004820152601b60248201527a14d85b19481b5d5cdd081899481858dd1a5d99481d1bc81b5a5b9d602a1b60448201526064016106eb565b60148111156110f65760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6044820152606560f81b60648201526084016106eb565b60105461110c8261110660085490565b9061192a565b111561115a5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016106eb565b3461116c66d529ae9e86000083611c08565b11156111ba5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016106eb565b60005b818110156112015760006111d060085490565b90506010546111de60085490565b10156111ee576111ee3382611c14565b50806111f9816128f1565b9150506111bd565b50600e541580156112215750601054600854148061122157506013544210155b15610d265743600e5550565b611235611750565b6001600160a01b0316826001600160a01b031614156112925760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016106eb565b806005600061129f611750565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556112e3611750565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161131f911515815260200190565b60405180910390a35050565b61133c611336611750565b8361193d565b6113585760405162461bcd60e51b81526004016106eb9061283d565b61136484848484611c2e565b50505050565b606060135442101561139457604051806080016040528060438152602001612bb06043913961071e565b601461139f83611c61565b6040516020016113b092919061290c565b60405160208183030381529060405292915050565b6113cd611750565b6001600160a01b03166113de61101f565b6001600160a01b0316146114045760405162461bcd60e51b81526004016106eb9061272e565b600061140f60085490565b905060005b601e81101561095c576114308361142b83856129be565b611c14565b8061143a816128f1565b915050611414565b6060604051806080016040528060438152602001612b6d60439139905090565b600d5460405163c455279160e01b81526000916001600160a01b039081169190841690829063c45527919061149b908890600401612434565b60206040518083038186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114eb91906129d6565b6001600160a01b0316141561150457600191505061071e565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b61153e611750565b6001600160a01b031661154f61101f565b6001600160a01b0316146115755760405162461bcd60e51b81526004016106eb9061272e565b600f54156115955760405162461bcd60e51b81526004016106eb906128a4565b600e546115e45760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d7573742062652073657460448201526064016106eb565b601054600e546115f5919040612a09565b600f55600e5460ff90611609904390611d5e565b111561162c5760105461161d600143612a1d565b611628919040612a09565b600f555b600f54610f7457600f5461164190600161192a565b600f55565b61164e611750565b6001600160a01b031661165f61101f565b6001600160a01b0316146116855760405162461bcd60e51b81526004016106eb9061272e565b6001600160a01b0381166116ea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106eb565b610d2681611bb6565b60003330141561174a57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915061174d9050565b50335b90565b600061175a6116f3565b905090565b60006001600160e01b031982166380ac58cd60e01b148061179057506001600160e01b03198216635b5e139f60e01b145b8061071e57506301ffc9a760e01b6001600160e01b031983161461071e565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061180182610e2d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166118a05760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016106eb565b60016118b36118ae87611d6a565b611de7565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611901573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b600061193682846129be565b9392505050565b6000611948826117af565b6119a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106eb565b60006119b483610e2d565b9050806001600160a01b0316846001600160a01b031614806119ef5750836001600160a01b03166119e4846107b6565b6001600160a01b0316145b8061152e575061152e8185611462565b826001600160a01b0316611a1282610e2d565b6001600160a01b031614611a7a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106eb565b6001600160a01b038216611adc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106eb565b611ae7838383611e17565b611af26000826117cc565b6001600160a01b0383166000908152600360205260408120805460019290611b1b908490612a1d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b499084906129be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006119368284612a34565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006119368284612a48565b610e29828260405180602001604052806000815250611ecf565b611c398484846119ff565b611c4584848484611f02565b6113645760405162461bcd60e51b81526004016106eb90612a67565b606081611c855750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611caf5780611c99816128f1565b9150611ca89050600a83612a34565b9150611c89565b6000816001600160401b03811115611cc957611cc9612489565b6040519080825280601f01601f191660200182016040528015611cf3576020820181803683370190505b5090505b841561152e57611d08600183612a1d565b9150611d15600a86612a09565b611d209060306129be565b60f81b818381518110611d3557611d3561288e565b60200101906001600160f81b031916908160001a905350611d57600a86612a34565b9450611cf7565b60006119368284612a1d565b6000604051806080016040528060438152602001612b2a6043913980516020918201208351848301516040808701518051908601209051611dca950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000611df2600b5490565b60405161190160f01b6020820152602281019190915260428101839052606201611dca565b6001600160a01b038316611e7257611e6d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e95565b816001600160a01b0316836001600160a01b031614611e9557611e958382612016565b6001600160a01b038216611eac5761095c816120b3565b826001600160a01b0316826001600160a01b03161461095c5761095c8282612162565b611ed983836121a6565b611ee66000848484611f02565b61095c5760405162461bcd60e51b81526004016106eb90612a67565b60006001600160a01b0384163b1561200b57836001600160a01b031663150b7a02611f2b611750565b8786866040518563ffffffff1660e01b8152600401611f4d9493929190612ab9565b602060405180830381600087803b158015611f6757600080fd5b505af1925050508015611f97575060408051601f3d908101601f19168201909252611f9491810190612af6565b60015b611ff1573d808015611fc5576040519150601f19603f3d011682016040523d82523d6000602084013e611fca565b606091505b508051611fe95760405162461bcd60e51b81526004016106eb90612a67565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061152e565b506001949350505050565b6000600161202384610ea4565b61202d9190612a1d565b600083815260076020526040902054909150808214612080576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120c590600190612a1d565b600083815260096020526040812054600880549394509092849081106120ed576120ed61288e565b90600052602060002001549050806008838154811061210e5761210e61288e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061214657612146612b13565b6001900381819060005260206000200160009055905550505050565b600061216d83610ea4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121fc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106eb565b612205816117af565b156122515760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016106eb565b61225d60008383611e17565b6001600160a01b03821660009081526003602052604081208054600192906122869084906129be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546122f090612763565b90600052602060002090601f0160209004810192826123125760008555612358565b82601f1061232b57805160ff1916838001178555612358565b82800160010185558215612358579182015b8281111561235857825182559160200191906001019061233d565b50612364929150612368565b5090565b5b808211156123645760008155600101612369565b60006020828403121561238f57600080fd5b5035919050565b6001600160e01b031981168114610d2657600080fd5b6000602082840312156123be57600080fd5b813561193681612396565b60005b838110156123e45781810151838201526020016123cc565b838111156113645750506000910152565b6000815180845261240d8160208601602086016123c9565b601f01601f19169290920160200192915050565b60208152600061193660208301846123f5565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114610d2657600080fd5b6000806040838503121561247057600080fd5b823561247b81612448565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156124b9576124b9612489565b604051601f8501601f19908116603f011681019082821181831017156124e1576124e1612489565b816040528093508581528686860111156124fa57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261252557600080fd5b6119368383356020850161249f565b600080600080600060a0868803121561254c57600080fd5b853561255781612448565b945060208601356001600160401b0381111561257257600080fd5b61257e88828901612514565b9450506040860135925060608601359150608086013560ff811681146125a357600080fd5b809150509295509295909350565b6000806000606084860312156125c657600080fd5b83356125d181612448565b925060208401356125e181612448565b929592945050506040919091013590565b60006020828403121561260457600080fd5b813561193681612448565b60006020828403121561262157600080fd5b81356001600160401b0381111561263757600080fd5b8201601f8101841361264857600080fd5b61152e8482356020840161249f565b6000806040838503121561266a57600080fd5b823561267581612448565b91506020830135801515811461268a57600080fd5b809150509250929050565b600080600080608085870312156126ab57600080fd5b84356126b681612448565b935060208501356126c681612448565b92506040850135915060608501356001600160401b038111156126e857600080fd5b6126f487828801612514565b91505092959194509250565b6000806040838503121561271357600080fd5b823561271e81612448565b9150602083013561268a81612448565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061277757607f821691505b6020821081141561279857634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906127ca908301846123f5565b95945050505050565b600081516127e58185602086016123c9565b9290920192915050565b600083516128018184602088016123c9565b60609390931b6001600160601b0319169190920190815260140192915050565b600082516128338184602087016123c9565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252601d908201527f5374617274696e6720696e64657820697320616c726561647920736574000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612905576129056128db565b5060010190565b600080845481600182811c91508083168061292857607f831692505b602080841082141561294857634e487b7160e01b86526022600452602486fd5b81801561295c576001811461296d5761299a565b60ff1986168952848901965061299a565b60008b81526020902060005b868110156129925781548b820152908501908301612979565b505084890196505b5050505050506127ca6129ad82866127d3565b64173539b7b760d91b815260050190565b600082198211156129d1576129d16128db565b500190565b6000602082840312156129e857600080fd5b815161193681612448565b634e487b7160e01b600052601260045260246000fd5b600082612a1857612a186129f3565b500690565b600082821015612a2f57612a2f6128db565b500390565b600082612a4357612a436129f3565b500490565b6000816000190483118215151615612a6257612a626128db565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612aec908301846123f5565b9695505050505050565b600060208284031215612b0857600080fd5b815161193681612396565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f697066732e696f2f697066732f516d50676935673934683633746e3741703243576132516a43657365635351533153424a374c586d47326b38355668747470733a2f2f697066732e696f2f697066732f516d637a59325a574e61596671394e58326d386879386976466f52466b64737575584e345a69744e6e36696d4858a26469706673582212209be41f9a08f83e9f363edbbe3321195ffbb6326ebb1a356ad73954b5a83362ec64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000270f00000000000000000000000000000000000000000000000000000000616202d0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000008486f6f6c6967616e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003484c470000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f15760003560e01c80636817c76c116101095780636817c76c1461048f57806370a08231146104aa578063715018a6146104ca5780637a1cbd3f146104df5780637d17fcbe146104ff5780638da5cb5b1461051457806395d89b4114610529578063977b055b1461053e578063a0712d6814610553578063a22cb46514610566578063b88d4fde14610586578063c87b56dd146105a6578063cb774d47146105c6578063d927d863146105dc578063e36d6498146105f2578063e75179a414610608578063e8a3d48514610628578063e985e9c51461063d578063e98665501461065d578063eb8d244414610672578063f2fde38b1461068c57600080fd5b8063018a2c37146101f657806301ffc9a71461021857806306fdde031461024d578063081812fc1461026f578063095ea7b31461029c5780630c53c51c146102bc5780630f7e5970146102cf57806318160ddd146102fc57806318e20a381461031b57806320379ee51461033157806323b872dd146103465780632d0335ab146103665780632f745c591461039c57806332cb6b0c146103bc5780633408e470146103d257806334918dfd146103e55780633ccfd60b146103fa57806342842e0e1461040f5780634f6ccce71461042f57806355f804b31461044f5780636352211e1461046f575b600080fd5b34801561020257600080fd5b5061021661021136600461237d565b6106ac565b005b34801561022457600080fd5b506102386102333660046123ac565b6106f9565b60405190151581526020015b60405180910390f35b34801561025957600080fd5b50610262610724565b6040516102449190612421565b34801561027b57600080fd5b5061028f61028a36600461237d565b6107b6565b6040516102449190612434565b3480156102a857600080fd5b506102166102b736600461245d565b61083e565b6102626102ca366004612534565b610961565b3480156102db57600080fd5b50610262604051806040016040528060018152602001603160f81b81525081565b34801561030857600080fd5b506008545b604051908152602001610244565b34801561032757600080fd5b5061030d60135481565b34801561033d57600080fd5b50600b5461030d565b34801561035257600080fd5b506102166103613660046125b1565b610b4a565b34801561037257600080fd5b5061030d6103813660046125f2565b6001600160a01b03166000908152600c602052604090205490565b3480156103a857600080fd5b5061030d6103b736600461245d565b610b82565b3480156103c857600080fd5b5061030d60105481565b3480156103de57600080fd5b504661030d565b3480156103f157600080fd5b50610216610c18565b34801561040657600080fd5b50610216610c6b565b34801561041b57600080fd5b5061021661042a3660046125b1565b610d29565b34801561043b57600080fd5b5061030d61044a36600461237d565b610d44565b34801561045b57600080fd5b5061021661046a36600461260f565b610dd7565b34801561047b57600080fd5b5061028f61048a36600461237d565b610e2d565b34801561049b57600080fd5b5061030d66d529ae9e86000081565b3480156104b657600080fd5b5061030d6104c53660046125f2565b610ea4565b3480156104d657600080fd5b50610216610f2b565b3480156104eb57600080fd5b506102166104fa36600461237d565b610f76565b34801561050b57600080fd5b50610216610fba565b34801561052057600080fd5b5061028f61101f565b34801561053557600080fd5b5061026261102e565b34801561054a57600080fd5b5061030d601481565b61021661056136600461237d565b61103d565b34801561057257600080fd5b50610216610581366004612657565b61122d565b34801561059257600080fd5b506102166105a1366004612695565b61132b565b3480156105b257600080fd5b506102626105c136600461237d565b61136a565b3480156105d257600080fd5b5061030d600f5481565b3480156105e857600080fd5b5061030d60125481565b3480156105fe57600080fd5b5061030d600e5481565b34801561061457600080fd5b506102166106233660046125f2565b6113c5565b34801561063457600080fd5b50610262611442565b34801561064957600080fd5b50610238610658366004612700565b611462565b34801561066957600080fd5b50610216611536565b34801561067e57600080fd5b506011546102389060ff1681565b34801561069857600080fd5b506102166106a73660046125f2565b611646565b6106b4611750565b6001600160a01b03166106c561101f565b6001600160a01b0316146106f45760405162461bcd60e51b81526004016106eb9061272e565b60405180910390fd5b601355565b60006001600160e01b0319821663780e9d6360e01b148061071e575061071e8261175f565b92915050565b60606000805461073390612763565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90612763565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b60006107c1826117af565b6108225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106eb565b506000908152600460205260409020546001600160a01b031690565b600061084982610e2d565b9050806001600160a01b0316836001600160a01b031614156108b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106eb565b806001600160a01b03166108c9611750565b6001600160a01b031614806108e557506108e581610658611750565b6109525760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016106eb565b61095c83836117cc565b505050565b60408051606081810183526001600160a01b0388166000818152600c60209081529085902054845283015291810186905261099f878287878761183a565b6109f55760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016106eb565b6001600160a01b0387166000908152600c6020526040902054610a1990600161192a565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610a6990899033908a9061279e565b60405180910390a1600080306001600160a01b0316888a604051602001610a919291906127ef565b60408051601f1981840301815290829052610aab91612821565b6000604051808303816000865af19150503d8060008114610ae8576040519150601f19603f3d011682016040523d82523d6000602084013e610aed565b606091505b509150915081610b3e5760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b60448201526064016106eb565b98975050505050505050565b610b5b610b55611750565b8261193d565b610b775760405162461bcd60e51b81526004016106eb9061283d565b61095c8383836119ff565b6000610b8d83610ea4565b8210610bef5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106eb565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c20611750565b6001600160a01b0316610c3161101f565b6001600160a01b031614610c575760405162461bcd60e51b81526004016106eb9061272e565b6011805460ff19811660ff90911615179055565b610c73611750565b6001600160a01b0316610c8461101f565b6001600160a01b031614610caa5760405162461bcd60e51b81526004016106eb9061272e565b6016546001600160a01b03166108fc610cc4476014611baa565b6040518115909202916000818181858888f19350505050158015610cec573d6000803e3d6000fd5b506015546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610d26573d6000803e3d6000fd5b50565b61095c8383836040518060200160405280600081525061132b565b6000610d4f60085490565b8210610db25760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106eb565b60088281548110610dc557610dc561288e565b90600052602060002001549050919050565b610ddf611750565b6001600160a01b0316610df061101f565b6001600160a01b031614610e165760405162461bcd60e51b81526004016106eb9061272e565b8051610e299060149060208401906122e4565b5050565b6000818152600260205260408120546001600160a01b03168061071e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106eb565b60006001600160a01b038216610f0f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106eb565b506001600160a01b031660009081526003602052604090205490565b610f33611750565b6001600160a01b0316610f4461101f565b6001600160a01b031614610f6a5760405162461bcd60e51b81526004016106eb9061272e565b610f746000611bb6565b565b610f7e611750565b6001600160a01b0316610f8f61101f565b6001600160a01b031614610fb55760405162461bcd60e51b81526004016106eb9061272e565b601255565b610fc2611750565b6001600160a01b0316610fd361101f565b6001600160a01b031614610ff95760405162461bcd60e51b81526004016106eb9061272e565b600f54156110195760405162461bcd60e51b81526004016106eb906128a4565b43600e55565b600a546001600160a01b031690565b60606001805461073390612763565b60115460ff16801561105157506012544210155b61109b5760405162461bcd60e51b815260206004820152601b60248201527a14d85b19481b5d5cdd081899481858dd1a5d99481d1bc81b5a5b9d602a1b60448201526064016106eb565b60148111156110f65760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6044820152606560f81b60648201526084016106eb565b60105461110c8261110660085490565b9061192a565b111561115a5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016106eb565b3461116c66d529ae9e86000083611c08565b11156111ba5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016106eb565b60005b818110156112015760006111d060085490565b90506010546111de60085490565b10156111ee576111ee3382611c14565b50806111f9816128f1565b9150506111bd565b50600e541580156112215750601054600854148061122157506013544210155b15610d265743600e5550565b611235611750565b6001600160a01b0316826001600160a01b031614156112925760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016106eb565b806005600061129f611750565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556112e3611750565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161131f911515815260200190565b60405180910390a35050565b61133c611336611750565b8361193d565b6113585760405162461bcd60e51b81526004016106eb9061283d565b61136484848484611c2e565b50505050565b606060135442101561139457604051806080016040528060438152602001612bb06043913961071e565b601461139f83611c61565b6040516020016113b092919061290c565b60405160208183030381529060405292915050565b6113cd611750565b6001600160a01b03166113de61101f565b6001600160a01b0316146114045760405162461bcd60e51b81526004016106eb9061272e565b600061140f60085490565b905060005b601e81101561095c576114308361142b83856129be565b611c14565b8061143a816128f1565b915050611414565b6060604051806080016040528060438152602001612b6d60439139905090565b600d5460405163c455279160e01b81526000916001600160a01b039081169190841690829063c45527919061149b908890600401612434565b60206040518083038186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114eb91906129d6565b6001600160a01b0316141561150457600191505061071e565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b61153e611750565b6001600160a01b031661154f61101f565b6001600160a01b0316146115755760405162461bcd60e51b81526004016106eb9061272e565b600f54156115955760405162461bcd60e51b81526004016106eb906128a4565b600e546115e45760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d7573742062652073657460448201526064016106eb565b601054600e546115f5919040612a09565b600f55600e5460ff90611609904390611d5e565b111561162c5760105461161d600143612a1d565b611628919040612a09565b600f555b600f54610f7457600f5461164190600161192a565b600f55565b61164e611750565b6001600160a01b031661165f61101f565b6001600160a01b0316146116855760405162461bcd60e51b81526004016106eb9061272e565b6001600160a01b0381166116ea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106eb565b610d2681611bb6565b60003330141561174a57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915061174d9050565b50335b90565b600061175a6116f3565b905090565b60006001600160e01b031982166380ac58cd60e01b148061179057506001600160e01b03198216635b5e139f60e01b145b8061071e57506301ffc9a760e01b6001600160e01b031983161461071e565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061180182610e2d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166118a05760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016106eb565b60016118b36118ae87611d6a565b611de7565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611901573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b600061193682846129be565b9392505050565b6000611948826117af565b6119a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106eb565b60006119b483610e2d565b9050806001600160a01b0316846001600160a01b031614806119ef5750836001600160a01b03166119e4846107b6565b6001600160a01b0316145b8061152e575061152e8185611462565b826001600160a01b0316611a1282610e2d565b6001600160a01b031614611a7a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106eb565b6001600160a01b038216611adc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106eb565b611ae7838383611e17565b611af26000826117cc565b6001600160a01b0383166000908152600360205260408120805460019290611b1b908490612a1d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b499084906129be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006119368284612a34565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006119368284612a48565b610e29828260405180602001604052806000815250611ecf565b611c398484846119ff565b611c4584848484611f02565b6113645760405162461bcd60e51b81526004016106eb90612a67565b606081611c855750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611caf5780611c99816128f1565b9150611ca89050600a83612a34565b9150611c89565b6000816001600160401b03811115611cc957611cc9612489565b6040519080825280601f01601f191660200182016040528015611cf3576020820181803683370190505b5090505b841561152e57611d08600183612a1d565b9150611d15600a86612a09565b611d209060306129be565b60f81b818381518110611d3557611d3561288e565b60200101906001600160f81b031916908160001a905350611d57600a86612a34565b9450611cf7565b60006119368284612a1d565b6000604051806080016040528060438152602001612b2a6043913980516020918201208351848301516040808701518051908601209051611dca950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000611df2600b5490565b60405161190160f01b6020820152602281019190915260428101839052606201611dca565b6001600160a01b038316611e7257611e6d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e95565b816001600160a01b0316836001600160a01b031614611e9557611e958382612016565b6001600160a01b038216611eac5761095c816120b3565b826001600160a01b0316826001600160a01b03161461095c5761095c8282612162565b611ed983836121a6565b611ee66000848484611f02565b61095c5760405162461bcd60e51b81526004016106eb90612a67565b60006001600160a01b0384163b1561200b57836001600160a01b031663150b7a02611f2b611750565b8786866040518563ffffffff1660e01b8152600401611f4d9493929190612ab9565b602060405180830381600087803b158015611f6757600080fd5b505af1925050508015611f97575060408051601f3d908101601f19168201909252611f9491810190612af6565b60015b611ff1573d808015611fc5576040519150601f19603f3d011682016040523d82523d6000602084013e611fca565b606091505b508051611fe95760405162461bcd60e51b81526004016106eb90612a67565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061152e565b506001949350505050565b6000600161202384610ea4565b61202d9190612a1d565b600083815260076020526040902054909150808214612080576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120c590600190612a1d565b600083815260096020526040812054600880549394509092849081106120ed576120ed61288e565b90600052602060002001549050806008838154811061210e5761210e61288e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061214657612146612b13565b6001900381819060005260206000200160009055905550505050565b600061216d83610ea4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121fc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106eb565b612205816117af565b156122515760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016106eb565b61225d60008383611e17565b6001600160a01b03821660009081526003602052604081208054600192906122869084906129be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546122f090612763565b90600052602060002090601f0160209004810192826123125760008555612358565b82601f1061232b57805160ff1916838001178555612358565b82800160010185558215612358579182015b8281111561235857825182559160200191906001019061233d565b50612364929150612368565b5090565b5b808211156123645760008155600101612369565b60006020828403121561238f57600080fd5b5035919050565b6001600160e01b031981168114610d2657600080fd5b6000602082840312156123be57600080fd5b813561193681612396565b60005b838110156123e45781810151838201526020016123cc565b838111156113645750506000910152565b6000815180845261240d8160208601602086016123c9565b601f01601f19169290920160200192915050565b60208152600061193660208301846123f5565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114610d2657600080fd5b6000806040838503121561247057600080fd5b823561247b81612448565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156124b9576124b9612489565b604051601f8501601f19908116603f011681019082821181831017156124e1576124e1612489565b816040528093508581528686860111156124fa57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261252557600080fd5b6119368383356020850161249f565b600080600080600060a0868803121561254c57600080fd5b853561255781612448565b945060208601356001600160401b0381111561257257600080fd5b61257e88828901612514565b9450506040860135925060608601359150608086013560ff811681146125a357600080fd5b809150509295509295909350565b6000806000606084860312156125c657600080fd5b83356125d181612448565b925060208401356125e181612448565b929592945050506040919091013590565b60006020828403121561260457600080fd5b813561193681612448565b60006020828403121561262157600080fd5b81356001600160401b0381111561263757600080fd5b8201601f8101841361264857600080fd5b61152e8482356020840161249f565b6000806040838503121561266a57600080fd5b823561267581612448565b91506020830135801515811461268a57600080fd5b809150509250929050565b600080600080608085870312156126ab57600080fd5b84356126b681612448565b935060208501356126c681612448565b92506040850135915060608501356001600160401b038111156126e857600080fd5b6126f487828801612514565b91505092959194509250565b6000806040838503121561271357600080fd5b823561271e81612448565b9150602083013561268a81612448565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061277757607f821691505b6020821081141561279857634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906127ca908301846123f5565b95945050505050565b600081516127e58185602086016123c9565b9290920192915050565b600083516128018184602088016123c9565b60609390931b6001600160601b0319169190920190815260140192915050565b600082516128338184602087016123c9565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252601d908201527f5374617274696e6720696e64657820697320616c726561647920736574000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612905576129056128db565b5060010190565b600080845481600182811c91508083168061292857607f831692505b602080841082141561294857634e487b7160e01b86526022600452602486fd5b81801561295c576001811461296d5761299a565b60ff1986168952848901965061299a565b60008b81526020902060005b868110156129925781548b820152908501908301612979565b505084890196505b5050505050506127ca6129ad82866127d3565b64173539b7b760d91b815260050190565b600082198211156129d1576129d16128db565b500190565b6000602082840312156129e857600080fd5b815161193681612448565b634e487b7160e01b600052601260045260246000fd5b600082612a1857612a186129f3565b500690565b600082821015612a2f57612a2f6128db565b500390565b600082612a4357612a436129f3565b500490565b6000816000190483118215151615612a6257612a626128db565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612aec908301846123f5565b9695505050505050565b600060208284031215612b0857600080fd5b815161193681612396565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f697066732e696f2f697066732f516d50676935673934683633746e3741703243576132516a43657365635351533153424a374c586d47326b38355668747470733a2f2f697066732e696f2f697066732f516d637a59325a574e61596671394e58326d386879386976466f52466b64737575584e345a69744e6e36696d4858a26469706673582212209be41f9a08f83e9f363edbbe3321195ffbb6326ebb1a356ad73954b5a83362ec64736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000270f00000000000000000000000000000000000000000000000000000000616202d0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000008486f6f6c6967616e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003484c470000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Hooligan
Arg [1] : symbol (string): HLG
Arg [2] : maxNftSupply (uint256): 9999
Arg [3] : saleStart (uint256): 1633813200
Arg [4] : proxyRegistryAddress_ (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000270f
Arg [3] : 00000000000000000000000000000000000000000000000000000000616202d0
Arg [4] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 486f6f6c6967616e000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 484c470000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

356:4899:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1938:121;;;;;;;;;;-1:-1:-1;1938:121:7;;;;;:::i;:::-;;:::i;:::-;;909:222:6;;;;;;;;;;-1:-1:-1;909:222:6;;;;;:::i;:::-;;:::i;:::-;;;750:14:18;;743:22;725:41;;713:2;698:18;909:222:6;;;;;;;;2349:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3860:217::-;;;;;;;;;;-1:-1:-1;3860:217:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3398:401::-;;;;;;;;;;-1:-1:-1;3398:401:5;;;;;:::i;:::-;;:::i;950:1117:14:-;;;;;;:::i;:::-;;:::i;288:43:3:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;288:43:3;;;;;1534:111:6;;;;;;;;;;-1:-1:-1;1621:10:6;:17;1534:111;;;4317:25:18;;;4305:2;4290:18;1534:111:6;4171:177:18;853:31:7;;;;;;;;;;;;;;;;1264:99:3;;;;;;;;;;-1:-1:-1;1341:15:3;;1264:99;;4724:330:5;;;;;;;;;;-1:-1:-1;4724:330:5;;;;;:::i;:::-;;:::i;2475:105:14:-;;;;;;;;;;-1:-1:-1;2475:105:14;;;;;:::i;:::-;-1:-1:-1;;;;;2561:12:14;2528:13;2561:12;;;:6;:12;;;;;;;2475:105;1210:253:6;;;;;;;;;;-1:-1:-1;1210:253:6;;;;;:::i;:::-;;:::i;748:25:7:-;;;;;;;;;;;;;;;;1369:155:3;;;;;;;;;;-1:-1:-1;1480:9:3;1369:155;;2166:87:7;;;;;;;;;;;;;:::i;1447:162::-;;;;;;;;;;;;;:::i;5120:179:5:-;;;;;;;;;;-1:-1:-1;5120:179:5;;;;;:::i;:::-;;:::i;1717:230:6:-;;;;;;;;;;-1:-1:-1;1717:230:6;;;;;:::i;:::-;;:::i;2065:95:7:-;;;;;;;;;;-1:-1:-1;2065:95:7;;;;;:::i;:::-;;:::i;2052:235:5:-;;;;;;;;;;-1:-1:-1;2052:235:5;;;;;:::i;:::-;;:::i;640:53:7:-;;;;;;;;;;;;676:17;640:53;;1790:205:5;;;;;;;;;;-1:-1:-1;1790:205:5;;;;;:::i;:::-;;:::i;1598:92:15:-;;;;;;;;;;;;;:::i;1819:113:7:-;;;;;;;;;;-1:-1:-1;1819:113:7;;;;;:::i;:::-;;:::i;3760:180::-;;;;;;;;;;;;;:::i;966:85:15:-;;;;;;;;;;;;;:::i;2511:102:5:-;;;;;;;;;;;;;:::i;701:40:7:-;;;;;;;;;;;;739:2;701:40;;2259:970;;;;;;:::i;:::-;;:::i;4144:290:5:-;;;;;;;;;;-1:-1:-1;4144:290:5;;;;;:::i;:::-;;:::i;5365:320::-;;;;;;;;;;-1:-1:-1;5365:320:5;;;;;:::i;:::-;;:::i;3946:333:7:-;;;;;;;;;;-1:-1:-1;3946:333:7;;;;;:::i;:::-;;:::i;605:28::-;;;;;;;;;;;;;;;;818:29;;;;;;;;;;;;;;;;565:33;;;;;;;;;;;;;;;;1615:198;;;;;;;;;;-1:-1:-1;1615:198:7;;;;;:::i;:::-;;:::i;5101:152::-;;;;;;;;;;;;;:::i;4406:432::-;;;;;;;;;;-1:-1:-1;4406:432:7;;;;;:::i;:::-;;:::i;3235:519::-;;;;;;;;;;;;;:::i;780:31::-;;;;;;;;;;-1:-1:-1;780:31:7;;;;;;;;1839:189:15;;;;;;;;;;-1:-1:-1;1839:189:15;;;;;:::i;:::-;;:::i;1938:121:7:-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;;;;;;;;;2018:16:7::1;:34:::0;1938:121::o;909:222:6:-;1011:4;-1:-1:-1;;;;;;1034:50:6;;-1:-1:-1;;;1034:50:6;;:90;;;1088:36;1112:11;1088:23;:36::i;:::-;1027:97;909:222;-1:-1:-1;;909:222:6:o;2349:98:5:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;-1:-1:-1;;;3955:73:5;;8135:2:18;3955:73:5;;;8117:21:18;8174:2;8154:18;;;8147:30;8213:34;8193:18;;;8186:62;-1:-1:-1;;;8264:18:18;;;8257:42;8316:19;;3955:73:5;7933:408:18;3955:73:5;-1:-1:-1;4046:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4046:24:5;;3860:217::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;-1:-1:-1;;;;;3535:11:5;:2;-1:-1:-1;;;;;3535:11:5;;;3527:57;;;;-1:-1:-1;;;3527:57:5;;8548:2:18;3527:57:5;;;8530:21:18;8587:2;8567:18;;;8560:30;8626:34;8606:18;;;8599:62;-1:-1:-1;;;8677:18:18;;;8670:31;8718:19;;3527:57:5;8346:397:18;3527:57:5;3632:5;-1:-1:-1;;;;;3616:21:5;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3616:21:5;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;3641:37::-;3595:165;;;;-1:-1:-1;;;3595:165:5;;8950:2:18;3595:165:5;;;8932:21:18;8989:2;8969:18;;;8962:30;9028:34;9008:18;;;9001:62;-1:-1:-1;;;9079:18:18;;;9072:54;9143:19;;3595:165:5;8748:420:18;3595:165:5;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;950:1117:14:-;1201:148;;;1145:12;1201:148;;;;;-1:-1:-1;;;;;1238:19:14;;1169:29;1238:19;;;:6;:19;;;;;;;;;1201:148;;;;;;;;;;;1381:45;1245:11;1201:148;1409:4;1415;1421;1381:6;:45::i;:::-;1360:125;;;;-1:-1:-1;;;1360:125:14;;9375:2:18;1360:125:14;;;9357:21:18;9414:2;9394:18;;;9387:30;9453:34;9433:18;;;9426:62;-1:-1:-1;;;9504:18:18;;;9497:31;9545:19;;1360:125:14;9173:397:18;1360:125:14;-1:-1:-1;;;;;1571:19:14;;;;;;:6;:19;;;;;;:26;;1595:1;1571:23;:26::i;:::-;-1:-1:-1;;;;;1549:19:14;;;;;;:6;:19;;;;;;;:48;;;;1613:122;;;;;1556:11;;1683:10;;1708:17;;1613:122;:::i;:::-;;;;;;;;1843:12;1857:23;1892:4;-1:-1:-1;;;;;1884:18:14;1933:17;1952:11;1916:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1916:48:14;;;;;;;;;;1884:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1842:132;;;;1992:7;1984:48;;;;-1:-1:-1;;;1984:48:14;;11094:2:18;1984:48:14;;;11076:21:18;11133:2;11113:18;;;11106:30;-1:-1:-1;;;11152:18:18;;;11145:58;11220:18;;1984:48:14;10892:352:18;1984:48:14;2050:10;950:1117;-1:-1:-1;;;;;;;;950:1117:14:o;4724:330:5:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;-1:-1:-1;;;4905:103:5;;;;;;;:::i;:::-;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;1210:253:6:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;-1:-1:-1;;;1326:87:6;;11869:2:18;1326:87:6;;;11851:21:18;11908:2;11888:18;;;11881:30;11947:34;11927:18;;;11920:62;-1:-1:-1;;;11998:18:18;;;11991:41;12049:19;;1326:87:6;11667:407:18;1326:87:6;-1:-1:-1;;;;;;1430:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1210:253::o;2166:87:7:-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;2234:12:7::1;::::0;;-1:-1:-1;;2218:28:7;::::1;2234:12;::::0;;::::1;2233:13;2218:28;::::0;;2166:87::o;1447:162::-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;1502:3:7::1;::::0;-1:-1:-1;;;;;1502:3:7::1;1494:52;1516:29;:21;1542:2;1516:25;:29::i;:::-;1494:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;1564:5:7::1;::::0;1556:46:::1;::::0;-1:-1:-1;;;;;1564:5:7;;::::1;::::0;1580:21:::1;1556:46:::0;::::1;;;::::0;1564:5:::1;1556:46:::0;1564:5;1556:46;1580:21;1564:5;1556:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1447:162::o:0;5120:179:5:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;1717:230:6:-;1792:7;1827:30;1621:10;:17;;1534:111;1827:30;1819:5;:38;1811:95;;;;-1:-1:-1;;;1811:95:6;;12281:2:18;1811:95:6;;;12263:21:18;12320:2;12300:18;;;12293:30;12359:34;12339:18;;;12332:62;-1:-1:-1;;;12410:18:18;;;12403:42;12462:19;;1811:95:6;12079:408:18;1811:95:6;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;1916:24;;1717:230;;;:::o;2065:95:7:-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;2135:18:7;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2065:95:::0;:::o;2052:235:5:-;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:5;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:5;;12826:2:18;2185:73:5;;;12808:21:18;12865:2;12845:18;;;12838:30;12904:34;12884:18;;;12877:62;-1:-1:-1;;;12955:18:18;;;12948:39;13004:19;;2185:73:5;12624:405:18;1790:205:5;1862:7;-1:-1:-1;;;;;1889:19:5;;1881:74;;;;-1:-1:-1;;;1881:74:5;;13236:2:18;1881:74:5;;;13218:21:18;13275:2;13255:18;;;13248:30;13314:34;13294:18;;;13287:62;-1:-1:-1;;;13365:18:18;;;13358:40;13415:19;;1881:74:5;13034:406:18;1881:74:5;-1:-1:-1;;;;;;1972:16:5;;;;;:9;:16;;;;;;;1790:205::o;1598:92:15:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;1819:113:7:-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;1895:14:7::1;:30:::0;1819:113::o;3760:180::-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;3837:13:7::1;::::0;:18;3829:60:::1;;;;-1:-1:-1::0;;;3829:60:7::1;;;;;;;:::i;:::-;3921:12;3900:18;:33:::0;3760:180::o;966:85:15:-;1038:6;;-1:-1:-1;;;;;1038:6:15;;966:85::o;2511:102:5:-;2567:13;2599:7;2592:14;;;;;:::i;2259:970:7:-;2330:12;;;;:49;;;;;2365:14;;2346:15;:33;;2330:49;2322:89;;;;-1:-1:-1;;;2322:89:7;;14005:2:18;2322:89:7;;;13987:21:18;14044:2;14024:18;;;14017:30;-1:-1:-1;;;14063:18:18;;;14056:57;14130:18;;2322:89:7;13803:351:18;2322:89:7;739:2;2442:14;:29;;2421:109;;;;-1:-1:-1;;;2421:109:7;;14361:2:18;2421:109:7;;;14343:21:18;14400:2;14380:18;;;14373:30;14439:34;14419:18;;;14412:62;-1:-1:-1;;;14490:18:18;;;14483:31;14531:19;;2421:109:7;14159:397:18;2421:109:7;2598:10;;2561:33;2579:14;2561:13;1621:10:6;:17;;1534:111;2561:13:7;:17;;:33::i;:::-;:47;;2540:126;;;;-1:-1:-1;;;2540:126:7;;14763:2:18;2540:126:7;;;14745:21:18;;;14782:18;;;14775:30;14841:34;14821:18;;;14814:62;14893:18;;2540:126:7;14561:356:18;2540:126:7;2730:9;2697:29;676:17;2711:14;2697:13;:29::i;:::-;:42;;2676:120;;;;-1:-1:-1;;;2676:120:7;;15124:2:18;2676:120:7;;;15106:21:18;15163:2;15143:18;;;15136:30;15202:33;15182:18;;;15175:61;15253:18;;2676:120:7;14922:355:18;2676:120:7;2812:9;2807:213;2831:14;2827:1;:18;2807:213;;;2866:17;2886:13;1621:10:6;:17;;1534:111;2886:13:7;2866:33;;2933:10;;2917:13;1621:10:6;:17;;1534:111;2917:13:7;:26;2913:97;;;2963:32;2973:10;2985:9;2963;:32::i;:::-;-1:-1:-1;2847:3:7;;;;:::i;:::-;;;;2807:213;;;-1:-1:-1;3047:18:7;;:23;:107;;;;-1:-1:-1;3104:10:7;;1621::6;:17;3087:27:7;:66;;;;3137:16;;3118:15;:35;;3087:66;3030:193;;;3200:12;3179:18;:33;2259:970;:::o;4144:290:5:-;4258:12;:10;:12::i;:::-;-1:-1:-1;;;;;4246:24:5;:8;-1:-1:-1;;;;;4246:24:5;;;4238:62;;;;-1:-1:-1;;;4238:62:5;;15756:2:18;4238:62:5;;;15738:21:18;15795:2;15775:18;;;15768:30;-1:-1:-1;;;15814:18:18;;;15807:55;15879:18;;4238:62:5;15554:349:18;4238:62:5;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;-1:-1:-1;;;;;4311:32:5;;;;;;;;;;;;;;;;;-1:-1:-1;4311:32:5;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4311:53:5;;;;;;;;;;;4394:12;:10;:12::i;:::-;-1:-1:-1;;;;;4379:48:5;;4418:8;4379:48;;;;750:14:18;743:22;725:41;;713:2;698:18;;585:187;4379:48:5;;;;;;;;4144:290;;:::o;5365:320::-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;-1:-1:-1;;;5526:103:5;;;;;;;:::i;:::-;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;3946:333:7:-;4044:13;4099:16;;4080:15;:35;;:192;;;;;;;;;;;;;;;;;;;;;;4151:8;4161:19;:8;:17;:19::i;:::-;4134:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4073:199;3946:333;-1:-1:-1;;3946:333:7:o;1615:198::-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;1672:14:7::1;1689:13;1621:10:6::0;:17;;1534:111;1689:13:7::1;1672:30;;1712:9;1731:76;1747:2;1743:1;:6;1731:76;;;1770:26;1780:3:::0;1785:10:::1;1794:1:::0;1785:6;:10:::1;:::i;:::-;1770:9;:26::i;:::-;1751:3:::0;::::1;::::0;::::1;:::i;:::-;;;;1731:76;;5101:152:::0;5145:13;5170:76;;;;;;;;;;;;;;;;;;;5101:152;:::o;4406:432::-;4653:20;;4696:28;;-1:-1:-1;;;4696:28:7;;4527:4;;-1:-1:-1;;;;;4653:20:7;;;;4688:49;;;;4653:20;;4696:21;;:28;;4718:5;;4696:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4688:49:7;;4684:91;;;4760:4;4753:11;;;;;4684:91;-1:-1:-1;;;;;4620:25:5;;;4597:4;4620:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;4792:39:7;4785:46;4406:432;-1:-1:-1;;;;4406:432:7:o;3235:519::-;1189:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;3298:13:7::1;::::0;:18;3290:60:::1;;;;-1:-1:-1::0;;;3290:60:7::1;;;;;;;:::i;:::-;3368:18;::::0;3360:68:::1;;;::::0;-1:-1:-1;;;3360:68:7;;18077:2:18;3360:68:7::1;::::0;::::1;18059:21:18::0;;;18096:18;;;18089:30;18155:34;18135:18;;;18128:62;18207:18;;3360:68:7::1;17875:356:18::0;3360:68:7::1;3496:10;::::0;3473:18:::1;::::0;3455:51:::1;::::0;3496:10;3463:29:::1;3455:51;:::i;:::-;3439:13;:67:::0;3537:18:::1;::::0;3559:3:::1;::::0;3520:36:::1;::::0;:12:::1;::::0;:16:::1;:36::i;:::-;:42;3516:138;;;3633:10;::::0;3612:16:::1;3627:1;3612:12;:16;:::i;:::-;3594:49;::::0;;3602:27:::1;3594:49;:::i;:::-;3578:13;:65:::0;3516:138:::1;3667:13;::::0;3663:85:::1;;3717:13;::::0;:20:::1;::::0;3735:1:::1;3717:17;:20::i;:::-;3701:13;:36:::0;3235:519::o;1839:189:15:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:15;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:15;;1170:68;;;;-1:-1:-1;;;1170:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:15;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:15;;18817:2:18;1919:73:15::1;::::0;::::1;18799:21:18::0;18856:2;18836:18;;;18829:30;18895:34;18875:18;;;18868:62;-1:-1:-1;;;18946:18:18;;;18939:36;18992:19;;1919:73:15::1;18615:402:18::0;1919:73:15::1;2002:19;2012:8;2002:9;:19::i;95:631:1:-:0;163:22;205:10;227:4;205:27;201:496;;;248:18;269:8;;248:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;307:8:1;514:17;508:24;-1:-1:-1;;;;;483:131:1;;-1:-1:-1;201:496:1;;-1:-1:-1;201:496:1;;-1:-1:-1;675:10:1;201:496;95:631;:::o;4977:118:7:-;5031:14;5064:24;:22;:24::i;:::-;5057:31;;4977:118;:::o;1431:300:5:-;1533:4;-1:-1:-1;;;;;;1568:40:5;;-1:-1:-1;;;1568:40:5;;:104;;-1:-1:-1;;;;;;;1624:48:5;;-1:-1:-1;;;1624:48:5;1568:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:4;;;1688:36:5;763:155:4;7157:125:5;7222:4;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:5;:30;;;7157:125::o;11008:171::-;11082:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11082:29:5;-1:-1:-1;;;;;11082:29:5;;;;;;;;:24;;11135:23;11082:24;11135:14;:23::i;:::-;-1:-1:-1;;;;;11126:46:5;;;;;;;;;;;11008:171;;:::o;2586:470:14:-;2758:4;-1:-1:-1;;;;;2782:20:14;;2774:70;;;;-1:-1:-1;;;2774:70:14;;19224:2:18;2774:70:14;;;19206:21:18;19263:2;19243:18;;;19236:30;19302:34;19282:18;;;19275:62;-1:-1:-1;;;19353:18:18;;;19346:35;19398:19;;2774:70:14;19022:401:18;2774:70:14;2895:154;2922:47;2941:27;2961:6;2941:19;:27::i;:::-;2922:18;:47::i;:::-;2895:154;;;;;;;;;;;;19655:25:18;;;;19728:4;19716:17;;19696:18;;;19689:45;19750:18;;;19743:34;;;19793:18;;;19786:34;;;19627:19;;2895:154:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2873:176:14;:6;-1:-1:-1;;;;;2873:176:14;;2854:195;;2586:470;;;;;;;:::o;2672:96:16:-;2730:7;2756:5;2760:1;2756;:5;:::i;:::-;2749:12;2672:96;-1:-1:-1;;;2672:96:16:o;7440:344:5:-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;-1:-1:-1;;;7549:73:5;;20033:2:18;7549:73:5;;;20015:21:18;20072:2;20052:18;;;20045:30;20111:34;20091:18;;;20084:62;-1:-1:-1;;;20162:18:18;;;20155:42;20214:19;;7549:73:5;19831:408:18;7549:73:5;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;-1:-1:-1;;;;;7689:16:5;:7;-1:-1:-1;;;;;7689:16:5;;:51;;;;7733:7;-1:-1:-1;;;;;7709:31:5;:20;7721:7;7709:11;:20::i;:::-;-1:-1:-1;;;;;7709:31:5;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;10337:560::-;10491:4;-1:-1:-1;;;;;10464:31:5;:23;10479:7;10464:14;:23::i;:::-;-1:-1:-1;;;;;10464:31:5;;10456:85;;;;-1:-1:-1;;;10456:85:5;;20446:2:18;10456:85:5;;;20428:21:18;20485:2;20465:18;;;20458:30;20524:34;20504:18;;;20497:62;-1:-1:-1;;;20575:18:18;;;20568:39;20624:19;;10456:85:5;20244:405:18;10456:85:5;-1:-1:-1;;;;;10559:16:5;;10551:65;;;;-1:-1:-1;;;10551:65:5;;20856:2:18;10551:65:5;;;20838:21:18;20895:2;20875:18;;;20868:30;20934:34;20914:18;;;20907:62;-1:-1:-1;;;20985:18:18;;;20978:34;21029:19;;10551:65:5;20654:400:18;10551:65:5;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;-1:-1:-1;;;;;10768:15:5;;;;;;:9;:15;;;;;:20;;10787:1;;10768:15;:20;;10787:1;;10768:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10798:13:5;;;;;;:9;:13;;;;;:18;;10815:1;;10798:13;:18;;10815:1;;10798:18;:::i;:::-;;;;-1:-1:-1;;10826:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10826:21:5;-1:-1:-1;;;;;10826:21:5;;;;;;;;;10863:27;;10826:16;;10863:27;;;;;;;10337:560;;;:::o;3767:96:16:-;3825:7;3851:5;3855:1;3851;:5;:::i;2034:169:15:-;2108:6;;;-1:-1:-1;;;;;2124:17:15;;;-1:-1:-1;;;;;;2124:17:15;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2079:124;2034:169;:::o;3382:96:16:-;3440:7;3466:5;3470:1;3466;:5;:::i;8114:108:5:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;6547:307::-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;-1:-1:-1;;;6736:111:5;;;;;;;:::i;275:703:17:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:17;;;;;;;;;;;;-1:-1:-1;;;574:10:17;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:17;;-1:-1:-1;720:2:17;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;-1:-1:-1;;;;;764:17:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:17;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:17;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:17;;;;;;;;-1:-1:-1;919:11:17;928:2;919:11;;:::i;:::-;;;791:150;;3039:96:16;3097:7;3123:5;3127:1;3123;:5;:::i;2073:396:14:-;2180:7;296:106;;;;;;;;;;;;;;;;;273:139;;;;;;;2328:12;;2362:11;;;;2405:24;;;;;2395:35;;;;;;2249:199;;;;;22007:25:18;;;22063:2;22048:18;;22041:34;;;;-1:-1:-1;;;;;22111:32:18;22106:2;22091:18;;22084:60;22175:2;22160:18;;22153:34;21994:3;21979:19;;21776:417;2249:199:14;;;;;;;;;;;;;2222:240;;;;;;2203:259;;2073:396;;;:::o;1884:249:3:-;1980:7;2078:20;1341:15;;;1264:99;2078:20;2049:63;;-1:-1:-1;;;2049:63:3;;;22456:27:18;22499:11;;;22492:27;;;;22535:12;;;22528:28;;;22572:12;;2049:63:3;22198:392:18;2543:572:6;-1:-1:-1;;;;;2742:18:6;;2738:183;;2776:40;2808:7;3924:10;:17;;3897:24;;;;:15;:24;;;;;:44;;;3951:24;;;;;;;;;;;;3821:161;2776:40;2738:183;;;2845:2;-1:-1:-1;;;;;2837:10:6;:4;-1:-1:-1;;;;;2837:10:6;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;-1:-1:-1;;;;;2934:16:6;;2930:179;;2966:45;3003:7;2966:36;:45::i;2930:179::-;3038:4;-1:-1:-1;;;;;3032:10:6;:2;-1:-1:-1;;;;;3032:10:6;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;8443:311:5:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;-1:-1:-1;;;8596:151:5;;;;;;;:::i;11732:782::-;11882:4;-1:-1:-1;;;;;11902:13:5;;1034:20:0;1080:8;11898:610:5;;11953:2;-1:-1:-1;;;;;11937:36:5;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11937:72:5;;;;;;;;-1:-1:-1;;11937:72:5;;;;;;;;;;;;:::i;:::-;;;11933:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12180:13:5;;12176:266;;12222:60;;-1:-1:-1;;;12222:60:5;;;;;;;:::i;12176:266::-;12394:6;12388:13;12379:6;12375:2;12371:15;12364:38;11933:523;-1:-1:-1;;;;;;12059:55:5;-1:-1:-1;;;12059:55:5;;-1:-1:-1;12052:62:5;;11898:610;-1:-1:-1;12493:4:5;11732:782;;;;;;:::o;4599:970:6:-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4922:18;4943:26;;;:17;:26;;;;;;4861:51;;-1:-1:-1;5073:28:6;;;5069:323;;-1:-1:-1;;;;;5139:18:6;;5117:19;5139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5188:30;;;;;;:44;;;5304:30;;:17;:30;;;;;:43;;;5069:323;-1:-1:-1;5485:26:6;;;;:17;:26;;;;;;;;5478:33;;;-1:-1:-1;;;;;5528:18:6;;;;;:12;:18;;;;;:34;;;;;;;5521:41;4599:970::o;5857:1061::-;6131:10;:17;6106:22;;6131:21;;6151:1;;6131:21;:::i;:::-;6162:18;6183:24;;;:15;:24;;;;;;6551:10;:26;;6106:46;;-1:-1:-1;6183:24:6;;6106:46;;6551:26;;;;;;:::i;:::-;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6692:28;;;:15;:28;;;;;;;:41;;;6861:24;;;;;6854:31;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;-1:-1:-1;;;;;3540:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3584:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3409:217:6:o;9076:372:5:-;-1:-1:-1;;;;;9155:16:5;;9147:61;;;;-1:-1:-1;;;9147:61:5;;23677:2:18;9147:61:5;;;23659:21:18;;;23696:18;;;23689:30;23755:34;23735:18;;;23728:62;23807:18;;9147:61:5;23475:356:18;9147:61:5;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;-1:-1:-1;;;9218:58:5;;24038:2:18;9218:58:5;;;24020:21:18;24077:2;24057:18;;;24050:30;-1:-1:-1;;;24096:18:18;;;24089:58;24164:18;;9218:58:5;23836:352:18;9218:58:5;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;-1:-1:-1;;;;;9343:13:5;;;;;;:9;:13;;;;;:18;;9360:1;;9343:13;:18;;9360:1;;9343:18;:::i;:::-;;;;-1:-1:-1;;9371:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9371:21:5;-1:-1:-1;;;;;9371:21:5;;;;;;;;9408:33;;9371:16;;;9408:33;;9371:16;;9408:33;9076:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:18;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:18;;14:180;-1:-1:-1;14:180:18:o;199:131::-;-1:-1:-1;;;;;;273:32:18;;263:43;;253:71;;320:1;317;310:12;335:245;393:6;446:2;434:9;425:7;421:23;417:32;414:52;;;462:1;459;452:12;414:52;501:9;488:23;520:30;544:5;520:30;:::i;777:258::-;849:1;859:113;873:6;870:1;867:13;859:113;;;949:11;;;943:18;930:11;;;923:39;895:2;888:10;859:113;;;990:6;987:1;984:13;981:48;;;-1:-1:-1;;1025:1:18;1007:16;;1000:27;777:258::o;1040:::-;1082:3;1120:5;1114:12;1147:6;1142:3;1135:19;1163:63;1219:6;1212:4;1207:3;1203:14;1196:4;1189:5;1185:16;1163:63;:::i;:::-;1280:2;1259:15;-1:-1:-1;;1255:29:18;1246:39;;;;1287:4;1242:50;;1040:258;-1:-1:-1;;1040:258:18:o;1303:220::-;1452:2;1441:9;1434:21;1415:4;1472:45;1513:2;1502:9;1498:18;1490:6;1472:45;:::i;1528:203::-;-1:-1:-1;;;;;1692:32:18;;;;1674:51;;1662:2;1647:18;;1528:203::o;1736:131::-;-1:-1:-1;;;;;1811:31:18;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:18:o;2192:127::-;2253:10;2248:3;2244:20;2241:1;2234:31;2284:4;2281:1;2274:15;2308:4;2305:1;2298:15;2324:631;2388:5;-1:-1:-1;;;;;2459:2:18;2451:6;2448:14;2445:40;;;2465:18;;:::i;:::-;2540:2;2534:9;2508:2;2594:15;;-1:-1:-1;;2590:24:18;;;2616:2;2586:33;2582:42;2570:55;;;2640:18;;;2660:22;;;2637:46;2634:72;;;2686:18;;:::i;:::-;2726:10;2722:2;2715:22;2755:6;2746:15;;2785:6;2777;2770:22;2825:3;2816:6;2811:3;2807:16;2804:25;2801:45;;;2842:1;2839;2832:12;2801:45;2892:6;2887:3;2880:4;2872:6;2868:17;2855:44;2947:1;2940:4;2931:6;2923;2919:19;2915:30;2908:41;;;;2324:631;;;;;:::o;2960:220::-;3002:5;3055:3;3048:4;3040:6;3036:17;3032:27;3022:55;;3073:1;3070;3063:12;3022:55;3095:79;3170:3;3161:6;3148:20;3141:4;3133:6;3129:17;3095:79;:::i;3185:758::-;3287:6;3295;3303;3311;3319;3372:3;3360:9;3351:7;3347:23;3343:33;3340:53;;;3389:1;3386;3379:12;3340:53;3428:9;3415:23;3447:31;3472:5;3447:31;:::i;:::-;3497:5;-1:-1:-1;3553:2:18;3538:18;;3525:32;-1:-1:-1;;;;;3569:30:18;;3566:50;;;3612:1;3609;3602:12;3566:50;3635:49;3676:7;3667:6;3656:9;3652:22;3635:49;:::i;:::-;3625:59;;;3731:2;3720:9;3716:18;3703:32;3693:42;;3782:2;3771:9;3767:18;3754:32;3744:42;;3838:3;3827:9;3823:19;3810:33;3887:4;3878:7;3874:18;3865:7;3862:31;3852:59;;3907:1;3904;3897:12;3852:59;3930:7;3920:17;;;3185:758;;;;;;;;:::o;4535:456::-;4612:6;4620;4628;4681:2;4669:9;4660:7;4656:23;4652:32;4649:52;;;4697:1;4694;4687:12;4649:52;4736:9;4723:23;4755:31;4780:5;4755:31;:::i;:::-;4805:5;-1:-1:-1;4862:2:18;4847:18;;4834:32;4875:33;4834:32;4875:33;:::i;:::-;4535:456;;4927:7;;-1:-1:-1;;;4981:2:18;4966:18;;;;4953:32;;4535:456::o;4996:247::-;5055:6;5108:2;5096:9;5087:7;5083:23;5079:32;5076:52;;;5124:1;5121;5114:12;5076:52;5163:9;5150:23;5182:31;5207:5;5182:31;:::i;5248:450::-;5317:6;5370:2;5358:9;5349:7;5345:23;5341:32;5338:52;;;5386:1;5383;5376:12;5338:52;5426:9;5413:23;-1:-1:-1;;;;;5451:6:18;5448:30;5445:50;;;5491:1;5488;5481:12;5445:50;5514:22;;5567:4;5559:13;;5555:27;-1:-1:-1;5545:55:18;;5596:1;5593;5586:12;5545:55;5619:73;5684:7;5679:2;5666:16;5661:2;5657;5653:11;5619:73;:::i;5703:416::-;5768:6;5776;5829:2;5817:9;5808:7;5804:23;5800:32;5797:52;;;5845:1;5842;5835:12;5797:52;5884:9;5871:23;5903:31;5928:5;5903:31;:::i;:::-;5953:5;-1:-1:-1;6010:2:18;5995:18;;5982:32;6052:15;;6045:23;6033:36;;6023:64;;6083:1;6080;6073:12;6023:64;6106:7;6096:17;;;5703:416;;;;;:::o;6124:665::-;6219:6;6227;6235;6243;6296:3;6284:9;6275:7;6271:23;6267:33;6264:53;;;6313:1;6310;6303:12;6264:53;6352:9;6339:23;6371:31;6396:5;6371:31;:::i;:::-;6421:5;-1:-1:-1;6478:2:18;6463:18;;6450:32;6491:33;6450:32;6491:33;:::i;:::-;6543:7;-1:-1:-1;6597:2:18;6582:18;;6569:32;;-1:-1:-1;6652:2:18;6637:18;;6624:32;-1:-1:-1;;;;;6668:30:18;;6665:50;;;6711:1;6708;6701:12;6665:50;6734:49;6775:7;6766:6;6755:9;6751:22;6734:49;:::i;:::-;6724:59;;;6124:665;;;;;;;:::o;6794:388::-;6862:6;6870;6923:2;6911:9;6902:7;6898:23;6894:32;6891:52;;;6939:1;6936;6929:12;6891:52;6978:9;6965:23;6997:31;7022:5;6997:31;:::i;:::-;7047:5;-1:-1:-1;7104:2:18;7089:18;;7076:32;7117:33;7076:32;7117:33;:::i;7187:356::-;7389:2;7371:21;;;7408:18;;;7401:30;7467:34;7462:2;7447:18;;7440:62;7534:2;7519:18;;7187:356::o;7548:380::-;7627:1;7623:12;;;;7670;;;7691:61;;7745:4;7737:6;7733:17;7723:27;;7691:61;7798:2;7790:6;7787:14;7767:18;7764:38;7761:161;;;7844:10;7839:3;7835:20;7832:1;7825:31;7879:4;7876:1;7869:15;7907:4;7904:1;7897:15;7761:161;;7548:380;;;:::o;9575:432::-;-1:-1:-1;;;;;9832:15:18;;;9814:34;;9884:15;;9879:2;9864:18;;9857:43;9936:2;9931;9916:18;;9909:30;;;9757:4;;9956:45;;9982:18;;9974:6;9956:45;:::i;:::-;9948:53;9575:432;-1:-1:-1;;;;;9575:432:18:o;10012:184::-;10053:3;10091:5;10085:12;10106:52;10151:6;10146:3;10139:4;10132:5;10128:16;10106:52;:::i;:::-;10174:16;;;;;10012:184;-1:-1:-1;;10012:184:18:o;10201:407::-;10358:3;10396:6;10390:13;10412:53;10458:6;10453:3;10446:4;10438:6;10434:17;10412:53;:::i;:::-;10559:2;10530:15;;;;-1:-1:-1;;;;;;10526:45:18;10487:16;;;;10512:60;;;10599:2;10588:14;;10201:407;-1:-1:-1;;10201:407:18:o;10613:274::-;10742:3;10780:6;10774:13;10796:53;10842:6;10837:3;10830:4;10822:6;10818:17;10796:53;:::i;:::-;10865:16;;;;;10613:274;-1:-1:-1;;10613:274:18:o;11249:413::-;11451:2;11433:21;;;11490:2;11470:18;;;11463:30;11529:34;11524:2;11509:18;;11502:62;-1:-1:-1;;;11595:2:18;11580:18;;11573:47;11652:3;11637:19;;11249:413::o;12492:127::-;12553:10;12548:3;12544:20;12541:1;12534:31;12584:4;12581:1;12574:15;12608:4;12605:1;12598:15;13445:353;13647:2;13629:21;;;13686:2;13666:18;;;13659:30;13725:31;13720:2;13705:18;;13698:59;13789:2;13774:18;;13445:353::o;15282:127::-;15343:10;15338:3;15334:20;15331:1;15324:31;15374:4;15371:1;15364:15;15398:4;15395:1;15388:15;15414:135;15453:3;-1:-1:-1;;15474:17:18;;15471:43;;;15494:18;;:::i;:::-;-1:-1:-1;15541:1:18;15530:13;;15414:135::o;16152:1300::-;16429:3;16458:1;16491:6;16485:13;16521:3;16543:1;16571:9;16567:2;16563:18;16553:28;;16631:2;16620:9;16616:18;16653;16643:61;;16697:4;16689:6;16685:17;16675:27;;16643:61;16723:2;16771;16763:6;16760:14;16740:18;16737:38;16734:165;;;-1:-1:-1;;;16798:33:18;;16854:4;16851:1;16844:15;16884:4;16805:3;16872:17;16734:165;16915:18;16942:104;;;;17060:1;17055:320;;;;16908:467;;16942:104;-1:-1:-1;;16975:24:18;;16963:37;;17020:16;;;;-1:-1:-1;16942:104:18;;17055:320;15981:1;15974:14;;;16018:4;16005:18;;17150:1;17164:165;17178:6;17175:1;17172:13;17164:165;;;17256:14;;17243:11;;;17236:35;17299:16;;;;17193:10;;17164:165;;;17168:3;;17358:6;17353:3;17349:16;17342:23;;16908:467;;;;;;;17391:55;17416:29;17441:3;17433:6;17416:29;:::i;:::-;-1:-1:-1;;;16094:20:18;;16139:1;16130:11;;16034:113;17457:128;17497:3;17528:1;17524:6;17521:1;17518:13;17515:39;;;17534:18;;:::i;:::-;-1:-1:-1;17570:9:18;;17457:128::o;17590:280::-;17689:6;17742:2;17730:9;17721:7;17717:23;17713:32;17710:52;;;17758:1;17755;17748:12;17710:52;17790:9;17784:16;17809:31;17834:5;17809:31;:::i;18236:127::-;18297:10;18292:3;18288:20;18285:1;18278:31;18328:4;18325:1;18318:15;18352:4;18349:1;18342:15;18368:112;18400:1;18426;18416:35;;18431:18;;:::i;:::-;-1:-1:-1;18465:9:18;;18368:112::o;18485:125::-;18525:4;18553:1;18550;18547:8;18544:34;;;18558:18;;:::i;:::-;-1:-1:-1;18595:9:18;;18485:125::o;21059:120::-;21099:1;21125;21115:35;;21130:18;;:::i;:::-;-1:-1:-1;21164:9:18;;21059:120::o;21184:168::-;21224:7;21290:1;21286;21282:6;21278:14;21275:1;21272:21;21267:1;21260:9;21253:17;21249:45;21246:71;;;21297:18;;:::i;:::-;-1:-1:-1;21337:9:18;;21184:168::o;21357:414::-;21559:2;21541:21;;;21598:2;21578:18;;;21571:30;21637:34;21632:2;21617:18;;21610:62;-1:-1:-1;;;21703:2:18;21688:18;;21681:48;21761:3;21746:19;;21357:414::o;22595:489::-;-1:-1:-1;;;;;22864:15:18;;;22846:34;;22916:15;;22911:2;22896:18;;22889:43;22963:2;22948:18;;22941:34;;;23011:3;23006:2;22991:18;;22984:31;;;22789:4;;23032:46;;23058:19;;23050:6;23032:46;:::i;:::-;23024:54;22595:489;-1:-1:-1;;;;;;22595:489:18:o;23089:249::-;23158:6;23211:2;23199:9;23190:7;23186:23;23182:32;23179:52;;;23227:1;23224;23217:12;23179:52;23259:9;23253:16;23278:30;23302:5;23278:30;:::i;23343:127::-;23404:10;23399:3;23395:20;23392:1;23385:31;23435:4;23432:1;23425:15;23459:4;23456:1;23449:15

Swarm Source

ipfs://9be41f9a08f83e9f363edbbe3321195ffbb6326ebb1a356ad73954b5a83362ec
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.