ETH Price: $3,280.99 (+0.48%)
Gas: 20 Gwei

Token

SurrealSociety (SURREAL)
 

Overview

Max Total Supply

248 SURREAL

Holders

146

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SURREAL
0x6decd1cb3cc55b79985053daccd147f2934fba05
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SurrealSociety

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: Address.sol


pragma solidity ^0.8.11;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (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);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (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: ERC721.sol



pragma solidity ^0.8.11;








abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    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 (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

    /**
     * @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 {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

        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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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



pragma solidity ^0.8.11;



/**
 * @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 but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @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-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }

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

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

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}
// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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: SurrealSociety.sol



pragma solidity ^0.8.11;




/**
  *                         Welcome to the Surreal Society.
  *  ▓█████████████████████████████████▀▀▀███████████████████████████████████████████
  *  ██████████████████████████████▀──────────▀██████████████████████████████████████
  *  █████████████████████████████───────────────▀███████████████████████████████████
  *  ████████████████████████████──────────────────└█████████████████████████████████
  *  ███████████████████████████──────────────────────└▀█████████████████████████████
  *  ██████████████████████████───────────────────────────▀██████████████████████████
  *  █████████████████████████───────────────────────────────▀███████████████████████
  *  ███████████████████████▌───────────────────────────────────▀████████████████████
  *  ██████████████████████▀──────────────────┌────┌┌┌┌┌┌┐┌────────▀█████████████████
  *  █████████████████████▀───────────────────┌╒╔▄█▓▓████▒╠█─────────╙███████████████
  *  ████████████████████└─────────────────┌╔▒▓████████████▌▒─────────╟██████████████
  *  ███████████████████───────────────────╩║▓██████████████▓╣────────╟██████████████
  *  █████████████████▀────────────────────▓██████████████████▌───────███████████████
  *  ████████████████┘─────────────────────└▀▀▀▀└────────┌─└╚└└──────▐███████████████
  *  ███████████████▌─────────────────────┌┐─┌┘┌───────██─╔─╒───────▄████████████████
  *  ███████████████─────────────────────┌▌██▄└──────┌▓██┐┌────────╓█████████████████
  *  ███████████████────────────────────┌▓███████▒░┌╗█████───┌▀────██████████████████
  *  ███████████████────────────────────▐██████████████████┌▐█────▐██████████████████
  *  ██████████████▌─────────────────────╠╫▌▓████████████─┌║╬──────▀█████████████████
  *  ████████████████───────────────────┌░╬▌█████████████████───────└████████████████
  *  █████████████████┐──────────────────░╠▓▓██████████╠╠┌┌└█─────────███████████████
  *  ▓█████████████████▌──────────────────╚╬████████████▀▀╚▌───────────└█████████████
  *  ▓▓██████████████████┐──────────────────╚╠███████████▌░▒─────────────▀███████████
  *  ▓█▓██████████████████▌────────────────────╙██████████╙────────────────██████████
  *  ▓▓▓▓███████████████████────────────────────────────────────────────────█████████
  *  ▓▓▓▓▓█████████████████─────────────┌───────────────────────────────────█████████
  *  ▓▓▓▓▓▓▓█████████████▀──────────────────────────────────────────────────█████████
  *  ▓▓▓▓▓▓▓▓▓██████▀└──────────────────────────────────────────────────────▀▀▀▀▀▀▀▀▀
  *
  *  Smart contract created by BuildingIdeas.io (https://buildingideas.io) 
  *  Optimized with hyper-low minting fees, no OpenSea list fees (OpenSea Proxy Registry), flashbot prevention, whitelist (Merkle Tree), and more!
  */
contract SurrealSociety is ERC721Enumerable, Ownable {

  // Metadata URL
  string public baseURI;

  // Open sea gasless transaction approvals! 
  address public proxyRegistryAddress;

  // Provenance
  string public SURREAL_SOCIETY = "";

  // Price & Supply
  uint256 public constant NFT_PRICE = 150000000000000000; //0.15 ETH
  uint public constant MAX_SUPPLY = 5000;

  // Internals
  string private _baseTokenURI;
  mapping(address => bool) public projectProxy;
  mapping(address => uint) public addressToMinted;
  bool public hasSaleStarted = false;
  bool public hasPreSaleStarted = false;

  // Pre-Sale
  uint256 public constant NFT_PRICE_PRESALE = 100000000000000000; //0.10 ETH
  uint public constant MAX_PRESALE_SUPPLY = 1500;

  // Develoepers Address (BuildingIdeas.io)
  address private constant DEVELOPER_ADDRESS = 0x9D7a3F970Bbc7aB9C8537dc9637051b824A9eD0C;

  // Whitelist hashroot
  bytes32 public WHITELIST;

  // NFT Claims
  uint private MAX_NFT_CLAIMS = 200;
  uint private NFT_CLAIMED = 0;
  

  constructor(string memory _baseURI, address _proxyRegistryAddress, bytes32 _whitelist, address _owner) ERC721("SurrealSociety", "SURREAL") {
    baseURI = _baseURI;
    proxyRegistryAddress = _proxyRegistryAddress;
    WHITELIST = _whitelist;
    transferOwnership(_owner);
  }

  function setWhitelist(bytes32 _whitelist) public onlyOwner {
    WHITELIST = _whitelist;
  }

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

  function tokenURI(uint256 _tokenId) public view override returns (string memory) {
    require(_exists(_tokenId), "Token does not exist.");
    return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
  }

  function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner {
    proxyRegistryAddress = _proxyRegistryAddress;
  }

  function flipProxyState(address proxyAddress) public onlyOwner {
    projectProxy[proxyAddress] = !projectProxy[proxyAddress];
  }

  function getBaseURI() external view returns(string memory) {
    return _baseTokenURI;
  }
  
  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }

  function mintDev(address _to, uint256 amount) public onlyOwner {
    require(amount <= MAX_NFT_CLAIMS, "Incorrect amount");
    require(amount + NFT_CLAIMED <= MAX_NFT_CLAIMS, "NFTs claimed");
    for (uint i = 0; i < amount; i++) {
      uint mintIndex = totalSupply() + 1;
      _safeMint(_to, mintIndex);
    }
    NFT_CLAIMED += amount;
  }

  function mintWhitelist(uint256 numNFTs, bytes32[] memory proof) public payable {
    require(msg.value >= NFT_PRICE_PRESALE * numNFTs, "Incorrect ether value");
    require(hasPreSaleStarted, "Presale has not started");
    require(totalSupply() < MAX_PRESALE_SUPPLY, "Presale has ended");
    require(numNFTs + balanceOf(msg.sender) < 4, "Max of 3 nfts per wallet");
    require(MerkleProof.verify(proof, WHITELIST, keccak256(abi.encodePacked(msg.sender))), "You are not in the whitelist");
    for (uint i = 0; i < numNFTs; i++) {
      uint mintIndex = totalSupply() + 1;
      _safeMint(msg.sender, mintIndex);
    } 
  }

  function mint(uint256 numNFTs) public payable {
    require(hasSaleStarted, "Sale has not started");
    require(numNFTs < 6, "Max of 5 nfts per tx");
    require(MAX_SUPPLY - MAX_NFT_CLAIMS > totalSupply(), "Sale has ended");
    require(MAX_SUPPLY - MAX_NFT_CLAIMS >= totalSupply() + numNFTs, "Exceeds MAX_SUPPLY");
    require(msg.value >= NFT_PRICE * numNFTs, "Incorrect ether value");

    for (uint i = 0; i < numNFTs; i++) {
      uint mintIndex = totalSupply() + 1;
      _safeMint(msg.sender, mintIndex);
    }
  }

  function flipSaleState() public onlyOwner {
    hasSaleStarted = !hasSaleStarted;
  }
  
  function flipPreSaleState() public onlyOwner {
    hasPreSaleStarted = !hasPreSaleStarted;
  }

  function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
    // (a + b - 1) / b can overflow on addition, so we distribute.
    return a / b + (a % b == 0 ? 0 : 1);
  } 

  function withdraw() public onlyOwner {
    require(address(this).balance > 0, "Contract must have balance");

    uint256 unit = ceilDiv(address(this).balance, 10000); // This is 0.01% of the total balance -> Needed to do presition calculations without floating point.

    // Surreal Team
    require(payable(0x7A6c41c001d6Fbf4AE6022E936B24d0d39AE3a25).send(unit * 255), "Payment failed"); // 2.55%
    require(payable(0x6Ec4EAA315aba37B7558A66c51D0dd4986128bCb).send(unit * 255), "Payment failed"); // 2.55%
    require(payable(0x2954F886f9E118F4a680D4B65627ca6b6f6094B3).send(unit * 620), "Payment failed"); // 6.20%
    require(payable(0x37B8C37EB031312c5DaaA02fD5baD9Dc380a8cc4).send(unit * 100), "Payment failed"); // 1 %
    require(payable(0xcc2ba3C4E74A531635b928D2aC5B3f176C8B6ec3).send(unit * 260), "Payment failed"); // 2.60%
    require(payable(0xC970bd4E2dF5F33ea62c72b9c3d808b8a609e5e1).send(unit * 580), "Payment failed"); // 5.80%
    require(payable(0x02916D0f68a02c502476DC630628B01Ee36A7826).send(unit * 60), "Payment failed"); // 0.6%
    require(payable(0x2C1Ba2909A0dC98A6219079FBe9A4ab23517D47E).send(unit * 60), "Payment failed"); // 0.6%
    require(payable(0x38cA9DAACB4d5e493132c2fE9507bbaee4AB86aC).send(unit * 60), "Payment failed"); // 0.6%
    require(payable(0x50a583Ab2432BF3bC5E7458C8ed10BC5Ec3AB23E).send(unit * 620), "Payment failed"); // 6.20%
    require(payable(0x58EE6F81AE4Ed77E8Dc50344Ab7571EA7A75a9b7).send(unit * 24), "Payment failed"); // 0.24%
    require(payable(0x10f3667970FAd7dA441261c80727caCd8B164806).send(unit * 920), "Payment failed"); // 9.20%
    require(payable(0x41b6cb632F5707bF80a1c904316b19fcBee2a4cF).send(unit * 60), "Payment failed"); // 0.6%
    require(payable(0x3b0f95D44f629e8E24a294799c4A1D21f06B6969).send(unit * 226), "Payment failed"); // 2.26%
    require(payable(0x77bC272C4a7C051a615F11E515259Fa6376936ed).send(unit * 60), "Payment failed"); // 0.6%

    // BuildingIdeas wallet
    require(payable(DEVELOPER_ADDRESS).send(unit  * 1000 ), "Payment to developers failed"); // 10%

    // DAO wallet is caller, receives the remaining balance - 48.4%
    require(payable(msg.sender).send(address(this).balance), "Withdrawal failed");
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    SURREAL_SOCIETY = provenanceHash;
  }

  function burn(uint256 tokenId) public { 
    require(_isApprovedOrOwner(_msgSender(), tokenId), "Not approved to burn.");
    _burn(tokenId);
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) return new uint256[](0);

    uint256[] memory tokensId = new uint256[](tokenCount);
    for (uint256 i; i < tokenCount; i++) {
        tokensId[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokensId;
  }

  function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds) public {
    for (uint256 i = 0; i < _tokenIds.length; i++) {
        transferFrom(_from, _to, _tokenIds[i]);
    }
  }

  function batchSafeTransferFrom(address _from, address _to, uint256[] memory _tokenIds, bytes memory data_) public {
    for (uint256 i = 0; i < _tokenIds.length; i++) {
        safeTransferFrom(_from, _to, _tokenIds[i], data_);
    }
  }

  function isOwnerOf(address account, uint256[] calldata _tokenIds) external view returns (bool){
    for(uint256 i; i < _tokenIds.length; ++i ){
        if(_owners[_tokenIds[i]] != account)
            return false;
    }

    return true;
  }

  function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(_owner)) == operator || projectProxy[operator]) return true;
    return super.isApprovedForAll(_owner, operator);
  }

  function _mint(address to, uint256 tokenId) internal virtual override {
    _owners.push(to);
    emit Transfer(address(0), to, tokenId);
  }
}
contract OwnableDelegateProxy { }
contract OpenSeaProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"bytes32","name":"_whitelist","type":"bytes32"},{"internalType":"address","name":"_owner","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":[],"name":"MAX_PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SURREAL_SOCIETY","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPreSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNFTs","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelist","type":"bytes32"}],"name":"setWhitelist","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":"tokenId","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b916008916200025f565b50600c805461ffff1916905560c8600e556000600f553480156200003e57600080fd5b5060405162003f1938038062003f19833981016040819052620000619162000338565b604080518082018252600e81526d5375727265616c536f636965747960901b60208083019182528351808501909452600784526614d5549491505360ca1b908401528151919291620000b6916000916200025f565b508051620000cc9060019060208401906200025f565b505050620000e9620000e36200013460201b60201c565b62000138565b8351620000fe9060069060208701906200025f565b50600780546001600160a01b0319166001600160a01b038516179055600d8290556200012a816200018a565b5050505062000482565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620002515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620001e1565b6200025c8162000138565b50565b8280546200026d9062000445565b90600052602060002090601f016020900481019282620002915760008555620002dc565b82601f10620002ac57805160ff1916838001178555620002dc565b82800160010185558215620002dc579182015b82811115620002dc578251825591602001919060010190620002bf565b50620002ea929150620002ee565b5090565b5b80821115620002ea5760008155600101620002ef565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200033357600080fd5b919050565b600080600080608085870312156200034f57600080fd5b84516001600160401b03808211156200036757600080fd5b818701915087601f8301126200037c57600080fd5b81518181111562000391576200039162000305565b604051601f8201601f19908116603f01168101908382118183101715620003bc57620003bc62000305565b81604052828152602093508a84848701011115620003d957600080fd5b600091505b82821015620003fd5784820184015181830185015290830190620003de565b828211156200040f5760008484830101525b9750620004219150508782016200031b565b94505050604085015191506200043a606086016200031b565b905092959194509250565b600181811c908216806200045a57607f821691505b602082108114156200047c57634e487b7160e01b600052602260045260246000fd5b50919050565b613a8780620004926000396000f3fe60806040526004361061031e5760003560e01c80635a4fee30116101a557806395d89b41116100ec578063cd7c032611610095578063f03255491161006f578063f032554914610887578063f2fde38b1461089c578063f3993d11146108bc578063f73c814b146108dc57600080fd5b8063cd7c032614610827578063d26ea6c014610847578063e985e9c51461086757600080fd5b8063a22cb465116100c6578063a22cb465146107c7578063b88d4fde146107e7578063c87b56dd1461080757600080fd5b806395d89b41146107725780639ec00c9514610787578063a0712d68146107b457600080fd5b80636c0360eb1161014e578063715018a611610128578063715018a61461071f5780638462151c146107345780638da5cb5b1461075457600080fd5b80636c0360eb146106d557806370a08231146106ea578063714c53981461070a57600080fd5b8063676dd5631161017f578063676dd563146106845780636a5928f5146106a05780636b8dc355146106bf57600080fd5b80635a4fee30146106145780635bab26e2146106345780636352211e1461066457600080fd5b8063324c6adc11610269578063438b6300116102125780634f6ccce7116101ec5780634f6ccce7146105b857806355f804b3146105d8578063577ad34d146105f857600080fd5b8063438b63001461054b578063440bc7f3146105785780634d44660c1461059857600080fd5b80633ccfd60b116102435780633ccfd60b146104f657806342842e0e1461050b57806342966c681461052b57600080fd5b8063324c6adc146104ab57806332cb6b0c146104cb57806334918dfd146104e157600080fd5b806310969523116102cb5780631c8b232d116102a55780631c8b232d1461045157806323b872dd1461046b5780632f745c591461048b57600080fd5b806310969523146103fc57806318160ddd1461041c5780631bb7cc991461043b57600080fd5b8063081812fc116102fc578063081812fc1461038f578063095ea7b3146103c75780630f5447a0146103e757600080fd5b806301ffc9a714610323578063061431a81461035857806306fdde031461036d575b600080fd5b34801561032f57600080fd5b5061034361033e3660046131f9565b6108fc565b60405190151581526020015b60405180910390f35b61036b610366366004613281565b610940565b005b34801561037957600080fd5b50610382610b8b565b60405161034f919061337b565b34801561039b57600080fd5b506103af6103aa36600461338e565b610c1d565b6040516001600160a01b03909116815260200161034f565b3480156103d357600080fd5b5061036b6103e23660046133bc565b610ca5565b3480156103f357600080fd5b50610382610dd2565b34801561040857600080fd5b5061036b610417366004613440565b610e60565b34801561042857600080fd5b506002545b60405190815260200161034f565b34801561044757600080fd5b5061042d600d5481565b34801561045d57600080fd5b50600c546103439060ff1681565b34801561047757600080fd5b5061036b610486366004613489565b610ebf565b34801561049757600080fd5b5061042d6104a63660046133bc565b610f47565b3480156104b757600080fd5b5061036b6104c63660046133bc565b611082565b3480156104d757600080fd5b5061042d61138881565b3480156104ed57600080fd5b5061036b6111d6565b34801561050257600080fd5b5061036b611232565b34801561051757600080fd5b5061036b610526366004613489565b611ac9565b34801561053757600080fd5b5061036b61054636600461338e565b611ae4565b34801561055757600080fd5b5061056b6105663660046134ca565b611b42565b60405161034f91906134e7565b34801561058457600080fd5b5061036b61059336600461338e565b611c15565b3480156105a457600080fd5b506103436105b336600461352b565b611c62565b3480156105c457600080fd5b5061042d6105d336600461338e565b611ce4565b3480156105e457600080fd5b5061036b6105f3366004613440565b611d62565b34801561060457600080fd5b5061042d67016345785d8a000081565b34801561062057600080fd5b5061036b61062f366004613639565b611dbd565b34801561064057600080fd5b5061034361064f3660046134ca565b600a6020526000908152604090205460ff1681565b34801561067057600080fd5b506103af61067f36600461338e565b611e07565b34801561069057600080fd5b5061042d670214e8348c4f000081565b3480156106ac57600080fd5b50600c5461034390610100900460ff1681565b3480156106cb57600080fd5b5061042d6105dc81565b3480156106e157600080fd5b50610382611ea7565b3480156106f657600080fd5b5061042d6107053660046134ca565b611eb4565b34801561071657600080fd5b50610382611f95565b34801561072b57600080fd5b5061036b611fa4565b34801561074057600080fd5b5061056b61074f3660046134ca565b611ff8565b34801561076057600080fd5b506005546001600160a01b03166103af565b34801561077e57600080fd5b506103826120a4565b34801561079357600080fd5b5061042d6107a23660046134ca565b600b6020526000908152604090205481565b61036b6107c236600461338e565b6120b3565b3480156107d357600080fd5b5061036b6107e23660046136c2565b6122c6565b3480156107f357600080fd5b5061036b610802366004613700565b61238b565b34801561081357600080fd5b5061038261082236600461338e565b612419565b34801561083357600080fd5b506007546103af906001600160a01b031681565b34801561085357600080fd5b5061036b6108623660046134ca565b6124a2565b34801561087357600080fd5b50610343610882366004613760565b61250c565b34801561089357600080fd5b5061036b612609565b3480156108a857600080fd5b5061036b6108b73660046134ca565b61266e565b3480156108c857600080fd5b5061036b6108d736600461378e565b61273b565b3480156108e857600080fd5b5061036b6108f73660046134ca565b61277d565b60006001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000148061093a575061093a826127ee565b92915050565b6109528267016345785d8a0000613806565b3410156109a65760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742065746865722076616c7565000000000000000000000060448201526064015b60405180910390fd5b600c54610100900460ff166109fd5760405162461bcd60e51b815260206004820152601760248201527f50726573616c6520686173206e6f742073746172746564000000000000000000604482015260640161099d565b6105dc610a0960025490565b10610a565760405162461bcd60e51b815260206004820152601160248201527f50726573616c652068617320656e646564000000000000000000000000000000604482015260640161099d565b6004610a6133611eb4565b610a6b9084613825565b10610ab85760405162461bcd60e51b815260206004820152601860248201527f4d6178206f662033206e667473207065722077616c6c65740000000000000000604482015260640161099d565b600d546040516bffffffffffffffffffffffff193360601b166020820152610afa91839160340160405160208183030381529060405280519060200120612889565b610b465760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f7420696e207468652077686974656c69737400000000604482015260640161099d565b60005b82811015610b86576000610b5c60025490565b610b67906001613825565b9050610b73338261289f565b5080610b7e8161383d565b915050610b49565b505050565b606060008054610b9a90613858565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc690613858565b8015610c135780601f10610be857610100808354040283529160200191610c13565b820191906000526020600020905b815481529060010190602001808311610bf657829003601f168201915b5050505050905090565b6000610c28826128b9565b610c895760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161099d565b506000908152600360205260409020546001600160a01b031690565b6000610cb082611e07565b9050806001600160a01b0316836001600160a01b03161415610d3a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161099d565b336001600160a01b0382161480610d565750610d56813361250c565b610dc85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161099d565b610b868383612903565b60088054610ddf90613858565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0b90613858565b8015610e585780601f10610e2d57610100808354040283529160200191610e58565b820191906000526020600020905b815481529060010190602001808311610e3b57829003601f168201915b505050505081565b6005546001600160a01b03163314610ea85760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b8051610ebb906008906020840190613153565b5050565b610eca335b82612971565b610f3c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099d565b610b86838383612a33565b6000610f5283611eb4565b8210610fb45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099d565b6000805b6002548110156110255760028181548110610fd557610fd561388d565b6000918252602090912001546001600160a01b0386811691161415611013578382141561100557915061093a9050565b8161100f8161383d565b9250505b8061101d8161383d565b915050610fb8565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099d565b6005546001600160a01b031633146110ca5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600e5481111561111c5760405162461bcd60e51b815260206004820152601060248201527f496e636f727265637420616d6f756e7400000000000000000000000000000000604482015260640161099d565b600e54600f5461112c9083613825565b111561117a5760405162461bcd60e51b815260206004820152600c60248201527f4e46547320636c61696d65640000000000000000000000000000000000000000604482015260640161099d565b60005b818110156111ba57600061119060025490565b61119b906001613825565b90506111a7848261289f565b50806111b28161383d565b91505061117d565b5080600f60008282546111cd9190613825565b90915550505050565b6005546001600160a01b0316331461121e5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600c805460ff19811660ff90911615179055565b6005546001600160a01b0316331461127a5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600047116112ca5760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206d75737420686176652062616c616e6365000000000000604482015260640161099d565b60006112d847612710612bb6565b9050737a6c41c001d6fbf4ae6022e936b24d0d39ae3a256108fc6112fd8360ff613806565b6040518115909202916000818181858888f193505050506113515760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b736ec4eaa315aba37b7558a66c51d0dd4986128bcb6108fc6113748360ff613806565b6040518115909202916000818181858888f193505050506113c85760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b732954f886f9e118f4a680d4b65627ca6b6f6094b36108fc6113ec8361026c613806565b6040518115909202916000818181858888f193505050506114405760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7337b8c37eb031312c5daaa02fd5bad9dc380a8cc46108fc611463836064613806565b6040518115909202916000818181858888f193505050506114b75760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b73cc2ba3c4e74a531635b928d2ac5b3f176c8b6ec36108fc6114db83610104613806565b6040518115909202916000818181858888f1935050505061152f5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b73c970bd4e2df5f33ea62c72b9c3d808b8a609e5e16108fc61155383610244613806565b6040518115909202916000818181858888f193505050506115a75760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7302916d0f68a02c502476dc630628b01ee36a78266108fc6115ca83603c613806565b6040518115909202916000818181858888f1935050505061161e5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b732c1ba2909a0dc98a6219079fbe9a4ab23517d47e6108fc61164183603c613806565b6040518115909202916000818181858888f193505050506116955760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7338ca9daacb4d5e493132c2fe9507bbaee4ab86ac6108fc6116b883603c613806565b6040518115909202916000818181858888f1935050505061170c5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7350a583ab2432bf3bc5e7458c8ed10bc5ec3ab23e6108fc6117308361026c613806565b6040518115909202916000818181858888f193505050506117845760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7358ee6f81ae4ed77e8dc50344ab7571ea7a75a9b76108fc6117a7836018613806565b6040518115909202916000818181858888f193505050506117fb5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7310f3667970fad7da441261c80727cacd8b1648066108fc61181f83610398613806565b6040518115909202916000818181858888f193505050506118735760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7341b6cb632f5707bf80a1c904316b19fcbee2a4cf6108fc61189683603c613806565b6040518115909202916000818181858888f193505050506118ea5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b733b0f95d44f629e8e24a294799c4a1d21f06b69696108fc61190d8360e2613806565b6040518115909202916000818181858888f193505050506119615760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7377bc272c4a7c051a615f11e515259fa6376936ed6108fc61198483603c613806565b6040518115909202916000818181858888f193505050506119d85760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b739d7a3f970bbc7ab9c8537dc9637051b824a9ed0c6108fc6119fc836103e8613806565b6040518115909202916000818181858888f19350505050611a5f5760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e7420746f20646576656c6f70657273206661696c656400000000604482015260640161099d565b60405133904780156108fc02916000818181858888f19350505050611ac65760405162461bcd60e51b815260206004820152601160248201527f5769746864726177616c206661696c6564000000000000000000000000000000604482015260640161099d565b50565b610b868383836040518060200160405280600081525061238b565b611aed33610ec4565b611b395760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000604482015260640161099d565b611ac681612be8565b60606000611b4f83611eb4565b905080611b8a5760005b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b509392505050565b60008167ffffffffffffffff811115611ba557611ba5613216565b604051908082528060200260200182016040528015611bce578160200160208202803683370190505b50905060005b82811015611b8257611be68582610f47565b828281518110611bf857611bf861388d565b602090810291909101015280611c0d8161383d565b915050611bd4565b6005546001600160a01b03163314611c5d5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600d55565b6000805b82811015611cd757846001600160a01b03166002858584818110611c8c57611c8c61388d565b9050602002013581548110611ca357611ca361388d565b6000918252602090912001546001600160a01b031614611cc7576000915050611cdd565b611cd08161383d565b9050611c66565b50600190505b9392505050565b6002546000908210611d5e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161099d565b5090565b6005546001600160a01b03163314611daa5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b8051610ebb906006906020840190613153565b60005b8251811015611e0057611dee8585858481518110611de057611de061388d565b60200260200101518561238b565b80611df88161383d565b915050611dc0565b5050505050565b60008060028381548110611e1d57611e1d61388d565b6000918252602090912001546001600160a01b031690508061093a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161099d565b60068054610ddf90613858565b60006001600160a01b038216611f325760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161099d565b6000805b600254811015611f8e5760028181548110611f5357611f5361388d565b6000918252602090912001546001600160a01b0385811691161415611f7e57611f7b8261383d565b91505b611f878161383d565b9050611f36565b5092915050565b606060098054610b9a90613858565b6005546001600160a01b03163314611fec5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b611ff66000612c6a565b565b6060600061200583611eb4565b905080612013576000611b59565b60008167ffffffffffffffff81111561202e5761202e613216565b604051908082528060200260200182016040528015612057578160200160208202803683370190505b50905060005b82811015611b825761206f8582610f47565b8282815181106120815761208161388d565b6020908102919091010152806120968161383d565b91505061205d565b50919050565b606060018054610b9a90613858565b600c5460ff166121055760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f742073746172746564000000000000000000000000604482015260640161099d565b600681106121555760405162461bcd60e51b815260206004820152601460248201527f4d6178206f662035206e66747320706572207478000000000000000000000000604482015260640161099d565b600254600e54612167906113886138a3565b116121b45760405162461bcd60e51b815260206004820152600e60248201527f53616c652068617320656e646564000000000000000000000000000000000000604482015260640161099d565b806121be60025490565b6121c89190613825565b600e546121d7906113886138a3565b10156122255760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d41585f535550504c590000000000000000000000000000604482015260640161099d565b61223781670214e8348c4f0000613806565b3410156122865760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742065746865722076616c75650000000000000000000000604482015260640161099d565b60005b81811015610ebb57600061229c60025490565b6122a7906001613825565b90506122b3338261289f565b50806122be8161383d565b915050612289565b6001600160a01b03821633141561231f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099d565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6123953383612971565b6124075760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099d565b61241384848484612cbc565b50505050565b6060612424826128b9565b6124705760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000604482015260640161099d565b600661247b83612d3a565b60405160200161248c9291906138d6565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146124ea5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015612577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259b919061397d565b6001600160a01b031614806125c857506001600160a01b0383166000908152600a602052604090205460ff165b156125d757600191505061093a565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146126515760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600c805461ff001981166101009182900460ff1615909102179055565b6005546001600160a01b031633146126b65760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b6001600160a01b0381166127325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161099d565b611ac681612c6a565b60005b81518110156124135761276b848484848151811061275e5761275e61388d565b6020026020010151610ebf565b806127758161383d565b91505061273e565b6005546001600160a01b031633146127c55760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b6001600160a01b03166000908152600a60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061285157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461093a565b6000826128968584612e6c565b14949350505050565b610ebb828260405180602001604052806000815250612f10565b6002546000908210801561093a575060006001600160a01b0316600283815481106128e6576128e661388d565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061293882611e07565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061297c826128b9565b6129dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161099d565b60006129e883611e07565b9050806001600160a01b0316846001600160a01b03161480612a235750836001600160a01b0316612a1884610c1d565b6001600160a01b0316145b806126015750612601818561250c565b826001600160a01b0316612a4682611e07565b6001600160a01b031614612ac25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161099d565b6001600160a01b038216612b3d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161099d565b612b48600082612903565b8160028281548110612b5c57612b5c61388d565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000612bc282846139b0565b15612bce576001612bd1565b60005b60ff16612bde83856139c4565b611cdd9190613825565b6000612bf382611e07565b9050612c00600083612903565b600060028381548110612c1557612c1561388d565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612cc7848484612a33565b612cd384848484612f8e565b6124135760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161099d565b606081612d7a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612da45780612d8e8161383d565b9150612d9d9050600a836139c4565b9150612d7e565b60008167ffffffffffffffff811115612dbf57612dbf613216565b6040519080825280601f01601f191660200182016040528015612de9576020820181803683370190505b5090505b841561260157612dfe6001836138a3565b9150612e0b600a866139b0565b612e16906030613825565b60f81b818381518110612e2b57612e2b61388d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e65600a866139c4565b9450612ded565b600081815b8451811015611b82576000858281518110612e8e57612e8e61388d565b60200260200101519050808311612ed0576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612efd565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612f088161383d565b915050612e71565b612f1a83836130d7565b612f276000848484612f8e565b610b865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161099d565b60006001600160a01b0384163b156130cc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fd29033908990889088906004016139d8565b6020604051808303816000875af192505050801561300d575060408051601f3d908101601f1916820190925261300a91810190613a14565b60015b6130b2573d80801561303b576040519150601f19603f3d011682016040523d82523d6000602084013e613040565b606091505b5080516130aa5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161099d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612601565b506001949350505050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461315f90613858565b90600052602060002090601f01602090048101928261318157600085556131c7565b82601f1061319a57805160ff19168380011785556131c7565b828001600101855582156131c7579182015b828111156131c75782518255916020019190600101906131ac565b50611d5e9291505b80821115611d5e57600081556001016131cf565b6001600160e01b031981168114611ac657600080fd5b60006020828403121561320b57600080fd5b8135611cdd816131e3565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561325557613255613216565b604052919050565b600067ffffffffffffffff82111561327757613277613216565b5060051b60200190565b6000806040838503121561329457600080fd5b8235915060208084013567ffffffffffffffff8111156132b357600080fd5b8401601f810186136132c457600080fd5b80356132d76132d28261325d565b61322c565b81815260059190911b820183019083810190888311156132f657600080fd5b928401925b82841015613314578335825292840192908401906132fb565b80955050505050509250929050565b60005b8381101561333e578181015183820152602001613326565b838111156124135750506000910152565b60008151808452613367816020860160208601613323565b601f01601f19169290920160200192915050565b602081526000611cdd602083018461334f565b6000602082840312156133a057600080fd5b5035919050565b6001600160a01b0381168114611ac657600080fd5b600080604083850312156133cf57600080fd5b82356133da816133a7565b946020939093013593505050565b600067ffffffffffffffff83111561340257613402613216565b613415601f8401601f191660200161322c565b905082815283838301111561342957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561345257600080fd5b813567ffffffffffffffff81111561346957600080fd5b8201601f8101841361347a57600080fd5b612601848235602084016133e8565b60008060006060848603121561349e57600080fd5b83356134a9816133a7565b925060208401356134b9816133a7565b929592945050506040919091013590565b6000602082840312156134dc57600080fd5b8135611cdd816133a7565b6020808252825182820181905260009190848201906040850190845b8181101561351f57835183529284019291840191600101613503565b50909695505050505050565b60008060006040848603121561354057600080fd5b833561354b816133a7565b9250602084013567ffffffffffffffff8082111561356857600080fd5b818601915086601f83011261357c57600080fd5b81358181111561358b57600080fd5b8760208260051b85010111156135a057600080fd5b6020830194508093505050509250925092565b600082601f8301126135c457600080fd5b813560206135d46132d28361325d565b82815260059290921b840181019181810190868411156135f357600080fd5b8286015b8481101561360e57803583529183019183016135f7565b509695505050505050565b600082601f83011261362a57600080fd5b611cdd838335602085016133e8565b6000806000806080858703121561364f57600080fd5b843561365a816133a7565b9350602085013561366a816133a7565b9250604085013567ffffffffffffffff8082111561368757600080fd5b613693888389016135b3565b935060608701359150808211156136a957600080fd5b506136b687828801613619565b91505092959194509250565b600080604083850312156136d557600080fd5b82356136e0816133a7565b9150602083013580151581146136f557600080fd5b809150509250929050565b6000806000806080858703121561371657600080fd5b8435613721816133a7565b93506020850135613731816133a7565b925060408501359150606085013567ffffffffffffffff81111561375457600080fd5b6136b687828801613619565b6000806040838503121561377357600080fd5b823561377e816133a7565b915060208301356136f5816133a7565b6000806000606084860312156137a357600080fd5b83356137ae816133a7565b925060208401356137be816133a7565b9150604084013567ffffffffffffffff8111156137da57600080fd5b6137e6868287016135b3565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613820576138206137f0565b500290565b60008219821115613838576138386137f0565b500190565b6000600019821415613851576138516137f0565b5060010190565b600181811c9082168061386c57607f821691505b6020821081141561209e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000828210156138b5576138b56137f0565b500390565b600081516138cc818560208601613323565b9290920192915050565b600080845481600182811c9150808316806138f257607f831692505b602080841082141561391257634e487b7160e01b86526022600452602486fd5b818015613926576001811461393757613964565b60ff19861689528489019650613964565b60008b81526020902060005b8681101561395c5781548b820152908501908301613943565b505084890196505b50505050505061397481856138ba565b95945050505050565b60006020828403121561398f57600080fd5b8151611cdd816133a7565b634e487b7160e01b600052601260045260246000fd5b6000826139bf576139bf61399a565b500690565b6000826139d3576139d361399a565b500490565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613a0a608083018461334f565b9695505050505050565b600060208284031215613a2657600080fd5b8151611cdd816131e356fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220394e98dfee9c47c924f60fbbd13b34e4262a7d58cc85c7c65dbb11fd8d8b8df764736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1ee1794837b77c0fddcd44e37e8702b09075a5644e28d2146fe32692a5d15920300000000000000000000000081cc8a4bb62ff93f62ec94e3aa40a3a862c543680000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d62774d6b3369356275794d41534d776d617a446a5478564477426a62536b6a7345704c6d464733337673627a2f00000000000000000000

Deployed Bytecode

0x60806040526004361061031e5760003560e01c80635a4fee30116101a557806395d89b41116100ec578063cd7c032611610095578063f03255491161006f578063f032554914610887578063f2fde38b1461089c578063f3993d11146108bc578063f73c814b146108dc57600080fd5b8063cd7c032614610827578063d26ea6c014610847578063e985e9c51461086757600080fd5b8063a22cb465116100c6578063a22cb465146107c7578063b88d4fde146107e7578063c87b56dd1461080757600080fd5b806395d89b41146107725780639ec00c9514610787578063a0712d68146107b457600080fd5b80636c0360eb1161014e578063715018a611610128578063715018a61461071f5780638462151c146107345780638da5cb5b1461075457600080fd5b80636c0360eb146106d557806370a08231146106ea578063714c53981461070a57600080fd5b8063676dd5631161017f578063676dd563146106845780636a5928f5146106a05780636b8dc355146106bf57600080fd5b80635a4fee30146106145780635bab26e2146106345780636352211e1461066457600080fd5b8063324c6adc11610269578063438b6300116102125780634f6ccce7116101ec5780634f6ccce7146105b857806355f804b3146105d8578063577ad34d146105f857600080fd5b8063438b63001461054b578063440bc7f3146105785780634d44660c1461059857600080fd5b80633ccfd60b116102435780633ccfd60b146104f657806342842e0e1461050b57806342966c681461052b57600080fd5b8063324c6adc146104ab57806332cb6b0c146104cb57806334918dfd146104e157600080fd5b806310969523116102cb5780631c8b232d116102a55780631c8b232d1461045157806323b872dd1461046b5780632f745c591461048b57600080fd5b806310969523146103fc57806318160ddd1461041c5780631bb7cc991461043b57600080fd5b8063081812fc116102fc578063081812fc1461038f578063095ea7b3146103c75780630f5447a0146103e757600080fd5b806301ffc9a714610323578063061431a81461035857806306fdde031461036d575b600080fd5b34801561032f57600080fd5b5061034361033e3660046131f9565b6108fc565b60405190151581526020015b60405180910390f35b61036b610366366004613281565b610940565b005b34801561037957600080fd5b50610382610b8b565b60405161034f919061337b565b34801561039b57600080fd5b506103af6103aa36600461338e565b610c1d565b6040516001600160a01b03909116815260200161034f565b3480156103d357600080fd5b5061036b6103e23660046133bc565b610ca5565b3480156103f357600080fd5b50610382610dd2565b34801561040857600080fd5b5061036b610417366004613440565b610e60565b34801561042857600080fd5b506002545b60405190815260200161034f565b34801561044757600080fd5b5061042d600d5481565b34801561045d57600080fd5b50600c546103439060ff1681565b34801561047757600080fd5b5061036b610486366004613489565b610ebf565b34801561049757600080fd5b5061042d6104a63660046133bc565b610f47565b3480156104b757600080fd5b5061036b6104c63660046133bc565b611082565b3480156104d757600080fd5b5061042d61138881565b3480156104ed57600080fd5b5061036b6111d6565b34801561050257600080fd5b5061036b611232565b34801561051757600080fd5b5061036b610526366004613489565b611ac9565b34801561053757600080fd5b5061036b61054636600461338e565b611ae4565b34801561055757600080fd5b5061056b6105663660046134ca565b611b42565b60405161034f91906134e7565b34801561058457600080fd5b5061036b61059336600461338e565b611c15565b3480156105a457600080fd5b506103436105b336600461352b565b611c62565b3480156105c457600080fd5b5061042d6105d336600461338e565b611ce4565b3480156105e457600080fd5b5061036b6105f3366004613440565b611d62565b34801561060457600080fd5b5061042d67016345785d8a000081565b34801561062057600080fd5b5061036b61062f366004613639565b611dbd565b34801561064057600080fd5b5061034361064f3660046134ca565b600a6020526000908152604090205460ff1681565b34801561067057600080fd5b506103af61067f36600461338e565b611e07565b34801561069057600080fd5b5061042d670214e8348c4f000081565b3480156106ac57600080fd5b50600c5461034390610100900460ff1681565b3480156106cb57600080fd5b5061042d6105dc81565b3480156106e157600080fd5b50610382611ea7565b3480156106f657600080fd5b5061042d6107053660046134ca565b611eb4565b34801561071657600080fd5b50610382611f95565b34801561072b57600080fd5b5061036b611fa4565b34801561074057600080fd5b5061056b61074f3660046134ca565b611ff8565b34801561076057600080fd5b506005546001600160a01b03166103af565b34801561077e57600080fd5b506103826120a4565b34801561079357600080fd5b5061042d6107a23660046134ca565b600b6020526000908152604090205481565b61036b6107c236600461338e565b6120b3565b3480156107d357600080fd5b5061036b6107e23660046136c2565b6122c6565b3480156107f357600080fd5b5061036b610802366004613700565b61238b565b34801561081357600080fd5b5061038261082236600461338e565b612419565b34801561083357600080fd5b506007546103af906001600160a01b031681565b34801561085357600080fd5b5061036b6108623660046134ca565b6124a2565b34801561087357600080fd5b50610343610882366004613760565b61250c565b34801561089357600080fd5b5061036b612609565b3480156108a857600080fd5b5061036b6108b73660046134ca565b61266e565b3480156108c857600080fd5b5061036b6108d736600461378e565b61273b565b3480156108e857600080fd5b5061036b6108f73660046134ca565b61277d565b60006001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000148061093a575061093a826127ee565b92915050565b6109528267016345785d8a0000613806565b3410156109a65760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742065746865722076616c7565000000000000000000000060448201526064015b60405180910390fd5b600c54610100900460ff166109fd5760405162461bcd60e51b815260206004820152601760248201527f50726573616c6520686173206e6f742073746172746564000000000000000000604482015260640161099d565b6105dc610a0960025490565b10610a565760405162461bcd60e51b815260206004820152601160248201527f50726573616c652068617320656e646564000000000000000000000000000000604482015260640161099d565b6004610a6133611eb4565b610a6b9084613825565b10610ab85760405162461bcd60e51b815260206004820152601860248201527f4d6178206f662033206e667473207065722077616c6c65740000000000000000604482015260640161099d565b600d546040516bffffffffffffffffffffffff193360601b166020820152610afa91839160340160405160208183030381529060405280519060200120612889565b610b465760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f7420696e207468652077686974656c69737400000000604482015260640161099d565b60005b82811015610b86576000610b5c60025490565b610b67906001613825565b9050610b73338261289f565b5080610b7e8161383d565b915050610b49565b505050565b606060008054610b9a90613858565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc690613858565b8015610c135780601f10610be857610100808354040283529160200191610c13565b820191906000526020600020905b815481529060010190602001808311610bf657829003601f168201915b5050505050905090565b6000610c28826128b9565b610c895760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161099d565b506000908152600360205260409020546001600160a01b031690565b6000610cb082611e07565b9050806001600160a01b0316836001600160a01b03161415610d3a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161099d565b336001600160a01b0382161480610d565750610d56813361250c565b610dc85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161099d565b610b868383612903565b60088054610ddf90613858565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0b90613858565b8015610e585780601f10610e2d57610100808354040283529160200191610e58565b820191906000526020600020905b815481529060010190602001808311610e3b57829003601f168201915b505050505081565b6005546001600160a01b03163314610ea85760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b8051610ebb906008906020840190613153565b5050565b610eca335b82612971565b610f3c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099d565b610b86838383612a33565b6000610f5283611eb4565b8210610fb45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099d565b6000805b6002548110156110255760028181548110610fd557610fd561388d565b6000918252602090912001546001600160a01b0386811691161415611013578382141561100557915061093a9050565b8161100f8161383d565b9250505b8061101d8161383d565b915050610fb8565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161099d565b6005546001600160a01b031633146110ca5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600e5481111561111c5760405162461bcd60e51b815260206004820152601060248201527f496e636f727265637420616d6f756e7400000000000000000000000000000000604482015260640161099d565b600e54600f5461112c9083613825565b111561117a5760405162461bcd60e51b815260206004820152600c60248201527f4e46547320636c61696d65640000000000000000000000000000000000000000604482015260640161099d565b60005b818110156111ba57600061119060025490565b61119b906001613825565b90506111a7848261289f565b50806111b28161383d565b91505061117d565b5080600f60008282546111cd9190613825565b90915550505050565b6005546001600160a01b0316331461121e5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600c805460ff19811660ff90911615179055565b6005546001600160a01b0316331461127a5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600047116112ca5760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206d75737420686176652062616c616e6365000000000000604482015260640161099d565b60006112d847612710612bb6565b9050737a6c41c001d6fbf4ae6022e936b24d0d39ae3a256108fc6112fd8360ff613806565b6040518115909202916000818181858888f193505050506113515760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b736ec4eaa315aba37b7558a66c51d0dd4986128bcb6108fc6113748360ff613806565b6040518115909202916000818181858888f193505050506113c85760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b732954f886f9e118f4a680d4b65627ca6b6f6094b36108fc6113ec8361026c613806565b6040518115909202916000818181858888f193505050506114405760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7337b8c37eb031312c5daaa02fd5bad9dc380a8cc46108fc611463836064613806565b6040518115909202916000818181858888f193505050506114b75760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b73cc2ba3c4e74a531635b928d2ac5b3f176c8b6ec36108fc6114db83610104613806565b6040518115909202916000818181858888f1935050505061152f5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b73c970bd4e2df5f33ea62c72b9c3d808b8a609e5e16108fc61155383610244613806565b6040518115909202916000818181858888f193505050506115a75760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7302916d0f68a02c502476dc630628b01ee36a78266108fc6115ca83603c613806565b6040518115909202916000818181858888f1935050505061161e5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b732c1ba2909a0dc98a6219079fbe9a4ab23517d47e6108fc61164183603c613806565b6040518115909202916000818181858888f193505050506116955760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7338ca9daacb4d5e493132c2fe9507bbaee4ab86ac6108fc6116b883603c613806565b6040518115909202916000818181858888f1935050505061170c5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7350a583ab2432bf3bc5e7458c8ed10bc5ec3ab23e6108fc6117308361026c613806565b6040518115909202916000818181858888f193505050506117845760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7358ee6f81ae4ed77e8dc50344ab7571ea7a75a9b76108fc6117a7836018613806565b6040518115909202916000818181858888f193505050506117fb5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7310f3667970fad7da441261c80727cacd8b1648066108fc61181f83610398613806565b6040518115909202916000818181858888f193505050506118735760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7341b6cb632f5707bf80a1c904316b19fcbee2a4cf6108fc61189683603c613806565b6040518115909202916000818181858888f193505050506118ea5760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b733b0f95d44f629e8e24a294799c4a1d21f06b69696108fc61190d8360e2613806565b6040518115909202916000818181858888f193505050506119615760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b7377bc272c4a7c051a615f11e515259fa6376936ed6108fc61198483603c613806565b6040518115909202916000818181858888f193505050506119d85760405162461bcd60e51b815260206004820152600e60248201526d14185e5b595b9d0819985a5b195960921b604482015260640161099d565b739d7a3f970bbc7ab9c8537dc9637051b824a9ed0c6108fc6119fc836103e8613806565b6040518115909202916000818181858888f19350505050611a5f5760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e7420746f20646576656c6f70657273206661696c656400000000604482015260640161099d565b60405133904780156108fc02916000818181858888f19350505050611ac65760405162461bcd60e51b815260206004820152601160248201527f5769746864726177616c206661696c6564000000000000000000000000000000604482015260640161099d565b50565b610b868383836040518060200160405280600081525061238b565b611aed33610ec4565b611b395760405162461bcd60e51b815260206004820152601560248201527f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000604482015260640161099d565b611ac681612be8565b60606000611b4f83611eb4565b905080611b8a5760005b604051908082528060200260200182016040528015611b82578160200160208202803683370190505b509392505050565b60008167ffffffffffffffff811115611ba557611ba5613216565b604051908082528060200260200182016040528015611bce578160200160208202803683370190505b50905060005b82811015611b8257611be68582610f47565b828281518110611bf857611bf861388d565b602090810291909101015280611c0d8161383d565b915050611bd4565b6005546001600160a01b03163314611c5d5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600d55565b6000805b82811015611cd757846001600160a01b03166002858584818110611c8c57611c8c61388d565b9050602002013581548110611ca357611ca361388d565b6000918252602090912001546001600160a01b031614611cc7576000915050611cdd565b611cd08161383d565b9050611c66565b50600190505b9392505050565b6002546000908210611d5e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161099d565b5090565b6005546001600160a01b03163314611daa5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b8051610ebb906006906020840190613153565b60005b8251811015611e0057611dee8585858481518110611de057611de061388d565b60200260200101518561238b565b80611df88161383d565b915050611dc0565b5050505050565b60008060028381548110611e1d57611e1d61388d565b6000918252602090912001546001600160a01b031690508061093a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161099d565b60068054610ddf90613858565b60006001600160a01b038216611f325760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161099d565b6000805b600254811015611f8e5760028181548110611f5357611f5361388d565b6000918252602090912001546001600160a01b0385811691161415611f7e57611f7b8261383d565b91505b611f878161383d565b9050611f36565b5092915050565b606060098054610b9a90613858565b6005546001600160a01b03163314611fec5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b611ff66000612c6a565b565b6060600061200583611eb4565b905080612013576000611b59565b60008167ffffffffffffffff81111561202e5761202e613216565b604051908082528060200260200182016040528015612057578160200160208202803683370190505b50905060005b82811015611b825761206f8582610f47565b8282815181106120815761208161388d565b6020908102919091010152806120968161383d565b91505061205d565b50919050565b606060018054610b9a90613858565b600c5460ff166121055760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f742073746172746564000000000000000000000000604482015260640161099d565b600681106121555760405162461bcd60e51b815260206004820152601460248201527f4d6178206f662035206e66747320706572207478000000000000000000000000604482015260640161099d565b600254600e54612167906113886138a3565b116121b45760405162461bcd60e51b815260206004820152600e60248201527f53616c652068617320656e646564000000000000000000000000000000000000604482015260640161099d565b806121be60025490565b6121c89190613825565b600e546121d7906113886138a3565b10156122255760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d41585f535550504c590000000000000000000000000000604482015260640161099d565b61223781670214e8348c4f0000613806565b3410156122865760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742065746865722076616c75650000000000000000000000604482015260640161099d565b60005b81811015610ebb57600061229c60025490565b6122a7906001613825565b90506122b3338261289f565b50806122be8161383d565b915050612289565b6001600160a01b03821633141561231f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161099d565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6123953383612971565b6124075760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161099d565b61241384848484612cbc565b50505050565b6060612424826128b9565b6124705760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000604482015260640161099d565b600661247b83612d3a565b60405160200161248c9291906138d6565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146124ea5760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015612577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259b919061397d565b6001600160a01b031614806125c857506001600160a01b0383166000908152600a602052604090205460ff165b156125d757600191505061093a565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146126515760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b600c805461ff001981166101009182900460ff1615909102179055565b6005546001600160a01b031633146126b65760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b6001600160a01b0381166127325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161099d565b611ac681612c6a565b60005b81518110156124135761276b848484848151811061275e5761275e61388d565b6020026020010151610ebf565b806127758161383d565b91505061273e565b6005546001600160a01b031633146127c55760405162461bcd60e51b81526020600482018190526024820152600080516020613a32833981519152604482015260640161099d565b6001600160a01b03166000908152600a60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061285157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461093a565b6000826128968584612e6c565b14949350505050565b610ebb828260405180602001604052806000815250612f10565b6002546000908210801561093a575060006001600160a01b0316600283815481106128e6576128e661388d565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061293882611e07565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061297c826128b9565b6129dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161099d565b60006129e883611e07565b9050806001600160a01b0316846001600160a01b03161480612a235750836001600160a01b0316612a1884610c1d565b6001600160a01b0316145b806126015750612601818561250c565b826001600160a01b0316612a4682611e07565b6001600160a01b031614612ac25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161099d565b6001600160a01b038216612b3d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161099d565b612b48600082612903565b8160028281548110612b5c57612b5c61388d565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000612bc282846139b0565b15612bce576001612bd1565b60005b60ff16612bde83856139c4565b611cdd9190613825565b6000612bf382611e07565b9050612c00600083612903565b600060028381548110612c1557612c1561388d565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612cc7848484612a33565b612cd384848484612f8e565b6124135760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161099d565b606081612d7a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612da45780612d8e8161383d565b9150612d9d9050600a836139c4565b9150612d7e565b60008167ffffffffffffffff811115612dbf57612dbf613216565b6040519080825280601f01601f191660200182016040528015612de9576020820181803683370190505b5090505b841561260157612dfe6001836138a3565b9150612e0b600a866139b0565b612e16906030613825565b60f81b818381518110612e2b57612e2b61388d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e65600a866139c4565b9450612ded565b600081815b8451811015611b82576000858281518110612e8e57612e8e61388d565b60200260200101519050808311612ed0576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612efd565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612f088161383d565b915050612e71565b612f1a83836130d7565b612f276000848484612f8e565b610b865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161099d565b60006001600160a01b0384163b156130cc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fd29033908990889088906004016139d8565b6020604051808303816000875af192505050801561300d575060408051601f3d908101601f1916820190925261300a91810190613a14565b60015b6130b2573d80801561303b576040519150601f19603f3d011682016040523d82523d6000602084013e613040565b606091505b5080516130aa5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161099d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612601565b506001949350505050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461315f90613858565b90600052602060002090601f01602090048101928261318157600085556131c7565b82601f1061319a57805160ff19168380011785556131c7565b828001600101855582156131c7579182015b828111156131c75782518255916020019190600101906131ac565b50611d5e9291505b80821115611d5e57600081556001016131cf565b6001600160e01b031981168114611ac657600080fd5b60006020828403121561320b57600080fd5b8135611cdd816131e3565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561325557613255613216565b604052919050565b600067ffffffffffffffff82111561327757613277613216565b5060051b60200190565b6000806040838503121561329457600080fd5b8235915060208084013567ffffffffffffffff8111156132b357600080fd5b8401601f810186136132c457600080fd5b80356132d76132d28261325d565b61322c565b81815260059190911b820183019083810190888311156132f657600080fd5b928401925b82841015613314578335825292840192908401906132fb565b80955050505050509250929050565b60005b8381101561333e578181015183820152602001613326565b838111156124135750506000910152565b60008151808452613367816020860160208601613323565b601f01601f19169290920160200192915050565b602081526000611cdd602083018461334f565b6000602082840312156133a057600080fd5b5035919050565b6001600160a01b0381168114611ac657600080fd5b600080604083850312156133cf57600080fd5b82356133da816133a7565b946020939093013593505050565b600067ffffffffffffffff83111561340257613402613216565b613415601f8401601f191660200161322c565b905082815283838301111561342957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561345257600080fd5b813567ffffffffffffffff81111561346957600080fd5b8201601f8101841361347a57600080fd5b612601848235602084016133e8565b60008060006060848603121561349e57600080fd5b83356134a9816133a7565b925060208401356134b9816133a7565b929592945050506040919091013590565b6000602082840312156134dc57600080fd5b8135611cdd816133a7565b6020808252825182820181905260009190848201906040850190845b8181101561351f57835183529284019291840191600101613503565b50909695505050505050565b60008060006040848603121561354057600080fd5b833561354b816133a7565b9250602084013567ffffffffffffffff8082111561356857600080fd5b818601915086601f83011261357c57600080fd5b81358181111561358b57600080fd5b8760208260051b85010111156135a057600080fd5b6020830194508093505050509250925092565b600082601f8301126135c457600080fd5b813560206135d46132d28361325d565b82815260059290921b840181019181810190868411156135f357600080fd5b8286015b8481101561360e57803583529183019183016135f7565b509695505050505050565b600082601f83011261362a57600080fd5b611cdd838335602085016133e8565b6000806000806080858703121561364f57600080fd5b843561365a816133a7565b9350602085013561366a816133a7565b9250604085013567ffffffffffffffff8082111561368757600080fd5b613693888389016135b3565b935060608701359150808211156136a957600080fd5b506136b687828801613619565b91505092959194509250565b600080604083850312156136d557600080fd5b82356136e0816133a7565b9150602083013580151581146136f557600080fd5b809150509250929050565b6000806000806080858703121561371657600080fd5b8435613721816133a7565b93506020850135613731816133a7565b925060408501359150606085013567ffffffffffffffff81111561375457600080fd5b6136b687828801613619565b6000806040838503121561377357600080fd5b823561377e816133a7565b915060208301356136f5816133a7565b6000806000606084860312156137a357600080fd5b83356137ae816133a7565b925060208401356137be816133a7565b9150604084013567ffffffffffffffff8111156137da57600080fd5b6137e6868287016135b3565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613820576138206137f0565b500290565b60008219821115613838576138386137f0565b500190565b6000600019821415613851576138516137f0565b5060010190565b600181811c9082168061386c57607f821691505b6020821081141561209e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000828210156138b5576138b56137f0565b500390565b600081516138cc818560208601613323565b9290920192915050565b600080845481600182811c9150808316806138f257607f831692505b602080841082141561391257634e487b7160e01b86526022600452602486fd5b818015613926576001811461393757613964565b60ff19861689528489019650613964565b60008b81526020902060005b8681101561395c5781548b820152908501908301613943565b505084890196505b50505050505061397481856138ba565b95945050505050565b60006020828403121561398f57600080fd5b8151611cdd816133a7565b634e487b7160e01b600052601260045260246000fd5b6000826139bf576139bf61399a565b500690565b6000826139d3576139d361399a565b500490565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613a0a608083018461334f565b9695505050505050565b600060208284031215613a2657600080fd5b8151611cdd816131e356fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220394e98dfee9c47c924f60fbbd13b34e4262a7d58cc85c7c65dbb11fd8d8b8df764736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1ee1794837b77c0fddcd44e37e8702b09075a5644e28d2146fe32692a5d15920300000000000000000000000081cc8a4bb62ff93f62ec94e3aa40a3a862c543680000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d62774d6b3369356275794d41534d776d617a446a5478564477426a62536b6a7345704c6d464733337673627a2f00000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://QmbwMk3i5buyMASMwmazDjTxVDwBjbSkjsEpLmFG33vsbz/
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [2] : _whitelist (bytes32): 0xee1794837b77c0fddcd44e37e8702b09075a5644e28d2146fe32692a5d159203
Arg [3] : _owner (address): 0x81cc8A4bb62fF93f62EC94e3AA40A3A862c54368

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [2] : ee1794837b77c0fddcd44e37e8702b09075a5644e28d2146fe32692a5d159203
Arg [3] : 00000000000000000000000081cc8a4bb62ff93f62ec94e3aa40a3a862c54368
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [5] : 697066733a2f2f516d62774d6b3369356275794d41534d776d617a446a547856
Arg [6] : 4477426a62536b6a7345704c6d464733337673627a2f00000000000000000000


Deployed Bytecode Sourcemap

39760:8670:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28672:224;;;;;;;;;;-1:-1:-1;28672:224:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;28672:224:0;;;;;;;;42750:635;;;;;;:::i;:::-;;:::i;:::-;;17249:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18061:308::-;;;;;;;;;;-1:-1:-1;18061:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3381:55:1;;;3363:74;;3351:2;3336:18;18061:308:0;3217:226:1;17584:411:0;;;;;;;;;;-1:-1:-1;17584:411:0;;;;;:::i;:::-;;:::i;39973:34::-;;;;;;;;;;;;;:::i;46566:119::-;;;;;;;;;;-1:-1:-1;46566:119:0;;;;;:::i;:::-;;:::i;28972:110::-;;;;;;;;;;-1:-1:-1;29060:7:0;:14;28972:110;;;4941:25:1;;;4929:2;4914:18;28972:110:0;4795:177:1;40693:24:0;;;;;;;;;;;;;;;;40300:34;;;;;;;;;;-1:-1:-1;40300:34:0;;;;;;;;19120:376;;;;;;;;;;-1:-1:-1;19120:376:0;;;;;:::i;:::-;;:::i;29448:490::-;;;;;;;;;;-1:-1:-1;29448:490:0;;;;;:::i;:::-;;:::i;42392:352::-;;;;;;;;;;-1:-1:-1;42392:352:0;;;;;:::i;:::-;;:::i;40105:38::-;;;;;;;;;;;;40139:4;40105:38;;43931:87;;;;;;;;;;;;;:::i;44322:2238::-;;;;;;;;;;;;;:::i;19567:185::-;;;;;;;;;;-1:-1:-1;19567:185:0;;;;;:::i;:::-;;:::i;46691:148::-;;;;;;;;;;-1:-1:-1;46691:148:0;;;;;:::i;:::-;;:::i;46845:370::-;;;;;;;;;;-1:-1:-1;46845:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41106:94::-;;;;;;;;;;-1:-1:-1;41106:94:0;;;;;:::i;:::-;;:::i;47680:249::-;;;;;;;;;;-1:-1:-1;47680:249:0;;;;;:::i;:::-;;:::i;29159:205::-;;;;;;;;;;-1:-1:-1;29159:205:0;;;;;:::i;:::-;;:::i;41206:92::-;;;;;;;;;;-1:-1:-1;41206:92:0;;;;;:::i;:::-;;:::i;40398:62::-;;;;;;;;;;;;40442:18;40398:62;;47433:241;;;;;;;;;;-1:-1:-1;47433:241:0;;;;;:::i;:::-;;:::i;40199:44::-;;;;;;;;;;-1:-1:-1;40199:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16856:326;;;;;;;;;;-1:-1:-1;16856:326:0;;;;;:::i;:::-;;:::i;40035:54::-;;;;;;;;;;;;40071:18;40035:54;;40339:37;;;;;;;;;;-1:-1:-1;40339:37:0;;;;;;;;;;;40476:46;;;;;;;;;;;;40518:4;40476:46;;39839:21;;;;;;;;;;;;;:::i;16402:392::-;;;;;;;;;;-1:-1:-1;16402:392:0;;;;;:::i;:::-;;:::i;41814:92::-;;;;;;;;;;;;;:::i;31656:103::-;;;;;;;;;;;;;:::i;41914:472::-;;;;;;;;;;-1:-1:-1;41914:472:0;;;;;:::i;:::-;;:::i;31005:87::-;;;;;;;;;;-1:-1:-1;31078:6:0;;-1:-1:-1;;;;;31078:6:0;31005:87;;17418:104;;;;;;;;;;;;;:::i;40248:47::-;;;;;;;;;;-1:-1:-1;40248:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;43391:534;;;;;;:::i;:::-;;:::i;18441:327::-;;;;;;;;;;-1:-1:-1;18441:327:0;;;;;:::i;:::-;;:::i;19823:365::-;;;;;;;;;;-1:-1:-1;19823:365:0;;;;;:::i;:::-;;:::i;41304:220::-;;;;;;;;;;-1:-1:-1;41304:220:0;;;;;:::i;:::-;;:::i;39914:35::-;;;;;;;;;;-1:-1:-1;39914:35:0;;;;-1:-1:-1;;;;;39914:35:0;;;41530:140;;;;;;;;;;-1:-1:-1;41530:140:0;;;;;:::i;:::-;;:::i;47935:342::-;;;;;;;;;;-1:-1:-1;47935:342:0;;;;;:::i;:::-;;:::i;44026:96::-;;;;;;;;;;;;;:::i;31914:201::-;;;;;;;;;;-1:-1:-1;31914:201:0;;;;;:::i;:::-;;:::i;47221:206::-;;;;;;;;;;-1:-1:-1;47221:206:0;;;;;:::i;:::-;;:::i;41676:132::-;;;;;;;;;;-1:-1:-1;41676:132:0;;;;;:::i;:::-;;:::i;28672:224::-;28774:4;-1:-1:-1;;;;;;28798:50:0;;28813:35;28798:50;;:90;;;28852:36;28876:11;28852:23;:36::i;:::-;28791:97;28672:224;-1:-1:-1;;28672:224:0:o;42750:635::-;42857:27;42877:7;40442:18;42857:27;:::i;:::-;42844:9;:40;;42836:74;;;;-1:-1:-1;;;42836:74:0;;11868:2:1;42836:74:0;;;11850:21:1;11907:2;11887:18;;;11880:30;11946:23;11926:18;;;11919:51;11987:18;;42836:74:0;;;;;;;;;42925:17;;;;;;;42917:53;;;;-1:-1:-1;;;42917:53:0;;12218:2:1;42917:53:0;;;12200:21:1;12257:2;12237:18;;;12230:30;12296:25;12276:18;;;12269:53;12339:18;;42917:53:0;12016:347:1;42917:53:0;40518:4;42985:13;29060:7;:14;;28972:110;42985:13;:34;42977:64;;;;-1:-1:-1;;;42977:64:0;;12570:2:1;42977:64:0;;;12552:21:1;12609:2;12589:18;;;12582:30;12648:19;12628:18;;;12621:47;12685:18;;42977:64:0;12368:341:1;42977:64:0;43090:1;43066:21;43076:10;43066:9;:21::i;:::-;43056:31;;:7;:31;:::i;:::-;:35;43048:72;;;;-1:-1:-1;;;43048:72:0;;13049:2:1;43048:72:0;;;13031:21:1;13088:2;13068:18;;;13061:30;13127:26;13107:18;;;13100:54;13171:18;;43048:72:0;12847:348:1;43048:72:0;43161:9;;43182:28;;-1:-1:-1;;43199:10:0;13349:2:1;13345:15;13341:53;43182:28:0;;;13329:66:1;43135:77:0;;43154:5;;13411:12:1;;43182:28:0;;;;;;;;;;;;43172:39;;;;;;43135:18;:77::i;:::-;43127:118;;;;-1:-1:-1;;;43127:118:0;;13636:2:1;43127:118:0;;;13618:21:1;13675:2;13655:18;;;13648:30;13714;13694:18;;;13687:58;13762:18;;43127:118:0;13434:352:1;43127:118:0;43257:6;43252:127;43273:7;43269:1;:11;43252:127;;;43296:14;43313:13;29060:7;:14;;28972:110;43313:13;:17;;43329:1;43313:17;:::i;:::-;43296:34;;43339:32;43349:10;43361:9;43339;:32::i;:::-;-1:-1:-1;43282:3:0;;;;:::i;:::-;;;;43252:127;;;;42750:635;;:::o;17249:100::-;17303:13;17336:5;17329:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17249:100;:::o;18061:308::-;18182:7;18229:16;18237:7;18229;:16::i;:::-;18207:110;;;;-1:-1:-1;;;18207:110:0;;14575:2:1;18207:110:0;;;14557:21:1;14614:2;14594:18;;;14587:30;14653:34;14633:18;;;14626:62;-1:-1:-1;;;14704:18:1;;;14697:42;14756:19;;18207:110:0;14373:408:1;18207:110:0;-1:-1:-1;18337:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;18337:24:0;;18061:308::o;17584:411::-;17665:13;17681:23;17696:7;17681:14;:23::i;:::-;17665:39;;17729:5;-1:-1:-1;;;;;17723:11:0;:2;-1:-1:-1;;;;;17723:11:0;;;17715:57;;;;-1:-1:-1;;;17715:57:0;;14988:2:1;17715:57:0;;;14970:21:1;15027:2;15007:18;;;15000:30;15066:34;15046:18;;;15039:62;15137:3;15117:18;;;15110:31;15158:19;;17715:57:0;14786:397:1;17715:57:0;15051:10;-1:-1:-1;;;;;17807:21:0;;;;:62;;-1:-1:-1;17832:37:0;17849:5;15051:10;47935:342;:::i;17832:37::-;17785:168;;;;-1:-1:-1;;;17785:168:0;;15390:2:1;17785:168:0;;;15372:21:1;15429:2;15409:18;;;15402:30;15468:34;15448:18;;;15441:62;15539:26;15519:18;;;15512:54;15583:19;;17785:168:0;15188:420:1;17785:168:0;17966:21;17975:2;17979:7;17966:8;:21::i;39973:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46566:119::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;46647:32;;::::1;::::0;:15:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46566:119:::0;:::o;19120:376::-;19329:41;15051:10;19348:12;19362:7;19329:18;:41::i;:::-;19307:140;;;;-1:-1:-1;;;19307:140:0;;16176:2:1;19307:140:0;;;16158:21:1;16215:2;16195:18;;;16188:30;16254:34;16234:18;;;16227:62;16325:19;16305:18;;;16298:47;16362:19;;19307:140:0;15974:413:1;19307:140:0;19460:28;19470:4;19476:2;19480:7;19460:9;:28::i;29448:490::-;29545:15;29589:16;29599:5;29589:9;:16::i;:::-;29581:5;:24;29573:80;;;;-1:-1:-1;;;29573:80:0;;16594:2:1;29573:80:0;;;16576:21:1;16633:2;16613:18;;;16606:30;16672:34;16652:18;;;16645:62;-1:-1:-1;;;16723:18:1;;;16716:41;16774:19;;29573:80:0;16392:407:1;29573:80:0;29666:10;29691:6;29687:178;29703:7;:14;29699:18;;29687:178;;;29750:7;29758:1;29750:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;29741:19:0;;;29750:10;;29741:19;29738:116;;;29792:5;29783;:14;29780:58;;;29806:1;-1:-1:-1;29799:8:0;;-1:-1:-1;29799:8:0;29780:58;29831:7;;;;:::i;:::-;;;;29780:58;29719:3;;;;:::i;:::-;;;;29687:178;;;-1:-1:-1;29877:53:0;;-1:-1:-1;;;29877:53:0;;16594:2:1;29877:53:0;;;16576:21:1;16633:2;16613:18;;;16606:30;16672:34;16652:18;;;16645:62;-1:-1:-1;;;16723:18:1;;;16716:41;16774:19;;29877:53:0;16392:407:1;42392:352:0;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;42480:14:::1;;42470:6;:24;;42462:53;;;::::0;-1:-1:-1;;;42462:53:0;;17195:2:1;42462:53:0::1;::::0;::::1;17177:21:1::0;17234:2;17214:18;;;17207:30;17273:18;17253;;;17246:46;17309:18;;42462:53:0::1;16993:340:1::0;42462:53:0::1;42554:14;::::0;42539:11:::1;::::0;42530:20:::1;::::0;:6;:20:::1;:::i;:::-;:38;;42522:63;;;::::0;-1:-1:-1;;;42522:63:0;;17540:2:1;42522:63:0::1;::::0;::::1;17522:21:1::0;17579:2;17559:18;;;17552:30;17618:14;17598:18;;;17591:42;17650:18;;42522:63:0::1;17338:336:1::0;42522:63:0::1;42597:6;42592:119;42613:6;42609:1;:10;42592:119;;;42635:14;42652:13;29060:7:::0;:14;;28972:110;42652:13:::1;:17;::::0;42668:1:::1;42652:17;:::i;:::-;42635:34;;42678:25;42688:3;42693:9;42678;:25::i;:::-;-1:-1:-1::0;42621:3:0;::::1;::::0;::::1;:::i;:::-;;;;42592:119;;;;42732:6;42717:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;42392:352:0:o;43931:87::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;43998:14:::1;::::0;;-1:-1:-1;;43980:32:0;::::1;43998:14;::::0;;::::1;43997:15;43980:32;::::0;;43931:87::o;44322:2238::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;44398:1:::1;44374:21;:25;44366:64;;;::::0;-1:-1:-1;;;44366:64:0;;17881:2:1;44366:64:0::1;::::0;::::1;17863:21:1::0;17920:2;17900:18;;;17893:30;17959:28;17939:18;;;17932:56;18005:18;;44366:64:0::1;17679:350:1::0;44366:64:0::1;44439:12;44454:37;44462:21;44485:5;44454:7;:37::i;:::-;44439:52:::0;-1:-1:-1;44638:42:0::1;44630:68;44687:10;44439:52:::0;44694:3:::1;44687:10;:::i;:::-;44630:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;44622:95;;;::::0;-1:-1:-1;;;44622:95:0;;18236:2:1;44622:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;44622:95:0::1;18034:338:1::0;44622:95:0::1;44749:42;44741:68;44798:10;:4:::0;44805:3:::1;44798:10;:::i;:::-;44741:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;44733:95;;;::::0;-1:-1:-1;;;44733:95:0;;18236:2:1;44733:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;44733:95:0::1;18034:338:1::0;44733:95:0::1;44860:42;44852:68;44909:10;:4:::0;44916:3:::1;44909:10;:::i;:::-;44852:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;44844:95;;;::::0;-1:-1:-1;;;44844:95:0;;18236:2:1;44844:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;44844:95:0::1;18034:338:1::0;44844:95:0::1;44971:42;44963:68;45020:10;:4:::0;45027:3:::1;45020:10;:::i;:::-;44963:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;44955:95;;;::::0;-1:-1:-1;;;44955:95:0;;18236:2:1;44955:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;44955:95:0::1;18034:338:1::0;44955:95:0::1;45080:42;45072:68;45129:10;:4:::0;45136:3:::1;45129:10;:::i;:::-;45072:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45064:95;;;::::0;-1:-1:-1;;;45064:95:0;;18236:2:1;45064:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45064:95:0::1;18034:338:1::0;45064:95:0::1;45191:42;45183:68;45240:10;:4:::0;45247:3:::1;45240:10;:::i;:::-;45183:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45175:95;;;::::0;-1:-1:-1;;;45175:95:0;;18236:2:1;45175:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45175:95:0::1;18034:338:1::0;45175:95:0::1;45302:42;45294:67;45351:9;:4:::0;45358:2:::1;45351:9;:::i;:::-;45294:67;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45286:94;;;::::0;-1:-1:-1;;;45286:94:0;;18236:2:1;45286:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45286:94:0::1;18034:338:1::0;45286:94:0::1;45411:42;45403:67;45460:9;:4:::0;45467:2:::1;45460:9;:::i;:::-;45403:67;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45395:94;;;::::0;-1:-1:-1;;;45395:94:0;;18236:2:1;45395:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45395:94:0::1;18034:338:1::0;45395:94:0::1;45520:42;45512:67;45569:9;:4:::0;45576:2:::1;45569:9;:::i;:::-;45512:67;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45504:94;;;::::0;-1:-1:-1;;;45504:94:0;;18236:2:1;45504:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45504:94:0::1;18034:338:1::0;45504:94:0::1;45629:42;45621:68;45678:10;:4:::0;45685:3:::1;45678:10;:::i;:::-;45621:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45613:95;;;::::0;-1:-1:-1;;;45613:95:0;;18236:2:1;45613:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45613:95:0::1;18034:338:1::0;45613:95:0::1;45740:42;45732:67;45789:9;:4:::0;45796:2:::1;45789:9;:::i;:::-;45732:67;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45724:94;;;::::0;-1:-1:-1;;;45724:94:0;;18236:2:1;45724:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45724:94:0::1;18034:338:1::0;45724:94:0::1;45850:42;45842:68;45899:10;:4:::0;45906:3:::1;45899:10;:::i;:::-;45842:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45834:95;;;::::0;-1:-1:-1;;;45834:95:0;;18236:2:1;45834:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45834:95:0::1;18034:338:1::0;45834:95:0::1;45961:42;45953:67;46010:9;:4:::0;46017:2:::1;46010:9;:::i;:::-;45953:67;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;45945:94;;;::::0;-1:-1:-1;;;45945:94:0;;18236:2:1;45945:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;45945:94:0::1;18034:338:1::0;45945:94:0::1;46070:42;46062:68;46119:10;:4:::0;46126:3:::1;46119:10;:::i;:::-;46062:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;46054:95;;;::::0;-1:-1:-1;;;46054:95:0;;18236:2:1;46054:95:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;46054:95:0::1;18034:338:1::0;46054:95:0::1;46181:42;46173:67;46230:9;:4:::0;46237:2:::1;46230:9;:::i;:::-;46173:67;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;46165:94;;;::::0;-1:-1:-1;;;46165:94:0;;18236:2:1;46165:94:0::1;::::0;::::1;18218:21:1::0;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:44;18348:18;;46165:94:0::1;18034:338:1::0;46165:94:0::1;40619:42;46313:46;46345:12;:4:::0;46353::::1;46345:12;:::i;:::-;46313:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;46305:87;;;::::0;-1:-1:-1;;;46305:87:0;;18579:2:1;46305:87:0::1;::::0;::::1;18561:21:1::0;18618:2;18598:18;;;18591:30;18657;18637:18;;;18630:58;18705:18;;46305:87:0::1;18377:352:1::0;46305:87:0::1;46485:47;::::0;46493:10:::1;::::0;46510:21:::1;46485:47:::0;::::1;;;::::0;::::1;::::0;;;46510:21;46493:10;46485:47;::::1;;;;;;46477:77;;;::::0;-1:-1:-1;;;46477:77:0;;18936:2:1;46477:77:0::1;::::0;::::1;18918:21:1::0;18975:2;18955:18;;;18948:30;19014:19;18994:18;;;18987:47;19051:18;;46477:77:0::1;18734:341:1::0;46477:77:0::1;44359:2201;44322:2238::o:0;19567:185::-;19705:39;19722:4;19728:2;19732:7;19705:39;;;;;;;;;;;;:16;:39::i;46691:148::-;46745:41;15051:10;46764:12;14971:98;46745:41;46737:75;;;;-1:-1:-1;;;46737:75:0;;19282:2:1;46737:75:0;;;19264:21:1;19321:2;19301:18;;;19294:30;19360:23;19340:18;;;19333:51;19401:18;;46737:75:0;19080:345:1;46737:75:0;46819:14;46825:7;46819:5;:14::i;46845:370::-;46905:16;46930:18;46951:17;46961:6;46951:9;:17::i;:::-;46930:38;-1:-1:-1;46979:15:0;46975:44;;47017:1;47003:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47003:16:0;-1:-1:-1;46996:23:0;46845:370;-1:-1:-1;;;46845:370:0:o;46975:44::-;47028:25;47070:10;47056:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47056:25:0;;47028:53;;47093:9;47088:100;47108:10;47104:1;:14;47088:100;;;47150:30;47170:6;47178:1;47150:19;:30::i;:::-;47136:8;47145:1;47136:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;47120:3;;;;:::i;:::-;;;;47088:100;;41106:94;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;41172:9:::1;:22:::0;41106:94::o;47680:249::-;47769:4;47785:9;47781:123;47796:20;;;47781:123;;;47862:7;-1:-1:-1;;;;;47837:32:0;:7;47845:9;;47855:1;47845:12;;;;;;;:::i;:::-;;;;;;;47837:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;47837:21:0;:32;47834:62;;47891:5;47884:12;;;;;47834:62;47818:3;;;:::i;:::-;;;47781:123;;;;47919:4;47912:11;;47680:249;;;;;;:::o;29159:205::-;29270:7;:14;29234:7;;29262:22;;29254:79;;;;-1:-1:-1;;;29254:79:0;;19632:2:1;29254:79:0;;;19614:21:1;19671:2;19651:18;;;19644:30;19710:34;19690:18;;;19683:62;19781:14;19761:18;;;19754:42;19813:19;;29254:79:0;19430:408:1;29254:79:0;-1:-1:-1;29351:5:0;29159:205::o;41206:92::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;41274:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;47433:241::-:0;47559:9;47554:115;47578:9;:16;47574:1;:20;47554:115;;;47612:49;47629:5;47636:3;47641:9;47651:1;47641:12;;;;;;;;:::i;:::-;;;;;;;47655:5;47612:16;:49::i;:::-;47596:3;;;;:::i;:::-;;;;47554:115;;;;47433:241;;;;:::o;16856:326::-;16973:7;16998:13;17014:7;17022;17014:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17014:16:0;;-1:-1:-1;17063:19:0;17041:110;;;;-1:-1:-1;;;17041:110:0;;20045:2:1;17041:110:0;;;20027:21:1;20084:2;20064:18;;;20057:30;20123:34;20103:18;;;20096:62;20194:11;20174:18;;;20167:39;20223:19;;17041:110:0;19843:405:1;39839:21:0;;;;;;;:::i;16402:392::-;16524:4;-1:-1:-1;;;;;16555:19:0;;16547:74;;;;-1:-1:-1;;;16547:74:0;;20455:2:1;16547:74:0;;;20437:21:1;20494:2;20474:18;;;20467:30;20533:34;20513:18;;;20506:62;20604:12;20584:18;;;20577:40;20634:19;;16547:74:0;20253:406:1;16547:74:0;16634:10;16660:6;16655:109;16672:7;:14;16668:18;;16655:109;;;16719:7;16727:1;16719:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16710:19:0;;;16719:10;;16710:19;16706:46;;;16745:7;;;:::i;:::-;;;16706:46;16688:3;;;:::i;:::-;;;16655:109;;;-1:-1:-1;16781:5:0;16402:392;-1:-1:-1;;16402:392:0:o;41814:92::-;41858:13;41887;41880:20;;;;;:::i;31656:103::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;31721:30:::1;31748:1;31721:18;:30::i;:::-;31656:103::o:0;41914:472::-;41975:16;42001:18;42022:17;42032:6;42022:9;:17::i;:::-;42001:38;-1:-1:-1;42050:15:0;42046:335;;42129:1;42115:16;;42046:335;42154:23;42194:10;42180:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42180:25:0;;42154:51;;42214:13;42236:116;42260:10;42252:5;:18;42236:116;;;42308:34;42328:6;42336:5;42308:19;:34::i;:::-;42292:6;42299:5;42292:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;42272:7;;;;:::i;:::-;;;;42236:116;;42046:335;41994:392;41914:472;;;:::o;17418:104::-;17474:13;17507:7;17500:14;;;;;:::i;43391:534::-;43452:14;;;;43444:47;;;;-1:-1:-1;;;43444:47:0;;20866:2:1;43444:47:0;;;20848:21:1;20905:2;20885:18;;;20878:30;20944:22;20924:18;;;20917:50;20984:18;;43444:47:0;20664:344:1;43444:47:0;43516:1;43506:7;:11;43498:44;;;;-1:-1:-1;;;43498:44:0;;21215:2:1;43498:44:0;;;21197:21:1;21254:2;21234:18;;;21227:30;21293:22;21273:18;;;21266:50;21333:18;;43498:44:0;21013:344:1;43498:44:0;29060:7;:14;43570;;43557:27;;40139:4;43557:27;:::i;:::-;:43;43549:70;;;;-1:-1:-1;;;43549:70:0;;21694:2:1;43549:70:0;;;21676:21:1;21733:2;21713:18;;;21706:30;21772:16;21752:18;;;21745:44;21806:18;;43549:70:0;21492:338:1;43549:70:0;43681:7;43665:13;29060:7;:14;;28972:110;43665:13;:23;;;;:::i;:::-;43647:14;;43634:27;;40139:4;43634:27;:::i;:::-;:54;;43626:85;;;;-1:-1:-1;;;43626:85:0;;22037:2:1;43626:85:0;;;22019:21:1;22076:2;22056:18;;;22049:30;22115:20;22095:18;;;22088:48;22153:18;;43626:85:0;21835:342:1;43626:85:0;43739:19;43751:7;40071:18;43739:19;:::i;:::-;43726:9;:32;;43718:66;;;;-1:-1:-1;;;43718:66:0;;11868:2:1;43718:66:0;;;11850:21:1;11907:2;11887:18;;;11880:30;11946:23;11926:18;;;11919:51;11987:18;;43718:66:0;11666:345:1;43718:66:0;43798:6;43793:127;43814:7;43810:1;:11;43793:127;;;43837:14;43854:13;29060:7;:14;;28972:110;43854:13;:17;;43870:1;43854:17;:::i;:::-;43837:34;;43880:32;43890:10;43902:9;43880;:32::i;:::-;-1:-1:-1;43823:3:0;;;;:::i;:::-;;;;43793:127;;18441:327;-1:-1:-1;;;;;18576:24:0;;15051:10;18576:24;;18568:62;;;;-1:-1:-1;;;18568:62:0;;22384:2:1;18568:62:0;;;22366:21:1;22423:2;22403:18;;;22396:30;22462:27;22442:18;;;22435:55;22507:18;;18568:62:0;22182:349:1;18568:62:0;15051:10;18643:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18643:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;18643:53:0;;;;;;;;;;18712:48;;586:41:1;;;18643:42:0;;15051:10;18712:48;;559:18:1;18712:48:0;;;;;;;18441:327;;:::o;19823:365::-;20012:41;15051:10;20045:7;20012:18;:41::i;:::-;19990:140;;;;-1:-1:-1;;;19990:140:0;;16176:2:1;19990:140:0;;;16158:21:1;16215:2;16195:18;;;16188:30;16254:34;16234:18;;;16227:62;16325:19;16305:18;;;16298:47;16362:19;;19990:140:0;15974:413:1;19990:140:0;20141:39;20155:4;20161:2;20165:7;20174:5;20141:13;:39::i;:::-;19823:365;;;;:::o;41304:220::-;41370:13;41400:17;41408:8;41400:7;:17::i;:::-;41392:51;;;;-1:-1:-1;;;41392:51:0;;22738:2:1;41392:51:0;;;22720:21:1;22777:2;22757:18;;;22750:30;22816:23;22796:18;;;22789:51;22857:18;;41392:51:0;22536:345:1;41392:51:0;41481:7;41490:26;41507:8;41490:16;:26::i;:::-;41464:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41450:68;;41304:220;;;:::o;41530:140::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;41620:20:::1;:44:::0;;-1:-1:-1;;;;;;41620:44:0::1;-1:-1:-1::0;;;;;41620:44:0;;;::::1;::::0;;;::::1;::::0;;41530:140::o;47935:342::-;48096:20;;48136:29;;;;;-1:-1:-1;;;;;3381:55:1;;;48136:29:0;;;3363:74:1;48025:4:0;;48096:20;;;48128:50;;;;48096:20;;48136:21;;3336:18:1;;48136:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48128:50:0;;:76;;;-1:-1:-1;;;;;;48182:22:0;;;;;;:12;:22;;;;;;;;48128:76;48124:93;;;48213:4;48206:11;;;;;48124:93;-1:-1:-1;;;;;19010:25:0;;;18981:4;19010:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48231:40;48224:47;47935:342;-1:-1:-1;;;;47935:342:0:o;44026:96::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;44099:17:::1;::::0;;-1:-1:-1;;44078:38:0;::::1;44099:17;::::0;;;::::1;;;44098:18;44078:38:::0;;::::1;;::::0;;44026:96::o;31914:201::-;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;-1:-1:-1;;;;;32003:22:0;::::1;31995:73;;;::::0;-1:-1:-1;;;31995:73:0;;24925:2:1;31995:73:0::1;::::0;::::1;24907:21:1::0;24964:2;24944:18;;;24937:30;25003:34;24983:18;;;24976:62;25074:8;25054:18;;;25047:36;25100:19;;31995:73:0::1;24723:402:1::0;31995:73:0::1;32079:28;32098:8;32079:18;:28::i;47221:206::-:0;47323:9;47318:104;47342:9;:16;47338:1;:20;47318:104;;;47376:38;47389:5;47396:3;47401:9;47411:1;47401:12;;;;;;;;:::i;:::-;;;;;;;47376;:38::i;:::-;47360:3;;;;:::i;:::-;;;;47318:104;;41676:132;31078:6;;-1:-1:-1;;;;;31078:6:0;15051:10;31225:23;31217:68;;;;-1:-1:-1;;;31217:68:0;;15815:2:1;31217:68:0;;;15797:21:1;;;15834:18;;;15827:30;-1:-1:-1;;;;;;;;;;;15873:18:1;;;15866:62;15945:18;;31217:68:0;15613:356:1;31217:68:0;-1:-1:-1;;;;;41776:26:0::1;;::::0;;;:12:::1;:26;::::0;;;;;;-1:-1:-1;;41746:56:0;::::1;41776:26;::::0;;::::1;41775:27;41746:56;::::0;;41676:132::o;15983:355::-;16130:4;-1:-1:-1;;;;;;16172:40:0;;16187:25;16172:40;;:105;;-1:-1:-1;;;;;;;16229:48:0;;16244:33;16229:48;16172:105;:158;;;-1:-1:-1;5336:25:0;-1:-1:-1;;;;;;5321:40:0;;;16294:36;5212:157;13032:190;13157:4;13210;13181:25;13194:5;13201:4;13181:12;:25::i;:::-;:33;;13032:190;-1:-1:-1;;;;13032:190:0:o;22851:110::-;22927:26;22937:2;22941:7;22927:26;;;;;;;;;;;;:9;:26::i;21735:155::-;21834:7;:14;21800:4;;21824:24;;:58;;;;;21880:1;-1:-1:-1;;;;;21852:30:0;:7;21860;21852:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21852:16:0;:30;;21817:65;21735:155;-1:-1:-1;;21735:155:0:o;25760:174::-;25835:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;25835:29:0;-1:-1:-1;;;;;25835:29:0;;;;;;;;:24;;25889:23;25835:24;25889:14;:23::i;:::-;-1:-1:-1;;;;;25880:46:0;;;;;;;;;;;25760:174;;:::o;22057:452::-;22186:4;22230:16;22238:7;22230;:16::i;:::-;22208:110;;;;-1:-1:-1;;;22208:110:0;;25332:2:1;22208:110:0;;;25314:21:1;25371:2;25351:18;;;25344:30;25410:34;25390:18;;;25383:62;-1:-1:-1;;;25461:18:1;;;25454:42;25513:19;;22208:110:0;25130:408:1;22208:110:0;22329:13;22345:23;22360:7;22345:14;:23::i;:::-;22329:39;;22398:5;-1:-1:-1;;;;;22387:16:0;:7;-1:-1:-1;;;;;22387:16:0;;:64;;;;22444:7;-1:-1:-1;;;;;22420:31:0;:20;22432:7;22420:11;:20::i;:::-;-1:-1:-1;;;;;22420:31:0;;22387:64;:113;;;;22468:32;22485:5;22492:7;22468:16;:32::i;25089:553::-;25262:4;-1:-1:-1;;;;;25235:31:0;:23;25250:7;25235:14;:23::i;:::-;-1:-1:-1;;;;;25235:31:0;;25213:122;;;;-1:-1:-1;;;25213:122:0;;25745:2:1;25213:122:0;;;25727:21:1;25784:2;25764:18;;;25757:30;25823:34;25803:18;;;25796:62;25894:11;25874:18;;;25867:39;25923:19;;25213:122:0;25543:405:1;25213:122:0;-1:-1:-1;;;;;25354:16:0;;25346:65;;;;-1:-1:-1;;;25346:65:0;;26155:2:1;25346:65:0;;;26137:21:1;26194:2;26174:18;;;26167:30;26233:34;26213:18;;;26206:62;26304:6;26284:18;;;26277:34;26328:19;;25346:65:0;25953:400:1;25346:65:0;25528:29;25545:1;25549:7;25528:8;:29::i;:::-;25587:2;25568:7;25576;25568:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;25568:21:0;-1:-1:-1;;;;;25568:21:0;;;;;;25607:27;;25626:7;;25607:27;;;;;;;;;;25568:16;25607:27;25089:553;;;:::o;44128:187::-;44190:7;44290:5;44294:1;44290;:5;:::i;:::-;:10;:18;;44307:1;44290:18;;;44303:1;44290:18;44281:28;;:5;44285:1;44281;:5;:::i;:::-;:28;;;;:::i;24420:332::-;24480:13;24496:23;24511:7;24496:14;:23::i;:::-;24480:39;;24621:29;24638:1;24642:7;24621:8;:29::i;:::-;24688:1;24661:7;24669;24661:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;24661:29:0;-1:-1:-1;;;;;24661:29:0;;;;;;24708:36;;24736:7;;24708:36;;;;;24661:16;;24708:36;24469:283;24420:332;:::o;32275:191::-;32368:6;;;-1:-1:-1;;;;;32385:17:0;;;-1:-1:-1;;;;;;32385:17:0;;;;;;;32418:40;;32368:6;;;32385:17;32368:6;;32418:40;;32349:16;;32418:40;32338:128;32275:191;:::o;21070:352::-;21227:28;21237:4;21243:2;21247:7;21227:9;:28::i;:::-;21288:48;21311:4;21317:2;21321:7;21330:5;21288:22;:48::i;:::-;21266:148;;;;-1:-1:-1;;;21266:148:0;;26991:2:1;21266:148:0;;;26973:21:1;27030:2;27010:18;;;27003:30;27069:34;27049:18;;;27042:62;-1:-1:-1;;;27120:18:1;;;27113:48;27178:19;;21266:148:0;26789:414:1;640:723:0;696:13;917:10;913:53;;-1:-1:-1;;944:10:0;;;;;;;;;;;;;;;;;;640:723::o;913:53::-;991:5;976:12;1032:78;1039:9;;1032:78;;1065:8;;;;:::i;:::-;;-1:-1:-1;1088:10:0;;-1:-1:-1;1096:2:0;1088:10;;:::i;:::-;;;1032:78;;;1120:19;1152:6;1142:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1142:17:0;;1120:39;;1170:154;1177:10;;1170:154;;1204:11;1214:1;1204:11;;:::i;:::-;;-1:-1:-1;1273:10:0;1281:2;1273:5;:10;:::i;:::-;1260:24;;:2;:24;:::i;:::-;1247:39;;1230:6;1237;1230:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1301:11:0;1310:2;1301:11;;:::i;:::-;;;1170:154;;13584:701;13667:7;13710:4;13667:7;13725:523;13749:5;:12;13745:1;:16;13725:523;;;13783:20;13806:5;13812:1;13806:8;;;;;;;;:::i;:::-;;;;;;;13783:31;;13849:12;13833;:28;13829:408;;13986:44;;;;;;27365:19:1;;;27400:12;;;27393:28;;;27437:12;;13986:44:0;;;;;;;;;;;;13976:55;;;;;;13961:70;;13829:408;;;14176:44;;;;;;27365:19:1;;;27400:12;;;27393:28;;;27437:12;;14176:44:0;;;;;;;;;;;;14166:55;;;;;;14151:70;;13829:408;-1:-1:-1;13763:3:0;;;;:::i;:::-;;;;13725:523;;23188:321;23318:18;23324:2;23328:7;23318:5;:18::i;:::-;23369:54;23400:1;23404:2;23408:7;23417:5;23369:22;:54::i;:::-;23347:154;;;;-1:-1:-1;;;23347:154:0;;26991:2:1;23347:154:0;;;26973:21:1;27030:2;27010:18;;;27003:30;27069:34;27049:18;;;27042:62;-1:-1:-1;;;27120:18:1;;;27113:48;27178:19;;23347:154:0;26789:414:1;26499:980:0;26654:4;-1:-1:-1;;;;;26675:13:0;;206:20;254:8;26671:801;;26728:175;;-1:-1:-1;;;26728:175:0;;-1:-1:-1;;;;;26728:36:0;;;;;:175;;15051:10;;26822:4;;26849:7;;26879:5;;26728:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26728:175:0;;;;;;;;-1:-1:-1;;26728:175:0;;;;;;;;;;;;:::i;:::-;;;26707:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27086:13:0;;27082:320;;27129:108;;-1:-1:-1;;;27129:108:0;;26991:2:1;27129:108:0;;;26973:21:1;27030:2;27010:18;;;27003:30;27069:34;27049:18;;;27042:62;-1:-1:-1;;;27120:18:1;;;27113:48;27178:19;;27129:108:0;26789:414:1;27082:320:0;27352:6;27346:13;27337:6;27333:2;27329:15;27322:38;26707:710;-1:-1:-1;;;;;;26967:51:0;-1:-1:-1;;;26967:51:0;;-1:-1:-1;26960:58:0;;26671:801;-1:-1:-1;27456:4:0;26499:980;;;;;;:::o;48283:144::-;48360:7;:16;;;;;;;-1:-1:-1;48360:16:0;;;;;;;-1:-1:-1;;;;;;48360:16:0;-1:-1:-1;;;;;48360:16:0;;;;;;;;48388:33;;48413:7;;-1:-1:-1;48388:33:0;;-1:-1:-1;;48388:33:0;48283:144;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:184::-;-1:-1:-1;;;687:1:1;680:88;787:4;784:1;777:15;811:4;808:1;801:15;827:275;898:2;892:9;963:2;944:13;;-1:-1:-1;;940:27:1;928:40;;998:18;983:34;;1019:22;;;980:62;977:88;;;1045:18;;:::i;:::-;1081:2;1074:22;827:275;;-1:-1:-1;827:275:1:o;1107:183::-;1167:4;1200:18;1192:6;1189:30;1186:56;;;1222:18;;:::i;:::-;-1:-1:-1;1267:1:1;1263:14;1279:4;1259:25;;1107:183::o;1295:959::-;1388:6;1396;1449:2;1437:9;1428:7;1424:23;1420:32;1417:52;;;1465:1;1462;1455:12;1417:52;1501:9;1488:23;1478:33;;1530:2;1583;1572:9;1568:18;1555:32;1610:18;1602:6;1599:30;1596:50;;;1642:1;1639;1632:12;1596:50;1665:22;;1718:4;1710:13;;1706:27;-1:-1:-1;1696:55:1;;1747:1;1744;1737:12;1696:55;1783:2;1770:16;1806:60;1822:43;1862:2;1822:43;:::i;:::-;1806:60;:::i;:::-;1900:15;;;1982:1;1978:10;;;;1970:19;;1966:28;;;1931:12;;;;2006:19;;;2003:39;;;2038:1;2035;2028:12;2003:39;2062:11;;;;2082:142;2098:6;2093:3;2090:15;2082:142;;;2164:17;;2152:30;;2115:12;;;;2202;;;;2082:142;;;2243:5;2233:15;;;;;;;1295:959;;;;;:::o;2259:258::-;2331:1;2341:113;2355:6;2352:1;2349:13;2341:113;;;2431:11;;;2425:18;2412:11;;;2405:39;2377:2;2370:10;2341:113;;;2472:6;2469:1;2466:13;2463:48;;;-1:-1:-1;;2507:1:1;2489:16;;2482:27;2259:258::o;2522:269::-;2575:3;2613:5;2607:12;2640:6;2635:3;2628:19;2656:63;2712:6;2705:4;2700:3;2696:14;2689:4;2682:5;2678:16;2656:63;:::i;:::-;2773:2;2752:15;-1:-1:-1;;2748:29:1;2739:39;;;;2780:4;2735:50;;2522:269;-1:-1:-1;;2522:269:1:o;2796:231::-;2945:2;2934:9;2927:21;2908:4;2965:56;3017:2;3006:9;3002:18;2994:6;2965:56;:::i;3032:180::-;3091:6;3144:2;3132:9;3123:7;3119:23;3115:32;3112:52;;;3160:1;3157;3150:12;3112:52;-1:-1:-1;3183:23:1;;3032:180;-1:-1:-1;3032:180:1:o;3448:154::-;-1:-1:-1;;;;;3527:5:1;3523:54;3516:5;3513:65;3503:93;;3592:1;3589;3582:12;3607:315;3675:6;3683;3736:2;3724:9;3715:7;3711:23;3707:32;3704:52;;;3752:1;3749;3742:12;3704:52;3791:9;3778:23;3810:31;3835:5;3810:31;:::i;:::-;3860:5;3912:2;3897:18;;;;3884:32;;-1:-1:-1;;;3607:315:1:o;3927:407::-;3992:5;4026:18;4018:6;4015:30;4012:56;;;4048:18;;:::i;:::-;4086:57;4131:2;4110:15;;-1:-1:-1;;4106:29:1;4137:4;4102:40;4086:57;:::i;:::-;4077:66;;4166:6;4159:5;4152:21;4206:3;4197:6;4192:3;4188:16;4185:25;4182:45;;;4223:1;4220;4213:12;4182:45;4272:6;4267:3;4260:4;4253:5;4249:16;4236:43;4326:1;4319:4;4310:6;4303:5;4299:18;4295:29;4288:40;3927:407;;;;;:::o;4339:451::-;4408:6;4461:2;4449:9;4440:7;4436:23;4432:32;4429:52;;;4477:1;4474;4467:12;4429:52;4517:9;4504:23;4550:18;4542:6;4539:30;4536:50;;;4582:1;4579;4572:12;4536:50;4605:22;;4658:4;4650:13;;4646:27;-1:-1:-1;4636:55:1;;4687:1;4684;4677:12;4636:55;4710:74;4776:7;4771:2;4758:16;4753:2;4749;4745:11;4710:74;:::i;5159:456::-;5236:6;5244;5252;5305:2;5293:9;5284:7;5280:23;5276:32;5273:52;;;5321:1;5318;5311:12;5273:52;5360:9;5347:23;5379:31;5404:5;5379:31;:::i;:::-;5429:5;-1:-1:-1;5486:2:1;5471:18;;5458:32;5499:33;5458:32;5499:33;:::i;:::-;5159:456;;5551:7;;-1:-1:-1;;;5605:2:1;5590:18;;;;5577:32;;5159:456::o;5620:247::-;5679:6;5732:2;5720:9;5711:7;5707:23;5703:32;5700:52;;;5748:1;5745;5738:12;5700:52;5787:9;5774:23;5806:31;5831:5;5806:31;:::i;5872:632::-;6043:2;6095:21;;;6165:13;;6068:18;;;6187:22;;;6014:4;;6043:2;6266:15;;;;6240:2;6225:18;;;6014:4;6309:169;6323:6;6320:1;6317:13;6309:169;;;6384:13;;6372:26;;6453:15;;;;6418:12;;;;6345:1;6338:9;6309:169;;;-1:-1:-1;6495:3:1;;5872:632;-1:-1:-1;;;;;;5872:632:1:o;6694:750::-;6789:6;6797;6805;6858:2;6846:9;6837:7;6833:23;6829:32;6826:52;;;6874:1;6871;6864:12;6826:52;6913:9;6900:23;6932:31;6957:5;6932:31;:::i;:::-;6982:5;-1:-1:-1;7038:2:1;7023:18;;7010:32;7061:18;7091:14;;;7088:34;;;7118:1;7115;7108:12;7088:34;7156:6;7145:9;7141:22;7131:32;;7201:7;7194:4;7190:2;7186:13;7182:27;7172:55;;7223:1;7220;7213:12;7172:55;7263:2;7250:16;7289:2;7281:6;7278:14;7275:34;;;7305:1;7302;7295:12;7275:34;7358:7;7353:2;7343:6;7340:1;7336:14;7332:2;7328:23;7324:32;7321:45;7318:65;;;7379:1;7376;7369:12;7318:65;7410:2;7406;7402:11;7392:21;;7432:6;7422:16;;;;;6694:750;;;;;:::o;7449:662::-;7503:5;7556:3;7549:4;7541:6;7537:17;7533:27;7523:55;;7574:1;7571;7564:12;7523:55;7610:6;7597:20;7636:4;7660:60;7676:43;7716:2;7676:43;:::i;7660:60::-;7754:15;;;7840:1;7836:10;;;;7824:23;;7820:32;;;7785:12;;;;7864:15;;;7861:35;;;7892:1;7889;7882:12;7861:35;7928:2;7920:6;7916:15;7940:142;7956:6;7951:3;7948:15;7940:142;;;8022:17;;8010:30;;8060:12;;;;7973;;7940:142;;;-1:-1:-1;8100:5:1;7449:662;-1:-1:-1;;;;;;7449:662:1:o;8116:221::-;8158:5;8211:3;8204:4;8196:6;8192:17;8188:27;8178:55;;8229:1;8226;8219:12;8178:55;8251:80;8327:3;8318:6;8305:20;8298:4;8290:6;8286:17;8251:80;:::i;8342:844::-;8462:6;8470;8478;8486;8539:3;8527:9;8518:7;8514:23;8510:33;8507:53;;;8556:1;8553;8546:12;8507:53;8595:9;8582:23;8614:31;8639:5;8614:31;:::i;:::-;8664:5;-1:-1:-1;8721:2:1;8706:18;;8693:32;8734:33;8693:32;8734:33;:::i;:::-;8786:7;-1:-1:-1;8844:2:1;8829:18;;8816:32;8867:18;8897:14;;;8894:34;;;8924:1;8921;8914:12;8894:34;8947:61;9000:7;8991:6;8980:9;8976:22;8947:61;:::i;:::-;8937:71;;9061:2;9050:9;9046:18;9033:32;9017:48;;9090:2;9080:8;9077:16;9074:36;;;9106:1;9103;9096:12;9074:36;;9129:51;9172:7;9161:8;9150:9;9146:24;9129:51;:::i;:::-;9119:61;;;8342:844;;;;;;;:::o;9191:416::-;9256:6;9264;9317:2;9305:9;9296:7;9292:23;9288:32;9285:52;;;9333:1;9330;9323:12;9285:52;9372:9;9359:23;9391:31;9416:5;9391:31;:::i;:::-;9441:5;-1:-1:-1;9498:2:1;9483:18;;9470:32;9540:15;;9533:23;9521:36;;9511:64;;9571:1;9568;9561:12;9511:64;9594:7;9584:17;;;9191:416;;;;;:::o;9612:665::-;9707:6;9715;9723;9731;9784:3;9772:9;9763:7;9759:23;9755:33;9752:53;;;9801:1;9798;9791:12;9752:53;9840:9;9827:23;9859:31;9884:5;9859:31;:::i;:::-;9909:5;-1:-1:-1;9966:2:1;9951:18;;9938:32;9979:33;9938:32;9979:33;:::i;:::-;10031:7;-1:-1:-1;10085:2:1;10070:18;;10057:32;;-1:-1:-1;10140:2:1;10125:18;;10112:32;10167:18;10156:30;;10153:50;;;10199:1;10196;10189:12;10153:50;10222:49;10263:7;10254:6;10243:9;10239:22;10222:49;:::i;10282:388::-;10350:6;10358;10411:2;10399:9;10390:7;10386:23;10382:32;10379:52;;;10427:1;10424;10417:12;10379:52;10466:9;10453:23;10485:31;10510:5;10485:31;:::i;:::-;10535:5;-1:-1:-1;10592:2:1;10577:18;;10564:32;10605:33;10564:32;10605:33;:::i;10675:624::-;10777:6;10785;10793;10846:2;10834:9;10825:7;10821:23;10817:32;10814:52;;;10862:1;10859;10852:12;10814:52;10901:9;10888:23;10920:31;10945:5;10920:31;:::i;:::-;10970:5;-1:-1:-1;11027:2:1;11012:18;;10999:32;11040:33;10999:32;11040:33;:::i;:::-;11092:7;-1:-1:-1;11150:2:1;11135:18;;11122:32;11177:18;11166:30;;11163:50;;;11209:1;11206;11199:12;11163:50;11232:61;11285:7;11276:6;11265:9;11261:22;11232:61;:::i;:::-;11222:71;;;10675:624;;;;;:::o;11304:184::-;-1:-1:-1;;;11353:1:1;11346:88;11453:4;11450:1;11443:15;11477:4;11474:1;11467:15;11493:168;11533:7;11599:1;11595;11591:6;11587:14;11584:1;11581:21;11576:1;11569:9;11562:17;11558:45;11555:71;;;11606:18;;:::i;:::-;-1:-1:-1;11646:9:1;;11493:168::o;12714:128::-;12754:3;12785:1;12781:6;12778:1;12775:13;12772:39;;;12791:18;;:::i;:::-;-1:-1:-1;12827:9:1;;12714:128::o;13791:135::-;13830:3;-1:-1:-1;;13851:17:1;;13848:43;;;13871:18;;:::i;:::-;-1:-1:-1;13918:1:1;13907:13;;13791:135::o;13931:437::-;14010:1;14006:12;;;;14053;;;14074:61;;14128:4;14120:6;14116:17;14106:27;;14074:61;14181:2;14173:6;14170:14;14150:18;14147:38;14144:218;;;-1:-1:-1;;;14215:1:1;14208:88;14319:4;14316:1;14309:15;14347:4;14344:1;14337:15;16804:184;-1:-1:-1;;;16853:1:1;16846:88;16953:4;16950:1;16943:15;16977:4;16974:1;16967:15;21362:125;21402:4;21430:1;21427;21424:8;21421:34;;;21435:18;;:::i;:::-;-1:-1:-1;21472:9:1;;21362:125::o;23012:185::-;23054:3;23092:5;23086:12;23107:52;23152:6;23147:3;23140:4;23133:5;23129:16;23107:52;:::i;:::-;23175:16;;;;;23012:185;-1:-1:-1;;23012:185:1:o;23202:1231::-;23378:3;23407:1;23440:6;23434:13;23470:3;23492:1;23520:9;23516:2;23512:18;23502:28;;23580:2;23569:9;23565:18;23602;23592:61;;23646:4;23638:6;23634:17;23624:27;;23592:61;23672:2;23720;23712:6;23709:14;23689:18;23686:38;23683:222;;;-1:-1:-1;;;23754:3:1;23747:90;23860:4;23857:1;23850:15;23890:4;23885:3;23878:17;23683:222;23921:18;23948:104;;;;24066:1;24061:320;;;;23914:467;;23948:104;-1:-1:-1;;23981:24:1;;23969:37;;24026:16;;;;-1:-1:-1;23948:104:1;;24061:320;22959:1;22952:14;;;22996:4;22983:18;;24156:1;24170:165;24184:6;24181:1;24178:13;24170:165;;;24262:14;;24249:11;;;24242:35;24305:16;;;;24199:10;;24170:165;;;24174:3;;24364:6;24359:3;24355:16;24348:23;;23914:467;;;;;;;24397:30;24423:3;24415:6;24397:30;:::i;:::-;24390:37;23202:1231;-1:-1:-1;;;;;23202:1231:1:o;24438:280::-;24537:6;24590:2;24578:9;24569:7;24565:23;24561:32;24558:52;;;24606:1;24603;24596:12;24558:52;24638:9;24632:16;24657:31;24682:5;24657:31;:::i;26358:184::-;-1:-1:-1;;;26407:1:1;26400:88;26507:4;26504:1;26497:15;26531:4;26528:1;26521:15;26547:112;26579:1;26605;26595:35;;26610:18;;:::i;:::-;-1:-1:-1;26644:9:1;;26547:112::o;26664:120::-;26704:1;26730;26720:35;;26735:18;;:::i;:::-;-1:-1:-1;26769:9:1;;26664:120::o;27460:523::-;27654:4;-1:-1:-1;;;;;27764:2:1;27756:6;27752:15;27741:9;27734:34;27816:2;27808:6;27804:15;27799:2;27788:9;27784:18;27777:43;;27856:6;27851:2;27840:9;27836:18;27829:34;27899:3;27894:2;27883:9;27879:18;27872:31;27920:57;27972:3;27961:9;27957:19;27949:6;27920:57;:::i;:::-;27912:65;27460:523;-1:-1:-1;;;;;;27460:523:1:o;27988:249::-;28057:6;28110:2;28098:9;28089:7;28085:23;28081:32;28078:52;;;28126:1;28123;28116:12;28078:52;28158:9;28152:16;28177:30;28201:5;28177:30;:::i

Swarm Source

ipfs://394e98dfee9c47c924f60fbbd13b34e4262a7d58cc85c7c65dbb11fd8d8b8df7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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