ETH Price: $3,174.43 (-7.78%)
Gas: 2 Gwei

Token

Aiyah Verse Stickman-X (SMX)
 

Overview

Max Total Supply

465 SMX

Holders

192

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
kxkkx.eth
Balance
1 SMX
0x3f5352a941bc4bb0d327a6d3d90fe187b07a999f
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:
StickManERC721

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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



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



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/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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



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



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



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



pragma solidity ^0.8.0;


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

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

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

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



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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/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/StickManERC721.sol


pragma solidity ^0.8.9;






/*
 ____  _   _      _    __  __                  _    _____   __ _    _   _  __     __
/ ___|| |_(_) ___| | _|  \/  | __ _ _ __      / \  |_ _\ \ / // \  | | | | \ \   / /__ _ __ ___  ___
\___ \| __| |/ __| |/ / |\/| |/ _` | '_ \    / _ \  | | \ V // _ \ | |_| |  \ \ / / _ \ '__/ __|/ _ \
 ___) | |_| | (__|   <| |  | | (_| | | | |  / ___ \ | |  | |/ ___ \|  _  |   \ V /  __/ |  \__ \  __/
|____/ \__|_|\___|_|\_\_|  |_|\__,_|_| |_| /_/   \_\___| |_/_/   \_\_| |_|    \_/ \___|_|  |___/\___|

*/

contract StickManERC721 is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    string private _baseUri;

    uint256 constant public _MAX_SUPPLY = 5555;

    // reserved supply: 555
    uint256 public _currentSupply = 1555;

    uint8 public _saleStatus = 0;

    uint public _revealTokenId = 0;

    uint8 public _priceIncr = 0;

    uint8 public _phase = 1;

    uint8 public  _maxMintCount = 3;

    string private _secretFam;

    string private _secretWL;

    mapping(address => bool) public _giveawayAddrs;

    mapping(uint8 => mapping(address => uint8)) public _mintCounts;

    event syncMintedCount(uint256 count);

    event syncSaleStatus(uint8 status);


    constructor(string memory baseUri, string memory secretFam, string memory secretWL) ERC721("Aiyah Verse Stickman-X", "SMX") {

        _baseUri = baseUri;
        _secretFam = secretFam;
        _secretWL = secretWL;
    }

    function _baseURI() internal view virtual override returns (string memory) {

        return _baseUri;
    }

    function setBaseURI(string memory baseUri) public onlyOwner {

        _baseUri = baseUri;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {

        require(_exists(tokenId), "tokenId not found");

        if (_revealTokenId >= tokenId) {

            return string(abi.encodePacked(_baseURI(), Strings.toString(tokenId), ".json"));
        }

        return string(abi.encodePacked(_baseURI(), "unknown.json"));
    }

    function renounceOwnership() public virtual override onlyOwner {

        // disable it too dangerous
    }

    function check(uint8 status, address to, uint8 mintNum) private view {

        require(status == _saleStatus, "not yet on sale or sale status mismatch");
        require(_mintCounts[_phase][to] + mintNum <= _maxMintCount, "over max mint count");
        require(mintNum > 0 && mintNum <= _maxMintCount, "over batch mint count");
        require(totalSupply().add(mintNum) <= _currentSupply.sub(555), "sold out");
    }

    function goMint(address to, uint8 mintNum) private {

        for (uint8 i = 1; i <= mintNum; i++) {

            _safeMint(to, totalSupply().add(1));
        }

        _mintCounts[_phase][to] += mintNum;

        emit syncMintedCount(totalSupply());
    }

    function famSaleMint(uint8 mintNum, bytes32 hash) public payable {

        check(1, msg.sender, mintNum);
        require(hash == sha256(abi.encodePacked(msg.sender, _secretFam)), "permission denied");
        require(msg.value == ((0.06 ether + (uint(_priceIncr) * 0.01 ether)) * uint(mintNum)), "ether value incorrect");
        goMint(msg.sender, mintNum);
    }

    function preSaleMint(uint8 mintNum, bytes32 hash) public payable {

        check(2, msg.sender, mintNum);
        require(hash == sha256(abi.encodePacked(msg.sender, _secretWL)), "permission denied");
        require(msg.value == ((0.07 ether + (uint(_priceIncr) * 0.01 ether)) * uint(mintNum)), "ether value incorrect");
        goMint(msg.sender, mintNum);
    }

    function publicSaleMint(uint8 mintNum) public payable {

        check(4, msg.sender, mintNum);
        require(msg.value == ((0.08 ether + (uint(_priceIncr) * 0.01 ether)) * uint(mintNum)), "ether value incorrect");
        goMint(msg.sender, mintNum);
    }

    function giveawayMint() public {

        require(_saleStatus > 0, "not yet on sale or sale status mismatch");
        require(totalSupply().add(1) <= _currentSupply.sub(555), "sold out");
        require(_giveawayAddrs[msg.sender] == true, "permission denied");
        delete _giveawayAddrs[msg.sender];

        _safeMint(msg.sender, totalSupply().add(1));

        emit syncMintedCount(totalSupply());
    }

    function ownerMint(uint8 mintNum) public onlyOwner {

        require(totalSupply().add(mintNum) <= _currentSupply, "sold out");
        goMint(msg.sender, mintNum);
    }

    function addGiveaway(address[] memory addresses) public onlyOwner {

        for (uint i = 0; i < addresses.length; i++) {

            _giveawayAddrs[addresses[i]] = true;
        }
    }

    function deleteGiveaway(address[] memory addresses) public onlyOwner {

        for (uint i = 0; i < addresses.length; i++) {

            delete _giveawayAddrs[addresses[i]];
        }
    }

    function setSecret(string memory secretFam, string memory secretWL) public onlyOwner {

        _secretFam = secretFam;
        _secretWL = secretWL;
    }

    function setSaleStatus(uint8 saleStatus) public onlyOwner {

        _saleStatus = saleStatus;

        emit syncSaleStatus(_saleStatus);
    }

    function setRevealTokenId(uint revealTokenId) public onlyOwner {

        _revealTokenId = revealTokenId;
    }

    function setPhaseConfig(uint8 phase, uint8 priceIncr, uint8 maxMintCount) public onlyOwner {

        _phase = phase;
        _priceIncr = priceIncr;
        _maxMintCount = maxMintCount;
    }

    function setCurrentSupply(uint currentSupply) public onlyOwner {

        require(currentSupply <= _MAX_SUPPLY, "over max supply");
        _currentSupply = currentSupply;
    }

    function withdraw() public virtual onlyOwner {

        Address.sendValue(payable(owner()), address(this).balance);
    }

    function getBalance() public onlyOwner view returns (uint256) {

        return address(this).balance;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"string","name":"secretFam","type":"string"},{"internalType":"string","name":"secretWL","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"syncMintedCount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"status","type":"uint8"}],"name":"syncSaleStatus","type":"event"},{"inputs":[],"name":"_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_giveawayAddrs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxMintCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"_mintCounts","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_phase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_priceIncr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revealTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleStatus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"deleteGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintNum","type":"uint8"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"famSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayMint","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintNum","type":"uint8"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintNum","type":"uint8"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintNum","type":"uint8"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentSupply","type":"uint256"}],"name":"setCurrentSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"phase","type":"uint8"},{"internalType":"uint8","name":"priceIncr","type":"uint8"},{"internalType":"uint8","name":"maxMintCount","type":"uint8"}],"name":"setPhaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTokenId","type":"uint256"}],"name":"setRevealTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"saleStatus","type":"uint8"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"secretFam","type":"string"},{"internalType":"string","name":"secretWL","type":"string"}],"name":"setSecret","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610613600c55600d805460ff191690556000600e55600f805462ffffff1916620301001790553480156200003757600080fd5b50604051620031ff380380620031ff8339810160408190526200005a9162000301565b604080518082018252601681527f416979616820566572736520537469636b6d616e2d58000000000000000000006020808301918252835180850190945260038452620a69ab60eb1b908401528151919291620000ba916000916200018e565b508051620000d09060019060208401906200018e565b505050620000ed620000e76200013860201b60201c565b6200013c565b82516200010290600b9060208601906200018e565b508151620001189060109060208501906200018e565b5080516200012e9060119060208401906200018e565b50505050620003cf565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019c9062000392565b90600052602060002090601f016020900481019282620001c057600085556200020b565b82601f10620001db57805160ff19168380011785556200020b565b828001600101855582156200020b579182015b828111156200020b578251825591602001919060010190620001ee565b50620002199291506200021d565b5090565b5b808211156200021957600081556001016200021e565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200025c57600080fd5b81516001600160401b038082111562000279576200027962000234565b604051601f8301601f19908116603f01168101908282118183101715620002a457620002a462000234565b81604052838152602092508683858801011115620002c157600080fd5b600091505b83821015620002e55785820183015181830184015290820190620002c6565b83821115620002f75760008385830101525b9695505050505050565b6000806000606084860312156200031757600080fd5b83516001600160401b03808211156200032f57600080fd5b6200033d878388016200024a565b945060208601519150808211156200035457600080fd5b62000362878388016200024a565b935060408601519150808211156200037957600080fd5b5062000388868287016200024a565b9150509250925092565b600181811c90821680620003a757607f821691505b60208210811415620003c957634e487b7160e01b600052602260045260246000fd5b50919050565b612e2080620003df6000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063bed51190116100b6578063e985e9c51161007a578063e985e9c5146106fc578063e9a8b84314610745578063ec31dde21461075a578063f2fde38b1461077a578063f66a04541461079a578063fffa65e0146107ba57600080fd5b8063bed5119014610654578063c76df80e1461068f578063c87b56dd146106a2578063cf520024146106c2578063dc547301146106dc57600080fd5b80639730105911610108578063973010591461059f578063a22cb465146105be578063a4fefad6146105de578063a85b9905146105f4578063b308ff3314610614578063b88d4fde1461063457600080fd5b8063715018a61461052457806387512b94146105395780638a6f8b6a146105595780638da5cb5b1461056c57806395d89b411461058a57600080fd5b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce71461045e57806353f8995d1461047e57806355f804b3146104ae57806357a06227146104ce5780636352211e146104e457806370a082311461050457600080fd5b80632f745c59146103bd5780633669017c146103dd5780633ccfd60b1461040957806342842e0e1461041e5780634891ad881461043e57600080fd5b806312065fe01161022457806312065fe01461033257806318160ddd1461035557806323b872dd1461036a57806323ea04fe1461038a5780632cbce8611461039d57600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b8578063085724e0146102f0578063095ea7b314610312575b600080fd5b34801561026d57600080fd5b5061028161027c366004612484565b6107d0565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab6107fb565b60405161028d91906124f9565b3480156102c457600080fd5b506102d86102d336600461250c565b61088d565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b3660046125e4565b610927565b005b34801561031e57600080fd5b5061031061032d366004612664565b61097d565b34801561033e57600080fd5b50610347610a8e565b60405190815260200161028d565b34801561036157600080fd5b50600854610347565b34801561037657600080fd5b5061031061038536600461268e565b610ac0565b6103106103983660046126db565b610af1565b3480156103a957600080fd5b506103106103b83660046126f7565b610c15565b3480156103c957600080fd5b506103476103d8366004612664565b610c9e565b3480156103e957600080fd5b50600f546103f79060ff1681565b60405160ff909116815260200161028d565b34801561041557600080fd5b50610310610d34565b34801561042a57600080fd5b5061031061043936600461268e565b610d7b565b34801561044a57600080fd5b506103106104593660046127a4565b610d96565b34801561046a57600080fd5b5061034761047936600461250c565b610e08565b34801561048a57600080fd5b506102816104993660046127bf565b60126020526000908152604090205460ff1681565b3480156104ba57600080fd5b506103106104c93660046127da565b610e9b565b3480156104da57600080fd5b50610347600e5481565b3480156104f057600080fd5b506102d86104ff36600461250c565b610ed8565b34801561051057600080fd5b5061034761051f3660046127bf565b610f4f565b34801561053057600080fd5b50610310610fd6565b34801561054557600080fd5b50600f546103f79062010000900460ff1681565b6103106105673660046126db565b611000565b34801561057857600080fd5b50600a546001600160a01b03166102d8565b34801561059657600080fd5b506102ab6110c6565b3480156105ab57600080fd5b50600f546103f790610100900460ff1681565b3480156105ca57600080fd5b506103106105d936600461280f565b6110d5565b3480156105ea57600080fd5b50610347600c5481565b34801561060057600080fd5b5061031061060f36600461250c565b61119a565b34801561062057600080fd5b5061031061062f3660046127a4565b6111c9565b34801561064057600080fd5b5061031061064f36600461284b565b611237565b34801561066057600080fd5b506103f761066f3660046128c7565b601360209081526000928352604080842090915290825290205460ff1681565b61031061069d3660046127a4565b61126f565b3480156106ae57600080fd5b506102ab6106bd36600461250c565b6112f8565b3480156106ce57600080fd5b50600d546103f79060ff1681565b3480156106e857600080fd5b506103106106f736600461250c565b6113ac565b34801561070857600080fd5b506102816107173660046128fa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561075157600080fd5b5061031061141f565b34801561076657600080fd5b50610310610775366004612916565b61151b565b34801561078657600080fd5b506103106107953660046127bf565b61157c565b3480156107a657600080fd5b506103106107b53660046126f7565b611614565b3480156107c657600080fd5b506103476115b381565b60006001600160e01b0319821663780e9d6360e01b14806107f557506107f5826116a6565b92915050565b60606000805461080a90612959565b80601f016020809104026020016040519081016040528092919081815260200182805461083690612959565b80156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661090b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600a546001600160a01b031633146109515760405162461bcd60e51b815260040161090290612994565b81516109649060109060208501906123d5565b5080516109789060119060208401906123d5565b505050565b600061098882610ed8565b9050806001600160a01b0316836001600160a01b031614156109f65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610902565b336001600160a01b0382161480610a125750610a128133610717565b610a845760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610902565b61097883836116f6565b600a546000906001600160a01b03163314610abb5760405162461bcd60e51b815260040161090290612994565b504790565b610aca3382611764565b610ae65760405162461bcd60e51b8152600401610902906129c9565b61097883838361185b565b610afd60013384611a06565b6002336010604051602001610b13929190612a1a565b60408051601f1981840301815290829052610b2d91612ad8565b602060405180830381855afa158015610b4a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610b6d9190612af4565b8114610b8b5760405162461bcd60e51b815260040161090290612b0d565b600f5460ff80841691610ba69116662386f26fc10000612b4e565b610bb79066d529ae9e860000612b6d565b610bc19190612b4e565b3414610c075760405162461bcd60e51b8152602060048201526015602482015274195d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610902565b610c113383611b5c565b5050565b600a546001600160a01b03163314610c3f5760405162461bcd60e51b815260040161090290612994565b60005b8151811015610c115760126000838381518110610c6157610c61612b85565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916905580610c9681612b9b565b915050610c42565b6000610ca983610f4f565b8210610d0b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610902565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d5e5760405162461bcd60e51b815260040161090290612994565b610d79610d73600a546001600160a01b031690565b47611c2a565b565b61097883838360405180602001604052806000815250611237565b600a546001600160a01b03163314610dc05760405162461bcd60e51b815260040161090290612994565b600d805460ff191660ff83169081179091556040519081527f4e825178b7eeb33778ae4999ddcf52726596743f115f044a01b96183b86b6fdb9060200160405180910390a150565b6000610e1360085490565b8210610e765760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610902565b60088281548110610e8957610e89612b85565b90600052602060002001549050919050565b600a546001600160a01b03163314610ec55760405162461bcd60e51b815260040161090290612994565b8051610c1190600b9060208401906123d5565b6000818152600260205260408120546001600160a01b0316806107f55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610902565b60006001600160a01b038216610fba5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610902565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610d795760405162461bcd60e51b815260040161090290612994565b61100c60023384611a06565b6002336011604051602001611022929190612a1a565b60408051601f198184030181529082905261103c91612ad8565b602060405180830381855afa158015611059573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061107c9190612af4565b811461109a5760405162461bcd60e51b815260040161090290612b0d565b600f5460ff808416916110b59116662386f26fc10000612b4e565b610bb79066f8b0a10e470000612b6d565b60606001805461080a90612959565b6001600160a01b03821633141561112e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610902565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146111c45760405162461bcd60e51b815260040161090290612994565b600e55565b600a546001600160a01b031633146111f35760405162461bcd60e51b815260040161090290612994565b600c5461120c8260ff1661120660085490565b90611d43565b111561122a5760405162461bcd60e51b815260040161090290612bb6565b6112343382611b5c565b50565b6112413383611764565b61125d5760405162461bcd60e51b8152600401610902906129c9565b61126984848484611d56565b50505050565b61127b60043383611a06565b600f5460ff808316916112969116662386f26fc10000612b4e565b6112a89067011c37937e080000612b6d565b6112b29190612b4e565b341461122a5760405162461bcd60e51b8152602060048201526015602482015274195d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610902565b6000818152600260205260409020546060906001600160a01b03166113535760405162461bcd60e51b81526020600482015260116024820152701d1bdad95b9259081b9bdd08199bdd5b99607a1b6044820152606401610902565b81600e541061139457611364611d89565b61136d83611d98565b60405160200161137e929190612bd8565b6040516020818303038152906040529050919050565b61139c611d89565b60405160200161137e9190612c17565b600a546001600160a01b031633146113d65760405162461bcd60e51b815260040161090290612994565b6115b381111561141a5760405162461bcd60e51b815260206004820152600f60248201526e6f766572206d617820737570706c7960881b6044820152606401610902565b600c55565b600d5460ff166114415760405162461bcd60e51b815260040161090290612c47565b600c546114509061022b611e96565b61145e600161120660085490565b111561147c5760405162461bcd60e51b815260040161090290612bb6565b3360009081526012602052604090205460ff1615156001146114b05760405162461bcd60e51b815260040161090290612b0d565b336000818152601260205260409020805460ff191690556114de906114d9600161120660085490565b611ea2565b7fea0164e175ff15f49fdecf6bcb469d82638b8d437d5ac071c05bfb6fd3e3ea2f61150860085490565b60405190815260200160405180910390a1565b600a546001600160a01b031633146115455760405162461bcd60e51b815260040161090290612994565b600f805460ff928316620100000262ff00ff19958416610100029590951662ffffff19909116179290911691909117919091179055565b600a546001600160a01b031633146115a65760405162461bcd60e51b815260040161090290612994565b6001600160a01b03811661160b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610902565b61123481611ebc565b600a546001600160a01b0316331461163e5760405162461bcd60e51b815260040161090290612994565b60005b8151811015610c115760016012600084848151811061166257611662612b85565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061169e81612b9b565b915050611641565b60006001600160e01b031982166380ac58cd60e01b14806116d757506001600160e01b03198216635b5e139f60e01b145b806107f557506301ffc9a760e01b6001600160e01b03198316146107f5565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172b82610ed8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610902565b60006117e883610ed8565b9050806001600160a01b0316846001600160a01b031614806118235750836001600160a01b03166118188461088d565b6001600160a01b0316145b8061185357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661186e82610ed8565b6001600160a01b0316146118d65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610902565b6001600160a01b0382166119385760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610902565b611943838383611f0e565b61194e6000826116f6565b6001600160a01b0383166000908152600360205260408120805460019290611977908490612c8e565b90915550506001600160a01b03821660009081526003602052604081208054600192906119a5908490612b6d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600d5460ff848116911614611a2d5760405162461bcd60e51b815260040161090290612c47565b600f5460ff6101008204811660009081526013602090815260408083206001600160a01b038816845290915290205462010000909204811691611a7291849116612ca5565b60ff161115611ab95760405162461bcd60e51b81526020600482015260136024820152721bdd995c881b585e081b5a5b9d0818dbdd5b9d606a1b6044820152606401610902565b60008160ff16118015611adb5750600f5460ff62010000909104811690821611155b611b1f5760405162461bcd60e51b81526020600482015260156024820152741bdd995c8818985d18da081b5a5b9d0818dbdd5b9d605a1b6044820152606401610902565b600c54611b2e9061022b611e96565b611b3e8260ff1661120660085490565b11156109785760405162461bcd60e51b815260040161090290612bb6565b60015b8160ff168160ff1611611b9057611b7e836114d9600161120660085490565b80611b8881612cca565b915050611b5f565b50600f5460ff610100909104811660009081526013602090815260408083206001600160a01b0387168452909152812080548493919291611bd391859116612ca5565b92506101000a81548160ff021916908360ff1602179055507fea0164e175ff15f49fdecf6bcb469d82638b8d437d5ac071c05bfb6fd3e3ea2f611c1560085490565b60405190815260200160405180910390a15050565b80471015611c7a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610902565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cc7576040519150601f19603f3d011682016040523d82523d6000602084013e611ccc565b606091505b50509050806109785760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610902565b6000611d4f8284612b6d565b9392505050565b611d6184848461185b565b611d6d84848484611fc6565b6112695760405162461bcd60e51b815260040161090290612cea565b6060600b805461080a90612959565b606081611dbc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611de65780611dd081612b9b565b9150611ddf9050600a83612d52565b9150611dc0565b60008167ffffffffffffffff811115611e0157611e01612525565b6040519080825280601f01601f191660200182016040528015611e2b576020820181803683370190505b5090505b841561185357611e40600183612c8e565b9150611e4d600a86612d66565b611e58906030612b6d565b60f81b818381518110611e6d57611e6d612b85565b60200101906001600160f81b031916908160001a905350611e8f600a86612d52565b9450611e2f565b6000611d4f8284612c8e565b610c118282604051806020016040528060008152506120c4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611f6957611f6481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611f8c565b816001600160a01b0316836001600160a01b031614611f8c57611f8c83826120f7565b6001600160a01b038216611fa35761097881612194565b826001600160a01b0316826001600160a01b031614610978576109788282612243565b60006001600160a01b0384163b156120b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061200a903390899088908890600401612d7a565b6020604051808303816000875af1925050508015612045575060408051601f3d908101601f1916820190925261204291810190612db7565b60015b61209f573d808015612073576040519150601f19603f3d011682016040523d82523d6000602084013e612078565b606091505b5080516120975760405162461bcd60e51b815260040161090290612cea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611853565b506001949350505050565b6120ce8383612287565b6120db6000848484611fc6565b6109785760405162461bcd60e51b815260040161090290612cea565b6000600161210484610f4f565b61210e9190612c8e565b600083815260076020526040902054909150808214612161576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121a690600190612c8e565b600083815260096020526040812054600880549394509092849081106121ce576121ce612b85565b9060005260206000200154905080600883815481106121ef576121ef612b85565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061222757612227612dd4565b6001900381819060005260206000200160009055905550505050565b600061224e83610f4f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122dd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610902565b6000818152600260205260409020546001600160a01b0316156123425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610902565b61234e60008383611f0e565b6001600160a01b0382166000908152600360205260408120805460019290612377908490612b6d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123e190612959565b90600052602060002090601f0160209004810192826124035760008555612449565b82601f1061241c57805160ff1916838001178555612449565b82800160010185558215612449579182015b8281111561244957825182559160200191906001019061242e565b50612455929150612459565b5090565b5b80821115612455576000815560010161245a565b6001600160e01b03198116811461123457600080fd5b60006020828403121561249657600080fd5b8135611d4f8161246e565b60005b838110156124bc5781810151838201526020016124a4565b838111156112695750506000910152565b600081518084526124e58160208601602086016124a1565b601f01601f19169290920160200192915050565b602081526000611d4f60208301846124cd565b60006020828403121561251e57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561256457612564612525565b604052919050565b600067ffffffffffffffff83111561258657612586612525565b612599601f8401601f191660200161253b565b90508281528383830111156125ad57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126125d557600080fd5b611d4f8383356020850161256c565b600080604083850312156125f757600080fd5b823567ffffffffffffffff8082111561260f57600080fd5b61261b868387016125c4565b9350602085013591508082111561263157600080fd5b5061263e858286016125c4565b9150509250929050565b80356001600160a01b038116811461265f57600080fd5b919050565b6000806040838503121561267757600080fd5b61268083612648565b946020939093013593505050565b6000806000606084860312156126a357600080fd5b6126ac84612648565b92506126ba60208501612648565b9150604084013590509250925092565b803560ff8116811461265f57600080fd5b600080604083850312156126ee57600080fd5b612680836126ca565b6000602080838503121561270a57600080fd5b823567ffffffffffffffff8082111561272257600080fd5b818501915085601f83011261273657600080fd5b81358181111561274857612748612525565b8060051b915061275984830161253b565b818152918301840191848101908884111561277357600080fd5b938501935b838510156127985761278985612648565b82529385019390850190612778565b98975050505050505050565b6000602082840312156127b657600080fd5b611d4f826126ca565b6000602082840312156127d157600080fd5b611d4f82612648565b6000602082840312156127ec57600080fd5b813567ffffffffffffffff81111561280357600080fd5b611853848285016125c4565b6000806040838503121561282257600080fd5b61282b83612648565b91506020830135801515811461284057600080fd5b809150509250929050565b6000806000806080858703121561286157600080fd5b61286a85612648565b935061287860208601612648565b925060408501359150606085013567ffffffffffffffff81111561289b57600080fd5b8501601f810187136128ac57600080fd5b6128bb8782356020840161256c565b91505092959194509250565b600080604083850312156128da57600080fd5b6128e3836126ca565b91506128f160208401612648565b90509250929050565b6000806040838503121561290d57600080fd5b6128e383612648565b60008060006060848603121561292b57600080fd5b612934846126ca565b9250612942602085016126ca565b9150612950604085016126ca565b90509250925092565b600181811c9082168061296d57607f821691505b6020821081141561298e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6bffffffffffffffffffffffff198360601b168152600060146000845481600182811c915080831680612a4e57607f831692505b6020808410821415612a6e57634e487b7160e01b86526022600452602486fd5b818015612a825760018114612a9757612ac8565b60ff1986168a890152848a0188019650612ac8565b60008b81526020902060005b86811015612abe5781548c82018b0152908501908301612aa3565b505087858b010196505b50949a9950505050505050505050565b60008251612aea8184602087016124a1565b9190910192915050565b600060208284031215612b0657600080fd5b5051919050565b6020808252601190820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612b6857612b68612b38565b500290565b60008219821115612b8057612b80612b38565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612baf57612baf612b38565b5060010190565b6020808252600890820152671cdbdb19081bdd5d60c21b604082015260600190565b60008351612bea8184602088016124a1565b835190830190612bfe8183602088016124a1565b64173539b7b760d91b9101908152600501949350505050565b60008251612c298184602087016124a1565b6b3ab735b737bbb7173539b7b760a11b920191825250600c01919050565b60208082526027908201527f6e6f7420796574206f6e2073616c65206f722073616c6520737461747573206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b600082821015612ca057612ca0612b38565b500390565b600060ff821660ff84168060ff03821115612cc257612cc2612b38565b019392505050565b600060ff821660ff811415612ce157612ce1612b38565b60010192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d6157612d61612d3c565b500490565b600082612d7557612d75612d3c565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dad908301846124cd565b9695505050505050565b600060208284031215612dc957600080fd5b8151611d4f8161246e565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a47d613dd1cf23bce77fc8144e973634346e228751bd4e24465719e672cc88b064736f6c634300080b0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001568747470733a2f2f6e66742e61697961682e696f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000122178415663662425446a406463736b527378000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000127864657856772426642a26684e6a737864660000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063bed51190116100b6578063e985e9c51161007a578063e985e9c5146106fc578063e9a8b84314610745578063ec31dde21461075a578063f2fde38b1461077a578063f66a04541461079a578063fffa65e0146107ba57600080fd5b8063bed5119014610654578063c76df80e1461068f578063c87b56dd146106a2578063cf520024146106c2578063dc547301146106dc57600080fd5b80639730105911610108578063973010591461059f578063a22cb465146105be578063a4fefad6146105de578063a85b9905146105f4578063b308ff3314610614578063b88d4fde1461063457600080fd5b8063715018a61461052457806387512b94146105395780638a6f8b6a146105595780638da5cb5b1461056c57806395d89b411461058a57600080fd5b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce71461045e57806353f8995d1461047e57806355f804b3146104ae57806357a06227146104ce5780636352211e146104e457806370a082311461050457600080fd5b80632f745c59146103bd5780633669017c146103dd5780633ccfd60b1461040957806342842e0e1461041e5780634891ad881461043e57600080fd5b806312065fe01161022457806312065fe01461033257806318160ddd1461035557806323b872dd1461036a57806323ea04fe1461038a5780632cbce8611461039d57600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b8578063085724e0146102f0578063095ea7b314610312575b600080fd5b34801561026d57600080fd5b5061028161027c366004612484565b6107d0565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab6107fb565b60405161028d91906124f9565b3480156102c457600080fd5b506102d86102d336600461250c565b61088d565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b3660046125e4565b610927565b005b34801561031e57600080fd5b5061031061032d366004612664565b61097d565b34801561033e57600080fd5b50610347610a8e565b60405190815260200161028d565b34801561036157600080fd5b50600854610347565b34801561037657600080fd5b5061031061038536600461268e565b610ac0565b6103106103983660046126db565b610af1565b3480156103a957600080fd5b506103106103b83660046126f7565b610c15565b3480156103c957600080fd5b506103476103d8366004612664565b610c9e565b3480156103e957600080fd5b50600f546103f79060ff1681565b60405160ff909116815260200161028d565b34801561041557600080fd5b50610310610d34565b34801561042a57600080fd5b5061031061043936600461268e565b610d7b565b34801561044a57600080fd5b506103106104593660046127a4565b610d96565b34801561046a57600080fd5b5061034761047936600461250c565b610e08565b34801561048a57600080fd5b506102816104993660046127bf565b60126020526000908152604090205460ff1681565b3480156104ba57600080fd5b506103106104c93660046127da565b610e9b565b3480156104da57600080fd5b50610347600e5481565b3480156104f057600080fd5b506102d86104ff36600461250c565b610ed8565b34801561051057600080fd5b5061034761051f3660046127bf565b610f4f565b34801561053057600080fd5b50610310610fd6565b34801561054557600080fd5b50600f546103f79062010000900460ff1681565b6103106105673660046126db565b611000565b34801561057857600080fd5b50600a546001600160a01b03166102d8565b34801561059657600080fd5b506102ab6110c6565b3480156105ab57600080fd5b50600f546103f790610100900460ff1681565b3480156105ca57600080fd5b506103106105d936600461280f565b6110d5565b3480156105ea57600080fd5b50610347600c5481565b34801561060057600080fd5b5061031061060f36600461250c565b61119a565b34801561062057600080fd5b5061031061062f3660046127a4565b6111c9565b34801561064057600080fd5b5061031061064f36600461284b565b611237565b34801561066057600080fd5b506103f761066f3660046128c7565b601360209081526000928352604080842090915290825290205460ff1681565b61031061069d3660046127a4565b61126f565b3480156106ae57600080fd5b506102ab6106bd36600461250c565b6112f8565b3480156106ce57600080fd5b50600d546103f79060ff1681565b3480156106e857600080fd5b506103106106f736600461250c565b6113ac565b34801561070857600080fd5b506102816107173660046128fa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561075157600080fd5b5061031061141f565b34801561076657600080fd5b50610310610775366004612916565b61151b565b34801561078657600080fd5b506103106107953660046127bf565b61157c565b3480156107a657600080fd5b506103106107b53660046126f7565b611614565b3480156107c657600080fd5b506103476115b381565b60006001600160e01b0319821663780e9d6360e01b14806107f557506107f5826116a6565b92915050565b60606000805461080a90612959565b80601f016020809104026020016040519081016040528092919081815260200182805461083690612959565b80156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661090b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600a546001600160a01b031633146109515760405162461bcd60e51b815260040161090290612994565b81516109649060109060208501906123d5565b5080516109789060119060208401906123d5565b505050565b600061098882610ed8565b9050806001600160a01b0316836001600160a01b031614156109f65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610902565b336001600160a01b0382161480610a125750610a128133610717565b610a845760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610902565b61097883836116f6565b600a546000906001600160a01b03163314610abb5760405162461bcd60e51b815260040161090290612994565b504790565b610aca3382611764565b610ae65760405162461bcd60e51b8152600401610902906129c9565b61097883838361185b565b610afd60013384611a06565b6002336010604051602001610b13929190612a1a565b60408051601f1981840301815290829052610b2d91612ad8565b602060405180830381855afa158015610b4a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610b6d9190612af4565b8114610b8b5760405162461bcd60e51b815260040161090290612b0d565b600f5460ff80841691610ba69116662386f26fc10000612b4e565b610bb79066d529ae9e860000612b6d565b610bc19190612b4e565b3414610c075760405162461bcd60e51b8152602060048201526015602482015274195d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610902565b610c113383611b5c565b5050565b600a546001600160a01b03163314610c3f5760405162461bcd60e51b815260040161090290612994565b60005b8151811015610c115760126000838381518110610c6157610c61612b85565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916905580610c9681612b9b565b915050610c42565b6000610ca983610f4f565b8210610d0b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610902565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d5e5760405162461bcd60e51b815260040161090290612994565b610d79610d73600a546001600160a01b031690565b47611c2a565b565b61097883838360405180602001604052806000815250611237565b600a546001600160a01b03163314610dc05760405162461bcd60e51b815260040161090290612994565b600d805460ff191660ff83169081179091556040519081527f4e825178b7eeb33778ae4999ddcf52726596743f115f044a01b96183b86b6fdb9060200160405180910390a150565b6000610e1360085490565b8210610e765760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610902565b60088281548110610e8957610e89612b85565b90600052602060002001549050919050565b600a546001600160a01b03163314610ec55760405162461bcd60e51b815260040161090290612994565b8051610c1190600b9060208401906123d5565b6000818152600260205260408120546001600160a01b0316806107f55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610902565b60006001600160a01b038216610fba5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610902565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610d795760405162461bcd60e51b815260040161090290612994565b61100c60023384611a06565b6002336011604051602001611022929190612a1a565b60408051601f198184030181529082905261103c91612ad8565b602060405180830381855afa158015611059573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061107c9190612af4565b811461109a5760405162461bcd60e51b815260040161090290612b0d565b600f5460ff808416916110b59116662386f26fc10000612b4e565b610bb79066f8b0a10e470000612b6d565b60606001805461080a90612959565b6001600160a01b03821633141561112e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610902565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146111c45760405162461bcd60e51b815260040161090290612994565b600e55565b600a546001600160a01b031633146111f35760405162461bcd60e51b815260040161090290612994565b600c5461120c8260ff1661120660085490565b90611d43565b111561122a5760405162461bcd60e51b815260040161090290612bb6565b6112343382611b5c565b50565b6112413383611764565b61125d5760405162461bcd60e51b8152600401610902906129c9565b61126984848484611d56565b50505050565b61127b60043383611a06565b600f5460ff808316916112969116662386f26fc10000612b4e565b6112a89067011c37937e080000612b6d565b6112b29190612b4e565b341461122a5760405162461bcd60e51b8152602060048201526015602482015274195d1a195c881d985b1d59481a5b98dbdc9c9958dd605a1b6044820152606401610902565b6000818152600260205260409020546060906001600160a01b03166113535760405162461bcd60e51b81526020600482015260116024820152701d1bdad95b9259081b9bdd08199bdd5b99607a1b6044820152606401610902565b81600e541061139457611364611d89565b61136d83611d98565b60405160200161137e929190612bd8565b6040516020818303038152906040529050919050565b61139c611d89565b60405160200161137e9190612c17565b600a546001600160a01b031633146113d65760405162461bcd60e51b815260040161090290612994565b6115b381111561141a5760405162461bcd60e51b815260206004820152600f60248201526e6f766572206d617820737570706c7960881b6044820152606401610902565b600c55565b600d5460ff166114415760405162461bcd60e51b815260040161090290612c47565b600c546114509061022b611e96565b61145e600161120660085490565b111561147c5760405162461bcd60e51b815260040161090290612bb6565b3360009081526012602052604090205460ff1615156001146114b05760405162461bcd60e51b815260040161090290612b0d565b336000818152601260205260409020805460ff191690556114de906114d9600161120660085490565b611ea2565b7fea0164e175ff15f49fdecf6bcb469d82638b8d437d5ac071c05bfb6fd3e3ea2f61150860085490565b60405190815260200160405180910390a1565b600a546001600160a01b031633146115455760405162461bcd60e51b815260040161090290612994565b600f805460ff928316620100000262ff00ff19958416610100029590951662ffffff19909116179290911691909117919091179055565b600a546001600160a01b031633146115a65760405162461bcd60e51b815260040161090290612994565b6001600160a01b03811661160b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610902565b61123481611ebc565b600a546001600160a01b0316331461163e5760405162461bcd60e51b815260040161090290612994565b60005b8151811015610c115760016012600084848151811061166257611662612b85565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061169e81612b9b565b915050611641565b60006001600160e01b031982166380ac58cd60e01b14806116d757506001600160e01b03198216635b5e139f60e01b145b806107f557506301ffc9a760e01b6001600160e01b03198316146107f5565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172b82610ed8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610902565b60006117e883610ed8565b9050806001600160a01b0316846001600160a01b031614806118235750836001600160a01b03166118188461088d565b6001600160a01b0316145b8061185357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661186e82610ed8565b6001600160a01b0316146118d65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610902565b6001600160a01b0382166119385760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610902565b611943838383611f0e565b61194e6000826116f6565b6001600160a01b0383166000908152600360205260408120805460019290611977908490612c8e565b90915550506001600160a01b03821660009081526003602052604081208054600192906119a5908490612b6d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600d5460ff848116911614611a2d5760405162461bcd60e51b815260040161090290612c47565b600f5460ff6101008204811660009081526013602090815260408083206001600160a01b038816845290915290205462010000909204811691611a7291849116612ca5565b60ff161115611ab95760405162461bcd60e51b81526020600482015260136024820152721bdd995c881b585e081b5a5b9d0818dbdd5b9d606a1b6044820152606401610902565b60008160ff16118015611adb5750600f5460ff62010000909104811690821611155b611b1f5760405162461bcd60e51b81526020600482015260156024820152741bdd995c8818985d18da081b5a5b9d0818dbdd5b9d605a1b6044820152606401610902565b600c54611b2e9061022b611e96565b611b3e8260ff1661120660085490565b11156109785760405162461bcd60e51b815260040161090290612bb6565b60015b8160ff168160ff1611611b9057611b7e836114d9600161120660085490565b80611b8881612cca565b915050611b5f565b50600f5460ff610100909104811660009081526013602090815260408083206001600160a01b0387168452909152812080548493919291611bd391859116612ca5565b92506101000a81548160ff021916908360ff1602179055507fea0164e175ff15f49fdecf6bcb469d82638b8d437d5ac071c05bfb6fd3e3ea2f611c1560085490565b60405190815260200160405180910390a15050565b80471015611c7a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610902565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cc7576040519150601f19603f3d011682016040523d82523d6000602084013e611ccc565b606091505b50509050806109785760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610902565b6000611d4f8284612b6d565b9392505050565b611d6184848461185b565b611d6d84848484611fc6565b6112695760405162461bcd60e51b815260040161090290612cea565b6060600b805461080a90612959565b606081611dbc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611de65780611dd081612b9b565b9150611ddf9050600a83612d52565b9150611dc0565b60008167ffffffffffffffff811115611e0157611e01612525565b6040519080825280601f01601f191660200182016040528015611e2b576020820181803683370190505b5090505b841561185357611e40600183612c8e565b9150611e4d600a86612d66565b611e58906030612b6d565b60f81b818381518110611e6d57611e6d612b85565b60200101906001600160f81b031916908160001a905350611e8f600a86612d52565b9450611e2f565b6000611d4f8284612c8e565b610c118282604051806020016040528060008152506120c4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611f6957611f6481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611f8c565b816001600160a01b0316836001600160a01b031614611f8c57611f8c83826120f7565b6001600160a01b038216611fa35761097881612194565b826001600160a01b0316826001600160a01b031614610978576109788282612243565b60006001600160a01b0384163b156120b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061200a903390899088908890600401612d7a565b6020604051808303816000875af1925050508015612045575060408051601f3d908101601f1916820190925261204291810190612db7565b60015b61209f573d808015612073576040519150601f19603f3d011682016040523d82523d6000602084013e612078565b606091505b5080516120975760405162461bcd60e51b815260040161090290612cea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611853565b506001949350505050565b6120ce8383612287565b6120db6000848484611fc6565b6109785760405162461bcd60e51b815260040161090290612cea565b6000600161210484610f4f565b61210e9190612c8e565b600083815260076020526040902054909150808214612161576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906121a690600190612c8e565b600083815260096020526040812054600880549394509092849081106121ce576121ce612b85565b9060005260206000200154905080600883815481106121ef576121ef612b85565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061222757612227612dd4565b6001900381819060005260206000200160009055905550505050565b600061224e83610f4f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122dd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610902565b6000818152600260205260409020546001600160a01b0316156123425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610902565b61234e60008383611f0e565b6001600160a01b0382166000908152600360205260408120805460019290612377908490612b6d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123e190612959565b90600052602060002090601f0160209004810192826124035760008555612449565b82601f1061241c57805160ff1916838001178555612449565b82800160010185558215612449579182015b8281111561244957825182559160200191906001019061242e565b50612455929150612459565b5090565b5b80821115612455576000815560010161245a565b6001600160e01b03198116811461123457600080fd5b60006020828403121561249657600080fd5b8135611d4f8161246e565b60005b838110156124bc5781810151838201526020016124a4565b838111156112695750506000910152565b600081518084526124e58160208601602086016124a1565b601f01601f19169290920160200192915050565b602081526000611d4f60208301846124cd565b60006020828403121561251e57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561256457612564612525565b604052919050565b600067ffffffffffffffff83111561258657612586612525565b612599601f8401601f191660200161253b565b90508281528383830111156125ad57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126125d557600080fd5b611d4f8383356020850161256c565b600080604083850312156125f757600080fd5b823567ffffffffffffffff8082111561260f57600080fd5b61261b868387016125c4565b9350602085013591508082111561263157600080fd5b5061263e858286016125c4565b9150509250929050565b80356001600160a01b038116811461265f57600080fd5b919050565b6000806040838503121561267757600080fd5b61268083612648565b946020939093013593505050565b6000806000606084860312156126a357600080fd5b6126ac84612648565b92506126ba60208501612648565b9150604084013590509250925092565b803560ff8116811461265f57600080fd5b600080604083850312156126ee57600080fd5b612680836126ca565b6000602080838503121561270a57600080fd5b823567ffffffffffffffff8082111561272257600080fd5b818501915085601f83011261273657600080fd5b81358181111561274857612748612525565b8060051b915061275984830161253b565b818152918301840191848101908884111561277357600080fd5b938501935b838510156127985761278985612648565b82529385019390850190612778565b98975050505050505050565b6000602082840312156127b657600080fd5b611d4f826126ca565b6000602082840312156127d157600080fd5b611d4f82612648565b6000602082840312156127ec57600080fd5b813567ffffffffffffffff81111561280357600080fd5b611853848285016125c4565b6000806040838503121561282257600080fd5b61282b83612648565b91506020830135801515811461284057600080fd5b809150509250929050565b6000806000806080858703121561286157600080fd5b61286a85612648565b935061287860208601612648565b925060408501359150606085013567ffffffffffffffff81111561289b57600080fd5b8501601f810187136128ac57600080fd5b6128bb8782356020840161256c565b91505092959194509250565b600080604083850312156128da57600080fd5b6128e3836126ca565b91506128f160208401612648565b90509250929050565b6000806040838503121561290d57600080fd5b6128e383612648565b60008060006060848603121561292b57600080fd5b612934846126ca565b9250612942602085016126ca565b9150612950604085016126ca565b90509250925092565b600181811c9082168061296d57607f821691505b6020821081141561298e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6bffffffffffffffffffffffff198360601b168152600060146000845481600182811c915080831680612a4e57607f831692505b6020808410821415612a6e57634e487b7160e01b86526022600452602486fd5b818015612a825760018114612a9757612ac8565b60ff1986168a890152848a0188019650612ac8565b60008b81526020902060005b86811015612abe5781548c82018b0152908501908301612aa3565b505087858b010196505b50949a9950505050505050505050565b60008251612aea8184602087016124a1565b9190910192915050565b600060208284031215612b0657600080fd5b5051919050565b6020808252601190820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612b6857612b68612b38565b500290565b60008219821115612b8057612b80612b38565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612baf57612baf612b38565b5060010190565b6020808252600890820152671cdbdb19081bdd5d60c21b604082015260600190565b60008351612bea8184602088016124a1565b835190830190612bfe8183602088016124a1565b64173539b7b760d91b9101908152600501949350505050565b60008251612c298184602087016124a1565b6b3ab735b737bbb7173539b7b760a11b920191825250600c01919050565b60208082526027908201527f6e6f7420796574206f6e2073616c65206f722073616c6520737461747573206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b600082821015612ca057612ca0612b38565b500390565b600060ff821660ff84168060ff03821115612cc257612cc2612b38565b019392505050565b600060ff821660ff811415612ce157612ce1612b38565b60010192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d6157612d61612d3c565b500490565b600082612d7557612d75612d3c565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dad908301846124cd565b9695505050505050565b600060208284031215612dc957600080fd5b8151611d4f8161246e565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a47d613dd1cf23bce77fc8144e973634346e228751bd4e24465719e672cc88b064736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001568747470733a2f2f6e66742e61697961682e696f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000122178415663662425446a406463736b527378000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000127864657856772426642a26684e6a737864660000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseUri (string): https://nft.aiyah.io/
Arg [1] : secretFam (string): !xAVcf$%Dj@dcskRsx
Arg [2] : secretWL (string): xdexVw$&d*&hNjsxdf

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [4] : 68747470733a2f2f6e66742e61697961682e696f2f0000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 2178415663662425446a406463736b5273780000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [8] : 7864657856772426642a26684e6a737864660000000000000000000000000000


Deployed Bytecode Sourcemap

54331:5532:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47594:224;;;;;;;;;;-1:-1:-1;47594:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;47594:224:0;;;;;;;;35486:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37045:221::-;;;;;;;;;;-1:-1:-1;37045:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;37045:221:0;1528:203:1;58775:159:0;;;;;;;;;;-1:-1:-1;58775:159:0;;;;;:::i;:::-;;:::i;:::-;;36568:411;;;;;;;;;;-1:-1:-1;36568:411:0;;;;;:::i;:::-;;:::i;59747:111::-;;;;;;;;;;;;;:::i;:::-;;;3918:25:1;;;3906:2;3891:18;59747:111:0;3772:177:1;48234:113:0;;;;;;;;;;-1:-1:-1;48322:10:0;:17;48234:113;;37935:339;;;;;;;;;;-1:-1:-1;37935:339:0;;;;;:::i;:::-;;:::i;56725:372::-;;;;;;:::i;:::-;;:::i;58570:197::-;;;;;;;;;;-1:-1:-1;58570:197:0;;;;;:::i;:::-;;:::i;47902:256::-;;;;;;;;;;-1:-1:-1;47902:256:0;;;;;:::i;:::-;;:::i;54661:27::-;;;;;;;;;;-1:-1:-1;54661:27:0;;;;;;;;;;;5832:4:1;5820:17;;;5802:36;;5790:2;5775:18;54661:27:0;5660:184:1;59615:124:0;;;;;;;;;;;;;:::i;38345:185::-;;;;;;;;;;-1:-1:-1;38345:185:0;;;;;:::i;:::-;;:::i;58942:148::-;;;;;;;;;;-1:-1:-1;58942:148:0;;;;;:::i;:::-;;:::i;48424:233::-;;;;;;;;;;-1:-1:-1;48424:233:0;;;;;:::i;:::-;;:::i;54836:46::-;;;;;;;;;;-1:-1:-1;54836:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55406:99;;;;;;;;;;-1:-1:-1;55406:99:0;;;;;:::i;:::-;;:::i;54622:30::-;;;;;;;;;;;;;;;;35180:239;;;;;;;;;;-1:-1:-1;35180:239:0;;;;;:::i;:::-;;:::i;34910:208::-;;;;;;;;;;-1:-1:-1;34910:208:0;;;;;:::i;:::-;;:::i;55899:110::-;;;;;;;;;;;;;:::i;54729:31::-;;;;;;;;;;-1:-1:-1;54729:31:0;;;;;;;;;;;57105:371;;;;;;:::i;:::-;;:::i;14534:87::-;;;;;;;;;;-1:-1:-1;14607:6:0;;-1:-1:-1;;;;;14607:6:0;14534:87;;35655:104;;;;;;;;;;;;;:::i;54697:23::-;;;;;;;;;;-1:-1:-1;54697:23:0;;;;;;;;;;;37338:295;;;;;;;;;;-1:-1:-1;37338:295:0;;;;;:::i;:::-;;:::i;54540:36::-;;;;;;;;;;;;;;;;59098:114;;;;;;;;;;-1:-1:-1;59098:114:0;;;;;:::i;:::-;;:::i;58185:175::-;;;;;;;;;;-1:-1:-1;58185:175:0;;;;;:::i;:::-;;:::i;38601:328::-;;;;;;;;;;-1:-1:-1;38601:328:0;;;;;:::i;:::-;;:::i;54891:62::-;;;;;;;;;;-1:-1:-1;54891:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;57484:264;;;;;;:::i;:::-;;:::i;55513:378::-;;;;;;;;;;-1:-1:-1;55513:378:0;;;;;:::i;:::-;;:::i;54585:28::-;;;;;;;;;;-1:-1:-1;54585:28:0;;;;;;;;59426:181;;;;;;;;;;-1:-1:-1;59426:181:0;;;;;:::i;:::-;;:::i;37704:164::-;;;;;;;;;;-1:-1:-1;37704:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;37825:25:0;;;37801:4;37825:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37704:164;57756:421;;;;;;;;;;;;;:::i;59220:198::-;;;;;;;;;;-1:-1:-1;59220:198:0;;;;;:::i;:::-;;:::i;15434:192::-;;;;;;;;;;-1:-1:-1;15434:192:0;;;;;:::i;:::-;;:::i;58368:194::-;;;;;;;;;;-1:-1:-1;58368:194:0;;;;;:::i;:::-;;:::i;54460:42::-;;;;;;;;;;;;54498:4;54460:42;;47594:224;47696:4;-1:-1:-1;;;;;;47720:50:0;;-1:-1:-1;;;47720:50:0;;:90;;;47774:36;47798:11;47774:23;:36::i;:::-;47713:97;47594:224;-1:-1:-1;;47594:224:0:o;35486:100::-;35540:13;35573:5;35566:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35486:100;:::o;37045:221::-;37121:7;40528:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40528:16:0;37141:73;;;;-1:-1:-1;;;37141:73:0;;9018:2:1;37141:73:0;;;9000:21:1;9057:2;9037:18;;;9030:30;9096:34;9076:18;;;9069:62;-1:-1:-1;;;9147:18:1;;;9140:42;9199:19;;37141:73:0;;;;;;;;;-1:-1:-1;37234:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37234:24:0;;37045:221::o;58775:159::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;58873:22;;::::1;::::0;:10:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;58906:20:0;;::::1;::::0;:9:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58775:159:::0;;:::o;36568:411::-;36649:13;36665:23;36680:7;36665:14;:23::i;:::-;36649:39;;36713:5;-1:-1:-1;;;;;36707:11:0;:2;-1:-1:-1;;;;;36707:11:0;;;36699:57;;;;-1:-1:-1;;;36699:57:0;;9792:2:1;36699:57:0;;;9774:21:1;9831:2;9811:18;;;9804:30;9870:34;9850:18;;;9843:62;-1:-1:-1;;;9921:18:1;;;9914:31;9962:19;;36699:57:0;9590:397:1;36699:57:0;11142:10;-1:-1:-1;;;;;36791:21:0;;;;:62;;-1:-1:-1;36816:37:0;36833:5;11142:10;37704:164;:::i;36816:37::-;36769:168;;;;-1:-1:-1;;;36769:168:0;;10194:2:1;36769:168:0;;;10176:21:1;10233:2;10213:18;;;10206:30;10272:34;10252:18;;;10245:62;10343:26;10323:18;;;10316:54;10387:19;;36769:168:0;9992:420:1;36769:168:0;36950:21;36959:2;36963:7;36950:8;:21::i;59747:111::-;14607:6;;59800:7;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;-1:-1:-1;59829:21:0::1;59747:111:::0;:::o;37935:339::-;38130:41;11142:10;38163:7;38130:18;:41::i;:::-;38122:103;;;;-1:-1:-1;;;38122:103:0;;;;;;;:::i;:::-;38238:28;38248:4;38254:2;38258:7;38238:9;:28::i;56725:372::-;56803:29;56809:1;56812:10;56824:7;56803:5;:29::i;:::-;56859:48;56883:10;56895;56866:40;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56866:40:0;;;;;;;;;;56859:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56851:4;:56;56843:86;;;;-1:-1:-1;;;56843:86:0;;;;;;;:::i;:::-;56982:10;;57011:13;;;;;56977:29;;56982:10;56996;56977:29;:::i;:::-;56963:44;;:10;:44;:::i;:::-;56962:62;;;;:::i;:::-;56948:9;:77;56940:111;;;;-1:-1:-1;;;56940:111:0;;13679:2:1;56940:111:0;;;13661:21:1;13718:2;13698:18;;;13691:30;-1:-1:-1;;;13737:18:1;;;13730:51;13798:18;;56940:111:0;13477:345:1;56940:111:0;57062:27;57069:10;57081:7;57062:6;:27::i;:::-;56725:372;;:::o;58570:197::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;58657:6:::1;58652:108;58673:9;:16;58669:1;:20;58652:108;;;58720:14;:28;58735:9;58745:1;58735:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;58720:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;58720:28:0;58713:35;;-1:-1:-1;;58713:35:0::1;::::0;;58691:3;::::1;::::0;::::1;:::i;:::-;;;;58652:108;;47902:256:::0;47999:7;48035:23;48052:5;48035:16;:23::i;:::-;48027:5;:31;48019:87;;;;-1:-1:-1;;;48019:87:0;;14301:2:1;48019:87:0;;;14283:21:1;14340:2;14320:18;;;14313:30;14379:34;14359:18;;;14352:62;-1:-1:-1;;;14430:18:1;;;14423:41;14481:19;;48019:87:0;14099:407:1;48019:87:0;-1:-1:-1;;;;;;48124:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;47902:256::o;59615:124::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;59673:58:::1;59699:7;14607:6:::0;;-1:-1:-1;;;;;14607:6:0;;14534:87;59699:7:::1;59709:21;59673:17;:58::i;:::-;59615:124::o:0;38345:185::-;38483:39;38500:4;38506:2;38510:7;38483:39;;;;;;;;;;;;:16;:39::i;58942:148::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;59013:11:::1;:24:::0;;-1:-1:-1;;59013:24:0::1;;::::0;::::1;::::0;;::::1;::::0;;;59055:27:::1;::::0;5802:36:1;;;59055:27:0::1;::::0;5790:2:1;5775:18;59055:27:0::1;;;;;;;58942:148:::0;:::o;48424:233::-;48499:7;48535:30;48322:10;:17;;48234:113;48535:30;48527:5;:38;48519:95;;;;-1:-1:-1;;;48519:95:0;;14713:2:1;48519:95:0;;;14695:21:1;14752:2;14732:18;;;14725:30;14791:34;14771:18;;;14764:62;-1:-1:-1;;;14842:18:1;;;14835:42;14894:19;;48519:95:0;14511:408:1;48519:95:0;48632:10;48643:5;48632:17;;;;;;;;:::i;:::-;;;;;;;;;48625:24;;48424:233;;;:::o;55406:99::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;55479:18;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;35180:239::-:0;35252:7;35288:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35288:16:0;35323:19;35315:73;;;;-1:-1:-1;;;35315:73:0;;15126:2:1;35315:73:0;;;15108:21:1;15165:2;15145:18;;;15138:30;15204:34;15184:18;;;15177:62;-1:-1:-1;;;15255:18:1;;;15248:39;15304:19;;35315:73:0;14924:405:1;34910:208:0;34982:7;-1:-1:-1;;;;;35010:19:0;;35002:74;;;;-1:-1:-1;;;35002:74:0;;15536:2:1;35002:74:0;;;15518:21:1;15575:2;15555:18;;;15548:30;15614:34;15594:18;;;15587:62;-1:-1:-1;;;15665:18:1;;;15658:40;15715:19;;35002:74:0;15334:406:1;35002:74:0;-1:-1:-1;;;;;;35094:16:0;;;;;:9;:16;;;;;;;34910:208::o;55899:110::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;57105:371::-;57183:29;57189:1;57192:10;57204:7;57183:5;:29::i;:::-;57239:47;57263:10;57275:9;57246:39;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57246:39:0;;;;;;;;;;57239:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57231:4;:55;57223:85;;;;-1:-1:-1;;;57223:85:0;;;;;;;:::i;:::-;57361:10;;57390:13;;;;;57356:29;;57361:10;57375;57356:29;:::i;:::-;57342:44;;:10;:44;:::i;35655:104::-;35711:13;35744:7;35737:14;;;;;:::i;37338:295::-;-1:-1:-1;;;;;37441:24:0;;11142:10;37441:24;;37433:62;;;;-1:-1:-1;;;37433:62:0;;15947:2:1;37433:62:0;;;15929:21:1;15986:2;15966:18;;;15959:30;16025:27;16005:18;;;15998:55;16070:18;;37433:62:0;15745:349:1;37433:62:0;11142:10;37508:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37508:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37508:53:0;;;;;;;;;;37577:48;;540:41:1;;;37508:42:0;;11142:10;37577:48;;513:18:1;37577:48:0;;;;;;;37338:295;;:::o;59098:114::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;59174:14:::1;:30:::0;59098:114::o;58185:175::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;58287:14:::1;;58257:26;58275:7;58257:26;;:13;48322:10:::0;:17;;48234:113;58257:13:::1;:17:::0;::::1;:26::i;:::-;:44;;58249:65;;;;-1:-1:-1::0;;;58249:65:0::1;;;;;;;:::i;:::-;58325:27;58332:10;58344:7;58325:6;:27::i;:::-;58185:175:::0;:::o;38601:328::-;38776:41;11142:10;38809:7;38776:18;:41::i;:::-;38768:103;;;;-1:-1:-1;;;38768:103:0;;;;;;;:::i;:::-;38882:39;38896:4;38902:2;38906:7;38915:5;38882:13;:39::i;:::-;38601:328;;;;:::o;57484:264::-;57551:29;57557:1;57560:10;57572:7;57551:5;:29::i;:::-;57633:10;;57662:13;;;;;57628:29;;57633:10;57647;57628:29;:::i;:::-;57614:44;;:10;:44;:::i;:::-;57613:62;;;;:::i;:::-;57599:9;:77;57591:111;;;;-1:-1:-1;;;57591:111:0;;13679:2:1;57591:111:0;;;13661:21:1;13718:2;13698:18;;;13691:30;-1:-1:-1;;;13737:18:1;;;13730:51;13798:18;;57591:111:0;13477:345:1;55513:378:0;40504:4;40528:16;;;:7;:16;;;;;;55586:13;;-1:-1:-1;;;;;40528:16:0;55614:46;;;;-1:-1:-1;;;55614:46:0;;16637:2:1;55614:46:0;;;16619:21:1;16676:2;16656:18;;;16649:30;-1:-1:-1;;;16695:18:1;;;16688:47;16752:18;;55614:46:0;16435:341:1;55614:46:0;55695:7;55677:14;;:25;55673:139;;55752:10;:8;:10::i;:::-;55764:25;55781:7;55764:16;:25::i;:::-;55735:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55721:79;;55513:378;;;:::o;55673:139::-;55855:10;:8;:10::i;:::-;55838:44;;;;;;;;:::i;59426:181::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;54498:4:::1;59510:13;:28;;59502:56;;;::::0;-1:-1:-1;;;59502:56:0;;18081:2:1;59502:56:0::1;::::0;::::1;18063:21:1::0;18120:2;18100:18;;;18093:30;-1:-1:-1;;;18139:18:1;;;18132:45;18194:18;;59502:56:0::1;17879:339:1::0;59502:56:0::1;59569:14;:30:::0;59426:181::o;57756:421::-;57808:11;;;;57800:67;;;;-1:-1:-1;;;57800:67:0;;;;;;;:::i;:::-;57910:14;;:23;;57929:3;57910:18;:23::i;:::-;57886:20;57904:1;57886:13;48322:10;:17;;48234:113;57886:20;:47;;57878:68;;;;-1:-1:-1;;;57878:68:0;;;;;;;:::i;:::-;57980:10;57965:26;;;;:14;:26;;;;;;;;:34;;:26;:34;57957:64;;;;-1:-1:-1;;;57957:64:0;;;;;;;:::i;:::-;58054:10;58039:26;;;;:14;:26;;;;;58032:33;;-1:-1:-1;;58032:33:0;;;58078:43;;58100:20;58032:33;58100:13;48322:10;:17;;48234:113;58100:20;58078:9;:43::i;:::-;58139:30;58155:13;48322:10;:17;;48234:113;58155:13;58139:30;;3918:25:1;;;3906:2;3891:18;58139:30:0;;;;;;;57756:421::o;59220:198::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;59324:6:::1;:14:::0;;::::1;59382:28:::0;;::::1;::::0;::::1;-1:-1:-1::0;;59324:14:0;;::::1;;;59382:28:::0;;;;-1:-1:-1;;59382:28:0;;;;59349:22;;;::::1;59382:28:::0;;;;;;;::::1;::::0;;59220:198::o;15434:192::-;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15523:22:0;::::1;15515:73;;;::::0;-1:-1:-1;;;15515:73:0;;18833:2:1;15515:73:0::1;::::0;::::1;18815:21:1::0;18872:2;18852:18;;;18845:30;18911:34;18891:18;;;18884:62;-1:-1:-1;;;18962:18:1;;;18955:36;19008:19;;15515:73:0::1;18631:402:1::0;15515:73:0::1;15599:19;15609:8;15599:9;:19::i;58368:194::-:0;14607:6;;-1:-1:-1;;;;;14607:6:0;11142:10;14754:23;14746:68;;;;-1:-1:-1;;;14746:68:0;;;;;;;:::i;:::-;58452:6:::1;58447:108;58468:9;:16;58464:1;:20;58447:108;;;58539:4;58508:14;:28;58523:9;58533:1;58523:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;58508:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;58508:28:0;:35;;-1:-1:-1;;58508:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58486:3;::::1;::::0;::::1;:::i;:::-;;;;58447:108;;34541:305:::0;34643:4;-1:-1:-1;;;;;;34680:40:0;;-1:-1:-1;;;34680:40:0;;:105;;-1:-1:-1;;;;;;;34737:48:0;;-1:-1:-1;;;34737:48:0;34680:105;:158;;;-1:-1:-1;;;;;;;;;;26629:40:0;;;34802:36;26520:157;44421:174;44496:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44496:29:0;-1:-1:-1;;;;;44496:29:0;;;;;;;;:24;;44550:23;44496:24;44550:14;:23::i;:::-;-1:-1:-1;;;;;44541:46:0;;;;;;;;;;;44421:174;;:::o;40733:348::-;40826:4;40528:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40528:16:0;40843:73;;;;-1:-1:-1;;;40843:73:0;;19240:2:1;40843:73:0;;;19222:21:1;19279:2;19259:18;;;19252:30;19318:34;19298:18;;;19291:62;-1:-1:-1;;;19369:18:1;;;19362:42;19421:19;;40843:73:0;19038:408:1;40843:73:0;40927:13;40943:23;40958:7;40943:14;:23::i;:::-;40927:39;;40996:5;-1:-1:-1;;;;;40985:16:0;:7;-1:-1:-1;;;;;40985:16:0;;:51;;;;41029:7;-1:-1:-1;;;;;41005:31:0;:20;41017:7;41005:11;:20::i;:::-;-1:-1:-1;;;;;41005:31:0;;40985:51;:87;;;-1:-1:-1;;;;;;37825:25:0;;;37801:4;37825:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41040:32;40977:96;40733:348;-1:-1:-1;;;;40733:348:0:o;43725:578::-;43884:4;-1:-1:-1;;;;;43857:31:0;:23;43872:7;43857:14;:23::i;:::-;-1:-1:-1;;;;;43857:31:0;;43849:85;;;;-1:-1:-1;;;43849:85:0;;19653:2:1;43849:85:0;;;19635:21:1;19692:2;19672:18;;;19665:30;19731:34;19711:18;;;19704:62;-1:-1:-1;;;19782:18:1;;;19775:39;19831:19;;43849:85:0;19451:405:1;43849:85:0;-1:-1:-1;;;;;43953:16:0;;43945:65;;;;-1:-1:-1;;;43945:65:0;;20063:2:1;43945:65:0;;;20045:21:1;20102:2;20082:18;;;20075:30;20141:34;20121:18;;;20114:62;-1:-1:-1;;;20192:18:1;;;20185:34;20236:19;;43945:65:0;19861:400:1;43945:65:0;44023:39;44044:4;44050:2;44054:7;44023:20;:39::i;:::-;44127:29;44144:1;44148:7;44127:8;:29::i;:::-;-1:-1:-1;;;;;44169:15:0;;;;;;:9;:15;;;;;:20;;44188:1;;44169:15;:20;;44188:1;;44169:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44200:13:0;;;;;;:9;:13;;;;;:18;;44217:1;;44200:13;:18;;44217:1;;44200:18;:::i;:::-;;;;-1:-1:-1;;44229:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44229:21:0;-1:-1:-1;;;;;44229:21:0;;;;;;;;;44268:27;;44229:16;;44268:27;;;;;;;43725:578;;;:::o;56017:425::-;56117:11;;;56107:21;;;56117:11;;56107:21;56099:73;;;;-1:-1:-1;;;56099:73:0;;;;;;;:::i;:::-;56228:13;;;;56203:6;;;;56191:19;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;56191:23:0;;;;;;;;;;56228:13;;;;;;;56191:33;;56217:7;;56191:23;:33;:::i;:::-;:50;;;;56183:82;;;;-1:-1:-1;;;56183:82:0;;20807:2:1;56183:82:0;;;20789:21:1;20846:2;20826:18;;;20819:30;-1:-1:-1;;;20865:18:1;;;20858:49;20924:18;;56183:82:0;20605:343:1;56183:82:0;56294:1;56284:7;:11;;;:39;;;;-1:-1:-1;56310:13:0;;;;;;;;;56299:24;;;;;56284:39;56276:73;;;;-1:-1:-1;;;56276:73:0;;21155:2:1;56276:73:0;;;21137:21:1;21194:2;21174:18;;;21167:30;-1:-1:-1;;;21213:18:1;;;21206:51;21274:18;;56276:73:0;20953:345:1;56276:73:0;56398:14;;:23;;56417:3;56398:18;:23::i;:::-;56368:26;56386:7;56368:26;;:13;48322:10;:17;;48234:113;56368:26;:53;;56360:74;;;;-1:-1:-1;;;56360:74:0;;;;;;;:::i;56450:267::-;56529:1;56514:101;56537:7;56532:12;;:1;:12;;;56514:101;;56568:35;56578:2;56582:20;56600:1;56582:13;48322:10;:17;;48234:113;56568:35;56546:3;;;;:::i;:::-;;;;56514:101;;;-1:-1:-1;56639:6:0;;;;;;;;;56627:19;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;56627:23:0;;;;;;;;;:34;;56654:7;;56627:23;;:19;:34;;56654:7;;56627:34;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56679:30;56695:13;48322:10;:17;;48234:113;56695:13;56679:30;;3918:25:1;;;3906:2;3891:18;56679:30:0;;;;;;;56450:267;;:::o;17902:317::-;18017:6;17992:21;:31;;17984:73;;;;-1:-1:-1;;;17984:73:0;;21685:2:1;17984:73:0;;;21667:21:1;21724:2;21704:18;;;21697:30;21763:31;21743:18;;;21736:59;21812:18;;17984:73:0;21483:353:1;17984:73:0;18071:12;18089:9;-1:-1:-1;;;;;18089:14:0;18111:6;18089:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18070:52;;;18141:7;18133:78;;;;-1:-1:-1;;;18133:78:0;;22253:2:1;18133:78:0;;;22235:21:1;22292:2;22272:18;;;22265:30;22331:34;22311:18;;;22304:62;22402:28;22382:18;;;22375:56;22448:19;;18133:78:0;22051:422:1;2792:98:0;2850:7;2877:5;2881:1;2877;:5;:::i;:::-;2870:12;2792:98;-1:-1:-1;;;2792:98:0:o;39811:315::-;39968:28;39978:4;39984:2;39988:7;39968:9;:28::i;:::-;40015:48;40038:4;40044:2;40048:7;40057:5;40015:22;:48::i;:::-;40007:111;;;;-1:-1:-1;;;40007:111:0;;;;;;;:::i;55287:::-;55347:13;55382:8;55375:15;;;;;:::i;8678:723::-;8734:13;8955:10;8951:53;;-1:-1:-1;;8982:10:0;;;;;;;;;;;;-1:-1:-1;;;8982:10:0;;;;;8678:723::o;8951:53::-;9029:5;9014:12;9070:78;9077:9;;9070:78;;9103:8;;;;:::i;:::-;;-1:-1:-1;9126:10:0;;-1:-1:-1;9134:2:0;9126:10;;:::i;:::-;;;9070:78;;;9158:19;9190:6;9180:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9180:17:0;;9158:39;;9208:154;9215:10;;9208:154;;9242:11;9252:1;9242:11;;:::i;:::-;;-1:-1:-1;9311:10:0;9319:2;9311:5;:10;:::i;:::-;9298:24;;:2;:24;:::i;:::-;9285:39;;9268:6;9275;9268:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9268:56:0;;;;;;;;-1:-1:-1;9339:11:0;9348:2;9339:11;;:::i;:::-;;;9208:154;;3173:98;3231:7;3258:5;3262:1;3258;:5;:::i;41423:110::-;41499:26;41509:2;41513:7;41499:26;;;;;;;;;;;;:9;:26::i;15634:173::-;15709:6;;;-1:-1:-1;;;;;15726:17:0;;;-1:-1:-1;;;;;;15726:17:0;;;;;;;15759:40;;15709:6;;;15726:17;15709:6;;15759:40;;15690:16;;15759:40;15679:128;15634:173;:::o;49270:589::-;-1:-1:-1;;;;;49476:18:0;;49472:187;;49511:40;49543:7;50686:10;:17;;50659:24;;;;:15;:24;;;;;:44;;;50714:24;;;;;;;;;;;;50582:164;49511:40;49472:187;;;49581:2;-1:-1:-1;;;;;49573:10:0;:4;-1:-1:-1;;;;;49573:10:0;;49569:90;;49600:47;49633:4;49639:7;49600:32;:47::i;:::-;-1:-1:-1;;;;;49673:16:0;;49669:183;;49706:45;49743:7;49706:36;:45::i;49669:183::-;49779:4;-1:-1:-1;;;;;49773:10:0;:2;-1:-1:-1;;;;;49773:10:0;;49769:83;;49800:40;49828:2;49832:7;49800:27;:40::i;45160:799::-;45315:4;-1:-1:-1;;;;;45336:13:0;;16903:20;16951:8;45332:620;;45372:72;;-1:-1:-1;;;45372:72:0;;-1:-1:-1;;;;;45372:36:0;;;;;:72;;11142:10;;45423:4;;45429:7;;45438:5;;45372:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45372:72:0;;;;;;;;-1:-1:-1;;45372:72:0;;;;;;;;;;;;:::i;:::-;;;45368:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45614:13:0;;45610:272;;45657:60;;-1:-1:-1;;;45657:60:0;;;;;;;:::i;45610:272::-;45832:6;45826:13;45817:6;45813:2;45809:15;45802:38;45368:529;-1:-1:-1;;;;;;45495:51:0;-1:-1:-1;;;45495:51:0;;-1:-1:-1;45488:58:0;;45332:620;-1:-1:-1;45936:4:0;45160:799;;;;;;:::o;41760:321::-;41890:18;41896:2;41900:7;41890:5;:18::i;:::-;41941:54;41972:1;41976:2;41980:7;41989:5;41941:22;:54::i;:::-;41919:154;;;;-1:-1:-1;;;41919:154:0;;;;;;;:::i;51373:988::-;51639:22;51689:1;51664:22;51681:4;51664:16;:22::i;:::-;:26;;;;:::i;:::-;51701:18;51722:26;;;:17;:26;;;;;;51639:51;;-1:-1:-1;51855:28:0;;;51851:328;;-1:-1:-1;;;;;51922:18:0;;51900:19;51922:18;;;:12;:18;;;;;;;;:34;;;;;;;;;51973:30;;;;;;:44;;;52090:30;;:17;:30;;;;;:43;;;51851:328;-1:-1:-1;52275:26:0;;;;:17;:26;;;;;;;;52268:33;;;-1:-1:-1;;;;;52319:18:0;;;;;:12;:18;;;;;:34;;;;;;;52312:41;51373:988::o;52656:1079::-;52934:10;:17;52909:22;;52934:21;;52954:1;;52934:21;:::i;:::-;52966:18;52987:24;;;:15;:24;;;;;;53360:10;:26;;52909:46;;-1:-1:-1;52987:24:0;;52909:46;;53360:26;;;;;;:::i;:::-;;;;;;;;;53338:48;;53424:11;53399:10;53410;53399:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;53504:28;;;:15;:28;;;;;;;:41;;;53676:24;;;;;53669:31;53711:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;52727:1008;;;52656:1079;:::o;50160:221::-;50245:14;50262:20;50279:2;50262:16;:20::i;:::-;-1:-1:-1;;;;;50293:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;50338:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;50160:221:0:o;42417:382::-;-1:-1:-1;;;;;42497:16:0;;42489:61;;;;-1:-1:-1;;;42489:61:0;;24353:2:1;42489:61:0;;;24335:21:1;;;24372:18;;;24365:30;24431:34;24411:18;;;24404:62;24483:18;;42489:61:0;24151:356:1;42489:61:0;40504:4;40528:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40528:16:0;:30;42561:58;;;;-1:-1:-1;;;42561:58:0;;24714:2:1;42561:58:0;;;24696:21:1;24753:2;24733:18;;;24726:30;24792;24772:18;;;24765:58;24840:18;;42561:58:0;24512:352:1;42561:58:0;42632:45;42661:1;42665:2;42669:7;42632:20;:45::i;:::-;-1:-1:-1;;;;;42690:13:0;;;;;;:9;:13;;;;;:18;;42707:1;;42690:13;:18;;42707:1;;42690:18;:::i;:::-;;;;-1:-1:-1;;42719:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42719:21:0;-1:-1:-1;;;;;42719:21:0;;;;;;;;42758:33;;42719:16;;;42758:33;;42719:16;;42758:33;42417:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:127::-;1797:10;1792:3;1788:20;1785:1;1778:31;1828:4;1825:1;1818:15;1852:4;1849:1;1842:15;1868:275;1939:2;1933:9;2004:2;1985:13;;-1:-1:-1;;1981:27:1;1969:40;;2039:18;2024:34;;2060:22;;;2021:62;2018:88;;;2086:18;;:::i;:::-;2122:2;2115:22;1868:275;;-1:-1:-1;1868:275:1:o;2148:407::-;2213:5;2247:18;2239:6;2236:30;2233:56;;;2269:18;;:::i;:::-;2307:57;2352:2;2331:15;;-1:-1:-1;;2327:29:1;2358:4;2323:40;2307:57;:::i;:::-;2298:66;;2387:6;2380:5;2373:21;2427:3;2418:6;2413:3;2409:16;2406:25;2403:45;;;2444:1;2441;2434:12;2403:45;2493:6;2488:3;2481:4;2474:5;2470:16;2457:43;2547:1;2540:4;2531:6;2524:5;2520:18;2516:29;2509:40;2148:407;;;;;:::o;2560:222::-;2603:5;2656:3;2649:4;2641:6;2637:17;2633:27;2623:55;;2674:1;2671;2664:12;2623:55;2696:80;2772:3;2763:6;2750:20;2743:4;2735:6;2731:17;2696:80;:::i;2787:543::-;2875:6;2883;2936:2;2924:9;2915:7;2911:23;2907:32;2904:52;;;2952:1;2949;2942:12;2904:52;2992:9;2979:23;3021:18;3062:2;3054:6;3051:14;3048:34;;;3078:1;3075;3068:12;3048:34;3101:50;3143:7;3134:6;3123:9;3119:22;3101:50;:::i;:::-;3091:60;;3204:2;3193:9;3189:18;3176:32;3160:48;;3233:2;3223:8;3220:16;3217:36;;;3249:1;3246;3239:12;3217:36;;3272:52;3316:7;3305:8;3294:9;3290:24;3272:52;:::i;:::-;3262:62;;;2787:543;;;;;:::o;3335:173::-;3403:20;;-1:-1:-1;;;;;3452:31:1;;3442:42;;3432:70;;3498:1;3495;3488:12;3432:70;3335:173;;;:::o;3513:254::-;3581:6;3589;3642:2;3630:9;3621:7;3617:23;3613:32;3610:52;;;3658:1;3655;3648:12;3610:52;3681:29;3700:9;3681:29;:::i;:::-;3671:39;3757:2;3742:18;;;;3729:32;;-1:-1:-1;;;3513:254:1:o;3954:328::-;4031:6;4039;4047;4100:2;4088:9;4079:7;4075:23;4071:32;4068:52;;;4116:1;4113;4106:12;4068:52;4139:29;4158:9;4139:29;:::i;:::-;4129:39;;4187:38;4221:2;4210:9;4206:18;4187:38;:::i;:::-;4177:48;;4272:2;4261:9;4257:18;4244:32;4234:42;;3954:328;;;;;:::o;4287:156::-;4353:20;;4413:4;4402:16;;4392:27;;4382:55;;4433:1;4430;4423:12;4448:250;4514:6;4522;4575:2;4563:9;4554:7;4550:23;4546:32;4543:52;;;4591:1;4588;4581:12;4543:52;4614:27;4631:9;4614:27;:::i;4703:952::-;4787:6;4818:2;4861;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;4917:9;4904:23;4946:18;4987:2;4979:6;4976:14;4973:34;;;5003:1;5000;4993:12;4973:34;5041:6;5030:9;5026:22;5016:32;;5086:7;5079:4;5075:2;5071:13;5067:27;5057:55;;5108:1;5105;5098:12;5057:55;5144:2;5131:16;5166:2;5162;5159:10;5156:36;;;5172:18;;:::i;:::-;5218:2;5215:1;5211:10;5201:20;;5241:28;5265:2;5261;5257:11;5241:28;:::i;:::-;5303:15;;;5373:11;;;5369:20;;;5334:12;;;;5401:19;;;5398:39;;;5433:1;5430;5423:12;5398:39;5457:11;;;;5477:148;5493:6;5488:3;5485:15;5477:148;;;5559:23;5578:3;5559:23;:::i;:::-;5547:36;;5510:12;;;;5603;;;;5477:148;;;5644:5;4703:952;-1:-1:-1;;;;;;;;4703:952:1:o;5849:182::-;5906:6;5959:2;5947:9;5938:7;5934:23;5930:32;5927:52;;;5975:1;5972;5965:12;5927:52;5998:27;6015:9;5998:27;:::i;6036:186::-;6095:6;6148:2;6136:9;6127:7;6123:23;6119:32;6116:52;;;6164:1;6161;6154:12;6116:52;6187:29;6206:9;6187:29;:::i;6227:322::-;6296:6;6349:2;6337:9;6328:7;6324:23;6320:32;6317:52;;;6365:1;6362;6355:12;6317:52;6405:9;6392:23;6438:18;6430:6;6427:30;6424:50;;;6470:1;6467;6460:12;6424:50;6493;6535:7;6526:6;6515:9;6511:22;6493:50;:::i;6554:347::-;6619:6;6627;6680:2;6668:9;6659:7;6655:23;6651:32;6648:52;;;6696:1;6693;6686:12;6648:52;6719:29;6738:9;6719:29;:::i;:::-;6709:39;;6798:2;6787:9;6783:18;6770:32;6845:5;6838:13;6831:21;6824:5;6821:32;6811:60;;6867:1;6864;6857:12;6811:60;6890:5;6880:15;;;6554:347;;;;;:::o;6906:667::-;7001:6;7009;7017;7025;7078:3;7066:9;7057:7;7053:23;7049:33;7046:53;;;7095:1;7092;7085:12;7046:53;7118:29;7137:9;7118:29;:::i;:::-;7108:39;;7166:38;7200:2;7189:9;7185:18;7166:38;:::i;:::-;7156:48;;7251:2;7240:9;7236:18;7223:32;7213:42;;7306:2;7295:9;7291:18;7278:32;7333:18;7325:6;7322:30;7319:50;;;7365:1;7362;7355:12;7319:50;7388:22;;7441:4;7433:13;;7429:27;-1:-1:-1;7419:55:1;;7470:1;7467;7460:12;7419:55;7493:74;7559:7;7554:2;7541:16;7536:2;7532;7528:11;7493:74;:::i;:::-;7483:84;;;6906:667;;;;;;;:::o;7578:256::-;7644:6;7652;7705:2;7693:9;7684:7;7680:23;7676:32;7673:52;;;7721:1;7718;7711:12;7673:52;7744:27;7761:9;7744:27;:::i;:::-;7734:37;;7790:38;7824:2;7813:9;7809:18;7790:38;:::i;:::-;7780:48;;7578:256;;;;;:::o;7839:260::-;7907:6;7915;7968:2;7956:9;7947:7;7943:23;7939:32;7936:52;;;7984:1;7981;7974:12;7936:52;8007:29;8026:9;8007:29;:::i;8104:322::-;8175:6;8183;8191;8244:2;8232:9;8223:7;8219:23;8215:32;8212:52;;;8260:1;8257;8250:12;8212:52;8283:27;8300:9;8283:27;:::i;:::-;8273:37;;8329:36;8361:2;8350:9;8346:18;8329:36;:::i;:::-;8319:46;;8384:36;8416:2;8405:9;8401:18;8384:36;:::i;:::-;8374:46;;8104:322;;;;;:::o;8431:380::-;8510:1;8506:12;;;;8553;;;8574:61;;8628:4;8620:6;8616:17;8606:27;;8574:61;8681:2;8673:6;8670:14;8650:18;8647:38;8644:161;;;8727:10;8722:3;8718:20;8715:1;8708:31;8762:4;8759:1;8752:15;8790:4;8787:1;8780:15;8644:161;;8431:380;;;:::o;9229:356::-;9431:2;9413:21;;;9450:18;;;9443:30;9509:34;9504:2;9489:18;;9482:62;9576:2;9561:18;;9229:356::o;10417:413::-;10619:2;10601:21;;;10658:2;10638:18;;;10631:30;10697:34;10692:2;10677:18;;10670:62;-1:-1:-1;;;10763:2:1;10748:18;;10741:47;10820:3;10805:19;;10417:413::o;10961:1259::-;11172:26;11168:31;11159:6;11155:2;11151:15;11147:53;11142:3;11135:66;11117:3;11220:2;11242:1;11275:6;11269:13;11305:3;11327:1;11355:9;11351:2;11347:18;11337:28;;11415:2;11404:9;11400:18;11437;11427:61;;11481:4;11473:6;11469:17;11459:27;;11427:61;11507:2;11555;11547:6;11544:14;11524:18;11521:38;11518:165;;;-1:-1:-1;;;11582:33:1;;11638:4;11635:1;11628:15;11668:4;11589:3;11656:17;11518:165;11699:18;11726:122;;;;11862:1;11857:338;;;;11692:503;;11726:122;-1:-1:-1;;11768:24:1;;11754:12;;;11747:46;11817:16;;;11813:25;;;-1:-1:-1;11726:122:1;;11857:338;10908:1;10901:14;;;10945:4;10932:18;;11952:1;11966:174;11980:6;11977:1;11974:13;11966:174;;;12067:14;;12049:11;;;12045:20;;12038:44;12110:16;;;;11995:10;;11966:174;;;11970:3;;12182:2;12173:6;12168:3;12164:16;12160:25;12153:32;;11692:503;-1:-1:-1;12211:3:1;;10961:1259;-1:-1:-1;;;;;;;;;;10961:1259:1:o;12225:274::-;12354:3;12392:6;12386:13;12408:53;12454:6;12449:3;12442:4;12434:6;12430:17;12408:53;:::i;:::-;12477:16;;;;;12225:274;-1:-1:-1;;12225:274:1:o;12504:184::-;12574:6;12627:2;12615:9;12606:7;12602:23;12598:32;12595:52;;;12643:1;12640;12633:12;12595:52;-1:-1:-1;12666:16:1;;12504:184;-1:-1:-1;12504:184:1:o;12693:341::-;12895:2;12877:21;;;12934:2;12914:18;;;12907:30;-1:-1:-1;;;12968:2:1;12953:18;;12946:47;13025:2;13010:18;;12693:341::o;13039:127::-;13100:10;13095:3;13091:20;13088:1;13081:31;13131:4;13128:1;13121:15;13155:4;13152:1;13145:15;13171:168;13211:7;13277:1;13273;13269:6;13265:14;13262:1;13259:21;13254:1;13247:9;13240:17;13236:45;13233:71;;;13284:18;;:::i;:::-;-1:-1:-1;13324:9:1;;13171:168::o;13344:128::-;13384:3;13415:1;13411:6;13408:1;13405:13;13402:39;;;13421:18;;:::i;:::-;-1:-1:-1;13457:9:1;;13344:128::o;13827:127::-;13888:10;13883:3;13879:20;13876:1;13869:31;13919:4;13916:1;13909:15;13943:4;13940:1;13933:15;13959:135;13998:3;-1:-1:-1;;14019:17:1;;14016:43;;;14039:18;;:::i;:::-;-1:-1:-1;14086:1:1;14075:13;;13959:135::o;16099:331::-;16301:2;16283:21;;;16340:1;16320:18;;;16313:29;-1:-1:-1;;;16373:2:1;16358:18;;16351:38;16421:2;16406:18;;16099:331::o;16781:637::-;17061:3;17099:6;17093:13;17115:53;17161:6;17156:3;17149:4;17141:6;17137:17;17115:53;:::i;:::-;17231:13;;17190:16;;;;17253:57;17231:13;17190:16;17287:4;17275:17;;17253:57;:::i;:::-;-1:-1:-1;;;17332:20:1;;17361:22;;;17410:1;17399:13;;16781:637;-1:-1:-1;;;;16781:637:1:o;17423:451::-;17655:3;17693:6;17687:13;17709:53;17755:6;17750:3;17743:4;17735:6;17731:17;17709:53;:::i;:::-;-1:-1:-1;;;17784:16:1;;17809:29;;;-1:-1:-1;17865:2:1;17854:14;;17423:451;-1:-1:-1;17423:451:1:o;18223:403::-;18425:2;18407:21;;;18464:2;18444:18;;;18437:30;18503:34;18498:2;18483:18;;18476:62;-1:-1:-1;;;18569:2:1;18554:18;;18547:37;18616:3;18601:19;;18223:403::o;20266:125::-;20306:4;20334:1;20331;20328:8;20325:34;;;20339:18;;:::i;:::-;-1:-1:-1;20376:9:1;;20266:125::o;20396:204::-;20434:3;20470:4;20467:1;20463:12;20502:4;20499:1;20495:12;20537:3;20531:4;20527:14;20522:3;20519:23;20516:49;;;20545:18;;:::i;:::-;20581:13;;20396:204;-1:-1:-1;;;20396:204:1:o;21303:175::-;21340:3;21384:4;21377:5;21373:16;21413:4;21404:7;21401:17;21398:43;;;21421:18;;:::i;:::-;21470:1;21457:15;;21303:175;-1:-1:-1;;21303:175:1:o;22478:414::-;22680:2;22662:21;;;22719:2;22699:18;;;22692:30;22758:34;22753:2;22738:18;;22731:62;-1:-1:-1;;;22824:2:1;22809:18;;22802:48;22882:3;22867:19;;22478:414::o;22897:127::-;22958:10;22953:3;22949:20;22946:1;22939:31;22989:4;22986:1;22979:15;23013:4;23010:1;23003:15;23029:120;23069:1;23095;23085:35;;23100:18;;:::i;:::-;-1:-1:-1;23134:9:1;;23029:120::o;23154:112::-;23186:1;23212;23202:35;;23217:18;;:::i;:::-;-1:-1:-1;23251:9:1;;23154:112::o;23271:489::-;-1:-1:-1;;;;;23540:15:1;;;23522:34;;23592:15;;23587:2;23572:18;;23565:43;23639:2;23624:18;;23617:34;;;23687:3;23682:2;23667:18;;23660:31;;;23465:4;;23708:46;;23734:19;;23726:6;23708:46;:::i;:::-;23700:54;23271:489;-1:-1:-1;;;;;;23271:489:1:o;23765:249::-;23834:6;23887:2;23875:9;23866:7;23862:23;23858:32;23855:52;;;23903:1;23900;23893:12;23855:52;23935:9;23929:16;23954:30;23978:5;23954:30;:::i;24019:127::-;24080:10;24075:3;24071:20;24068:1;24061:31;24111:4;24108:1;24101:15;24135:4;24132:1;24125:15

Swarm Source

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