ETH Price: $2,485.44 (+2.84%)

Token

Malaya Ape Club V2 (MAC-V2)
 

Overview

Max Total Supply

3,333 MAC-V2

Holders

305

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 MAC-V2
0xc60904259F702Fbb39C7389C6A845fBe5b36A444
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:
MalayaApeClubV2

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-18
*/

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


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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.1 (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 (last updated v4.5.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);

    /**
     * @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.1 (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/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/MalayaApeClubV2.sol



//Compiled By Eaxon.


pragma solidity >=0.7.0 <0.9.0;







  contract MalayaApeClubV2 is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public preSaleCost = 0.08 ether;
  uint256 public cost = 0.08 ether;
  uint256 public maxSupply = 6666;
  uint256 public preSaleMaxSupply = 6000;
  uint256 public maxMintAmountPresale = 3;
  uint256 public maxMintAmount = 3;
  uint256 public nftPerAddressLimitPresale = 100;
  uint256 public nftPerAddressLimit = 100;
  uint256 public preSaleDate = 1654444800;
  uint256 public preSaleEndDate = 1654531199;
  uint256 public publicSaleDate = 1654531200;
  bool public paused = false;
  bool public revealed = false;
  bool public onlyWhitelisted = true;
  mapping(address => bool) whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

 address p1 = 0x347aC2Fb138844865fA33377c063cACd5668E1F1; // A
 address p2 = 0x6E6ea9d4BA16d71D02271E4B48F9242fCf35570b; // E
 address p3 = 0x1f147EdCb514647D02f05aEA621952642388b2D2; // D
 address p4 = 0x33c2DE3650536a67bD225F176Bb5b0CE5b6F9478; // J2
 address p5 = 0xd2c7B648897cC83820bFb6770Cad4007e9867fdC; // J
 address p6 = 0x9a1dae29Aa74EdFb6c132C8825D3933938aa8a8F; // F
 address p7 = 0xABD50f4803D7AB638d360b76b5aa7978f9B5cF6C; // P
 address p8 = 0xf5BC68f2C29122Fb4Fa746378a679c4197968Db8; // M
 address p9 = 0xC427c7C46e6E5EBC94d1071874AaE33f113F7422; // Z
  
  constructor(
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721("Malaya Ape Club V2", "MAC-V2") {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  //MODIFIERS
  modifier notPaused {
    require(!paused, "the contract is paused");
    _;
  }

  modifier saleStarted {
    require(block.timestamp >= preSaleDate, "Sale has not started yet");
    _;
  }

  modifier minimumMintAmount(uint256 _mintAmount) {
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    _;
  }

  // INTERNAL
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function presaleValidations(
    uint256 ownerTokenCount,
    uint256 _mintAmount,
    uint256 _supply
  ) internal {
    uint256 actualCost;
    block.timestamp < preSaleEndDate
      ? actualCost = preSaleCost
      : actualCost = cost;
      if (onlyWhitelisted == true) {
    require(isWhitelisted(msg.sender), "user is not whitelisted");
    require(
      ownerTokenCount + _mintAmount <= nftPerAddressLimitPresale,
      "max NFT per address exceeded for presale"
    );
    require(msg.value >= actualCost * _mintAmount, "insufficient funds");
    require(
      _mintAmount <= maxMintAmountPresale,
      "max mint amount per transaction exceeded"
    );
    require(
      supply.current() + _mintAmount <= preSaleMaxSupply,
      "max NFT presale limit exceeded"
    );}
    else {
    require(
      ownerTokenCount + _mintAmount <= nftPerAddressLimitPresale,
      "max NFT per address exceeded for presale"
    );
    require(msg.value >= actualCost * _mintAmount, "insufficient funds");
    require(
      _mintAmount <= maxMintAmountPresale,
      "max mint amount per transaction exceeded"
    );
    require(
      supply.current() + _mintAmount <= preSaleMaxSupply,
      "max NFT presale limit exceeded"
    );
    }
  }

  function publicsaleValidations(uint256 ownerTokenCount, uint256 _mintAmount)
    internal
  {
    require(
      ownerTokenCount + _mintAmount <= nftPerAddressLimit,
      "max NFT per address exceeded"
    );
    require(msg.value >= cost * _mintAmount, "insufficient funds");
    require(
      _mintAmount <= maxMintAmount,
      "max mint amount per transaction exceeded"
    );
  }

  //MINT
  function mint(uint256 _mintAmount)
    public
    payable
    notPaused
    saleStarted
    minimumMintAmount(_mintAmount)
  {
    uint256 ownerTokenCount = addressMintedBalance[msg.sender];

    //Do some validations depending on which step of the sale we are in
    block.timestamp < publicSaleDate
      ? presaleValidations(ownerTokenCount, _mintAmount, supply.current())
      : publicsaleValidations(ownerTokenCount, _mintAmount);

    require(supply.current() + _mintAmount <= maxSupply, "max NFT limit exceeded");

     _mintLoop(msg.sender, _mintAmount);
  }

   function mintForOwner(uint256 _mintAmount) public onlyOwner {
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply.current() + _mintAmount <= maxSupply);

    _mintLoop(msg.sender, _mintAmount);
  }
  
    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }
 
  
  function gift(uint256 _mintAmount, address destination) public onlyOwner {
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(supply.current() + _mintAmount <= maxSupply, "max NFT limit exceeded");

   _mintLoop(msg.sender, _mintAmount);
  }

  //PUBLIC VIEWS
  function isWhitelisted(address _user) public view returns (bool) {
    return whitelistedAddresses[_user];
  }

   function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (!revealed) {
      return notRevealedUri;
    } else {
      string memory currentBaseURI = _baseURI();
      return
        bytes(currentBaseURI).length > 0
          ? string(
            abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)
          )
          : "";
    }
  }
  
    function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function getCurrentCost() public view returns (uint256) {
    if (block.timestamp < preSaleEndDate) {
      return preSaleCost;
    } else {
      return cost;
    }
  }

  //ONLY OWNER VIEWS
  function getBaseURI() public view onlyOwner returns (string memory) {
    return baseURI;
  }

  function getContractBalance() public view onlyOwner returns (uint256) {
    return address(this).balance;
  }

  //ONLY OWNER SETTERS
  function reveal(bool _state) public onlyOwner {
    revealed = _state;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  function setNftPerAddressLimitPreSale(uint256 _limit) public onlyOwner {
    nftPerAddressLimitPresale = _limit;
  }

  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function setPresaleCost(uint256 _newCost) public onlyOwner {
    preSaleCost = _newCost;
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmountPreSale(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmountPresale = _newmaxMintAmount;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function setPresaleMaxSupply(uint256 _newPresaleMaxSupply) public onlyOwner {
    preSaleMaxSupply = _newPresaleMaxSupply;
  }

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

  function setPreSaleDate(uint256 _preSaleDate) public onlyOwner {
    preSaleDate = _preSaleDate;
  }

  function setPreSaleEndDate(uint256 _preSaleEndDate) public onlyOwner {
    preSaleEndDate = _preSaleEndDate;
  }

  function setPublicSaleDate(uint256 _publicSaleDate) public onlyOwner {
    publicSaleDate = _publicSaleDate;
  }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }

  function whitelistUsers(address[] memory addresses) public onlyOwner {
    for (uint256 i = 0; i < addresses.length; i++) {
      whitelistedAddresses[addresses[i]] = true;
    }
  }

  function withdrawAll() public payable onlyOwner {

  uint256 _p1share = address(this).balance * 29750 /100000;

  uint256 _p2share = address(this).balance * 18275 /100000;

  uint256 _p3share = address(this).balance * 3400 /100000;

  uint256 _p4share = address(this).balance * 3400 /100000;

  uint256 _p5share = address(this).balance * 1700 /100000;

  uint256 _p6share = address(this).balance * 2125 /100000;

  uint256 _p7share = address(this).balance * 850 /100000;

  uint256 _p8share = address(this).balance * 15000 /100000;

  uint256 _p9share = address(this).balance * 17000 /100000;

  uint256 _ownershare = address(this).balance * 8500 /100000;


        require(payable(p1).send(_p1share));
        require(payable(p2).send(_p2share));
        require(payable(p3).send(_p3share));
        require(payable(p4).send(_p4share));
        require(payable(p5).send(_p5share));
        require(payable(p6).send(_p6share));
        require(payable(p7).send(_p7share));
        require(payable(p8).send(_p8share));
        require(payable(p9).send(_p9share));

        require(payable(msg.sender).send(_ownershare));
  }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimitPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleDate","type":"uint256"}],"name":"setPreSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleEndDate","type":"uint256"}],"name":"setPreSaleEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresaleMaxSupply","type":"uint256"}],"name":"setPresaleMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleDate","type":"uint256"}],"name":"setPublicSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmountPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600991906200038f565b5067011c37937e080000600b819055600c55611a0a600d55611770600e556003600f8190556010556064601181905560125563629cd30060135563629e247f60145563629e24806015556016805462ffffff191662010000179055601980546001600160a01b031990811673347ac2fb138844865fa33377c063cacd5668e1f117909155601a80548216736e6ea9d4ba16d71d02271e4b48f9242fcf35570b179055601b80548216731f147edcb514647d02f05aea621952642388b2d2179055601c805482167333c2de3650536a67bd225f176bb5b0ce5b6f9478179055601d8054821673d2c7b648897cc83820bfb6770cad4007e9867fdc179055601e80548216739a1dae29aa74edfb6c132c8825d3933938aa8a8f179055601f8054821673abd50f4803d7ab638d360b76b5aa7978f9b5cf6c17905560208054821673f5bc68f2c29122fb4fa746378a679c4197968db81790556021805490911673c427c7c46e6e5ebc94d1071874aae33f113f7422179055348015620001aa57600080fd5b50604051620037fc380380620037fc833981016040819052620001cd91620004ec565b604080518082018252601281527126b0b630bcb09020b8329021b63ab1102b1960711b60208083019182528351808501909452600684526526a0a196ab1960d11b90840152815191929162000225916000916200038f565b5080516200023b9060019060208401906200038f565b50505062000258620002526200027660201b60201c565b6200027a565b6200026382620002cc565b6200026e8162000334565b5050620005a9565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200031b5760405162461bcd60e51b81526020600482018190526024820152600080516020620037dc83398151915260448201526064015b60405180910390fd5b8051620003309060089060208401906200038f565b5050565b6006546001600160a01b031633146200037f5760405162461bcd60e51b81526020600482018190526024820152600080516020620037dc833981519152604482015260640162000312565b80516200033090600a9060208401905b8280546200039d9062000556565b90600052602060002090601f016020900481019282620003c157600085556200040c565b82601f10620003dc57805160ff19168380011785556200040c565b828001600101855582156200040c579182015b828111156200040c578251825591602001919060010190620003ef565b506200041a9291506200041e565b5090565b5b808211156200041a57600081556001016200041f565b600082601f8301126200044757600080fd5b81516001600160401b038082111562000464576200046462000593565b604051601f8301601f19908116603f011681019082821181831017156200048f576200048f62000593565b81604052838152602092508683858801011115620004ac57600080fd5b600091505b83821015620004d05785820183015181830184015290820190620004b1565b83821115620004e25760008385830101525b9695505050505050565b600080604083850312156200050057600080fd5b82516001600160401b03808211156200051857600080fd5b620005268683870162000435565b935060208501519150808211156200053d57600080fd5b506200054c8582860162000435565b9150509250929050565b600181811c908216806200056b57607f821691505b602082108114156200058d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61322380620005b96000396000f3fe6080604052600436106103ad5760003560e01c806370a08231116101e7578063a0712d681161010d578063d0eb26b0116100a0578063eced38731161006f578063eced387314610a98578063edec5f2714610aae578063f2c4ce1e14610ace578063f2fde38b14610aee57600080fd5b8063d0eb26b0146109f9578063d5abeb0114610a19578063da3ef23f14610a2f578063e985e9c514610a4f57600080fd5b8063ba7d2c76116100dc578063ba7d2c7614610998578063c6682862146109ae578063c87b56dd146109c3578063cc9ff9c6146109e357600080fd5b8063a0712d681461092f578063a18116f114610942578063a22cb46514610958578063b88d4fde1461097857600080fd5b8063831e60de116101855780638fdcf942116101545780638fdcf942146108ba578063940cd05b146108da57806395d89b41146108fa5780639c70b5121461090f57600080fd5b8063831e60de1461085f57806383a076be14610874578063853828b6146108945780638da5cb5b1461089c57600080fd5b8063743c7f6b116101c1578063743c7f6b146107f35780637967a50a146108135780637effc032146108295780637f00c7a61461083f57600080fd5b806370a08231146107a9578063714c5398146107c9578063715018a6146107de57600080fd5b80632e09282e116102d757806355f804b31161026a578063669736c011610239578063669736c01461073f5780636c0360eb1461075f5780636f8b44b0146107745780636f9fb98a1461079457600080fd5b806355f804b3146106c55780635c975abb146106e55780636352211e146106ff57806363bc312a1461071f57600080fd5b806342f0ca0d116102a657806342f0ca0d14610639578063438b63001461065957806344a0d68a1461068657806351830227146106a657600080fd5b80632e09282e146105aa5780633af32abf146105c05780633c952764146105f957806342842e0e1461061957600080fd5b80630a50716b1161034f57806318cae2691161031e57806318cae269146105315780631985cc651461055e578063239c70ae1461057457806323b872dd1461058a57600080fd5b80630a50716b146104b85780630e54a883146104d857806313faede6146104f857806318160ddd1461051c57600080fd5b8063081812fc1161038b578063081812fc1461042b578063081c8c4414610463578063095ea7b3146104785780630a403f041461049857600080fd5b806301ffc9a7146103b257806302329a29146103e757806306fdde0314610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612c7f565b610b0e565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b50610407610402366004612c64565b610b60565b005b34801561041557600080fd5b5061041e610ba6565b6040516103de9190612eaf565b34801561043757600080fd5b5061044b610446366004612d02565b610c38565b6040516001600160a01b0390911681526020016103de565b34801561046f57600080fd5b5061041e610ccd565b34801561048457600080fd5b50610407610493366004612b86565b610d5b565b3480156104a457600080fd5b506104076104b3366004612d02565b610e71565b3480156104c457600080fd5b506104076104d3366004612d02565b610ea0565b3480156104e457600080fd5b506104076104f3366004612d02565b610ecf565b34801561050457600080fd5b5061050e600c5481565b6040519081526020016103de565b34801561052857600080fd5b5061050e610efe565b34801561053d57600080fd5b5061050e61054c366004612a56565b60186020526000908152604090205481565b34801561056a57600080fd5b5061050e60135481565b34801561058057600080fd5b5061050e60105481565b34801561059657600080fd5b506104076105a5366004612aa4565b610f0e565b3480156105b657600080fd5b5061050e60115481565b3480156105cc57600080fd5b506103d26105db366004612a56565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561060557600080fd5b50610407610614366004612c64565b610f3f565b34801561062557600080fd5b50610407610634366004612aa4565b610f85565b34801561064557600080fd5b50610407610654366004612d02565b610fa0565b34801561066557600080fd5b50610679610674366004612a56565b610fcf565b6040516103de9190612e6b565b34801561069257600080fd5b506104076106a1366004612d02565b6110b0565b3480156106b257600080fd5b506016546103d290610100900460ff1681565b3480156106d157600080fd5b506104076106e0366004612cb9565b6110df565b3480156106f157600080fd5b506016546103d29060ff1681565b34801561070b57600080fd5b5061044b61071a366004612d02565b611120565b34801561072b57600080fd5b5061040761073a366004612d02565b611197565b34801561074b57600080fd5b5061040761075a366004612d02565b61121c565b34801561076b57600080fd5b5061041e61124b565b34801561078057600080fd5b5061040761078f366004612d02565b611258565b3480156107a057600080fd5b5061050e611287565b3480156107b557600080fd5b5061050e6107c4366004612a56565b6112b9565b3480156107d557600080fd5b5061041e611340565b3480156107ea57600080fd5b5061040761137a565b3480156107ff57600080fd5b5061040761080e366004612d02565b6113b0565b34801561081f57600080fd5b5061050e60145481565b34801561083557600080fd5b5061050e600f5481565b34801561084b57600080fd5b5061040761085a366004612d02565b6113df565b34801561086b57600080fd5b5061050e61140e565b34801561088057600080fd5b5061040761088f366004612d1b565b611428565b61040761150a565b3480156108a857600080fd5b506006546001600160a01b031661044b565b3480156108c657600080fd5b506104076108d5366004612d02565b611852565b3480156108e657600080fd5b506104076108f5366004612c64565b611881565b34801561090657600080fd5b5061041e6118c5565b34801561091b57600080fd5b506016546103d29062010000900460ff1681565b61040761093d366004612d02565b6118d4565b34801561094e57600080fd5b5061050e600e5481565b34801561096457600080fd5b50610407610973366004612b5c565b611a66565b34801561098457600080fd5b50610407610993366004612ae0565b611a71565b3480156109a457600080fd5b5061050e60125481565b3480156109ba57600080fd5b5061041e611aa9565b3480156109cf57600080fd5b5061041e6109de366004612d02565b611ab6565b3480156109ef57600080fd5b5061050e600b5481565b348015610a0557600080fd5b50610407610a14366004612d02565b611c3a565b348015610a2557600080fd5b5061050e600d5481565b348015610a3b57600080fd5b50610407610a4a366004612cb9565b611c69565b348015610a5b57600080fd5b506103d2610a6a366004612a71565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aa457600080fd5b5061050e60155481565b348015610aba57600080fd5b50610407610ac9366004612bb0565b611ca6565b348015610ada57600080fd5b50610407610ae9366004612cb9565b611d38565b348015610afa57600080fd5b50610407610b09366004612a56565b611d75565b60006001600160e01b031982166380ac58cd60e01b1480610b3f57506001600160e01b03198216635b5e139f60e01b145b80610b5a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b03163314610b935760405162461bcd60e51b8152600401610b8a90612f5c565b60405180910390fd5b6016805460ff1916911515919091179055565b606060008054610bb590613115565b80601f0160208091040260200160405190810160405280929190818152602001828054610be190613115565b8015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610cb15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b506000908152600460205260409020546001600160a01b031690565b600a8054610cda90613115565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0690613115565b8015610d535780601f10610d2857610100808354040283529160200191610d53565b820191906000526020600020905b815481529060010190602001808311610d3657829003601f168201915b505050505081565b6000610d6682611120565b9050806001600160a01b0316836001600160a01b03161415610dd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b8a565b336001600160a01b0382161480610df05750610df08133610a6a565b610e625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b8a565b610e6c8383611e0d565b505050565b6006546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610b8a90612f5c565b600e55565b6006546001600160a01b03163314610eca5760405162461bcd60e51b8152600401610b8a90612f5c565b601155565b6006546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b8a90612f5c565b601555565b6000610f0960075490565b905090565b610f183382611e7b565b610f345760405162461bcd60e51b8152600401610b8a90613005565b610e6c838383611f72565b6006546001600160a01b03163314610f695760405162461bcd60e51b8152600401610b8a90612f5c565b60168054911515620100000262ff000019909216919091179055565b610e6c83838360405180602001604052806000815250611a71565b6006546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610b8a90612f5c565b601455565b60606000610fdc836112b9565b905060008167ffffffffffffffff811115610ff957610ff96131c1565b604051908082528060200260200182016040528015611022578160200160208202803683370190505b509050600160005b838110801561103b5750600d548211155b156110a657600061104b83611120565b9050866001600160a01b0316816001600160a01b03161415611093578284838151811061107a5761107a6131ab565b60209081029190910101528161108f81613150565b9250505b8261109d81613150565b9350505061102a565b5090949350505050565b6006546001600160a01b031633146110da5760405162461bcd60e51b8152600401610b8a90612f5c565b600c55565b6006546001600160a01b031633146111095760405162461bcd60e51b8152600401610b8a90612f5c565b805161111c90600890602084019061293e565b5050565b6000818152600260205260408120546001600160a01b031680610b5a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b8a565b6006546001600160a01b031633146111c15760405162461bcd60e51b8152600401610b8a90612f5c565b60165460ff16156111d157600080fd5b600081116111de57600080fd5b6010548111156111ed57600080fd5b600d54816111fa60075490565b6112049190613087565b111561120f57600080fd5b611219338261210e565b50565b6006546001600160a01b031633146112465760405162461bcd60e51b8152600401610b8a90612f5c565b600f55565b60088054610cda90613115565b6006546001600160a01b031633146112825760405162461bcd60e51b8152600401610b8a90612f5c565b600d55565b6006546000906001600160a01b031633146112b45760405162461bcd60e51b8152600401610b8a90612f5c565b504790565b60006001600160a01b0382166113245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b8a565b506001600160a01b031660009081526003602052604090205490565b6006546060906001600160a01b0316331461136d5760405162461bcd60e51b8152600401610b8a90612f5c565b60088054610bb590613115565b6006546001600160a01b031633146113a45760405162461bcd60e51b8152600401610b8a90612f5c565b6113ae600061214b565b565b6006546001600160a01b031633146113da5760405162461bcd60e51b8152600401610b8a90612f5c565b601355565b6006546001600160a01b031633146114095760405162461bcd60e51b8152600401610b8a90612f5c565b601055565b60006014544210156114215750600b5490565b50600c5490565b6006546001600160a01b031633146114525760405162461bcd60e51b8152600401610b8a90612f5c565b600082116114a25760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b600d54826114af60075490565b6114b99190613087565b11156115005760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b61111c338361210e565b6006546001600160a01b031633146115345760405162461bcd60e51b8152600401610b8a90612f5c565b6000620186a0611546476174366130b3565b611550919061309f565b90506000620186a0611564476147636130b3565b61156e919061309f565b90506000620186a061158247610d486130b3565b61158c919061309f565b90506000620186a06115a047610d486130b3565b6115aa919061309f565b90506000620186a06115be476106a46130b3565b6115c8919061309f565b90506000620186a06115dc4761084d6130b3565b6115e6919061309f565b90506000620186a06115fa476103526130b3565b611604919061309f565b90506000620186a061161847613a986130b3565b611622919061309f565b90506000620186a0611636476142686130b3565b611640919061309f565b90506000620186a0611654476121346130b3565b61165e919061309f565b6019546040519192506001600160a01b0316908b156108fc02908c906000818181858888f1935050505061169157600080fd5b601a546040516001600160a01b03909116908a156108fc02908b906000818181858888f193505050506116c357600080fd5b601b546040516001600160a01b039091169089156108fc02908a906000818181858888f193505050506116f557600080fd5b601c546040516001600160a01b039091169088156108fc029089906000818181858888f1935050505061172757600080fd5b601d546040516001600160a01b039091169087156108fc029088906000818181858888f1935050505061175957600080fd5b601e546040516001600160a01b039091169086156108fc029087906000818181858888f1935050505061178b57600080fd5b601f546040516001600160a01b039091169085156108fc029086906000818181858888f193505050506117bd57600080fd5b6020546040516001600160a01b039091169084156108fc029085906000818181858888f193505050506117ef57600080fd5b6021546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505061182157600080fd5b604051339082156108fc029083906000818181858888f1935050505061184657600080fd5b50505050505050505050565b6006546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610b8a90612f5c565b600b55565b6006546001600160a01b031633146118ab5760405162461bcd60e51b8152600401610b8a90612f5c565b601680549115156101000261ff0019909216919091179055565b606060018054610bb590613115565b60165460ff16156119205760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b8a565b6013544210156119725760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b8a565b80600081116119c35760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b3360009081526018602052604090205460155442106119eb576119e6818461219d565b6119fe565b6119fe81846119f960075490565b612247565b600d5483611a0b60075490565b611a159190613087565b1115611a5c5760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b610e6c338461210e565b61111c338383612493565b611a7b3383611e7b565b611a975760405162461bcd60e51b8152600401610b8a90613005565b611aa384848484612562565b50505050565b60098054610cda90613115565b6000818152600260205260409020546060906001600160a01b0316611b355760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b8a565b601654610100900460ff16611bd657600a8054611b5190613115565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7d90613115565b8015611bca5780601f10611b9f57610100808354040283529160200191611bca565b820191906000526020600020905b815481529060010190602001808311611bad57829003601f168201915b50505050509050919050565b6000611be0612595565b90506000815111611c005760405180602001604052806000815250611c2e565b80611c0a846125a4565b6009604051602001611c1e93929190612d6a565b6040516020818303038152906040525b9392505050565b919050565b6006546001600160a01b03163314611c645760405162461bcd60e51b8152600401610b8a90612f5c565b601255565b6006546001600160a01b03163314611c935760405162461bcd60e51b8152600401610b8a90612f5c565b805161111c90600990602084019061293e565b6006546001600160a01b03163314611cd05760405162461bcd60e51b8152600401610b8a90612f5c565b60005b815181101561111c57600160176000848481518110611cf457611cf46131ab565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611d3081613150565b915050611cd3565b6006546001600160a01b03163314611d625760405162461bcd60e51b8152600401610b8a90612f5c565b805161111c90600a90602084019061293e565b6006546001600160a01b03163314611d9f5760405162461bcd60e51b8152600401610b8a90612f5c565b6001600160a01b038116611e045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8a565b6112198161214b565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e4282611120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ef45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b6000611eff83611120565b9050806001600160a01b0316846001600160a01b03161480611f3a5750836001600160a01b0316611f2f84610c38565b6001600160a01b0316145b80611f6a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f8582611120565b6001600160a01b031614611fe95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b8a565b6001600160a01b03821661204b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b8a565b612056600082611e0d565b6001600160a01b038316600090815260036020526040812080546001929061207f9084906130d2565b90915550506001600160a01b03821660009081526003602052604081208054600192906120ad908490613087565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610e6c57612127600780546001019055565b6121398361213460075490565b6126a2565b8061214381613150565b915050612111565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6012546121aa8284613087565b11156121f85760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610b8a565b80600c5461220691906130b3565b3410156122255760405162461bcd60e51b8152600401610b8a90612f91565b60105481111561111c5760405162461bcd60e51b8152600401610b8a90612f14565b6000601454421061225c5750600c5480612262565b50600b54805b5060165462010000900460ff161515600114156123b8573360009081526017602052604090205460ff166122d85760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b8a565b6011546122e58486613087565b11156123035760405162461bcd60e51b8152600401610b8a90612fbd565b61230d83826130b3565b34101561232c5760405162461bcd60e51b8152600401610b8a90612f91565b600f5483111561234e5760405162461bcd60e51b8152600401610b8a90612f14565b600e548361235b60075490565b6123659190613087565b11156123b35760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b611aa3565b6011546123c58486613087565b11156123e35760405162461bcd60e51b8152600401610b8a90612fbd565b6123ed83826130b3565b34101561240c5760405162461bcd60e51b8152600401610b8a90612f91565b600f5483111561242e5760405162461bcd60e51b8152600401610b8a90612f14565b600e548361243b60075490565b6124459190613087565b1115611aa35760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b816001600160a01b0316836001600160a01b031614156124f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61256d848484611f72565b612579848484846126bc565b611aa35760405162461bcd60e51b8152600401610b8a90612ec2565b606060088054610bb590613115565b6060816125c85750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125f257806125dc81613150565b91506125eb9050600a8361309f565b91506125cc565b60008167ffffffffffffffff81111561260d5761260d6131c1565b6040519080825280601f01601f191660200182016040528015612637576020820181803683370190505b5090505b8415611f6a5761264c6001836130d2565b9150612659600a8661316b565b612664906030613087565b60f81b818381518110612679576126796131ab565b60200101906001600160f81b031916908160001a90535061269b600a8661309f565b945061263b565b61111c8282604051806020016040528060008152506127c9565b60006001600160a01b0384163b156127be57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612700903390899088908890600401612e2e565b602060405180830381600087803b15801561271a57600080fd5b505af192505050801561274a575060408051601f3d908101601f1916820190925261274791810190612c9c565b60015b6127a4573d808015612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50805161279c5760405162461bcd60e51b8152600401610b8a90612ec2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f6a565b506001949350505050565b6127d383836127fc565b6127e060008484846126bc565b610e6c5760405162461bcd60e51b8152600401610b8a90612ec2565b6001600160a01b0382166128525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8a565b6000818152600260205260409020546001600160a01b0316156128b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8a565b6001600160a01b03821660009081526003602052604081208054600192906128e0908490613087565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461294a90613115565b90600052602060002090601f01602090048101928261296c57600085556129b2565b82601f1061298557805160ff19168380011785556129b2565b828001600101855582156129b2579182015b828111156129b2578251825591602001919060010190612997565b506129be9291506129c2565b5090565b5b808211156129be57600081556001016129c3565b600067ffffffffffffffff8311156129f1576129f16131c1565b612a04601f8401601f1916602001613056565b9050828152838383011115612a1857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611c3557600080fd5b80358015158114611c3557600080fd5b600060208284031215612a6857600080fd5b611c2e82612a2f565b60008060408385031215612a8457600080fd5b612a8d83612a2f565b9150612a9b60208401612a2f565b90509250929050565b600080600060608486031215612ab957600080fd5b612ac284612a2f565b9250612ad060208501612a2f565b9150604084013590509250925092565b60008060008060808587031215612af657600080fd5b612aff85612a2f565b9350612b0d60208601612a2f565b925060408501359150606085013567ffffffffffffffff811115612b3057600080fd5b8501601f81018713612b4157600080fd5b612b50878235602084016129d7565b91505092959194509250565b60008060408385031215612b6f57600080fd5b612b7883612a2f565b9150612a9b60208401612a46565b60008060408385031215612b9957600080fd5b612ba283612a2f565b946020939093013593505050565b60006020808385031215612bc357600080fd5b823567ffffffffffffffff80821115612bdb57600080fd5b818501915085601f830112612bef57600080fd5b813581811115612c0157612c016131c1565b8060051b9150612c12848301613056565b8181528481019084860184860187018a1015612c2d57600080fd5b600095505b83861015612c5757612c4381612a2f565b835260019590950194918601918601612c32565b5098975050505050505050565b600060208284031215612c7657600080fd5b611c2e82612a46565b600060208284031215612c9157600080fd5b8135611c2e816131d7565b600060208284031215612cae57600080fd5b8151611c2e816131d7565b600060208284031215612ccb57600080fd5b813567ffffffffffffffff811115612ce257600080fd5b8201601f81018413612cf357600080fd5b611f6a848235602084016129d7565b600060208284031215612d1457600080fd5b5035919050565b60008060408385031215612d2e57600080fd5b82359150612a9b60208401612a2f565b60008151808452612d568160208601602086016130e9565b601f01601f19169290920160200192915050565b600084516020612d7d8285838a016130e9565b855191840191612d908184848a016130e9565b8554920191600090600181811c9080831680612dad57607f831692505b858310811415612dcb57634e487b7160e01b85526022600452602485fd5b808015612ddf5760018114612df057612e1d565b60ff19851688528388019550612e1d565b60008b81526020902060005b85811015612e155781548a820152908401908801612dfc565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e6190830184612d3e565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ea357835183529284019291840191600101612e87565b50909695505050505050565b602081526000611c2e6020830184612d3e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526028908201527f6d6178204e465420706572206164647265737320657863656564656420666f726040820152672070726573616c6560c01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561307f5761307f6131c1565b604052919050565b6000821982111561309a5761309a61317f565b500190565b6000826130ae576130ae613195565b500490565b60008160001904831182151516156130cd576130cd61317f565b500290565b6000828210156130e4576130e461317f565b500390565b60005b838110156131045781810151838201526020016130ec565b83811115611aa35750506000910152565b600181811c9082168061312957607f821691505b6020821081141561314a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131645761316461317f565b5060010190565b60008261317a5761317a613195565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461121957600080fdfea26469706673582212209b884e303531f70c4744cfeb45f4eae7241122d7dfbc58b381e9080ea1a7879464736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d656266655776566274615a667168654662693143594e4e5a4e58764c63543871384c525a6a6d48464238556a2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d524c7768555238424d74456f6f7a5a786b746b466e59615965565438636358557276346632537557475864672f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c806370a08231116101e7578063a0712d681161010d578063d0eb26b0116100a0578063eced38731161006f578063eced387314610a98578063edec5f2714610aae578063f2c4ce1e14610ace578063f2fde38b14610aee57600080fd5b8063d0eb26b0146109f9578063d5abeb0114610a19578063da3ef23f14610a2f578063e985e9c514610a4f57600080fd5b8063ba7d2c76116100dc578063ba7d2c7614610998578063c6682862146109ae578063c87b56dd146109c3578063cc9ff9c6146109e357600080fd5b8063a0712d681461092f578063a18116f114610942578063a22cb46514610958578063b88d4fde1461097857600080fd5b8063831e60de116101855780638fdcf942116101545780638fdcf942146108ba578063940cd05b146108da57806395d89b41146108fa5780639c70b5121461090f57600080fd5b8063831e60de1461085f57806383a076be14610874578063853828b6146108945780638da5cb5b1461089c57600080fd5b8063743c7f6b116101c1578063743c7f6b146107f35780637967a50a146108135780637effc032146108295780637f00c7a61461083f57600080fd5b806370a08231146107a9578063714c5398146107c9578063715018a6146107de57600080fd5b80632e09282e116102d757806355f804b31161026a578063669736c011610239578063669736c01461073f5780636c0360eb1461075f5780636f8b44b0146107745780636f9fb98a1461079457600080fd5b806355f804b3146106c55780635c975abb146106e55780636352211e146106ff57806363bc312a1461071f57600080fd5b806342f0ca0d116102a657806342f0ca0d14610639578063438b63001461065957806344a0d68a1461068657806351830227146106a657600080fd5b80632e09282e146105aa5780633af32abf146105c05780633c952764146105f957806342842e0e1461061957600080fd5b80630a50716b1161034f57806318cae2691161031e57806318cae269146105315780631985cc651461055e578063239c70ae1461057457806323b872dd1461058a57600080fd5b80630a50716b146104b85780630e54a883146104d857806313faede6146104f857806318160ddd1461051c57600080fd5b8063081812fc1161038b578063081812fc1461042b578063081c8c4414610463578063095ea7b3146104785780630a403f041461049857600080fd5b806301ffc9a7146103b257806302329a29146103e757806306fdde0314610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612c7f565b610b0e565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b50610407610402366004612c64565b610b60565b005b34801561041557600080fd5b5061041e610ba6565b6040516103de9190612eaf565b34801561043757600080fd5b5061044b610446366004612d02565b610c38565b6040516001600160a01b0390911681526020016103de565b34801561046f57600080fd5b5061041e610ccd565b34801561048457600080fd5b50610407610493366004612b86565b610d5b565b3480156104a457600080fd5b506104076104b3366004612d02565b610e71565b3480156104c457600080fd5b506104076104d3366004612d02565b610ea0565b3480156104e457600080fd5b506104076104f3366004612d02565b610ecf565b34801561050457600080fd5b5061050e600c5481565b6040519081526020016103de565b34801561052857600080fd5b5061050e610efe565b34801561053d57600080fd5b5061050e61054c366004612a56565b60186020526000908152604090205481565b34801561056a57600080fd5b5061050e60135481565b34801561058057600080fd5b5061050e60105481565b34801561059657600080fd5b506104076105a5366004612aa4565b610f0e565b3480156105b657600080fd5b5061050e60115481565b3480156105cc57600080fd5b506103d26105db366004612a56565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561060557600080fd5b50610407610614366004612c64565b610f3f565b34801561062557600080fd5b50610407610634366004612aa4565b610f85565b34801561064557600080fd5b50610407610654366004612d02565b610fa0565b34801561066557600080fd5b50610679610674366004612a56565b610fcf565b6040516103de9190612e6b565b34801561069257600080fd5b506104076106a1366004612d02565b6110b0565b3480156106b257600080fd5b506016546103d290610100900460ff1681565b3480156106d157600080fd5b506104076106e0366004612cb9565b6110df565b3480156106f157600080fd5b506016546103d29060ff1681565b34801561070b57600080fd5b5061044b61071a366004612d02565b611120565b34801561072b57600080fd5b5061040761073a366004612d02565b611197565b34801561074b57600080fd5b5061040761075a366004612d02565b61121c565b34801561076b57600080fd5b5061041e61124b565b34801561078057600080fd5b5061040761078f366004612d02565b611258565b3480156107a057600080fd5b5061050e611287565b3480156107b557600080fd5b5061050e6107c4366004612a56565b6112b9565b3480156107d557600080fd5b5061041e611340565b3480156107ea57600080fd5b5061040761137a565b3480156107ff57600080fd5b5061040761080e366004612d02565b6113b0565b34801561081f57600080fd5b5061050e60145481565b34801561083557600080fd5b5061050e600f5481565b34801561084b57600080fd5b5061040761085a366004612d02565b6113df565b34801561086b57600080fd5b5061050e61140e565b34801561088057600080fd5b5061040761088f366004612d1b565b611428565b61040761150a565b3480156108a857600080fd5b506006546001600160a01b031661044b565b3480156108c657600080fd5b506104076108d5366004612d02565b611852565b3480156108e657600080fd5b506104076108f5366004612c64565b611881565b34801561090657600080fd5b5061041e6118c5565b34801561091b57600080fd5b506016546103d29062010000900460ff1681565b61040761093d366004612d02565b6118d4565b34801561094e57600080fd5b5061050e600e5481565b34801561096457600080fd5b50610407610973366004612b5c565b611a66565b34801561098457600080fd5b50610407610993366004612ae0565b611a71565b3480156109a457600080fd5b5061050e60125481565b3480156109ba57600080fd5b5061041e611aa9565b3480156109cf57600080fd5b5061041e6109de366004612d02565b611ab6565b3480156109ef57600080fd5b5061050e600b5481565b348015610a0557600080fd5b50610407610a14366004612d02565b611c3a565b348015610a2557600080fd5b5061050e600d5481565b348015610a3b57600080fd5b50610407610a4a366004612cb9565b611c69565b348015610a5b57600080fd5b506103d2610a6a366004612a71565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aa457600080fd5b5061050e60155481565b348015610aba57600080fd5b50610407610ac9366004612bb0565b611ca6565b348015610ada57600080fd5b50610407610ae9366004612cb9565b611d38565b348015610afa57600080fd5b50610407610b09366004612a56565b611d75565b60006001600160e01b031982166380ac58cd60e01b1480610b3f57506001600160e01b03198216635b5e139f60e01b145b80610b5a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b03163314610b935760405162461bcd60e51b8152600401610b8a90612f5c565b60405180910390fd5b6016805460ff1916911515919091179055565b606060008054610bb590613115565b80601f0160208091040260200160405190810160405280929190818152602001828054610be190613115565b8015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610cb15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b506000908152600460205260409020546001600160a01b031690565b600a8054610cda90613115565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0690613115565b8015610d535780601f10610d2857610100808354040283529160200191610d53565b820191906000526020600020905b815481529060010190602001808311610d3657829003601f168201915b505050505081565b6000610d6682611120565b9050806001600160a01b0316836001600160a01b03161415610dd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b8a565b336001600160a01b0382161480610df05750610df08133610a6a565b610e625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b8a565b610e6c8383611e0d565b505050565b6006546001600160a01b03163314610e9b5760405162461bcd60e51b8152600401610b8a90612f5c565b600e55565b6006546001600160a01b03163314610eca5760405162461bcd60e51b8152600401610b8a90612f5c565b601155565b6006546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b8a90612f5c565b601555565b6000610f0960075490565b905090565b610f183382611e7b565b610f345760405162461bcd60e51b8152600401610b8a90613005565b610e6c838383611f72565b6006546001600160a01b03163314610f695760405162461bcd60e51b8152600401610b8a90612f5c565b60168054911515620100000262ff000019909216919091179055565b610e6c83838360405180602001604052806000815250611a71565b6006546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610b8a90612f5c565b601455565b60606000610fdc836112b9565b905060008167ffffffffffffffff811115610ff957610ff96131c1565b604051908082528060200260200182016040528015611022578160200160208202803683370190505b509050600160005b838110801561103b5750600d548211155b156110a657600061104b83611120565b9050866001600160a01b0316816001600160a01b03161415611093578284838151811061107a5761107a6131ab565b60209081029190910101528161108f81613150565b9250505b8261109d81613150565b9350505061102a565b5090949350505050565b6006546001600160a01b031633146110da5760405162461bcd60e51b8152600401610b8a90612f5c565b600c55565b6006546001600160a01b031633146111095760405162461bcd60e51b8152600401610b8a90612f5c565b805161111c90600890602084019061293e565b5050565b6000818152600260205260408120546001600160a01b031680610b5a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b8a565b6006546001600160a01b031633146111c15760405162461bcd60e51b8152600401610b8a90612f5c565b60165460ff16156111d157600080fd5b600081116111de57600080fd5b6010548111156111ed57600080fd5b600d54816111fa60075490565b6112049190613087565b111561120f57600080fd5b611219338261210e565b50565b6006546001600160a01b031633146112465760405162461bcd60e51b8152600401610b8a90612f5c565b600f55565b60088054610cda90613115565b6006546001600160a01b031633146112825760405162461bcd60e51b8152600401610b8a90612f5c565b600d55565b6006546000906001600160a01b031633146112b45760405162461bcd60e51b8152600401610b8a90612f5c565b504790565b60006001600160a01b0382166113245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b8a565b506001600160a01b031660009081526003602052604090205490565b6006546060906001600160a01b0316331461136d5760405162461bcd60e51b8152600401610b8a90612f5c565b60088054610bb590613115565b6006546001600160a01b031633146113a45760405162461bcd60e51b8152600401610b8a90612f5c565b6113ae600061214b565b565b6006546001600160a01b031633146113da5760405162461bcd60e51b8152600401610b8a90612f5c565b601355565b6006546001600160a01b031633146114095760405162461bcd60e51b8152600401610b8a90612f5c565b601055565b60006014544210156114215750600b5490565b50600c5490565b6006546001600160a01b031633146114525760405162461bcd60e51b8152600401610b8a90612f5c565b600082116114a25760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b600d54826114af60075490565b6114b99190613087565b11156115005760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b61111c338361210e565b6006546001600160a01b031633146115345760405162461bcd60e51b8152600401610b8a90612f5c565b6000620186a0611546476174366130b3565b611550919061309f565b90506000620186a0611564476147636130b3565b61156e919061309f565b90506000620186a061158247610d486130b3565b61158c919061309f565b90506000620186a06115a047610d486130b3565b6115aa919061309f565b90506000620186a06115be476106a46130b3565b6115c8919061309f565b90506000620186a06115dc4761084d6130b3565b6115e6919061309f565b90506000620186a06115fa476103526130b3565b611604919061309f565b90506000620186a061161847613a986130b3565b611622919061309f565b90506000620186a0611636476142686130b3565b611640919061309f565b90506000620186a0611654476121346130b3565b61165e919061309f565b6019546040519192506001600160a01b0316908b156108fc02908c906000818181858888f1935050505061169157600080fd5b601a546040516001600160a01b03909116908a156108fc02908b906000818181858888f193505050506116c357600080fd5b601b546040516001600160a01b039091169089156108fc02908a906000818181858888f193505050506116f557600080fd5b601c546040516001600160a01b039091169088156108fc029089906000818181858888f1935050505061172757600080fd5b601d546040516001600160a01b039091169087156108fc029088906000818181858888f1935050505061175957600080fd5b601e546040516001600160a01b039091169086156108fc029087906000818181858888f1935050505061178b57600080fd5b601f546040516001600160a01b039091169085156108fc029086906000818181858888f193505050506117bd57600080fd5b6020546040516001600160a01b039091169084156108fc029085906000818181858888f193505050506117ef57600080fd5b6021546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505061182157600080fd5b604051339082156108fc029083906000818181858888f1935050505061184657600080fd5b50505050505050505050565b6006546001600160a01b0316331461187c5760405162461bcd60e51b8152600401610b8a90612f5c565b600b55565b6006546001600160a01b031633146118ab5760405162461bcd60e51b8152600401610b8a90612f5c565b601680549115156101000261ff0019909216919091179055565b606060018054610bb590613115565b60165460ff16156119205760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610b8a565b6013544210156119725760405162461bcd60e51b815260206004820152601860248201527f53616c6520686173206e6f7420737461727465642079657400000000000000006044820152606401610b8a565b80600081116119c35760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b8a565b3360009081526018602052604090205460155442106119eb576119e6818461219d565b6119fe565b6119fe81846119f960075490565b612247565b600d5483611a0b60075490565b611a159190613087565b1115611a5c5760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b8a565b610e6c338461210e565b61111c338383612493565b611a7b3383611e7b565b611a975760405162461bcd60e51b8152600401610b8a90613005565b611aa384848484612562565b50505050565b60098054610cda90613115565b6000818152600260205260409020546060906001600160a01b0316611b355760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b8a565b601654610100900460ff16611bd657600a8054611b5190613115565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7d90613115565b8015611bca5780601f10611b9f57610100808354040283529160200191611bca565b820191906000526020600020905b815481529060010190602001808311611bad57829003601f168201915b50505050509050919050565b6000611be0612595565b90506000815111611c005760405180602001604052806000815250611c2e565b80611c0a846125a4565b6009604051602001611c1e93929190612d6a565b6040516020818303038152906040525b9392505050565b919050565b6006546001600160a01b03163314611c645760405162461bcd60e51b8152600401610b8a90612f5c565b601255565b6006546001600160a01b03163314611c935760405162461bcd60e51b8152600401610b8a90612f5c565b805161111c90600990602084019061293e565b6006546001600160a01b03163314611cd05760405162461bcd60e51b8152600401610b8a90612f5c565b60005b815181101561111c57600160176000848481518110611cf457611cf46131ab565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611d3081613150565b915050611cd3565b6006546001600160a01b03163314611d625760405162461bcd60e51b8152600401610b8a90612f5c565b805161111c90600a90602084019061293e565b6006546001600160a01b03163314611d9f5760405162461bcd60e51b8152600401610b8a90612f5c565b6001600160a01b038116611e045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8a565b6112198161214b565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e4282611120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ef45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b8a565b6000611eff83611120565b9050806001600160a01b0316846001600160a01b03161480611f3a5750836001600160a01b0316611f2f84610c38565b6001600160a01b0316145b80611f6a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f8582611120565b6001600160a01b031614611fe95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b8a565b6001600160a01b03821661204b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b8a565b612056600082611e0d565b6001600160a01b038316600090815260036020526040812080546001929061207f9084906130d2565b90915550506001600160a01b03821660009081526003602052604081208054600192906120ad908490613087565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610e6c57612127600780546001019055565b6121398361213460075490565b6126a2565b8061214381613150565b915050612111565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6012546121aa8284613087565b11156121f85760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610b8a565b80600c5461220691906130b3565b3410156122255760405162461bcd60e51b8152600401610b8a90612f91565b60105481111561111c5760405162461bcd60e51b8152600401610b8a90612f14565b6000601454421061225c5750600c5480612262565b50600b54805b5060165462010000900460ff161515600114156123b8573360009081526017602052604090205460ff166122d85760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610b8a565b6011546122e58486613087565b11156123035760405162461bcd60e51b8152600401610b8a90612fbd565b61230d83826130b3565b34101561232c5760405162461bcd60e51b8152600401610b8a90612f91565b600f5483111561234e5760405162461bcd60e51b8152600401610b8a90612f14565b600e548361235b60075490565b6123659190613087565b11156123b35760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b611aa3565b6011546123c58486613087565b11156123e35760405162461bcd60e51b8152600401610b8a90612fbd565b6123ed83826130b3565b34101561240c5760405162461bcd60e51b8152600401610b8a90612f91565b600f5483111561242e5760405162461bcd60e51b8152600401610b8a90612f14565b600e548361243b60075490565b6124459190613087565b1115611aa35760405162461bcd60e51b815260206004820152601e60248201527f6d6178204e46542070726573616c65206c696d697420657863656564656400006044820152606401610b8a565b816001600160a01b0316836001600160a01b031614156124f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61256d848484611f72565b612579848484846126bc565b611aa35760405162461bcd60e51b8152600401610b8a90612ec2565b606060088054610bb590613115565b6060816125c85750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125f257806125dc81613150565b91506125eb9050600a8361309f565b91506125cc565b60008167ffffffffffffffff81111561260d5761260d6131c1565b6040519080825280601f01601f191660200182016040528015612637576020820181803683370190505b5090505b8415611f6a5761264c6001836130d2565b9150612659600a8661316b565b612664906030613087565b60f81b818381518110612679576126796131ab565b60200101906001600160f81b031916908160001a90535061269b600a8661309f565b945061263b565b61111c8282604051806020016040528060008152506127c9565b60006001600160a01b0384163b156127be57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612700903390899088908890600401612e2e565b602060405180830381600087803b15801561271a57600080fd5b505af192505050801561274a575060408051601f3d908101601f1916820190925261274791810190612c9c565b60015b6127a4573d808015612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50805161279c5760405162461bcd60e51b8152600401610b8a90612ec2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f6a565b506001949350505050565b6127d383836127fc565b6127e060008484846126bc565b610e6c5760405162461bcd60e51b8152600401610b8a90612ec2565b6001600160a01b0382166128525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8a565b6000818152600260205260409020546001600160a01b0316156128b75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8a565b6001600160a01b03821660009081526003602052604081208054600192906128e0908490613087565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461294a90613115565b90600052602060002090601f01602090048101928261296c57600085556129b2565b82601f1061298557805160ff19168380011785556129b2565b828001600101855582156129b2579182015b828111156129b2578251825591602001919060010190612997565b506129be9291506129c2565b5090565b5b808211156129be57600081556001016129c3565b600067ffffffffffffffff8311156129f1576129f16131c1565b612a04601f8401601f1916602001613056565b9050828152838383011115612a1857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611c3557600080fd5b80358015158114611c3557600080fd5b600060208284031215612a6857600080fd5b611c2e82612a2f565b60008060408385031215612a8457600080fd5b612a8d83612a2f565b9150612a9b60208401612a2f565b90509250929050565b600080600060608486031215612ab957600080fd5b612ac284612a2f565b9250612ad060208501612a2f565b9150604084013590509250925092565b60008060008060808587031215612af657600080fd5b612aff85612a2f565b9350612b0d60208601612a2f565b925060408501359150606085013567ffffffffffffffff811115612b3057600080fd5b8501601f81018713612b4157600080fd5b612b50878235602084016129d7565b91505092959194509250565b60008060408385031215612b6f57600080fd5b612b7883612a2f565b9150612a9b60208401612a46565b60008060408385031215612b9957600080fd5b612ba283612a2f565b946020939093013593505050565b60006020808385031215612bc357600080fd5b823567ffffffffffffffff80821115612bdb57600080fd5b818501915085601f830112612bef57600080fd5b813581811115612c0157612c016131c1565b8060051b9150612c12848301613056565b8181528481019084860184860187018a1015612c2d57600080fd5b600095505b83861015612c5757612c4381612a2f565b835260019590950194918601918601612c32565b5098975050505050505050565b600060208284031215612c7657600080fd5b611c2e82612a46565b600060208284031215612c9157600080fd5b8135611c2e816131d7565b600060208284031215612cae57600080fd5b8151611c2e816131d7565b600060208284031215612ccb57600080fd5b813567ffffffffffffffff811115612ce257600080fd5b8201601f81018413612cf357600080fd5b611f6a848235602084016129d7565b600060208284031215612d1457600080fd5b5035919050565b60008060408385031215612d2e57600080fd5b82359150612a9b60208401612a2f565b60008151808452612d568160208601602086016130e9565b601f01601f19169290920160200192915050565b600084516020612d7d8285838a016130e9565b855191840191612d908184848a016130e9565b8554920191600090600181811c9080831680612dad57607f831692505b858310811415612dcb57634e487b7160e01b85526022600452602485fd5b808015612ddf5760018114612df057612e1d565b60ff19851688528388019550612e1d565b60008b81526020902060005b85811015612e155781548a820152908401908801612dfc565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e6190830184612d3e565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ea357835183529284019291840191600101612e87565b50909695505050505050565b602081526000611c2e6020830184612d3e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526028908201527f6d6178204e465420706572206164647265737320657863656564656420666f726040820152672070726573616c6560c01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561307f5761307f6131c1565b604052919050565b6000821982111561309a5761309a61317f565b500190565b6000826130ae576130ae613195565b500490565b60008160001904831182151516156130cd576130cd61317f565b500290565b6000828210156130e4576130e461317f565b500390565b60005b838110156131045781810151838201526020016130ec565b83811115611aa35750506000910152565b600181811c9082168061312957607f821691505b6020821081141561314a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131645761316461317f565b5060010190565b60008261317a5761317a613195565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461121957600080fdfea26469706673582212209b884e303531f70c4744cfeb45f4eae7241122d7dfbc58b381e9080ea1a7879464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d656266655776566274615a667168654662693143594e4e5a4e58764c63543871384c525a6a6d48464238556a2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d524c7768555238424d74456f6f7a5a786b746b466e59615965565438636358557276346632537557475864672f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmebfeWvVbtaZfqheFbi1CYNNZNXvLcT8q8LRZjmHFB8Uj/
Arg [1] : _initNotRevealedUri (string): ipfs://QmRLwhUR8BMtEoozZxktkFnYaYeVT8ccXUrv4f2SuWGXdg/hidden.json

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d656266655776566274615a667168654662693143594e4e
Arg [4] : 5a4e58764c63543871384c525a6a6d48464238556a2f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [6] : 697066733a2f2f516d524c7768555238424d74456f6f7a5a786b746b466e5961
Arg [7] : 5965565438636358557276346632537557475864672f68696464656e2e6a736f
Arg [8] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47048:10380:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26654:305;;;;;;;;;;-1:-1:-1;26654:305:0;;;;;:::i;:::-;;:::i;:::-;;;8599:14:1;;8592:22;8574:41;;8562:2;8547:18;26654:305:0;;;;;;;;54270:73;;;;;;;;;;-1:-1:-1;54270:73:0;;;;;:::i;:::-;;:::i;:::-;;27599:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29158:221::-;;;;;;;;;;-1:-1:-1;29158:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7260:32:1;;;7242:51;;7230:2;7215:18;29158:221:0;7096:203:1;47275:28:0;;;;;;;;;;;;;:::i;28681:411::-;;;;;;;;;;-1:-1:-1;28681:411:0;;;;;:::i;:::-;;:::i;55385:128::-;;;;;;;;;;-1:-1:-1;55385:128:0;;;;;:::i;:::-;;:::i;54349:118::-;;;;;;;;;;-1:-1:-1;54349:118:0;;;;;:::i;:::-;;:::i;55847:114::-;;;;;;;;;;-1:-1:-1;55847:114:0;;;;;:::i;:::-;;:::i;47352:32::-;;;;;;;;;;;;;;;;;;;19018:25:1;;;19006:2;18991:18;47352:32:0;18872:177:1;53648:89:0;;;;;;;;;;;;;:::i;47935:55::-;;;;;;;;;;-1:-1:-1;47935:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;47644:39;;;;;;;;;;;;;;;;47512:32;;;;;;;;;;;;;;;;29908:339;;;;;;;;;;-1:-1:-1;29908:339:0;;;;;:::i;:::-;;:::i;47549:46::-;;;;;;;;;;;;;;;;52339:112;;;;;;;;;;-1:-1:-1;52339:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;52418:27:0;52398:4;52418:27;;;:20;:27;;;;;;;;;52339:112;55969:95;;;;;;;;;;-1:-1:-1;55969:95:0;;;;;:::i;:::-;;:::i;30318:185::-;;;;;;;;;;-1:-1:-1;30318:185:0;;;;;:::i;:::-;;:::i;55727:114::-;;;;;;;;;;-1:-1:-1;55727:114:0;;;;;:::i;:::-;;:::i;52458:635::-;;;;;;;;;;-1:-1:-1;52458:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54683:80::-;;;;;;;;;;-1:-1:-1;54683:80:0;;;;;:::i;:::-;;:::i;47813:28::-;;;;;;;;;;-1:-1:-1;47813:28:0;;;;;;;;;;;55027:98;;;;;;;;;;-1:-1:-1;55027:98:0;;;;;:::i;:::-;;:::i;47782:26::-;;;;;;;;;;-1:-1:-1;47782:26:0;;;;;;;;27293:239;;;;;;;;;;-1:-1:-1;27293:239:0;;;;;:::i;:::-;;:::i;51556:266::-;;;;;;;;;;-1:-1:-1;51556:266:0;;;;;:::i;:::-;;:::i;54769:130::-;;;;;;;;;;-1:-1:-1;54769:130:0;;;;;:::i;:::-;;:::i;47207:21::-;;;;;;;;;;;;;:::i;55519:94::-;;;;;;;;;;-1:-1:-1;55519:94:0;;;;;:::i;:::-;;:::i;54047:111::-;;;;;;;;;;;;;:::i;27023:208::-;;;;;;;;;;-1:-1:-1;27023:208:0;;;;;:::i;:::-;;:::i;53946:95::-;;;;;;;;;;;;;:::i;6195:103::-;;;;;;;;;;;;;:::i;55619:102::-;;;;;;;;;;-1:-1:-1;55619:102:0;;;;;:::i;:::-;;:::i;47688:42::-;;;;;;;;;;;;;;;;47468:39;;;;;;;;;;;;;;;;54905:116;;;;;;;;;;-1:-1:-1;54905:116:0;;;;;:::i;:::-;;:::i;53743:175::-;;;;;;;;;;;;;:::i;52047:268::-;;;;;;;;;;-1:-1:-1;52047:268:0;;;;;:::i;:::-;;:::i;56262:1157::-;;;:::i;5544:87::-;;;;;;;;;;-1:-1:-1;5617:6:0;;-1:-1:-1;;;;;5617:6:0;5544:87;;54583:94;;;;;;;;;;-1:-1:-1;54583:94:0;;;;;:::i;:::-;;:::i;54188:76::-;;;;;;;;;;-1:-1:-1;54188:76:0;;;;;:::i;:::-;;:::i;27768:104::-;;;;;;;;;;;;;:::i;47846:34::-;;;;;;;;;;-1:-1:-1;47846:34:0;;;;;;;;;;;50965:584;;;;;;:::i;:::-;;:::i;47425:38::-;;;;;;;;;;;;;;;;29451:155;;;;;;;;;;-1:-1:-1;29451:155:0;;;;;:::i;:::-;;:::i;30574:328::-;;;;;;;;;;-1:-1:-1;30574:328:0;;;;;:::i;:::-;;:::i;47600:39::-;;;;;;;;;;;;;;;;47233:37;;;;;;;;;;;;;:::i;53099:539::-;;;;;;;;;;-1:-1:-1;53099:539:0;;;;;:::i;:::-;;:::i;47308:39::-;;;;;;;;;;;;;;;;54473:104;;;;;;;;;;-1:-1:-1;54473:104:0;;;;;:::i;:::-;;:::i;47389:31::-;;;;;;;;;;;;;;;;55131:122;;;;;;;;;;-1:-1:-1;55131:122:0;;;;;:::i;:::-;;:::i;29677:164::-;;;;;;;;;;-1:-1:-1;29677:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29798:25:0;;;29774:4;29798:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29677:164;47735:42;;;;;;;;;;;;;;;;56070:186;;;;;;;;;;-1:-1:-1;56070:186:0;;;;;:::i;:::-;;:::i;55259:120::-;;;;;;;;;;-1:-1:-1;55259:120:0;;;;;:::i;:::-;;:::i;6453:201::-;;;;;;;;;;-1:-1:-1;6453:201:0;;;;;:::i;:::-;;:::i;26654:305::-;26756:4;-1:-1:-1;;;;;;26793:40:0;;-1:-1:-1;;;26793:40:0;;:105;;-1:-1:-1;;;;;;;26850:48:0;;-1:-1:-1;;;26850:48:0;26793:105;:158;;;-1:-1:-1;;;;;;;;;;18437:40:0;;;26915:36;26773:178;26654:305;-1:-1:-1;;26654:305:0:o;54270:73::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;;;;;;;;;54322:6:::1;:15:::0;;-1:-1:-1;;54322:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54270:73::o;27599:100::-;27653:13;27686:5;27679:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27599:100;:::o;29158:221::-;29234:7;32501:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32501:16:0;29254:73;;;;-1:-1:-1;;;29254:73:0;;14890:2:1;29254:73:0;;;14872:21:1;14929:2;14909:18;;;14902:30;14968:34;14948:18;;;14941:62;-1:-1:-1;;;15019:18:1;;;15012:42;15071:19;;29254:73:0;14688:408:1;29254:73:0;-1:-1:-1;29347:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29347:24:0;;29158:221::o;47275:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28681:411::-;28762:13;28778:23;28793:7;28778:14;:23::i;:::-;28762:39;;28826:5;-1:-1:-1;;;;;28820:11:0;:2;-1:-1:-1;;;;;28820:11:0;;;28812:57;;;;-1:-1:-1;;;28812:57:0;;16790:2:1;28812:57:0;;;16772:21:1;16829:2;16809:18;;;16802:30;16868:34;16848:18;;;16841:62;-1:-1:-1;;;16919:18:1;;;16912:31;16960:19;;28812:57:0;16588:397:1;28812:57:0;4348:10;-1:-1:-1;;;;;28904:21:0;;;;:62;;-1:-1:-1;28929:37:0;28946:5;4348:10;29677:164;:::i;28929:37::-;28882:168;;;;-1:-1:-1;;;28882:168:0;;12932:2:1;28882:168:0;;;12914:21:1;12971:2;12951:18;;;12944:30;13010:34;12990:18;;;12983:62;13081:26;13061:18;;;13054:54;13125:19;;28882:168:0;12730:420:1;28882:168:0;29063:21;29072:2;29076:7;29063:8;:21::i;:::-;28751:341;28681:411;;:::o;55385:128::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55468:16:::1;:39:::0;55385:128::o;54349:118::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54427:25:::1;:34:::0;54349:118::o;55847:114::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55923:14:::1;:32:::0;55847:114::o;53648:89::-;53692:7;53715:16;:6;964:14;;872:114;53715:16;53708:23;;53648:89;:::o;29908:339::-;30103:41;4348:10;30136:7;30103:18;:41::i;:::-;30095:103;;;;-1:-1:-1;;;30095:103:0;;;;;;;:::i;:::-;30211:28;30221:4;30227:2;30231:7;30211:9;:28::i;55969:95::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;56034:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;56034:24:0;;::::1;::::0;;;::::1;::::0;;55969:95::o;30318:185::-;30456:39;30473:4;30479:2;30483:7;30456:39;;;;;;;;;;;;:16;:39::i;55727:114::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55803:14:::1;:32:::0;55727:114::o;52458:635::-;52533:16;52561:23;52587:17;52597:6;52587:9;:17::i;:::-;52561:43;;52611:30;52658:15;52644:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52644:30:0;-1:-1:-1;52611:63:0;-1:-1:-1;52706:1:0;52681:22;52750:309;52775:15;52757;:33;:64;;;;;52812:9;;52794:14;:27;;52757:64;52750:309;;;52832:25;52860:23;52868:14;52860:7;:23::i;:::-;52832:51;;52919:6;-1:-1:-1;;;;;52898:27:0;:17;-1:-1:-1;;;;;52898:27:0;;52894:131;;;52971:14;52938:13;52952:15;52938:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;52998:17;;;;:::i;:::-;;;;52894:131;53035:16;;;;:::i;:::-;;;;52823:236;52750:309;;;-1:-1:-1;53074:13:0;;52458:635;-1:-1:-1;;;;52458:635:0:o;54683:80::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54742:4:::1;:15:::0;54683:80::o;55027:98::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55098:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55027:98:::0;:::o;27293:239::-;27365:7;27401:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27401:16:0;27436:19;27428:73;;;;-1:-1:-1;;;27428:73:0;;13768:2:1;27428:73:0;;;13750:21:1;13807:2;13787:18;;;13780:30;13846:34;13826:18;;;13819:62;-1:-1:-1;;;13897:18:1;;;13890:39;13946:19;;27428:73:0;13566:405:1;51556:266:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;51632:6:::1;::::0;::::1;;51631:7;51623:16;;;::::0;::::1;;51668:1;51654:11;:15;51646:24;;;::::0;::::1;;51700:13;;51685:11;:28;;51677:37;;;::::0;::::1;;51763:9;;51748:11;51729:16;:6;964:14:::0;;872:114;51729:16:::1;:30;;;;:::i;:::-;:43;;51721:52;;;::::0;::::1;;51782:34;51792:10;51804:11;51782:9;:34::i;:::-;51556:266:::0;:::o;54769:130::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54853:20:::1;:40:::0;54769:130::o;47207:21::-;;;;;;;:::i;55519:94::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55585:9:::1;:22:::0;55519:94::o;54047:111::-;5617:6;;54108:7;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;-1:-1:-1;54131:21:0::1;54047:111:::0;:::o;27023:208::-;27095:7;-1:-1:-1;;;;;27123:19:0;;27115:74;;;;-1:-1:-1;;;27115:74:0;;13357:2:1;27115:74:0;;;13339:21:1;13396:2;13376:18;;;13369:30;13435:34;13415:18;;;13408:62;-1:-1:-1;;;13486:18:1;;;13479:40;13536:19;;27115:74:0;13155:406:1;27115:74:0;-1:-1:-1;;;;;;27207:16:0;;;;;:9;:16;;;;;;;27023:208::o;53946:95::-;5617:6;;53999:13;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54028:7:::1;54021:14;;;;;:::i;6195:103::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;55619:102::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55689:11:::1;:26:::0;55619:102::o;54905:116::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54982:13:::1;:33:::0;54905:116::o;53743:175::-;53790:7;53828:14;;53810:15;:32;53806:107;;;-1:-1:-1;53860:11:0;;;53743:175::o;53806:107::-;-1:-1:-1;53901:4:0;;;53743:175::o;52047:268::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;52149:1:::1;52135:11;:15;52127:55;;;::::0;-1:-1:-1;;;52127:55:0;;18718:2:1;52127:55:0::1;::::0;::::1;18700:21:1::0;18757:2;18737:18;;;18730:30;18796:29;18776:18;;;18769:57;18843:18;;52127:55:0::1;18516:351:1::0;52127:55:0::1;52231:9;;52216:11;52197:16;:6;964:14:::0;;872:114;52197:16:::1;:30;;;;:::i;:::-;:43;;52189:78;;;::::0;-1:-1:-1;;;52189:78:0;;14178:2:1;52189:78:0::1;::::0;::::1;14160:21:1::0;14217:2;14197:18;;;14190:30;-1:-1:-1;;;14236:18:1;;;14229:52;14298:18;;52189:78:0::1;13976:346:1::0;52189:78:0::1;52275:34;52285:10;52297:11;52275:9;:34::i;56262:1157::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;56317:16:::1;56367:6;56336:29;:21;56360:5;56336:29;:::i;:::-;:37;;;;:::i;:::-;56317:56:::0;-1:-1:-1;56380:16:0::1;56430:6;56399:29;:21;56423:5;56399:29;:::i;:::-;:37;;;;:::i;:::-;56380:56:::0;-1:-1:-1;56443:16:0::1;56492:6;56462:28;:21;56486:4;56462:28;:::i;:::-;:36;;;;:::i;:::-;56443:55:::0;-1:-1:-1;56505:16:0::1;56554:6;56524:28;:21;56548:4;56524:28;:::i;:::-;:36;;;;:::i;:::-;56505:55:::0;-1:-1:-1;56567:16:0::1;56616:6;56586:28;:21;56610:4;56586:28;:::i;:::-;:36;;;;:::i;:::-;56567:55:::0;-1:-1:-1;56629:16:0::1;56678:6;56648:28;:21;56672:4;56648:28;:::i;:::-;:36;;;;:::i;:::-;56629:55:::0;-1:-1:-1;56691:16:0::1;56739:6;56710:27;:21;56734:3;56710:27;:::i;:::-;:35;;;;:::i;:::-;56691:54:::0;-1:-1:-1;56752:16:0::1;56802:6;56771:29;:21;56795:5;56771:29;:::i;:::-;:37;;;;:::i;:::-;56752:56:::0;-1:-1:-1;56815:16:0::1;56865:6;56834:29;:21;56858:5;56834:29;:::i;:::-;:37;;;;:::i;:::-;56815:56:::0;-1:-1:-1;56878:19:0::1;56930:6;56900:28;:21;56924:4;56900:28;:::i;:::-;:36;;;;:::i;:::-;56967:2;::::0;56959:26:::1;::::0;56878:58;;-1:-1:-1;;;;;;56967:2:0::1;::::0;56959:26;::::1;;;::::0;56976:8;;56967:2:::1;56959:26:::0;56967:2;56959:26;56976:8;56967:2;56959:26;::::1;;;;;;56951:35;;;::::0;::::1;;57013:2;::::0;57005:26:::1;::::0;-1:-1:-1;;;;;57013:2:0;;::::1;::::0;57005:26;::::1;;;::::0;57022:8;;57013:2:::1;57005:26:::0;57013:2;57005:26;57022:8;57013:2;57005:26;::::1;;;;;;56997:35;;;::::0;::::1;;57059:2;::::0;57051:26:::1;::::0;-1:-1:-1;;;;;57059:2:0;;::::1;::::0;57051:26;::::1;;;::::0;57068:8;;57059:2:::1;57051:26:::0;57059:2;57051:26;57068:8;57059:2;57051:26;::::1;;;;;;57043:35;;;::::0;::::1;;57105:2;::::0;57097:26:::1;::::0;-1:-1:-1;;;;;57105:2:0;;::::1;::::0;57097:26;::::1;;;::::0;57114:8;;57105:2:::1;57097:26:::0;57105:2;57097:26;57114:8;57105:2;57097:26;::::1;;;;;;57089:35;;;::::0;::::1;;57151:2;::::0;57143:26:::1;::::0;-1:-1:-1;;;;;57151:2:0;;::::1;::::0;57143:26;::::1;;;::::0;57160:8;;57151:2:::1;57143:26:::0;57151:2;57143:26;57160:8;57151:2;57143:26;::::1;;;;;;57135:35;;;::::0;::::1;;57197:2;::::0;57189:26:::1;::::0;-1:-1:-1;;;;;57197:2:0;;::::1;::::0;57189:26;::::1;;;::::0;57206:8;;57197:2:::1;57189:26:::0;57197:2;57189:26;57206:8;57197:2;57189:26;::::1;;;;;;57181:35;;;::::0;::::1;;57243:2;::::0;57235:26:::1;::::0;-1:-1:-1;;;;;57243:2:0;;::::1;::::0;57235:26;::::1;;;::::0;57252:8;;57243:2:::1;57235:26:::0;57243:2;57235:26;57252:8;57243:2;57235:26;::::1;;;;;;57227:35;;;::::0;::::1;;57289:2;::::0;57281:26:::1;::::0;-1:-1:-1;;;;;57289:2:0;;::::1;::::0;57281:26;::::1;;;::::0;57298:8;;57289:2:::1;57281:26:::0;57289:2;57281:26;57298:8;57289:2;57281:26;::::1;;;;;;57273:35;;;::::0;::::1;;57335:2;::::0;57327:26:::1;::::0;-1:-1:-1;;;;;57335:2:0;;::::1;::::0;57327:26;::::1;;;::::0;57344:8;;57335:2:::1;57327:26:::0;57335:2;57327:26;57344:8;57335:2;57327:26;::::1;;;;;;57319:35;;;::::0;::::1;;57375:37;::::0;57383:10:::1;::::0;57375:37;::::1;;;::::0;57400:11;;57375:37:::1;::::0;;;57400:11;57383:10;57375:37;::::1;;;;;;57367:46;;;::::0;::::1;;56310:1109;;;;;;;;;;56262:1157::o:0;54583:94::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54649:11:::1;:22:::0;54583:94::o;54188:76::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54241:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;54241:17:0;;::::1;::::0;;;::::1;::::0;;54188:76::o;27768:104::-;27824:13;27857:7;27850:14;;;;;:::i;50965:584::-;48845:6;;;;48844:7;48836:42;;;;-1:-1:-1;;;48836:42:0;;15664:2:1;48836:42:0;;;15646:21:1;15703:2;15683:18;;;15676:30;-1:-1:-1;;;15722:18:1;;;15715:52;15784:18;;48836:42:0;15462:346:1;48836:42:0;48953:11:::1;;48934:15;:30;;48926:67;;;::::0;-1:-1:-1;;;48926:67:0;;9052:2:1;48926:67:0::1;::::0;::::1;9034:21:1::0;9091:2;9071:18;;;9064:30;9130:26;9110:18;;;9103:54;9174:18;;48926:67:0::1;8850:348:1::0;48926:67:0::1;51080:11:::2;49090:1;49076:11;:15;49068:55;;;::::0;-1:-1:-1;;;49068:55:0;;18718:2:1;49068:55:0::2;::::0;::::2;18700:21:1::0;18757:2;18737:18;;;18730:30;18796:29;18776:18;;;18769:57;18843:18;;49068:55:0::2;18516:351:1::0;49068:55:0::2;51150:10:::3;51103:23;51129:32:::0;;;:20:::3;:32;::::0;;;;;51261:14:::3;::::0;51243:15:::3;:32;:169;;51361:51;51383:15;51400:11;51361:21;:51::i;:::-;51243:169;;;51285:66;51304:15;51321:11;51334:16;:6;964:14:::0;;872:114;51334:16:::3;51285:18;:66::i;:::-;51463:9;;51448:11;51429:16;:6;964:14:::0;;872:114;51429:16:::3;:30;;;;:::i;:::-;:43;;51421:78;;;::::0;-1:-1:-1;;;51421:78:0;;14178:2:1;51421:78:0::3;::::0;::::3;14160:21:1::0;14217:2;14197:18;;;14190:30;-1:-1:-1;;;14236:18:1;;;14229:52;14298:18;;51421:78:0::3;13976:346:1::0;51421:78:0::3;51509:34;51519:10;51531:11;51509:9;:34::i;29451:155::-:0;29546:52;4348:10;29579:8;29589;29546:18;:52::i;30574:328::-;30749:41;4348:10;30782:7;30749:18;:41::i;:::-;30741:103;;;;-1:-1:-1;;;30741:103:0;;;;;;;:::i;:::-;30855:39;30869:4;30875:2;30879:7;30888:5;30855:13;:39::i;:::-;30574:328;;;;:::o;47233:37::-;;;;;;;:::i;53099:539::-;32477:4;32501:16;;;:7;:16;;;;;;53197:13;;-1:-1:-1;;;;;32501:16:0;53222:97;;;;-1:-1:-1;;;53222:97:0;;16374:2:1;53222:97:0;;;16356:21:1;16413:2;16393:18;;;16386:30;16452:34;16432:18;;;16425:62;-1:-1:-1;;;16503:18:1;;;16496:45;16558:19;;53222:97:0;16172:411:1;53222:97:0;53333:8;;;;;;;53328:305;;53359:14;53352:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53099:539;;;:::o;53328:305::-;53396:28;53427:10;:8;:10::i;:::-;53396:41;;53493:1;53468:14;53462:28;:32;:163;;;;;;;;;;;;;;;;;53546:14;53562:18;:7;:16;:18::i;:::-;53582:13;53529:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53462:163;53446:179;53099:539;-1:-1:-1;;;53099:539:0:o;53328:305::-;53099:539;;;:::o;54473:104::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;54544:18:::1;:27:::0;54473:104::o;55131:122::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55214:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;56070:186::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;56151:9:::1;56146:105;56170:9;:16;56166:1;:20;56146:105;;;56239:4;56202:20;:34;56223:9;56233:1;56223:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;56202:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;56202:34:0;:41;;-1:-1:-1;;56202:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56188:3;::::1;::::0;::::1;:::i;:::-;;;;56146:105;;55259:120:::0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;55341:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;6453:201::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6542:22:0;::::1;6534:73;;;::::0;-1:-1:-1;;;6534:73:0;;9824:2:1;6534:73:0::1;::::0;::::1;9806:21:1::0;9863:2;9843:18;;;9836:30;9902:34;9882:18;;;9875:62;-1:-1:-1;;;9953:18:1;;;9946:36;9999:19;;6534:73:0::1;9622:402:1::0;6534:73:0::1;6618:28;6637:8;6618:18;:28::i;36558:174::-:0;36633:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36633:29:0;-1:-1:-1;;;;;36633:29:0;;;;;;;;:24;;36687:23;36633:24;36687:14;:23::i;:::-;-1:-1:-1;;;;;36678:46:0;;;;;;;;;;;36558:174;;:::o;32706:348::-;32799:4;32501:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32501:16:0;32816:73;;;;-1:-1:-1;;;32816:73:0;;12519:2:1;32816:73:0;;;12501:21:1;12558:2;12538:18;;;12531:30;12597:34;12577:18;;;12570:62;-1:-1:-1;;;12648:18:1;;;12641:42;12700:19;;32816:73:0;12317:408:1;32816:73:0;32900:13;32916:23;32931:7;32916:14;:23::i;:::-;32900:39;;32969:5;-1:-1:-1;;;;;32958:16:0;:7;-1:-1:-1;;;;;32958:16:0;;:51;;;;33002:7;-1:-1:-1;;;;;32978:31:0;:20;32990:7;32978:11;:20::i;:::-;-1:-1:-1;;;;;32978:31:0;;32958:51;:87;;;-1:-1:-1;;;;;;29798:25:0;;;29774:4;29798:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33013:32;32950:96;32706:348;-1:-1:-1;;;;32706:348:0:o;35815:625::-;35974:4;-1:-1:-1;;;;;35947:31:0;:23;35962:7;35947:14;:23::i;:::-;-1:-1:-1;;;;;35947:31:0;;35939:81;;;;-1:-1:-1;;;35939:81:0;;10231:2:1;35939:81:0;;;10213:21:1;10270:2;10250:18;;;10243:30;10309:34;10289:18;;;10282:62;-1:-1:-1;;;10360:18:1;;;10353:35;10405:19;;35939:81:0;10029:401:1;35939:81:0;-1:-1:-1;;;;;36039:16:0;;36031:65;;;;-1:-1:-1;;;36031:65:0;;11351:2:1;36031:65:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:34;11409:18;;;11402:62;-1:-1:-1;;;11480:18:1;;;11473:34;11524:19;;36031:65:0;11149:400:1;36031:65:0;36213:29;36230:1;36234:7;36213:8;:29::i;:::-;-1:-1:-1;;;;;36255:15:0;;;;;;:9;:15;;;;;:20;;36274:1;;36255:15;:20;;36274:1;;36255:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36286:13:0;;;;;;:9;:13;;;;;:18;;36303:1;;36286:13;:18;;36303:1;;36286:18;:::i;:::-;;;;-1:-1:-1;;36315:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36315:21:0;-1:-1:-1;;;;;36315:21:0;;;;;;;;;36354:27;;36315:16;;36354:27;;;;;;;28751:341;28681:411;;:::o;51832:204::-;51912:9;51907:124;51931:11;51927:1;:15;51907:124;;;51958:18;:6;1083:19;;1101:1;1083:19;;;994:127;51958:18;51985:38;51995:9;52006:16;:6;964:14;;872:114;52006:16;51985:9;:38::i;:::-;51944:3;;;;:::i;:::-;;;;51907:124;;6814:191;6907:6;;;-1:-1:-1;;;;;6924:17:0;;;-1:-1:-1;;;;;;6924:17:0;;;;;;;6957:40;;6907:6;;;6924:17;6907:6;;6957:40;;6888:16;;6957:40;6877:128;6814:191;:::o;50551:398::-;50701:18;;50668:29;50686:11;50668:15;:29;:::i;:::-;:51;;50652:113;;;;-1:-1:-1;;;50652:113:0;;10994:2:1;50652:113:0;;;10976:21:1;11033:2;11013:18;;;11006:30;11072;11052:18;;;11045:58;11120:18;;50652:113:0;10792:352:1;50652:113:0;50800:11;50793:4;;:18;;;;:::i;:::-;50780:9;:31;;50772:62;;;;-1:-1:-1;;;50772:62:0;;;;;;;:::i;:::-;50872:13;;50857:11;:28;;50841:102;;;;-1:-1:-1;;;50841:102:0;;;;;;;:::i;49266:1279::-;49393:18;49436:14;;49418:15;:32;:93;;-1:-1:-1;49507:4:0;;;49418:93;;;-1:-1:-1;49473:11:0;;;49418:93;-1:-1:-1;49524:15:0;;;;;;;:23;;49543:4;49524:23;49520:1020;;;49578:10;52398:4;52418:27;;;:20;:27;;;;;;;;49556:61;;;;-1:-1:-1;;;49556:61:0;;18366:2:1;49556:61:0;;;18348:21:1;18405:2;18385:18;;;18378:30;18444:25;18424:18;;;18417:53;18487:18;;49556:61:0;18164:347:1;49556:61:0;49673:25;;49640:29;49658:11;49640:15;:29;:::i;:::-;:58;;49624:132;;;;-1:-1:-1;;;49624:132:0;;;;;;;:::i;:::-;49784:24;49797:11;49784:10;:24;:::i;:::-;49771:9;:37;;49763:68;;;;-1:-1:-1;;;49763:68:0;;;;;;;:::i;:::-;49869:20;;49854:11;:35;;49838:109;;;;-1:-1:-1;;;49838:109:0;;;;;;;:::i;:::-;50004:16;;49989:11;49970:16;:6;964:14;;872:114;49970:16;:30;;;;:::i;:::-;:50;;49954:114;;;;-1:-1:-1;;;49954:114:0;;16015:2:1;49954:114:0;;;15997:21:1;16054:2;16034:18;;;16027:30;16093:32;16073:18;;;16066:60;16143:18;;49954:114:0;15813:354:1;49954:114:0;49520:1020;;;50137:25;;50104:29;50122:11;50104:15;:29;:::i;:::-;:58;;50088:132;;;;-1:-1:-1;;;50088:132:0;;;;;;;:::i;:::-;50248:24;50261:11;50248:10;:24;:::i;:::-;50235:9;:37;;50227:68;;;;-1:-1:-1;;;50227:68:0;;;;;;;:::i;:::-;50333:20;;50318:11;:35;;50302:109;;;;-1:-1:-1;;;50302:109:0;;;;;;;:::i;:::-;50468:16;;50453:11;50434:16;:6;964:14;;872:114;50434:16;:30;;;;:::i;:::-;:50;;50418:114;;;;-1:-1:-1;;;50418:114:0;;16015:2:1;50418:114:0;;;15997:21:1;16054:2;16034:18;;;16027:30;16093:32;16073:18;;;16066:60;16143:18;;50418:114:0;15813:354:1;36874:315:0;37029:8;-1:-1:-1;;;;;37020:17:0;:5;-1:-1:-1;;;;;37020:17:0;;;37012:55;;;;-1:-1:-1;;;37012:55:0;;11756:2:1;37012:55:0;;;11738:21:1;11795:2;11775:18;;;11768:30;11834:27;11814:18;;;11807:55;11879:18;;37012:55:0;11554:349:1;37012:55:0;-1:-1:-1;;;;;37078:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37078:46:0;;;;;;;;;;37140:41;;8574::1;;;37140::0;;8547:18:1;37140:41:0;;;;;;;36874:315;;;:::o;31784:::-;31941:28;31951:4;31957:2;31961:7;31941:9;:28::i;:::-;31988:48;32011:4;32017:2;32021:7;32030:5;31988:22;:48::i;:::-;31980:111;;;;-1:-1:-1;;;31980:111:0;;;;;;;:::i;49158:102::-;49218:13;49247:7;49240:14;;;;;:::i;1830:723::-;1886:13;2107:10;2103:53;;-1:-1:-1;;2134:10:0;;;;;;;;;;;;-1:-1:-1;;;2134:10:0;;;;;1830:723::o;2103:53::-;2181:5;2166:12;2222:78;2229:9;;2222:78;;2255:8;;;;:::i;:::-;;-1:-1:-1;2278:10:0;;-1:-1:-1;2286:2:0;2278:10;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2332:17:0;;2310:39;;2360:154;2367:10;;2360:154;;2394:11;2404:1;2394:11;;:::i;:::-;;-1:-1:-1;2463:10:0;2471:2;2463:5;:10;:::i;:::-;2450:24;;:2;:24;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2420:56:0;;;;;;;;-1:-1:-1;2491:11:0;2500:2;2491:11;;:::i;:::-;;;2360:154;;33396:110;33472:26;33482:2;33486:7;33472:26;;;;;;;;;;;;:9;:26::i;37754:799::-;37909:4;-1:-1:-1;;;;;37930:13:0;;8540:19;:23;37926:620;;37966:72;;-1:-1:-1;;;37966:72:0;;-1:-1:-1;;;;;37966:36:0;;;;;:72;;4348:10;;38017:4;;38023:7;;38032:5;;37966:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37966:72:0;;;;;;;;-1:-1:-1;;37966:72:0;;;;;;;;;;;;:::i;:::-;;;37962:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38208:13:0;;38204:272;;38251:60;;-1:-1:-1;;;38251:60:0;;;;;;;:::i;38204:272::-;38426:6;38420:13;38411:6;38407:2;38403:15;38396:38;37962:529;-1:-1:-1;;;;;;38089:51:0;-1:-1:-1;;;38089:51:0;;-1:-1:-1;38082:58:0;;37926:620;-1:-1:-1;38530:4:0;37754:799;;;;;;:::o;33733:321::-;33863:18;33869:2;33873:7;33863:5;:18::i;:::-;33914:54;33945:1;33949:2;33953:7;33962:5;33914:22;:54::i;:::-;33892:154;;;;-1:-1:-1;;;33892:154:0;;;;;;;:::i;34390:439::-;-1:-1:-1;;;;;34470:16:0;;34462:61;;;;-1:-1:-1;;;34462:61:0;;14529:2:1;34462:61:0;;;14511:21:1;;;14548:18;;;14541:30;14607:34;14587:18;;;14580:62;14659:18;;34462:61:0;14327:356:1;34462:61:0;32477:4;32501:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32501:16:0;:30;34534:58;;;;-1:-1:-1;;;34534:58:0;;10637:2:1;34534:58:0;;;10619:21:1;10676:2;10656:18;;;10649:30;10715;10695:18;;;10688:58;10763:18;;34534:58:0;10435:352:1;34534:58:0;-1:-1:-1;;;;;34663:13:0;;;;;;:9;:13;;;;;:18;;34680:1;;34663:13;:18;;34680:1;;34663:18;:::i;:::-;;;;-1:-1:-1;;34692:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34692:21:0;-1:-1:-1;;;;;34692:21:0;;;;;;;;34731:33;;34692:16;;;34731:33;;34692:16;;34731:33;55098:21:::1;55027:98:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;603:160;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:963::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;2989:18;3030:2;3022:6;3019:14;3016:34;;;3046:1;3043;3036:12;3016:34;3084:6;3073:9;3069:22;3059:32;;3129:7;3122:4;3118:2;3114:13;3110:27;3100:55;;3151:1;3148;3141:12;3100:55;3187:2;3174:16;3209:2;3205;3202:10;3199:36;;;3215:18;;:::i;:::-;3261:2;3258:1;3254:10;3244:20;;3284:28;3308:2;3304;3300:11;3284:28;:::i;:::-;3346:15;;;3377:12;;;;3409:11;;;3439;;;3435:20;;3432:33;-1:-1:-1;3429:53:1;;;3478:1;3475;3468:12;3429:53;3500:1;3491:10;;3510:169;3524:2;3521:1;3518:9;3510:169;;;3581:23;3600:3;3581:23;:::i;:::-;3569:36;;3542:1;3535:9;;;;;3625:12;;;;3657;;3510:169;;;-1:-1:-1;3698:5:1;2746:963;-1:-1:-1;;;;;;;;2746:963:1:o;3714:180::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;3862:26;3878:9;3862:26;:::i;3899:245::-;3957:6;4010:2;3998:9;3989:7;3985:23;3981:32;3978:52;;;4026:1;4023;4016:12;3978:52;4065:9;4052:23;4084:30;4108:5;4084:30;:::i;4149:249::-;4218:6;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4319:9;4313:16;4338:30;4362:5;4338:30;:::i;4403:450::-;4472:6;4525:2;4513:9;4504:7;4500:23;4496:32;4493:52;;;4541:1;4538;4531:12;4493:52;4581:9;4568:23;4614:18;4606:6;4603:30;4600:50;;;4646:1;4643;4636:12;4600:50;4669:22;;4722:4;4714:13;;4710:27;-1:-1:-1;4700:55:1;;4751:1;4748;4741:12;4700:55;4774:73;4839:7;4834:2;4821:16;4816:2;4812;4808:11;4774:73;:::i;4858:180::-;4917:6;4970:2;4958:9;4949:7;4945:23;4941:32;4938:52;;;4986:1;4983;4976:12;4938:52;-1:-1:-1;5009:23:1;;4858:180;-1:-1:-1;4858:180:1:o;5043:254::-;5111:6;5119;5172:2;5160:9;5151:7;5147:23;5143:32;5140:52;;;5188:1;5185;5178:12;5140:52;5224:9;5211:23;5201:33;;5253:38;5287:2;5276:9;5272:18;5253:38;:::i;5302:257::-;5343:3;5381:5;5375:12;5408:6;5403:3;5396:19;5424:63;5480:6;5473:4;5468:3;5464:14;5457:4;5450:5;5446:16;5424:63;:::i;:::-;5541:2;5520:15;-1:-1:-1;;5516:29:1;5507:39;;;;5548:4;5503:50;;5302:257;-1:-1:-1;;5302:257:1:o;5564:1527::-;5788:3;5826:6;5820:13;5852:4;5865:51;5909:6;5904:3;5899:2;5891:6;5887:15;5865:51;:::i;:::-;5979:13;;5938:16;;;;6001:55;5979:13;5938:16;6023:15;;;6001:55;:::i;:::-;6145:13;;6078:20;;;6118:1;;6205;6227:18;;;;6280;;;;6307:93;;6385:4;6375:8;6371:19;6359:31;;6307:93;6448:2;6438:8;6435:16;6415:18;6412:40;6409:167;;;-1:-1:-1;;;6475:33:1;;6531:4;6528:1;6521:15;6561:4;6482:3;6549:17;6409:167;6592:18;6619:110;;;;6743:1;6738:328;;;;6585:481;;6619:110;-1:-1:-1;;6654:24:1;;6640:39;;6699:20;;;;-1:-1:-1;6619:110:1;;6738:328;19407:1;19400:14;;;19444:4;19431:18;;6833:1;6847:169;6861:8;6858:1;6855:15;6847:169;;;6943:14;;6928:13;;;6921:37;6986:16;;;;6878:10;;6847:169;;;6851:3;;7047:8;7040:5;7036:20;7029:27;;6585:481;-1:-1:-1;7082:3:1;;5564:1527;-1:-1:-1;;;;;;;;;;;5564:1527:1:o;7304:488::-;-1:-1:-1;;;;;7573:15:1;;;7555:34;;7625:15;;7620:2;7605:18;;7598:43;7672:2;7657:18;;7650:34;;;7720:3;7715:2;7700:18;;7693:31;;;7498:4;;7741:45;;7766:19;;7758:6;7741:45;:::i;:::-;7733:53;7304:488;-1:-1:-1;;;;;;7304:488:1:o;7797:632::-;7968:2;8020:21;;;8090:13;;7993:18;;;8112:22;;;7939:4;;7968:2;8191:15;;;;8165:2;8150:18;;;7939:4;8234:169;8248:6;8245:1;8242:13;8234:169;;;8309:13;;8297:26;;8378:15;;;;8343:12;;;;8270:1;8263:9;8234:169;;;-1:-1:-1;8420:3:1;;7797:632;-1:-1:-1;;;;;;7797:632:1:o;8626:219::-;8775:2;8764:9;8757:21;8738:4;8795:44;8835:2;8824:9;8820:18;8812:6;8795:44;:::i;9203:414::-;9405:2;9387:21;;;9444:2;9424:18;;;9417:30;9483:34;9478:2;9463:18;;9456:62;-1:-1:-1;;;9549:2:1;9534:18;;9527:48;9607:3;9592:19;;9203:414::o;11908:404::-;12110:2;12092:21;;;12149:2;12129:18;;;12122:30;12188:34;12183:2;12168:18;;12161:62;-1:-1:-1;;;12254:2:1;12239:18;;12232:38;12302:3;12287:19;;11908:404::o;15101:356::-;15303:2;15285:21;;;15322:18;;;15315:30;15381:34;15376:2;15361:18;;15354:62;15448:2;15433:18;;15101:356::o;16990:342::-;17192:2;17174:21;;;17231:2;17211:18;;;17204:30;-1:-1:-1;;;17265:2:1;17250:18;;17243:48;17323:2;17308:18;;16990:342::o;17337:404::-;17539:2;17521:21;;;17578:2;17558:18;;;17551:30;17617:34;17612:2;17597:18;;17590:62;-1:-1:-1;;;17683:2:1;17668:18;;17661:38;17731:3;17716:19;;17337:404::o;17746:413::-;17948:2;17930:21;;;17987:2;17967:18;;;17960:30;18026:34;18021:2;18006:18;;17999:62;-1:-1:-1;;;18092:2:1;18077:18;;18070:47;18149:3;18134:19;;17746:413::o;19054:275::-;19125:2;19119:9;19190:2;19171:13;;-1:-1:-1;;19167:27:1;19155:40;;19225:18;19210:34;;19246:22;;;19207:62;19204:88;;;19272:18;;:::i;:::-;19308:2;19301:22;19054:275;;-1:-1:-1;19054:275:1:o;19460:128::-;19500:3;19531:1;19527:6;19524:1;19521:13;19518:39;;;19537:18;;:::i;:::-;-1:-1:-1;19573:9:1;;19460:128::o;19593:120::-;19633:1;19659;19649:35;;19664:18;;:::i;:::-;-1:-1:-1;19698:9:1;;19593:120::o;19718:168::-;19758:7;19824:1;19820;19816:6;19812:14;19809:1;19806:21;19801:1;19794:9;19787:17;19783:45;19780:71;;;19831:18;;:::i;:::-;-1:-1:-1;19871:9:1;;19718:168::o;19891:125::-;19931:4;19959:1;19956;19953:8;19950:34;;;19964:18;;:::i;:::-;-1:-1:-1;20001:9:1;;19891:125::o;20021:258::-;20093:1;20103:113;20117:6;20114:1;20111:13;20103:113;;;20193:11;;;20187:18;20174:11;;;20167:39;20139:2;20132:10;20103:113;;;20234:6;20231:1;20228:13;20225:48;;;-1:-1:-1;;20269:1:1;20251:16;;20244:27;20021:258::o;20284:380::-;20363:1;20359:12;;;;20406;;;20427:61;;20481:4;20473:6;20469:17;20459:27;;20427:61;20534:2;20526:6;20523:14;20503:18;20500:38;20497:161;;;20580:10;20575:3;20571:20;20568:1;20561:31;20615:4;20612:1;20605:15;20643:4;20640:1;20633:15;20497:161;;20284:380;;;:::o;20669:135::-;20708:3;-1:-1:-1;;20729:17:1;;20726:43;;;20749:18;;:::i;:::-;-1:-1:-1;20796:1:1;20785:13;;20669:135::o;20809:112::-;20841:1;20867;20857:35;;20872:18;;:::i;:::-;-1:-1:-1;20906:9:1;;20809:112::o;20926:127::-;20987:10;20982:3;20978:20;20975:1;20968:31;21018:4;21015:1;21008:15;21042:4;21039:1;21032:15;21058:127;21119:10;21114:3;21110:20;21107:1;21100:31;21150:4;21147:1;21140:15;21174:4;21171:1;21164:15;21190:127;21251:10;21246:3;21242:20;21239:1;21232:31;21282:4;21279:1;21272:15;21306:4;21303:1;21296:15;21322:127;21383:10;21378:3;21374:20;21371:1;21364:31;21414:4;21411:1;21404:15;21438:4;21435:1;21428:15;21454:131;-1:-1:-1;;;;;;21528:32:1;;21518:43;;21508:71;;21575:1;21572;21565:12

Swarm Source

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