ETH Price: $3,301.11 (-3.87%)
Gas: 21 Gwei

Soul Cafe (SC)
 

Overview

TokenID

3222

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Soul Café is a collection of 3333 randomly generated, unique and diverse women existing as NFTs on the Ethereum Blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SoulCafe

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 14: SoulCafe.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

contract OwnableDelegateProxy {}

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

contract SoulCafe is
    ERC721Enumerable,
    Ownable
{
    using SafeMath for uint256;
    using Strings for uint256;
    
    address proxyRegistryAddress;

    uint256 public mintPrice = 0.03 ether; 
    uint256 public maxSupply = 3333;
    
    uint256 public saleTimeStamp;
    uint256 public revealTimeStamp;

    string private BASE_URI = "";

    address private sc = 0x78Cd6C571DeA180529C86ed42689dBDd0e5319ce;
    address private dev = 0xe97D9622C7189C2A2e7eC39A71cf77Bb25344082;

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxNftSupply,
        uint256 saleStart,
        address proxyRegistryAddress_
    ) ERC721(name, symbol) {
        maxSupply = maxNftSupply;
        saleTimeStamp = saleStart;
        revealTimeStamp = saleStart + (86400 * 2);
        proxyRegistryAddress = proxyRegistryAddress_;
    }

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

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

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

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

    function setMintPrice(uint256 price) public onlyOwner {
        mintPrice = price;
    }

    function setMaxSupply(uint256 supply) public onlyOwner {
        maxSupply = supply;
    }

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

    function mint(uint256 numberOfTokens) public payable {
        require(block.timestamp >= saleTimeStamp, "Sale must be active to mint");
        require(
            totalSupply().add(numberOfTokens) <= maxSupply,
            "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() < maxSupply) {
                _mint(msg.sender, mintIndex);
            }
        }
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return block.timestamp >= revealTimeStamp 
        ? string(abi.encodePacked(BASE_URI, _tokenId.toString(), ".json")) 
        : contractURI() ;
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function contractURI() public pure returns (string memory) {
        return "ipfs://QmYacSSWSpfSraRsnQjR8gNbGwAk92F94UE4apgeFzQs6B";
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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 3 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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 4 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

File 5 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

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 6 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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 7 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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 8 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

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 9 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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 10 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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 11 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 12 of 14: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

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 generally not needed starting with Solidity 0.8, since 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 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

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":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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"uint256","name":"num","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTimeStamp","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":"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":"saleTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"setSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]

6080604052666a94d74f430000600c55610d05600d5560405180602001604052806000815250601090805190602001906200003c929190620002af565b507378cd6c571dea180529c86ed42689dbdd0e5319ce601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e97d9622c7189c2a2e7ec39a71cf77bb25344082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f457600080fd5b50604051620049123803806200491283398181016040528101906200011a9190620003ff565b8484816000908051906020019062000134929190620002af565b5080600190805190602001906200014d929190620002af565b5050506200017062000164620001e160201b60201c565b620001e960201b60201c565b82600d8190555081600e819055506202a300826200018f919062000512565b600f8190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000721565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002bd90620005e3565b90600052602060002090601f016020900481019282620002e157600085556200032d565b82601f10620002fc57805160ff19168380011785556200032d565b828001600101855582156200032d579182015b828111156200032c5782518255916020019190600101906200030f565b5b5090506200033c919062000340565b5090565b5b808211156200035b57600081600090555060010162000341565b5090565b6000620003766200037084620004dc565b620004b3565b9050828152602081018484840111156200038f57600080fd5b6200039c848285620005ad565b509392505050565b600081519050620003b581620006ed565b92915050565b600082601f830112620003cd57600080fd5b8151620003df8482602086016200035f565b91505092915050565b600081519050620003f98162000707565b92915050565b600080600080600060a086880312156200041857600080fd5b600086015167ffffffffffffffff8111156200043357600080fd5b6200044188828901620003bb565b955050602086015167ffffffffffffffff8111156200045f57600080fd5b6200046d88828901620003bb565b94505060406200048088828901620003e8565b93505060606200049388828901620003e8565b9250506080620004a688828901620003a4565b9150509295509295909350565b6000620004bf620004d2565b9050620004cd828262000619565b919050565b6000604051905090565b600067ffffffffffffffff821115620004fa57620004f9620006ad565b5b6200050582620006dc565b9050602081019050919050565b60006200051f82620005a3565b91506200052c83620005a3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200056457620005636200064f565b5b828201905092915050565b60006200057c8262000583565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620005cd578082015181840152602081019050620005b0565b83811115620005dd576000848401525b50505050565b60006002820490506001821680620005fc57607f821691505b602082108114156200061357620006126200067e565b5b50919050565b6200062482620006dc565b810181811067ffffffffffffffff82111715620006465762000645620006ad565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620006f8816200056f565b81146200070457600080fd5b50565b6200071281620005a3565b81146200071e57600080fd5b50565b6141e180620007316000396000f3fe6080604052600436106101e35760003560e01c80636f8b44b011610102578063a22cb46511610095578063e8a3d48511610064578063e8a3d485146106cf578063e985e9c5146106fa578063f2fde38b14610737578063f4a0a52814610760576101e3565b8063a22cb46514610615578063b88d4fde1461063e578063c87b56dd14610667578063d5abeb01146106a4576101e3565b80637a1cbd3f116100d15780637a1cbd3f1461057a5780638da5cb5b146105a357806395d89b41146105ce578063a0712d68146105f9576101e3565b80636f8b44b0146104d257806370a08231146104fb578063715018a61461053857806371f9c5341461054f576101e3565b80632f745c591161017a57806355f804b31161014957806355f804b314610416578063626a15bd1461043f5780636352211e1461046a5780636817c76c146104a7576101e3565b80632f745c591461035c5780633ccfd60b1461039957806342842e0e146103b05780634f6ccce7146103d9576101e3565b8063081812fc116101b6578063081812fc146102a2578063095ea7b3146102df57806318160ddd1461030857806323b872dd14610333576101e3565b8063018a2c37146101e857806301ffc9a71461021157806303339bcb1461024e57806306fdde0314610277575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612f51565b610789565b005b34801561021d57600080fd5b5061023860048036038101906102339190612e95565b61080f565b604051610245919061347a565b60405180910390f35b34801561025a57600080fd5b5061027560048036038101906102709190612f7a565b610889565b005b34801561028357600080fd5b5061028c61094a565b6040516102999190613495565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612f51565b6109dc565b6040516102d69190613413565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190612e59565b610a61565b005b34801561031457600080fd5b5061031d610b79565b60405161032a9190613737565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612d53565b610b86565b005b34801561036857600080fd5b50610383600480360381019061037e9190612e59565b610be6565b6040516103909190613737565b60405180910390f35b3480156103a557600080fd5b506103ae610c8b565b005b3480156103bc57600080fd5b506103d760048036038101906103d29190612d53565b610dee565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190612f51565b610e0e565b60405161040d9190613737565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190612f10565b610ea5565b005b34801561044b57600080fd5b50610454610f3b565b6040516104619190613737565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190612f51565b610f41565b60405161049e9190613413565b60405180910390f35b3480156104b357600080fd5b506104bc610ff3565b6040516104c99190613737565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190612f51565b610ff9565b005b34801561050757600080fd5b50610522600480360381019061051d9190612cee565b61107f565b60405161052f9190613737565b60405180910390f35b34801561054457600080fd5b5061054d611137565b005b34801561055b57600080fd5b506105646111bf565b6040516105719190613737565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190612f51565b6111c5565b005b3480156105af57600080fd5b506105b861124b565b6040516105c59190613413565b60405180910390f35b3480156105da57600080fd5b506105e3611275565b6040516105f09190613495565b60405180910390f35b610613600480360381019061060e9190612f51565b611307565b005b34801561062157600080fd5b5061063c60048036038101906106379190612e1d565b61144c565b005b34801561064a57600080fd5b5061066560048036038101906106609190612da2565b611462565b005b34801561067357600080fd5b5061068e60048036038101906106899190612f51565b6114c4565b60405161069b9190613495565b60405180910390f35b3480156106b057600080fd5b506106b9611510565b6040516106c69190613737565b60405180910390f35b3480156106db57600080fd5b506106e4611516565b6040516106f19190613495565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190612d17565b611536565b60405161072e919061347a565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190612cee565b611638565b005b34801561076c57600080fd5b5061078760048036038101906107829190612f51565b611730565b005b6107916117b6565b73ffffffffffffffffffffffffffffffffffffffff166107af61124b565b73ffffffffffffffffffffffffffffffffffffffff1614610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc90613697565b60405180910390fd5b80600f8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108825750610881826117be565b5b9050919050565b6108916117b6565b73ffffffffffffffffffffffffffffffffffffffff166108af61124b565b73ffffffffffffffffffffffffffffffffffffffff1614610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90613697565b60405180910390fd5b600061090f610b79565b905060005b838110156109445761093183828461092c9190613831565b6118a0565b808061093c90613a71565b915050610914565b50505050565b60606000805461095990613a0e565b80601f016020809104026020016040519081016040528092919081815260200182805461098590613a0e565b80156109d25780601f106109a7576101008083540402835291602001916109d2565b820191906000526020600020905b8154815290600101906020018083116109b557829003601f168201915b5050505050905090565b60006109e7826118be565b610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d90613677565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6c82610f41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906136d7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afc6117b6565b73ffffffffffffffffffffffffffffffffffffffff161480610b2b5750610b2a81610b256117b6565b611536565b5b610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906135d7565b60405180910390fd5b610b74838361192a565b505050565b6000600880549050905090565b610b97610b916117b6565b826119e3565b610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd906136f7565b60405180910390fd5b610be1838383611ac1565b505050565b6000610bf18361107f565b8210610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c29906134b7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c936117b6565b73ffffffffffffffffffffffffffffffffffffffff16610cb161124b565b73ffffffffffffffffffffffffffffffffffffffff1614610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90613697565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc610d57600547611d1d90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610d82573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610deb573d6000803e3d6000fd5b50565b610e0983838360405180602001604052806000815250611462565b505050565b6000610e18610b79565b8210610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613717565b60405180910390fd5b60088281548110610e93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ead6117b6565b73ffffffffffffffffffffffffffffffffffffffff16610ecb61124b565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613697565b60405180910390fd5b8060109080519060200190610f37929190612afd565b5050565b600e5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190613617565b60405180910390fd5b80915050919050565b600c5481565b6110016117b6565b73ffffffffffffffffffffffffffffffffffffffff1661101f61124b565b73ffffffffffffffffffffffffffffffffffffffff1614611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90613697565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e7906135f7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113f6117b6565b73ffffffffffffffffffffffffffffffffffffffff1661115d61124b565b73ffffffffffffffffffffffffffffffffffffffff16146111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90613697565b60405180910390fd5b6111bd6000611d33565b565b600f5481565b6111cd6117b6565b73ffffffffffffffffffffffffffffffffffffffff166111eb61124b565b73ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890613697565b60405180910390fd5b80600e8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461128490613a0e565b80601f01602080910402602001604051908101604052809291908181526020018280546112b090613a0e565b80156112fd5780601f106112d2576101008083540402835291602001916112fd565b820191906000526020600020905b8154815290600101906020018083116112e057829003601f168201915b5050505050905090565b600e5442101561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390613597565b60405180910390fd5b600d546113698261135b610b79565b611df990919063ffffffff16565b11156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613637565b60405180910390fd5b346113c082600c54611e0f90919063ffffffff16565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613577565b60405180910390fd5b60005b81811015611448576000611416610b79565b9050600d54611423610b79565b1015611434576114333382611e25565b5b50808061144090613a71565b915050611404565b5050565b61145e6114576117b6565b8383611ff3565b5050565b61147361146d6117b6565b836119e3565b6114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a9906136f7565b60405180910390fd5b6114be84848484612160565b50505050565b6060600f544210156114dd576114d8611516565b611509565b60106114e8836121bc565b6040516020016114f99291906133e4565b6040516020818303038152906040525b9050919050565b600d5481565b606060405180606001604052806035815260200161417760359139905090565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016115ae9190613413565b60206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe9190612ee7565b73ffffffffffffffffffffffffffffffffffffffff161415611624576001915050611632565b61162e8484612369565b9150505b92915050565b6116406117b6565b73ffffffffffffffffffffffffffffffffffffffff1661165e61124b565b73ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab90613697565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906134f7565b60405180910390fd5b61172d81611d33565b50565b6117386117b6565b73ffffffffffffffffffffffffffffffffffffffff1661175661124b565b73ffffffffffffffffffffffffffffffffffffffff16146117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a390613697565b60405180910390fd5b80600c8190555050565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061188957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118995750611898826123fd565b5b9050919050565b6118ba828260405180602001604052806000815250612467565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199d83610f41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119ee826118be565b611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a24906135b7565b60405180910390fd5b6000611a3883610f41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611aa757508373ffffffffffffffffffffffffffffffffffffffff16611a8f846109dc565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ab85750611ab78185611536565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ae182610f41565b73ffffffffffffffffffffffffffffffffffffffff1614611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e906136b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90613537565b60405180910390fd5b611bb28383836124c2565b611bbd60008261192a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c0d9190613912565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c649190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611d2b9190613887565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611e079190613831565b905092915050565b60008183611e1d91906138b8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90613657565b60405180910390fd5b611e9e816118be565b15611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590613517565b60405180910390fd5b611eea600083836124c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3a9190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990613557565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612153919061347a565b60405180910390a3505050565b61216b848484611ac1565b612177848484846125d6565b6121b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad906134d7565b60405180910390fd5b50505050565b60606000821415612204576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612364565b600082905060005b6000821461223657808061221f90613a71565b915050600a8261222f9190613887565b915061220c565b60008167ffffffffffffffff811115612278577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122aa5781602001600182028036833780820191505090505b5090505b6000851461235d576001826122c39190613912565b9150600a856122d29190613aba565b60306122de9190613831565b60f81b81838151811061231a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123569190613887565b94506122ae565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124718383611e25565b61247e60008484846125d6565b6124bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b4906134d7565b60405180910390fd5b505050565b6124cd83838361276d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125105761250b81612772565b61254f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461254e5761254d83826127bb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125925761258d81612928565b6125d1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125d0576125cf8282612a6b565b5b5b505050565b60006125f78473ffffffffffffffffffffffffffffffffffffffff16612aea565b15612760578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126206117b6565b8786866040518563ffffffff1660e01b8152600401612642949392919061342e565b602060405180830381600087803b15801561265c57600080fd5b505af192505050801561268d57506040513d601f19601f8201168201806040525081019061268a9190612ebe565b60015b612710573d80600081146126bd576040519150601f19603f3d011682016040523d82523d6000602084013e6126c2565b606091505b50600081511415612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff906134d7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612765565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127c88461107f565b6127d29190613912565b90506000600760008481526020019081526020016000205490508181146128b7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061293c9190613912565b9050600060096000848152602001908152602001600020549050600060088381548110612992577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a768361107f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b0990613a0e565b90600052602060002090601f016020900481019282612b2b5760008555612b72565b82601f10612b4457805160ff1916838001178555612b72565b82800160010185558215612b72579182015b82811115612b71578251825591602001919060010190612b56565b5b509050612b7f9190612b83565b5090565b5b80821115612b9c576000816000905550600101612b84565b5090565b6000612bb3612bae84613777565b613752565b905082815260208101848484011115612bcb57600080fd5b612bd68482856139cc565b509392505050565b6000612bf1612bec846137a8565b613752565b905082815260208101848484011115612c0957600080fd5b612c148482856139cc565b509392505050565b600081359050612c2b81614103565b92915050565b600081359050612c408161411a565b92915050565b600081359050612c5581614131565b92915050565b600081519050612c6a81614131565b92915050565b600082601f830112612c8157600080fd5b8135612c91848260208601612ba0565b91505092915050565b600081519050612ca981614148565b92915050565b600082601f830112612cc057600080fd5b8135612cd0848260208601612bde565b91505092915050565b600081359050612ce88161415f565b92915050565b600060208284031215612d0057600080fd5b6000612d0e84828501612c1c565b91505092915050565b60008060408385031215612d2a57600080fd5b6000612d3885828601612c1c565b9250506020612d4985828601612c1c565b9150509250929050565b600080600060608486031215612d6857600080fd5b6000612d7686828701612c1c565b9350506020612d8786828701612c1c565b9250506040612d9886828701612cd9565b9150509250925092565b60008060008060808587031215612db857600080fd5b6000612dc687828801612c1c565b9450506020612dd787828801612c1c565b9350506040612de887828801612cd9565b925050606085013567ffffffffffffffff811115612e0557600080fd5b612e1187828801612c70565b91505092959194509250565b60008060408385031215612e3057600080fd5b6000612e3e85828601612c1c565b9250506020612e4f85828601612c31565b9150509250929050565b60008060408385031215612e6c57600080fd5b6000612e7a85828601612c1c565b9250506020612e8b85828601612cd9565b9150509250929050565b600060208284031215612ea757600080fd5b6000612eb584828501612c46565b91505092915050565b600060208284031215612ed057600080fd5b6000612ede84828501612c5b565b91505092915050565b600060208284031215612ef957600080fd5b6000612f0784828501612c9a565b91505092915050565b600060208284031215612f2257600080fd5b600082013567ffffffffffffffff811115612f3c57600080fd5b612f4884828501612caf565b91505092915050565b600060208284031215612f6357600080fd5b6000612f7184828501612cd9565b91505092915050565b60008060408385031215612f8d57600080fd5b6000612f9b85828601612cd9565b9250506020612fac85828601612c1c565b9150509250929050565b612fbf81613946565b82525050565b612fce81613958565b82525050565b6000612fdf826137ee565b612fe98185613804565b9350612ff98185602086016139db565b61300281613ba7565b840191505092915050565b6000613018826137f9565b6130228185613815565b93506130328185602086016139db565b61303b81613ba7565b840191505092915050565b6000613051826137f9565b61305b8185613826565b935061306b8185602086016139db565b80840191505092915050565b6000815461308481613a0e565b61308e8186613826565b945060018216600081146130a957600181146130ba576130ed565b60ff198316865281860193506130ed565b6130c3856137d9565b60005b838110156130e5578154818901526001820191506020810190506130c6565b838801955050505b50505092915050565b6000613103602b83613815565b915061310e82613bb8565b604082019050919050565b6000613126603283613815565b915061313182613c07565b604082019050919050565b6000613149602683613815565b915061315482613c56565b604082019050919050565b600061316c601c83613815565b915061317782613ca5565b602082019050919050565b600061318f602483613815565b915061319a82613cce565b604082019050919050565b60006131b2601983613815565b91506131bd82613d1d565b602082019050919050565b60006131d5601f83613815565b91506131e082613d46565b602082019050919050565b60006131f8601b83613815565b915061320382613d6f565b602082019050919050565b600061321b602c83613815565b915061322682613d98565b604082019050919050565b600061323e603883613815565b915061324982613de7565b604082019050919050565b6000613261602a83613815565b915061326c82613e36565b604082019050919050565b6000613284602983613815565b915061328f82613e85565b604082019050919050565b60006132a7602083613815565b91506132b282613ed4565b602082019050919050565b60006132ca602083613815565b91506132d582613efd565b602082019050919050565b60006132ed602c83613815565b91506132f882613f26565b604082019050919050565b6000613310600583613826565b915061331b82613f75565b600582019050919050565b6000613333602083613815565b915061333e82613f9e565b602082019050919050565b6000613356602983613815565b915061336182613fc7565b604082019050919050565b6000613379602183613815565b915061338482614016565b604082019050919050565b600061339c603183613815565b91506133a782614065565b604082019050919050565b60006133bf602c83613815565b91506133ca826140b4565b604082019050919050565b6133de816139c2565b82525050565b60006133f08285613077565b91506133fc8284613046565b915061340782613303565b91508190509392505050565b60006020820190506134286000830184612fb6565b92915050565b60006080820190506134436000830187612fb6565b6134506020830186612fb6565b61345d60408301856133d5565b818103606083015261346f8184612fd4565b905095945050505050565b600060208201905061348f6000830184612fc5565b92915050565b600060208201905081810360008301526134af818461300d565b905092915050565b600060208201905081810360008301526134d0816130f6565b9050919050565b600060208201905081810360008301526134f081613119565b9050919050565b600060208201905081810360008301526135108161313c565b9050919050565b600060208201905081810360008301526135308161315f565b9050919050565b6000602082019050818103600083015261355081613182565b9050919050565b60006020820190508181036000830152613570816131a5565b9050919050565b60006020820190508181036000830152613590816131c8565b9050919050565b600060208201905081810360008301526135b0816131eb565b9050919050565b600060208201905081810360008301526135d08161320e565b9050919050565b600060208201905081810360008301526135f081613231565b9050919050565b6000602082019050818103600083015261361081613254565b9050919050565b6000602082019050818103600083015261363081613277565b9050919050565b600060208201905081810360008301526136508161329a565b9050919050565b60006020820190508181036000830152613670816132bd565b9050919050565b60006020820190508181036000830152613690816132e0565b9050919050565b600060208201905081810360008301526136b081613326565b9050919050565b600060208201905081810360008301526136d081613349565b9050919050565b600060208201905081810360008301526136f08161336c565b9050919050565b600060208201905081810360008301526137108161338f565b9050919050565b60006020820190508181036000830152613730816133b2565b9050919050565b600060208201905061374c60008301846133d5565b92915050565b600061375c61376d565b90506137688282613a40565b919050565b6000604051905090565b600067ffffffffffffffff82111561379257613791613b78565b5b61379b82613ba7565b9050602081019050919050565b600067ffffffffffffffff8211156137c3576137c2613b78565b5b6137cc82613ba7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061383c826139c2565b9150613847836139c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561387c5761387b613aeb565b5b828201905092915050565b6000613892826139c2565b915061389d836139c2565b9250826138ad576138ac613b1a565b5b828204905092915050565b60006138c3826139c2565b91506138ce836139c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561390757613906613aeb565b5b828202905092915050565b600061391d826139c2565b9150613928836139c2565b92508282101561393b5761393a613aeb565b5b828203905092915050565b6000613951826139a2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061399b82613946565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139f95780820151818401526020810190506139de565b83811115613a08576000848401525b50505050565b60006002820490506001821680613a2657607f821691505b60208210811415613a3a57613a39613b49565b5b50919050565b613a4982613ba7565b810181811067ffffffffffffffff82111715613a6857613a67613b78565b5b80604052505050565b6000613a7c826139c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613aaf57613aae613aeb565b5b600182019050919050565b6000613ac5826139c2565b9150613ad0836139c2565b925082613ae057613adf613b1a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61410c81613946565b811461411757600080fd5b50565b61412381613958565b811461412e57600080fd5b50565b61413a81613964565b811461414557600080fd5b50565b61415181613990565b811461415c57600080fd5b50565b614168816139c2565b811461417357600080fd5b5056fe697066733a2f2f516d59616353535753706653726152736e516a5238674e624777416b393246393455453461706765467a51733642a2646970667358221220c69a7131561eaf6c2266f538b252371a82eca8e3b005351021aa1201f7b0fe8c64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000061f57290000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000009536f756c2043616665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025343000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636f8b44b011610102578063a22cb46511610095578063e8a3d48511610064578063e8a3d485146106cf578063e985e9c5146106fa578063f2fde38b14610737578063f4a0a52814610760576101e3565b8063a22cb46514610615578063b88d4fde1461063e578063c87b56dd14610667578063d5abeb01146106a4576101e3565b80637a1cbd3f116100d15780637a1cbd3f1461057a5780638da5cb5b146105a357806395d89b41146105ce578063a0712d68146105f9576101e3565b80636f8b44b0146104d257806370a08231146104fb578063715018a61461053857806371f9c5341461054f576101e3565b80632f745c591161017a57806355f804b31161014957806355f804b314610416578063626a15bd1461043f5780636352211e1461046a5780636817c76c146104a7576101e3565b80632f745c591461035c5780633ccfd60b1461039957806342842e0e146103b05780634f6ccce7146103d9576101e3565b8063081812fc116101b6578063081812fc146102a2578063095ea7b3146102df57806318160ddd1461030857806323b872dd14610333576101e3565b8063018a2c37146101e857806301ffc9a71461021157806303339bcb1461024e57806306fdde0314610277575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612f51565b610789565b005b34801561021d57600080fd5b5061023860048036038101906102339190612e95565b61080f565b604051610245919061347a565b60405180910390f35b34801561025a57600080fd5b5061027560048036038101906102709190612f7a565b610889565b005b34801561028357600080fd5b5061028c61094a565b6040516102999190613495565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612f51565b6109dc565b6040516102d69190613413565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190612e59565b610a61565b005b34801561031457600080fd5b5061031d610b79565b60405161032a9190613737565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612d53565b610b86565b005b34801561036857600080fd5b50610383600480360381019061037e9190612e59565b610be6565b6040516103909190613737565b60405180910390f35b3480156103a557600080fd5b506103ae610c8b565b005b3480156103bc57600080fd5b506103d760048036038101906103d29190612d53565b610dee565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190612f51565b610e0e565b60405161040d9190613737565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190612f10565b610ea5565b005b34801561044b57600080fd5b50610454610f3b565b6040516104619190613737565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190612f51565b610f41565b60405161049e9190613413565b60405180910390f35b3480156104b357600080fd5b506104bc610ff3565b6040516104c99190613737565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190612f51565b610ff9565b005b34801561050757600080fd5b50610522600480360381019061051d9190612cee565b61107f565b60405161052f9190613737565b60405180910390f35b34801561054457600080fd5b5061054d611137565b005b34801561055b57600080fd5b506105646111bf565b6040516105719190613737565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190612f51565b6111c5565b005b3480156105af57600080fd5b506105b861124b565b6040516105c59190613413565b60405180910390f35b3480156105da57600080fd5b506105e3611275565b6040516105f09190613495565b60405180910390f35b610613600480360381019061060e9190612f51565b611307565b005b34801561062157600080fd5b5061063c60048036038101906106379190612e1d565b61144c565b005b34801561064a57600080fd5b5061066560048036038101906106609190612da2565b611462565b005b34801561067357600080fd5b5061068e60048036038101906106899190612f51565b6114c4565b60405161069b9190613495565b60405180910390f35b3480156106b057600080fd5b506106b9611510565b6040516106c69190613737565b60405180910390f35b3480156106db57600080fd5b506106e4611516565b6040516106f19190613495565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190612d17565b611536565b60405161072e919061347a565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190612cee565b611638565b005b34801561076c57600080fd5b5061078760048036038101906107829190612f51565b611730565b005b6107916117b6565b73ffffffffffffffffffffffffffffffffffffffff166107af61124b565b73ffffffffffffffffffffffffffffffffffffffff1614610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc90613697565b60405180910390fd5b80600f8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108825750610881826117be565b5b9050919050565b6108916117b6565b73ffffffffffffffffffffffffffffffffffffffff166108af61124b565b73ffffffffffffffffffffffffffffffffffffffff1614610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90613697565b60405180910390fd5b600061090f610b79565b905060005b838110156109445761093183828461092c9190613831565b6118a0565b808061093c90613a71565b915050610914565b50505050565b60606000805461095990613a0e565b80601f016020809104026020016040519081016040528092919081815260200182805461098590613a0e565b80156109d25780601f106109a7576101008083540402835291602001916109d2565b820191906000526020600020905b8154815290600101906020018083116109b557829003601f168201915b5050505050905090565b60006109e7826118be565b610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d90613677565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6c82610f41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906136d7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afc6117b6565b73ffffffffffffffffffffffffffffffffffffffff161480610b2b5750610b2a81610b256117b6565b611536565b5b610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b61906135d7565b60405180910390fd5b610b74838361192a565b505050565b6000600880549050905090565b610b97610b916117b6565b826119e3565b610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd906136f7565b60405180910390fd5b610be1838383611ac1565b505050565b6000610bf18361107f565b8210610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c29906134b7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c936117b6565b73ffffffffffffffffffffffffffffffffffffffff16610cb161124b565b73ffffffffffffffffffffffffffffffffffffffff1614610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90613697565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc610d57600547611d1d90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610d82573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610deb573d6000803e3d6000fd5b50565b610e0983838360405180602001604052806000815250611462565b505050565b6000610e18610b79565b8210610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613717565b60405180910390fd5b60088281548110610e93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ead6117b6565b73ffffffffffffffffffffffffffffffffffffffff16610ecb61124b565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613697565b60405180910390fd5b8060109080519060200190610f37929190612afd565b5050565b600e5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190613617565b60405180910390fd5b80915050919050565b600c5481565b6110016117b6565b73ffffffffffffffffffffffffffffffffffffffff1661101f61124b565b73ffffffffffffffffffffffffffffffffffffffff1614611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90613697565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e7906135f7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113f6117b6565b73ffffffffffffffffffffffffffffffffffffffff1661115d61124b565b73ffffffffffffffffffffffffffffffffffffffff16146111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90613697565b60405180910390fd5b6111bd6000611d33565b565b600f5481565b6111cd6117b6565b73ffffffffffffffffffffffffffffffffffffffff166111eb61124b565b73ffffffffffffffffffffffffffffffffffffffff1614611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890613697565b60405180910390fd5b80600e8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461128490613a0e565b80601f01602080910402602001604051908101604052809291908181526020018280546112b090613a0e565b80156112fd5780601f106112d2576101008083540402835291602001916112fd565b820191906000526020600020905b8154815290600101906020018083116112e057829003601f168201915b5050505050905090565b600e5442101561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390613597565b60405180910390fd5b600d546113698261135b610b79565b611df990919063ffffffff16565b11156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613637565b60405180910390fd5b346113c082600c54611e0f90919063ffffffff16565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613577565b60405180910390fd5b60005b81811015611448576000611416610b79565b9050600d54611423610b79565b1015611434576114333382611e25565b5b50808061144090613a71565b915050611404565b5050565b61145e6114576117b6565b8383611ff3565b5050565b61147361146d6117b6565b836119e3565b6114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a9906136f7565b60405180910390fd5b6114be84848484612160565b50505050565b6060600f544210156114dd576114d8611516565b611509565b60106114e8836121bc565b6040516020016114f99291906133e4565b6040516020818303038152906040525b9050919050565b600d5481565b606060405180606001604052806035815260200161417760359139905090565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016115ae9190613413565b60206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe9190612ee7565b73ffffffffffffffffffffffffffffffffffffffff161415611624576001915050611632565b61162e8484612369565b9150505b92915050565b6116406117b6565b73ffffffffffffffffffffffffffffffffffffffff1661165e61124b565b73ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab90613697565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906134f7565b60405180910390fd5b61172d81611d33565b50565b6117386117b6565b73ffffffffffffffffffffffffffffffffffffffff1661175661124b565b73ffffffffffffffffffffffffffffffffffffffff16146117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a390613697565b60405180910390fd5b80600c8190555050565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061188957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118995750611898826123fd565b5b9050919050565b6118ba828260405180602001604052806000815250612467565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199d83610f41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119ee826118be565b611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a24906135b7565b60405180910390fd5b6000611a3883610f41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611aa757508373ffffffffffffffffffffffffffffffffffffffff16611a8f846109dc565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ab85750611ab78185611536565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ae182610f41565b73ffffffffffffffffffffffffffffffffffffffff1614611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e906136b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90613537565b60405180910390fd5b611bb28383836124c2565b611bbd60008261192a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c0d9190613912565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c649190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611d2b9190613887565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611e079190613831565b905092915050565b60008183611e1d91906138b8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90613657565b60405180910390fd5b611e9e816118be565b15611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590613517565b60405180910390fd5b611eea600083836124c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3a9190613831565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990613557565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612153919061347a565b60405180910390a3505050565b61216b848484611ac1565b612177848484846125d6565b6121b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad906134d7565b60405180910390fd5b50505050565b60606000821415612204576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612364565b600082905060005b6000821461223657808061221f90613a71565b915050600a8261222f9190613887565b915061220c565b60008167ffffffffffffffff811115612278577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122aa5781602001600182028036833780820191505090505b5090505b6000851461235d576001826122c39190613912565b9150600a856122d29190613aba565b60306122de9190613831565b60f81b81838151811061231a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123569190613887565b94506122ae565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124718383611e25565b61247e60008484846125d6565b6124bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b4906134d7565b60405180910390fd5b505050565b6124cd83838361276d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125105761250b81612772565b61254f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461254e5761254d83826127bb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125925761258d81612928565b6125d1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125d0576125cf8282612a6b565b5b5b505050565b60006125f78473ffffffffffffffffffffffffffffffffffffffff16612aea565b15612760578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126206117b6565b8786866040518563ffffffff1660e01b8152600401612642949392919061342e565b602060405180830381600087803b15801561265c57600080fd5b505af192505050801561268d57506040513d601f19601f8201168201806040525081019061268a9190612ebe565b60015b612710573d80600081146126bd576040519150601f19603f3d011682016040523d82523d6000602084013e6126c2565b606091505b50600081511415612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff906134d7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612765565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127c88461107f565b6127d29190613912565b90506000600760008481526020019081526020016000205490508181146128b7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061293c9190613912565b9050600060096000848152602001908152602001600020549050600060088381548110612992577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a768361107f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b0990613a0e565b90600052602060002090601f016020900481019282612b2b5760008555612b72565b82601f10612b4457805160ff1916838001178555612b72565b82800160010185558215612b72579182015b82811115612b71578251825591602001919060010190612b56565b5b509050612b7f9190612b83565b5090565b5b80821115612b9c576000816000905550600101612b84565b5090565b6000612bb3612bae84613777565b613752565b905082815260208101848484011115612bcb57600080fd5b612bd68482856139cc565b509392505050565b6000612bf1612bec846137a8565b613752565b905082815260208101848484011115612c0957600080fd5b612c148482856139cc565b509392505050565b600081359050612c2b81614103565b92915050565b600081359050612c408161411a565b92915050565b600081359050612c5581614131565b92915050565b600081519050612c6a81614131565b92915050565b600082601f830112612c8157600080fd5b8135612c91848260208601612ba0565b91505092915050565b600081519050612ca981614148565b92915050565b600082601f830112612cc057600080fd5b8135612cd0848260208601612bde565b91505092915050565b600081359050612ce88161415f565b92915050565b600060208284031215612d0057600080fd5b6000612d0e84828501612c1c565b91505092915050565b60008060408385031215612d2a57600080fd5b6000612d3885828601612c1c565b9250506020612d4985828601612c1c565b9150509250929050565b600080600060608486031215612d6857600080fd5b6000612d7686828701612c1c565b9350506020612d8786828701612c1c565b9250506040612d9886828701612cd9565b9150509250925092565b60008060008060808587031215612db857600080fd5b6000612dc687828801612c1c565b9450506020612dd787828801612c1c565b9350506040612de887828801612cd9565b925050606085013567ffffffffffffffff811115612e0557600080fd5b612e1187828801612c70565b91505092959194509250565b60008060408385031215612e3057600080fd5b6000612e3e85828601612c1c565b9250506020612e4f85828601612c31565b9150509250929050565b60008060408385031215612e6c57600080fd5b6000612e7a85828601612c1c565b9250506020612e8b85828601612cd9565b9150509250929050565b600060208284031215612ea757600080fd5b6000612eb584828501612c46565b91505092915050565b600060208284031215612ed057600080fd5b6000612ede84828501612c5b565b91505092915050565b600060208284031215612ef957600080fd5b6000612f0784828501612c9a565b91505092915050565b600060208284031215612f2257600080fd5b600082013567ffffffffffffffff811115612f3c57600080fd5b612f4884828501612caf565b91505092915050565b600060208284031215612f6357600080fd5b6000612f7184828501612cd9565b91505092915050565b60008060408385031215612f8d57600080fd5b6000612f9b85828601612cd9565b9250506020612fac85828601612c1c565b9150509250929050565b612fbf81613946565b82525050565b612fce81613958565b82525050565b6000612fdf826137ee565b612fe98185613804565b9350612ff98185602086016139db565b61300281613ba7565b840191505092915050565b6000613018826137f9565b6130228185613815565b93506130328185602086016139db565b61303b81613ba7565b840191505092915050565b6000613051826137f9565b61305b8185613826565b935061306b8185602086016139db565b80840191505092915050565b6000815461308481613a0e565b61308e8186613826565b945060018216600081146130a957600181146130ba576130ed565b60ff198316865281860193506130ed565b6130c3856137d9565b60005b838110156130e5578154818901526001820191506020810190506130c6565b838801955050505b50505092915050565b6000613103602b83613815565b915061310e82613bb8565b604082019050919050565b6000613126603283613815565b915061313182613c07565b604082019050919050565b6000613149602683613815565b915061315482613c56565b604082019050919050565b600061316c601c83613815565b915061317782613ca5565b602082019050919050565b600061318f602483613815565b915061319a82613cce565b604082019050919050565b60006131b2601983613815565b91506131bd82613d1d565b602082019050919050565b60006131d5601f83613815565b91506131e082613d46565b602082019050919050565b60006131f8601b83613815565b915061320382613d6f565b602082019050919050565b600061321b602c83613815565b915061322682613d98565b604082019050919050565b600061323e603883613815565b915061324982613de7565b604082019050919050565b6000613261602a83613815565b915061326c82613e36565b604082019050919050565b6000613284602983613815565b915061328f82613e85565b604082019050919050565b60006132a7602083613815565b91506132b282613ed4565b602082019050919050565b60006132ca602083613815565b91506132d582613efd565b602082019050919050565b60006132ed602c83613815565b91506132f882613f26565b604082019050919050565b6000613310600583613826565b915061331b82613f75565b600582019050919050565b6000613333602083613815565b915061333e82613f9e565b602082019050919050565b6000613356602983613815565b915061336182613fc7565b604082019050919050565b6000613379602183613815565b915061338482614016565b604082019050919050565b600061339c603183613815565b91506133a782614065565b604082019050919050565b60006133bf602c83613815565b91506133ca826140b4565b604082019050919050565b6133de816139c2565b82525050565b60006133f08285613077565b91506133fc8284613046565b915061340782613303565b91508190509392505050565b60006020820190506134286000830184612fb6565b92915050565b60006080820190506134436000830187612fb6565b6134506020830186612fb6565b61345d60408301856133d5565b818103606083015261346f8184612fd4565b905095945050505050565b600060208201905061348f6000830184612fc5565b92915050565b600060208201905081810360008301526134af818461300d565b905092915050565b600060208201905081810360008301526134d0816130f6565b9050919050565b600060208201905081810360008301526134f081613119565b9050919050565b600060208201905081810360008301526135108161313c565b9050919050565b600060208201905081810360008301526135308161315f565b9050919050565b6000602082019050818103600083015261355081613182565b9050919050565b60006020820190508181036000830152613570816131a5565b9050919050565b60006020820190508181036000830152613590816131c8565b9050919050565b600060208201905081810360008301526135b0816131eb565b9050919050565b600060208201905081810360008301526135d08161320e565b9050919050565b600060208201905081810360008301526135f081613231565b9050919050565b6000602082019050818103600083015261361081613254565b9050919050565b6000602082019050818103600083015261363081613277565b9050919050565b600060208201905081810360008301526136508161329a565b9050919050565b60006020820190508181036000830152613670816132bd565b9050919050565b60006020820190508181036000830152613690816132e0565b9050919050565b600060208201905081810360008301526136b081613326565b9050919050565b600060208201905081810360008301526136d081613349565b9050919050565b600060208201905081810360008301526136f08161336c565b9050919050565b600060208201905081810360008301526137108161338f565b9050919050565b60006020820190508181036000830152613730816133b2565b9050919050565b600060208201905061374c60008301846133d5565b92915050565b600061375c61376d565b90506137688282613a40565b919050565b6000604051905090565b600067ffffffffffffffff82111561379257613791613b78565b5b61379b82613ba7565b9050602081019050919050565b600067ffffffffffffffff8211156137c3576137c2613b78565b5b6137cc82613ba7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061383c826139c2565b9150613847836139c2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561387c5761387b613aeb565b5b828201905092915050565b6000613892826139c2565b915061389d836139c2565b9250826138ad576138ac613b1a565b5b828204905092915050565b60006138c3826139c2565b91506138ce836139c2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561390757613906613aeb565b5b828202905092915050565b600061391d826139c2565b9150613928836139c2565b92508282101561393b5761393a613aeb565b5b828203905092915050565b6000613951826139a2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061399b82613946565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139f95780820151818401526020810190506139de565b83811115613a08576000848401525b50505050565b60006002820490506001821680613a2657607f821691505b60208210811415613a3a57613a39613b49565b5b50919050565b613a4982613ba7565b810181811067ffffffffffffffff82111715613a6857613a67613b78565b5b80604052505050565b6000613a7c826139c2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613aaf57613aae613aeb565b5b600182019050919050565b6000613ac5826139c2565b9150613ad0836139c2565b925082613ae057613adf613b1a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61410c81613946565b811461411757600080fd5b50565b61412381613958565b811461412e57600080fd5b50565b61413a81613964565b811461414557600080fd5b50565b61415181613990565b811461415c57600080fd5b50565b614168816139c2565b811461417357600080fd5b5056fe697066733a2f2f516d59616353535753706653726152736e516a5238674e624777416b393246393455453461706765467a51733642a2646970667358221220c69a7131561eaf6c2266f538b252371a82eca8e3b005351021aa1201f7b0fe8c64736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000061f57290000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000009536f756c2043616665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025343000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Soul Cafe
Arg [1] : symbol (string): SC
Arg [2] : maxNftSupply (uint256): 3333
Arg [3] : saleStart (uint256): 1643475600
Arg [4] : proxyRegistryAddress_ (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000d05
Arg [3] : 0000000000000000000000000000000000000000000000000000000061f57290
Arg [4] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 536f756c20436166650000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 5343000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

288:3203:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1656:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;989:222:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1328:212:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2408:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1164:158:12;;;;;;;;;;;;;:::i;:::-;;5042:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1797:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1960:95:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;538:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;452:37:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1849:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:10;;;;;;;;;;;;;:::i;:::-;;572:30:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1546:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1029:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2570:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2061:625:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4203:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2692:277:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;496:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3351:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2975:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1770:88:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1656:108;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1748:9:12::1;1730:15;:27;;;;1656:108:::0;:::o;989:222:4:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;1328:212:12:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1398:14:12::1;1415:13;:11;:13::i;:::-;1398:30;;1438:9;1457:77;1473:3;1469:1;:7;1457:77;;;1497:26;1507:3;1521:1;1512:6;:10;;;;:::i;:::-;1497:9;:26::i;:::-;1478:3;;;;;:::i;:::-;;;;1457:77;;;1311:1:10;;1328:212:12::0;;:::o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3457:401;;;:::o;1614:111:4:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;4646:330:3:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;1164:158:12:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1219:3:12::1;;;;;;;;;;;1211:21;;:51;1233:28;1259:1;1233:21;:25;;:28;;;;:::i;:::-;1211:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1280:2;;;;;;;;;;;1272:20;;:43;1293:21;1272:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1164:158::o:0;5042:179:3:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;1797:230:4:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;;;;;;;;;;;;;;;;;1996:24;;1797:230;;;:::o;1960:95:12:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2041:7:12::1;2030:8;:18;;;;;;;;;;;;:::i;:::-;;1960:95:::0;:::o;538:28::-;;;;:::o;2111:235:3:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;452:37:12:-;;;;:::o;1864:90::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1941:6:12::1;1929:9;:18;;;;1864:90:::0;:::o;1849:205:3:-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;1661:101:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;572:30:12:-;;;;:::o;1546:104::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1634:9:12::1;1618:13;:25;;;;1546:104:::0;:::o;1029:85:10:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;2061:625:12:-;2151:13;;2132:15;:32;;2124:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2264:9;;2227:33;2245:14;2227:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;2206:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;2395:9;2362:29;2376:14;2362:9;;:13;;:29;;;;:::i;:::-;:42;;2341:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;2477:9;2472:208;2496:14;2492:1;:18;2472:208;;;2531:17;2551:13;:11;:13::i;:::-;2531:33;;2598:9;;2582:13;:11;:13::i;:::-;:25;2578:92;;;2627:28;2633:10;2645:9;2627:5;:28::i;:::-;2578:92;2472:208;2512:3;;;;;:::i;:::-;;;;2472:208;;;;2061:625;:::o;4203:153:3:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;5287:320::-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;2692:277:12:-;2790:13;2845:15;;2826;:34;;:135;;2948:13;:11;:13::i;:::-;2826:135;;;2896:8;2906:19;:8;:17;:19::i;:::-;2879:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2826:135;2819:142;;2692:277;;;:::o;496:31::-;;;;:::o;3351:138::-;3395:13;3420:62;;;;;;;;;;;;;;;;;;;3351:138;:::o;2975:370::-;3096:4;3116:27;3160:20;;;;;;;;;;;3116:65;;3236:8;3195:49;;3203:13;:21;;;3225:5;3203:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3195:49;;;3191:91;;;3267:4;3260:11;;;;;3191:91;3299:39;3322:5;3329:8;3299:22;:39::i;:::-;3292:46;;;2975:370;;;;;:::o;1911:198:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1770:88:12:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1846:5:12::1;1834:9;:17;;;;1770:88:::0;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;1490:300:3:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;:::-;8036:108;;:::o;7079:125::-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;10930:171::-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;3836:96:11:-;3894:7;3924:1;3920;:5;;;;:::i;:::-;3913:12;;3836:96;;;;:::o;2263:187:10:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2263:187;;:::o;2741:96:11:-;2799:7;2829:1;2825;:5;;;;:::i;:::-;2818:12;;2741:96;;;;:::o;3451:::-;3509:7;3539:1;3535;:5;;;;:::i;:::-;3528:12;;3451:96;;;;:::o;8998:372:3:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;11236:307::-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;4422:162:3:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8365:311:3:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8365:311;;;:::o;2623:572:4:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;12096:778:3:-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;13430:122::-;;;;:::o;3901:161:4:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5149:323;;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4679:970;;;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;;;;;;;;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5937:1061;;;;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3489:217;;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:14:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1571:201::-;1657:5;1688:6;1682:13;1673:22;;1704:62;1760:5;1704:62;:::i;:::-;1663:109;;;;:::o;1792:273::-;1848:5;1897:3;1890:4;1882:6;1878:17;1874:27;1864:2;;1915:1;1912;1905:12;1864:2;1955:6;1942:20;1980:79;2055:3;2047:6;2040:4;2032:6;2028:17;1980:79;:::i;:::-;1971:88;;1854:211;;;;;:::o;2071:139::-;2117:5;2155:6;2142:20;2133:29;;2171:33;2198:5;2171:33;:::i;:::-;2123:87;;;;:::o;2216:262::-;2275:6;2324:2;2312:9;2303:7;2299:23;2295:32;2292:2;;;2340:1;2337;2330:12;2292:2;2383:1;2408:53;2453:7;2444:6;2433:9;2429:22;2408:53;:::i;:::-;2398:63;;2354:117;2282:196;;;;:::o;2484:407::-;2552:6;2560;2609:2;2597:9;2588:7;2584:23;2580:32;2577:2;;;2625:1;2622;2615:12;2577:2;2668:1;2693:53;2738:7;2729:6;2718:9;2714:22;2693:53;:::i;:::-;2683:63;;2639:117;2795:2;2821:53;2866:7;2857:6;2846:9;2842:22;2821:53;:::i;:::-;2811:63;;2766:118;2567:324;;;;;:::o;2897:552::-;2974:6;2982;2990;3039:2;3027:9;3018:7;3014:23;3010:32;3007:2;;;3055:1;3052;3045:12;3007:2;3098:1;3123:53;3168:7;3159:6;3148:9;3144:22;3123:53;:::i;:::-;3113:63;;3069:117;3225:2;3251:53;3296:7;3287:6;3276:9;3272:22;3251:53;:::i;:::-;3241:63;;3196:118;3353:2;3379:53;3424:7;3415:6;3404:9;3400:22;3379:53;:::i;:::-;3369:63;;3324:118;2997:452;;;;;:::o;3455:809::-;3550:6;3558;3566;3574;3623:3;3611:9;3602:7;3598:23;3594:33;3591:2;;;3640:1;3637;3630:12;3591:2;3683:1;3708:53;3753:7;3744:6;3733:9;3729:22;3708:53;:::i;:::-;3698:63;;3654:117;3810:2;3836:53;3881:7;3872:6;3861:9;3857:22;3836:53;:::i;:::-;3826:63;;3781:118;3938:2;3964:53;4009:7;4000:6;3989:9;3985:22;3964:53;:::i;:::-;3954:63;;3909:118;4094:2;4083:9;4079:18;4066:32;4125:18;4117:6;4114:30;4111:2;;;4157:1;4154;4147:12;4111:2;4185:62;4239:7;4230:6;4219:9;4215:22;4185:62;:::i;:::-;4175:72;;4037:220;3581:683;;;;;;;:::o;4270:401::-;4335:6;4343;4392:2;4380:9;4371:7;4367:23;4363:32;4360:2;;;4408:1;4405;4398:12;4360:2;4451:1;4476:53;4521:7;4512:6;4501:9;4497:22;4476:53;:::i;:::-;4466:63;;4422:117;4578:2;4604:50;4646:7;4637:6;4626:9;4622:22;4604:50;:::i;:::-;4594:60;;4549:115;4350:321;;;;;:::o;4677:407::-;4745:6;4753;4802:2;4790:9;4781:7;4777:23;4773:32;4770:2;;;4818:1;4815;4808:12;4770:2;4861:1;4886:53;4931:7;4922:6;4911:9;4907:22;4886:53;:::i;:::-;4876:63;;4832:117;4988:2;5014:53;5059:7;5050:6;5039:9;5035:22;5014:53;:::i;:::-;5004:63;;4959:118;4760:324;;;;;:::o;5090:260::-;5148:6;5197:2;5185:9;5176:7;5172:23;5168:32;5165:2;;;5213:1;5210;5203:12;5165:2;5256:1;5281:52;5325:7;5316:6;5305:9;5301:22;5281:52;:::i;:::-;5271:62;;5227:116;5155:195;;;;:::o;5356:282::-;5425:6;5474:2;5462:9;5453:7;5449:23;5445:32;5442:2;;;5490:1;5487;5480:12;5442:2;5533:1;5558:63;5613:7;5604:6;5593:9;5589:22;5558:63;:::i;:::-;5548:73;;5504:127;5432:206;;;;:::o;5644:342::-;5743:6;5792:2;5780:9;5771:7;5767:23;5763:32;5760:2;;;5808:1;5805;5798:12;5760:2;5851:1;5876:93;5961:7;5952:6;5941:9;5937:22;5876:93;:::i;:::-;5866:103;;5822:157;5750:236;;;;:::o;5992:375::-;6061:6;6110:2;6098:9;6089:7;6085:23;6081:32;6078:2;;;6126:1;6123;6116:12;6078:2;6197:1;6186:9;6182:17;6169:31;6227:18;6219:6;6216:30;6213:2;;;6259:1;6256;6249:12;6213:2;6287:63;6342:7;6333:6;6322:9;6318:22;6287:63;:::i;:::-;6277:73;;6140:220;6068:299;;;;:::o;6373:262::-;6432:6;6481:2;6469:9;6460:7;6456:23;6452:32;6449:2;;;6497:1;6494;6487:12;6449:2;6540:1;6565:53;6610:7;6601:6;6590:9;6586:22;6565:53;:::i;:::-;6555:63;;6511:117;6439:196;;;;:::o;6641:407::-;6709:6;6717;6766:2;6754:9;6745:7;6741:23;6737:32;6734:2;;;6782:1;6779;6772:12;6734:2;6825:1;6850:53;6895:7;6886:6;6875:9;6871:22;6850:53;:::i;:::-;6840:63;;6796:117;6952:2;6978:53;7023:7;7014:6;7003:9;6999:22;6978:53;:::i;:::-;6968:63;;6923:118;6724:324;;;;;:::o;7054:118::-;7141:24;7159:5;7141:24;:::i;:::-;7136:3;7129:37;7119:53;;:::o;7178:109::-;7259:21;7274:5;7259:21;:::i;:::-;7254:3;7247:34;7237:50;;:::o;7293:360::-;7379:3;7407:38;7439:5;7407:38;:::i;:::-;7461:70;7524:6;7519:3;7461:70;:::i;:::-;7454:77;;7540:52;7585:6;7580:3;7573:4;7566:5;7562:16;7540:52;:::i;:::-;7617:29;7639:6;7617:29;:::i;:::-;7612:3;7608:39;7601:46;;7383:270;;;;;:::o;7659:364::-;7747:3;7775:39;7808:5;7775:39;:::i;:::-;7830:71;7894:6;7889:3;7830:71;:::i;:::-;7823:78;;7910:52;7955:6;7950:3;7943:4;7936:5;7932:16;7910:52;:::i;:::-;7987:29;8009:6;7987:29;:::i;:::-;7982:3;7978:39;7971:46;;7751:272;;;;;:::o;8029:377::-;8135:3;8163:39;8196:5;8163:39;:::i;:::-;8218:89;8300:6;8295:3;8218:89;:::i;:::-;8211:96;;8316:52;8361:6;8356:3;8349:4;8342:5;8338:16;8316:52;:::i;:::-;8393:6;8388:3;8384:16;8377:23;;8139:267;;;;;:::o;8436:845::-;8539:3;8576:5;8570:12;8605:36;8631:9;8605:36;:::i;:::-;8657:89;8739:6;8734:3;8657:89;:::i;:::-;8650:96;;8777:1;8766:9;8762:17;8793:1;8788:137;;;;8939:1;8934:341;;;;8755:520;;8788:137;8872:4;8868:9;8857;8853:25;8848:3;8841:38;8908:6;8903:3;8899:16;8892:23;;8788:137;;8934:341;9001:38;9033:5;9001:38;:::i;:::-;9061:1;9075:154;9089:6;9086:1;9083:13;9075:154;;;9163:7;9157:14;9153:1;9148:3;9144:11;9137:35;9213:1;9204:7;9200:15;9189:26;;9111:4;9108:1;9104:12;9099:17;;9075:154;;;9258:6;9253:3;9249:16;9242:23;;8941:334;;8755:520;;8543:738;;;;;;:::o;9287:366::-;9429:3;9450:67;9514:2;9509:3;9450:67;:::i;:::-;9443:74;;9526:93;9615:3;9526:93;:::i;:::-;9644:2;9639:3;9635:12;9628:19;;9433:220;;;:::o;9659:366::-;9801:3;9822:67;9886:2;9881:3;9822:67;:::i;:::-;9815:74;;9898:93;9987:3;9898:93;:::i;:::-;10016:2;10011:3;10007:12;10000:19;;9805:220;;;:::o;10031:366::-;10173:3;10194:67;10258:2;10253:3;10194:67;:::i;:::-;10187:74;;10270:93;10359:3;10270:93;:::i;:::-;10388:2;10383:3;10379:12;10372:19;;10177:220;;;:::o;10403:366::-;10545:3;10566:67;10630:2;10625:3;10566:67;:::i;:::-;10559:74;;10642:93;10731:3;10642:93;:::i;:::-;10760:2;10755:3;10751:12;10744:19;;10549:220;;;:::o;10775:366::-;10917:3;10938:67;11002:2;10997:3;10938:67;:::i;:::-;10931:74;;11014:93;11103:3;11014:93;:::i;:::-;11132:2;11127:3;11123:12;11116:19;;10921:220;;;:::o;11147:366::-;11289:3;11310:67;11374:2;11369:3;11310:67;:::i;:::-;11303:74;;11386:93;11475:3;11386:93;:::i;:::-;11504:2;11499:3;11495:12;11488:19;;11293:220;;;:::o;11519:366::-;11661:3;11682:67;11746:2;11741:3;11682:67;:::i;:::-;11675:74;;11758:93;11847:3;11758:93;:::i;:::-;11876:2;11871:3;11867:12;11860:19;;11665:220;;;:::o;11891:366::-;12033:3;12054:67;12118:2;12113:3;12054:67;:::i;:::-;12047:74;;12130:93;12219:3;12130:93;:::i;:::-;12248:2;12243:3;12239:12;12232:19;;12037:220;;;:::o;12263:366::-;12405:3;12426:67;12490:2;12485:3;12426:67;:::i;:::-;12419:74;;12502:93;12591:3;12502:93;:::i;:::-;12620:2;12615:3;12611:12;12604:19;;12409:220;;;:::o;12635:366::-;12777:3;12798:67;12862:2;12857:3;12798:67;:::i;:::-;12791:74;;12874:93;12963:3;12874:93;:::i;:::-;12992:2;12987:3;12983:12;12976:19;;12781:220;;;:::o;13007:366::-;13149:3;13170:67;13234:2;13229:3;13170:67;:::i;:::-;13163:74;;13246:93;13335:3;13246:93;:::i;:::-;13364:2;13359:3;13355:12;13348:19;;13153:220;;;:::o;13379:366::-;13521:3;13542:67;13606:2;13601:3;13542:67;:::i;:::-;13535:74;;13618:93;13707:3;13618:93;:::i;:::-;13736:2;13731:3;13727:12;13720:19;;13525:220;;;:::o;13751:366::-;13893:3;13914:67;13978:2;13973:3;13914:67;:::i;:::-;13907:74;;13990:93;14079:3;13990:93;:::i;:::-;14108:2;14103:3;14099:12;14092:19;;13897:220;;;:::o;14123:366::-;14265:3;14286:67;14350:2;14345:3;14286:67;:::i;:::-;14279:74;;14362:93;14451:3;14362:93;:::i;:::-;14480:2;14475:3;14471:12;14464:19;;14269:220;;;:::o;14495:366::-;14637:3;14658:67;14722:2;14717:3;14658:67;:::i;:::-;14651:74;;14734:93;14823:3;14734:93;:::i;:::-;14852:2;14847:3;14843:12;14836:19;;14641:220;;;:::o;14867:400::-;15027:3;15048:84;15130:1;15125:3;15048:84;:::i;:::-;15041:91;;15141:93;15230:3;15141:93;:::i;:::-;15259:1;15254:3;15250:11;15243:18;;15031:236;;;:::o;15273:366::-;15415:3;15436:67;15500:2;15495:3;15436:67;:::i;:::-;15429:74;;15512:93;15601:3;15512:93;:::i;:::-;15630:2;15625:3;15621:12;15614:19;;15419:220;;;:::o;15645:366::-;15787:3;15808:67;15872:2;15867:3;15808:67;:::i;:::-;15801:74;;15884:93;15973:3;15884:93;:::i;:::-;16002:2;15997:3;15993:12;15986:19;;15791:220;;;:::o;16017:366::-;16159:3;16180:67;16244:2;16239:3;16180:67;:::i;:::-;16173:74;;16256:93;16345:3;16256:93;:::i;:::-;16374:2;16369:3;16365:12;16358:19;;16163:220;;;:::o;16389:366::-;16531:3;16552:67;16616:2;16611:3;16552:67;:::i;:::-;16545:74;;16628:93;16717:3;16628:93;:::i;:::-;16746:2;16741:3;16737:12;16730:19;;16535:220;;;:::o;16761:366::-;16903:3;16924:67;16988:2;16983:3;16924:67;:::i;:::-;16917:74;;17000:93;17089:3;17000:93;:::i;:::-;17118:2;17113:3;17109:12;17102:19;;16907:220;;;:::o;17133:118::-;17220:24;17238:5;17220:24;:::i;:::-;17215:3;17208:37;17198:53;;:::o;17257:695::-;17535:3;17557:92;17645:3;17636:6;17557:92;:::i;:::-;17550:99;;17666:95;17757:3;17748:6;17666:95;:::i;:::-;17659:102;;17778:148;17922:3;17778:148;:::i;:::-;17771:155;;17943:3;17936:10;;17539:413;;;;;:::o;17958:222::-;18051:4;18089:2;18078:9;18074:18;18066:26;;18102:71;18170:1;18159:9;18155:17;18146:6;18102:71;:::i;:::-;18056:124;;;;:::o;18186:640::-;18381:4;18419:3;18408:9;18404:19;18396:27;;18433:71;18501:1;18490:9;18486:17;18477:6;18433:71;:::i;:::-;18514:72;18582:2;18571:9;18567:18;18558:6;18514:72;:::i;:::-;18596;18664:2;18653:9;18649:18;18640:6;18596:72;:::i;:::-;18715:9;18709:4;18705:20;18700:2;18689:9;18685:18;18678:48;18743:76;18814:4;18805:6;18743:76;:::i;:::-;18735:84;;18386:440;;;;;;;:::o;18832:210::-;18919:4;18957:2;18946:9;18942:18;18934:26;;18970:65;19032:1;19021:9;19017:17;19008:6;18970:65;:::i;:::-;18924:118;;;;:::o;19048:313::-;19161:4;19199:2;19188:9;19184:18;19176:26;;19248:9;19242:4;19238:20;19234:1;19223:9;19219:17;19212:47;19276:78;19349:4;19340:6;19276:78;:::i;:::-;19268:86;;19166:195;;;;:::o;19367:419::-;19533:4;19571:2;19560:9;19556:18;19548:26;;19620:9;19614:4;19610:20;19606:1;19595:9;19591:17;19584:47;19648:131;19774:4;19648:131;:::i;:::-;19640:139;;19538:248;;;:::o;19792:419::-;19958:4;19996:2;19985:9;19981:18;19973:26;;20045:9;20039:4;20035:20;20031:1;20020:9;20016:17;20009:47;20073:131;20199:4;20073:131;:::i;:::-;20065:139;;19963:248;;;:::o;20217:419::-;20383:4;20421:2;20410:9;20406:18;20398:26;;20470:9;20464:4;20460:20;20456:1;20445:9;20441:17;20434:47;20498:131;20624:4;20498:131;:::i;:::-;20490:139;;20388:248;;;:::o;20642:419::-;20808:4;20846:2;20835:9;20831:18;20823:26;;20895:9;20889:4;20885:20;20881:1;20870:9;20866:17;20859:47;20923:131;21049:4;20923:131;:::i;:::-;20915:139;;20813:248;;;:::o;21067:419::-;21233:4;21271:2;21260:9;21256:18;21248:26;;21320:9;21314:4;21310:20;21306:1;21295:9;21291:17;21284:47;21348:131;21474:4;21348:131;:::i;:::-;21340:139;;21238:248;;;:::o;21492:419::-;21658:4;21696:2;21685:9;21681:18;21673:26;;21745:9;21739:4;21735:20;21731:1;21720:9;21716:17;21709:47;21773:131;21899:4;21773:131;:::i;:::-;21765:139;;21663:248;;;:::o;21917:419::-;22083:4;22121:2;22110:9;22106:18;22098:26;;22170:9;22164:4;22160:20;22156:1;22145:9;22141:17;22134:47;22198:131;22324:4;22198:131;:::i;:::-;22190:139;;22088:248;;;:::o;22342:419::-;22508:4;22546:2;22535:9;22531:18;22523:26;;22595:9;22589:4;22585:20;22581:1;22570:9;22566:17;22559:47;22623:131;22749:4;22623:131;:::i;:::-;22615:139;;22513:248;;;:::o;22767:419::-;22933:4;22971:2;22960:9;22956:18;22948:26;;23020:9;23014:4;23010:20;23006:1;22995:9;22991:17;22984:47;23048:131;23174:4;23048:131;:::i;:::-;23040:139;;22938:248;;;:::o;23192:419::-;23358:4;23396:2;23385:9;23381:18;23373:26;;23445:9;23439:4;23435:20;23431:1;23420:9;23416:17;23409:47;23473:131;23599:4;23473:131;:::i;:::-;23465:139;;23363:248;;;:::o;23617:419::-;23783:4;23821:2;23810:9;23806:18;23798:26;;23870:9;23864:4;23860:20;23856:1;23845:9;23841:17;23834:47;23898:131;24024:4;23898:131;:::i;:::-;23890:139;;23788:248;;;:::o;24042:419::-;24208:4;24246:2;24235:9;24231:18;24223:26;;24295:9;24289:4;24285:20;24281:1;24270:9;24266:17;24259:47;24323:131;24449:4;24323:131;:::i;:::-;24315:139;;24213:248;;;:::o;24467:419::-;24633:4;24671:2;24660:9;24656:18;24648:26;;24720:9;24714:4;24710:20;24706:1;24695:9;24691:17;24684:47;24748:131;24874:4;24748:131;:::i;:::-;24740:139;;24638:248;;;:::o;24892:419::-;25058:4;25096:2;25085:9;25081:18;25073:26;;25145:9;25139:4;25135:20;25131:1;25120:9;25116:17;25109:47;25173:131;25299:4;25173:131;:::i;:::-;25165:139;;25063:248;;;:::o;25317:419::-;25483:4;25521:2;25510:9;25506:18;25498:26;;25570:9;25564:4;25560:20;25556:1;25545:9;25541:17;25534:47;25598:131;25724:4;25598:131;:::i;:::-;25590:139;;25488:248;;;:::o;25742:419::-;25908:4;25946:2;25935:9;25931:18;25923:26;;25995:9;25989:4;25985:20;25981:1;25970:9;25966:17;25959:47;26023:131;26149:4;26023:131;:::i;:::-;26015:139;;25913:248;;;:::o;26167:419::-;26333:4;26371:2;26360:9;26356:18;26348:26;;26420:9;26414:4;26410:20;26406:1;26395:9;26391:17;26384:47;26448:131;26574:4;26448:131;:::i;:::-;26440:139;;26338:248;;;:::o;26592:419::-;26758:4;26796:2;26785:9;26781:18;26773:26;;26845:9;26839:4;26835:20;26831:1;26820:9;26816:17;26809:47;26873:131;26999:4;26873:131;:::i;:::-;26865:139;;26763:248;;;:::o;27017:419::-;27183:4;27221:2;27210:9;27206:18;27198:26;;27270:9;27264:4;27260:20;27256:1;27245:9;27241:17;27234:47;27298:131;27424:4;27298:131;:::i;:::-;27290:139;;27188:248;;;:::o;27442:419::-;27608:4;27646:2;27635:9;27631:18;27623:26;;27695:9;27689:4;27685:20;27681:1;27670:9;27666:17;27659:47;27723:131;27849:4;27723:131;:::i;:::-;27715:139;;27613:248;;;:::o;27867:222::-;27960:4;27998:2;27987:9;27983:18;27975:26;;28011:71;28079:1;28068:9;28064:17;28055:6;28011:71;:::i;:::-;27965:124;;;;:::o;28095:129::-;28129:6;28156:20;;:::i;:::-;28146:30;;28185:33;28213:4;28205:6;28185:33;:::i;:::-;28136:88;;;:::o;28230:75::-;28263:6;28296:2;28290:9;28280:19;;28270:35;:::o;28311:307::-;28372:4;28462:18;28454:6;28451:30;28448:2;;;28484:18;;:::i;:::-;28448:2;28522:29;28544:6;28522:29;:::i;:::-;28514:37;;28606:4;28600;28596:15;28588:23;;28377:241;;;:::o;28624:308::-;28686:4;28776:18;28768:6;28765:30;28762:2;;;28798:18;;:::i;:::-;28762:2;28836:29;28858:6;28836:29;:::i;:::-;28828:37;;28920:4;28914;28910:15;28902:23;;28691:241;;;:::o;28938:141::-;28987:4;29010:3;29002:11;;29033:3;29030:1;29023:14;29067:4;29064:1;29054:18;29046:26;;28992:87;;;:::o;29085:98::-;29136:6;29170:5;29164:12;29154:22;;29143:40;;;:::o;29189:99::-;29241:6;29275:5;29269:12;29259:22;;29248:40;;;:::o;29294:168::-;29377:11;29411:6;29406:3;29399:19;29451:4;29446:3;29442:14;29427:29;;29389:73;;;;:::o;29468:169::-;29552:11;29586:6;29581:3;29574:19;29626:4;29621:3;29617:14;29602:29;;29564:73;;;;:::o;29643:148::-;29745:11;29782:3;29767:18;;29757:34;;;;:::o;29797:305::-;29837:3;29856:20;29874:1;29856:20;:::i;:::-;29851:25;;29890:20;29908:1;29890:20;:::i;:::-;29885:25;;30044:1;29976:66;29972:74;29969:1;29966:81;29963:2;;;30050:18;;:::i;:::-;29963:2;30094:1;30091;30087:9;30080:16;;29841:261;;;;:::o;30108:185::-;30148:1;30165:20;30183:1;30165:20;:::i;:::-;30160:25;;30199:20;30217:1;30199:20;:::i;:::-;30194:25;;30238:1;30228:2;;30243:18;;:::i;:::-;30228:2;30285:1;30282;30278:9;30273:14;;30150:143;;;;:::o;30299:348::-;30339:7;30362:20;30380:1;30362:20;:::i;:::-;30357:25;;30396:20;30414:1;30396:20;:::i;:::-;30391:25;;30584:1;30516:66;30512:74;30509:1;30506:81;30501:1;30494:9;30487:17;30483:105;30480:2;;;30591:18;;:::i;:::-;30480:2;30639:1;30636;30632:9;30621:20;;30347:300;;;;:::o;30653:191::-;30693:4;30713:20;30731:1;30713:20;:::i;:::-;30708:25;;30747:20;30765:1;30747:20;:::i;:::-;30742:25;;30786:1;30783;30780:8;30777:2;;;30791:18;;:::i;:::-;30777:2;30836:1;30833;30829:9;30821:17;;30698:146;;;;:::o;30850:96::-;30887:7;30916:24;30934:5;30916:24;:::i;:::-;30905:35;;30895:51;;;:::o;30952:90::-;30986:7;31029:5;31022:13;31015:21;31004:32;;30994:48;;;:::o;31048:149::-;31084:7;31124:66;31117:5;31113:78;31102:89;;31092:105;;;:::o;31203:125::-;31269:7;31298:24;31316:5;31298:24;:::i;:::-;31287:35;;31277:51;;;:::o;31334:126::-;31371:7;31411:42;31404:5;31400:54;31389:65;;31379:81;;;:::o;31466:77::-;31503:7;31532:5;31521:16;;31511:32;;;:::o;31549:154::-;31633:6;31628:3;31623;31610:30;31695:1;31686:6;31681:3;31677:16;31670:27;31600:103;;;:::o;31709:307::-;31777:1;31787:113;31801:6;31798:1;31795:13;31787:113;;;31886:1;31881:3;31877:11;31871:18;31867:1;31862:3;31858:11;31851:39;31823:2;31820:1;31816:10;31811:15;;31787:113;;;31918:6;31915:1;31912:13;31909:2;;;31998:1;31989:6;31984:3;31980:16;31973:27;31909:2;31758:258;;;;:::o;32022:320::-;32066:6;32103:1;32097:4;32093:12;32083:22;;32150:1;32144:4;32140:12;32171:18;32161:2;;32227:4;32219:6;32215:17;32205:27;;32161:2;32289;32281:6;32278:14;32258:18;32255:38;32252:2;;;32308:18;;:::i;:::-;32252:2;32073:269;;;;:::o;32348:281::-;32431:27;32453:4;32431:27;:::i;:::-;32423:6;32419:40;32561:6;32549:10;32546:22;32525:18;32513:10;32510:34;32507:62;32504:2;;;32572:18;;:::i;:::-;32504:2;32612:10;32608:2;32601:22;32391:238;;;:::o;32635:233::-;32674:3;32697:24;32715:5;32697:24;:::i;:::-;32688:33;;32743:66;32736:5;32733:77;32730:2;;;32813:18;;:::i;:::-;32730:2;32860:1;32853:5;32849:13;32842:20;;32678:190;;;:::o;32874:176::-;32906:1;32923:20;32941:1;32923:20;:::i;:::-;32918:25;;32957:20;32975:1;32957:20;:::i;:::-;32952:25;;32996:1;32986:2;;33001:18;;:::i;:::-;32986:2;33042:1;33039;33035:9;33030:14;;32908:142;;;;:::o;33056:180::-;33104:77;33101:1;33094:88;33201:4;33198:1;33191:15;33225:4;33222:1;33215:15;33242:180;33290:77;33287:1;33280:88;33387:4;33384:1;33377:15;33411:4;33408:1;33401:15;33428:180;33476:77;33473:1;33466:88;33573:4;33570:1;33563:15;33597:4;33594:1;33587:15;33614:180;33662:77;33659:1;33652:88;33759:4;33756:1;33749:15;33783:4;33780:1;33773:15;33800:102;33841:6;33892:2;33888:7;33883:2;33876:5;33872:14;33868:28;33858:38;;33848:54;;;:::o;33908:230::-;34048:34;34044:1;34036:6;34032:14;34025:58;34117:13;34112:2;34104:6;34100:15;34093:38;34014:124;:::o;34144:237::-;34284:34;34280:1;34272:6;34268:14;34261:58;34353:20;34348:2;34340:6;34336:15;34329:45;34250:131;:::o;34387:225::-;34527:34;34523:1;34515:6;34511:14;34504:58;34596:8;34591:2;34583:6;34579:15;34572:33;34493:119;:::o;34618:178::-;34758:30;34754:1;34746:6;34742:14;34735:54;34724:72;:::o;34802:223::-;34942:34;34938:1;34930:6;34926:14;34919:58;35011:6;35006:2;34998:6;34994:15;34987:31;34908:117;:::o;35031:175::-;35171:27;35167:1;35159:6;35155:14;35148:51;35137:69;:::o;35212:181::-;35352:33;35348:1;35340:6;35336:14;35329:57;35318:75;:::o;35399:177::-;35539:29;35535:1;35527:6;35523:14;35516:53;35505:71;:::o;35582:231::-;35722:34;35718:1;35710:6;35706:14;35699:58;35791:14;35786:2;35778:6;35774:15;35767:39;35688:125;:::o;35819:243::-;35959:34;35955:1;35947:6;35943:14;35936:58;36028:26;36023:2;36015:6;36011:15;36004:51;35925:137;:::o;36068:229::-;36208:34;36204:1;36196:6;36192:14;36185:58;36277:12;36272:2;36264:6;36260:15;36253:37;36174:123;:::o;36303:228::-;36443:34;36439:1;36431:6;36427:14;36420:58;36512:11;36507:2;36499:6;36495:15;36488:36;36409:122;:::o;36537:182::-;36677:34;36673:1;36665:6;36661:14;36654:58;36643:76;:::o;36725:182::-;36865:34;36861:1;36853:6;36849:14;36842:58;36831:76;:::o;36913:231::-;37053:34;37049:1;37041:6;37037:14;37030:58;37122:14;37117:2;37109:6;37105:15;37098:39;37019:125;:::o;37150:155::-;37290:7;37286:1;37278:6;37274:14;37267:31;37256:49;:::o;37311:182::-;37451:34;37447:1;37439:6;37435:14;37428:58;37417:76;:::o;37499:228::-;37639:34;37635:1;37627:6;37623:14;37616:58;37708:11;37703:2;37695:6;37691:15;37684:36;37605:122;:::o;37733:220::-;37873:34;37869:1;37861:6;37857:14;37850:58;37942:3;37937:2;37929:6;37925:15;37918:28;37839:114;:::o;37959:236::-;38099:34;38095:1;38087:6;38083:14;38076:58;38168:19;38163:2;38155:6;38151:15;38144:44;38065:130;:::o;38201:231::-;38341:34;38337:1;38329:6;38325:14;38318:58;38410:14;38405:2;38397:6;38393:15;38386:39;38307:125;:::o;38438:122::-;38511:24;38529:5;38511:24;:::i;:::-;38504:5;38501:35;38491:2;;38550:1;38547;38540:12;38491:2;38481:79;:::o;38566:116::-;38636:21;38651:5;38636:21;:::i;:::-;38629:5;38626:32;38616:2;;38672:1;38669;38662:12;38616:2;38606:76;:::o;38688:120::-;38760:23;38777:5;38760:23;:::i;:::-;38753:5;38750:34;38740:2;;38798:1;38795;38788:12;38740:2;38730:78;:::o;38814:180::-;38916:53;38963:5;38916:53;:::i;:::-;38909:5;38906:64;38896:2;;38984:1;38981;38974:12;38896:2;38886:108;:::o;39000:122::-;39073:24;39091:5;39073:24;:::i;:::-;39066:5;39063:35;39053:2;;39112:1;39109;39102:12;39053:2;39043:79;:::o

Swarm Source

ipfs://c69a7131561eaf6c2266f538b252371a82eca8e3b005351021aa1201f7b0fe8c
Loading...
Loading
Loading...
Loading
[ 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.