ETH Price: $3,165.79 (+2.75%)

Token

NoAzukiNoApe (NoAzukiNoApe)
 

Overview

Max Total Supply

5,555 NoAzukiNoApe

Holders

1,297

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 NoAzukiNoApe
0xf7949b6a49ce4784b26ca6d80e80625dc769ba06
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:
NFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 3 of 3: NoAzukiNoApe.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./ERC721.sol";

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}


abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// Used for OpenSea Whitelisting
contract OwnableDelegateProxy {}

/**
 * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract NFT is ERC721A, ReentrancyGuard {

	// Project Name
	string private _name = "NoAzukiNoApe";

	// Project Symbol
	string private _symbol = "NoAzukiNoApe";

	// Locked, Presale, PublicSale 
	enum Stage {
		Locked,
		Presale
	}
	Stage internal _currentStage;

	// Root Hash for Whitelist

	// OpenSea Whitelisting
	address public constant _proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

	// Wrapped Ethereum Address
	address constant _wrappedETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

	// Total NFT Supply
	uint256 constant _totalSupply = 5555;

	// Presale Constants
	uint256 constant _preSaleMaxMint = 5;

	// Addresses for payment splitter here
	address constant account1 = 0xdb217A8bd47B0Dcd77FA71C6536640B1c27671b0;
	address constant account2 = 0xFc9F025e9192CeDa964602b51Dc801E35Db9518B;
	address immutable deployer;
	uint256 constant accountPercentage1 = 90;
	uint256 constant accountPercentage2 = 10;

	// Check if caller is sender
	modifier isUserCaller() {
		require(tx.origin == msg.sender, "Caller is Smart Contract");
		_;
	}

	// Check if not locked
	modifier notLocked() {
		require(_currentStage != Stage.Locked, "Stage Locked"); 
		_;
	}

	constructor(string memory URI_) ERC721A(_name,_symbol,URI_) {
		deployer = msg.sender;
		_currentStage = Stage.Locked;
	}

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

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        ProxyRegistry proxyRegistry = ProxyRegistry(_proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner,operator);
    }

    // Check if shareholder
	function isShareHolder() private isUserCaller view returns(bool) {
		return (msg.sender == account1) || (msg.sender == account2) || (msg.sender == deployer);	
	}

  	// Set stage for NFT drops
	function setStage(uint256 newStage) external onlyOwner {
		require(newStage <= 1, "Wrong Stage Index");
		if(newStage == 0) {
			_currentStage = Stage.Locked;
		}
		else if(newStage == 1) {
			_currentStage = Stage.Presale;
		}
	}

	// Mint function
	function mint(uint256 quantity) external notLocked nonReentrant isUserCaller payable {
		require(quantity > 0, "Quantity cannot be 0");
		uint256 currentSupply = totalSupply();
		uint256 currentMintCount = _numberMinted(msg.sender); // numberMinted

		require(currentSupply + quantity <= _totalSupply, "Exceeds Collection Size");
		require(currentMintCount + quantity <= _preSaleMaxMint, "Exceeds Allowed Mint");

		_safeMint(msg.sender, quantity);
	}

	// Withdraw Wrapped ETH funds
	function withdrawWrappedETHFunds() external {
		require(isShareHolder(),"Not Shareholder");

		// Get Wrapped Ethereum Balance of this contract
		IERC20 wrappedETHContract = IERC20(_wrappedETH);
		uint256 wETHBalance = wrappedETHContract.balanceOf(address(this));
		
		wrappedETHContract.transfer(account1, wETHBalance * 90 / 100);
		wrappedETHContract.transfer(account2, wETHBalance * 10 / 100);
	}

	// Withdraw ETH Funds
	function withdrawETHFunds() external {
		require(isShareHolder(),"Not Shareholder");

		// Get Ethereum Balance of this contract
		uint256 ETHBalance = address(this).balance;

		_widthdraw(account1,ETHBalance * 90 / 100);
		_widthdraw(account2,ETHBalance * 10 / 100);
	}

	function _widthdraw(address _address, uint256 _amount) internal {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }
}

File 1 of 3: ERC165.sol
// SPDX-License-Identifier: UNLICENSED
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.
 */

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


abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 2 of 3: ERC721.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./ERC165.sol";

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

/**
 * @dev Interface of an ERC721Metadata compliant contract.
 */
interface IERC721Metadata {
    /**
     * @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);
}

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract ERC721A is Ownable, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _URI;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    constructor(string memory name_, string memory symbol_, string memory URI_) {
        _name = name_;
        _symbol = symbol_;
        _URI = URI_;
        _currentIndex = _startTokenId();
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev Set Base URI for computing {tokenURI}. Can be overriden in child contracts.
     */
    function setBaseURI(string calldata URI) external virtual onlyOwner {
        _URI = URI;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, true);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"URI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStage","type":"uint256"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETHFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawWrappedETHFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052600c60a08190526b4e6f417a756b694e6f41706560a01b60c09081526200002d9190816200034d565b5060408051808201909152600c8082526b4e6f417a756b694e6f41706560a01b60209092019182526200006391600d916200034d565b503480156200007157600080fd5b5060405162002437380380620024378339810160408190526200009491620003f3565b600c8054620000a390620004cf565b80601f0160208091040260200160405190810160405280929190818152602001828054620000d190620004cf565b8015620001225780601f10620000f65761010080835404028352916020019162000122565b820191906000526020600020905b8154815290600101906020018083116200010457829003601f168201915b5050505050600d80546200013690620004cf565b80601f01602080910402602001604051908101604052809291908181526020018280546200016490620004cf565b8015620001b55780601f106200018957610100808354040283529160200191620001b5565b820191906000526020600020905b8154815290600101906020018083116200019757829003601f168201915b505050505082620001d5620001cf6200027260201b60201c565b62000276565b620001e76301ffc9a760e01b620002c6565b8251620001fc9060049060208601906200034d565b508151620002129060059060208501906200034d565b508051620002289060069060208401906200034d565b506001600255620002406380ac58cd60e01b620002c6565b62000252635b5e139f60e01b620002c6565b50506001600b5550503360601b608052600e805460ff1916905562000522565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160e01b03198082161415620003255760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b8280546200035b90620004cf565b90600052602060002090601f0160209004810192826200037f5760008555620003ca565b82601f106200039a57805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003ca578251825591602001919060010190620003ad565b50620003d8929150620003dc565b5090565b5b80821115620003d85760008155600101620003dd565b600060208083850312156200040757600080fd5b82516001600160401b03808211156200041f57600080fd5b818501915085601f8301126200043457600080fd5b8151818111156200044957620004496200050c565b604051601f8201601f19908116603f011681019083821181831017156200047457620004746200050c565b8160405282815288868487010111156200048d57600080fd5b600093505b82841015620004b1578484018601518185018701529285019262000492565b82841115620004c35760008684830101525b98975050505050505050565b600181811c90821680620004e457607f821691505b602082108114156200050657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c611ef66200054160003960006110140152611ef66000f3fe6080604052600436106101405760003560e01c80636352211e116100b6578063a0712d681161006f578063a0712d6814610377578063a22cb4651461038a578063b88d4fde146103aa578063c87b56dd146103ca578063e985e9c5146103ea578063f2fde38b1461040a57600080fd5b80636352211e146102c757806370a08231146102e7578063715018a61461030757806389cd503a1461031c5780638da5cb5b1461034457806395d89b411461036257600080fd5b806318160ddd1161010857806318160ddd1461020b57806323b872dd146102325780633eb1d7771461025257806342842e0e1461027257806355f804b314610292578063629f349d146102b257600080fd5b806301ffc9a714610145578063045767731461017a57806306fdde0314610191578063081812fc146101b3578063095ea7b3146101eb575b600080fd5b34801561015157600080fd5b50610165610160366004611b36565b61042a565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610485565b005b34801561019d57600080fd5b506101a66106d1565b6040516101719190611cd9565b3480156101bf57600080fd5b506101d36101ce366004611bff565b610763565b6040516001600160a01b039091168152602001610171565b3480156101f757600080fd5b5061018f610206366004611aed565b6107a7565b34801561021757600080fd5b5060035460025403600019015b604051908152602001610171565b34801561023e57600080fd5b5061018f61024d36600461199e565b610830565b34801561025e57600080fd5b5061018f61026d366004611bff565b61083b565b34801561027e57600080fd5b5061018f61028d36600461199e565b6108d6565b34801561029e57600080fd5b5061018f6102ad366004611b8d565b6108f1565b3480156102be57600080fd5b5061018f610927565b3480156102d357600080fd5b506101d36102e2366004611bff565b6109c7565b3480156102f357600080fd5b50610224610302366004611948565b6109d9565b34801561031357600080fd5b5061018f610a28565b34801561032857600080fd5b506101d373a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561035057600080fd5b506000546001600160a01b03166101d3565b34801561036e57600080fd5b506101a6610a5e565b61018f610385366004611bff565b610a6d565b34801561039657600080fd5b5061018f6103a5366004611abf565b610c9f565b3480156103b657600080fd5b5061018f6103c53660046119df565b610d35565b3480156103d657600080fd5b506101a66103e5366004611bff565b610d86565b3480156103f657600080fd5b50610165610405366004611965565b610e0b565b34801561041657600080fd5b5061018f610425366004611948565b610eea565b60006001600160e01b031982166380ac58cd60e01b148061045b57506001600160e01b03198216635b5e139f60e01b145b8061047f57506001600160e01b0319821660009081526001602052604090205460ff165b92915050565b61048d610f82565b6104d05760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064015b60405180910390fd5b6040516370a0823160e01b815230600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29060009082906370a082319060240160206040518083038186803b15801561051f57600080fd5b505afa158015610533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105579190611c18565b90506001600160a01b03821663a9059cbb73db217a8bd47b0dcd77fa71c6536640b1c27671b0606461058a85605a611d4d565b6105949190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106129190611b19565b506001600160a01b03821663a9059cbb73fc9f025e9192ceda964602b51dc801e35db9518b606461064485600a611d4d565b61064e9190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cc9190611b19565b505050565b6060600c80546106e090611daf565b80601f016020809104026020016040519081016040528092919081815260200182805461070c90611daf565b80156107595780601f1061072e57610100808354040283529160200191610759565b820191906000526020600020905b81548152906001019060200180831161073c57829003601f168201915b5050505050905090565b600061076e8261103b565b61078b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600960205260409020546001600160a01b031690565b60006107b2826109c7565b9050806001600160a01b0316836001600160a01b031614156107e75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061080757506108058133610e0b565b155b15610825576040516367d9dca160e11b815260040160405180910390fd5b6106cc838383611074565b6106cc8383836110d0565b6000546001600160a01b031633146108655760405162461bcd60e51b81526004016104c790611cec565b60018111156108aa5760405162461bcd60e51b81526020600482015260116024820152700aee4dedcce40a6e8c2ceca4092dcc8caf607b1b60448201526064016104c7565b806108bc5750600e805460ff19169055565b80600114156108d357600e805460ff191660011790555b50565b6106cc83838360405180602001604052806000815250610d35565b6000546001600160a01b0316331461091b5760405162461bcd60e51b81526004016104c790611cec565b6106cc600683836118af565b61092f610f82565b61096d5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064016104c7565b476109a273db217a8bd47b0dcd77fa71c6536640b1c27671b0606461099384605a611d4d565b61099d9190611d39565b6112bf565b6108d373fc9f025e9192ceda964602b51dc801e35db9518b606461099384600a611d4d565b60006109d282611355565b5192915050565b60006001600160a01b038216610a02576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526008602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610a525760405162461bcd60e51b81526004016104c790611cec565b610a5c600061147e565b565b6060600d80546106e090611daf565b6000600e5460ff166001811115610a8657610a86611e45565b1415610ac35760405162461bcd60e51b815260206004820152600c60248201526b14dd1859d948131bd8dad95960a21b60448201526064016104c7565b6002600b541415610b165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c7565b6002600b55323314610b655760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b60008111610bac5760405162461bcd60e51b815260206004820152601460248201527305175616e746974792063616e6e6f7420626520360641b60448201526064016104c7565b60035460025460009190036000190133600090815260086020526040902054909150600160401b900467ffffffffffffffff166115b3610bec8484611d21565b1115610c3a5760405162461bcd60e51b815260206004820152601760248201527f4578636565647320436f6c6c656374696f6e2053697a6500000000000000000060448201526064016104c7565b6005610c468483611d21565b1115610c8b5760405162461bcd60e51b8152602060048201526014602482015273115e18d959591cc8105b1b1bddd95908135a5b9d60621b60448201526064016104c7565b610c9533846114ce565b50506001600b5550565b6001600160a01b038216331415610cc95760405163b06307db60e01b815260040160405180910390fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d408484846110d0565b6001600160a01b0383163b15158015610d625750610d60848484846114ec565b155b15610d80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d918261103b565b610dae57604051630a14c4b560e41b815260040160405180910390fd5b6000610db86115e3565b9050805160001415610dd95760405180602001604052806000815250610e04565b80610de3846115f2565b604051602001610df4929190611c5d565b6040516020818303038152906040525b9392505050565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190611b70565b6001600160a01b03161415610eb857600191505061047f565b6001600160a01b038085166000908152600a602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b03163314610f145760405162461bcd60e51b81526004016104c790611cec565b6001600160a01b038116610f795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c7565b6108d38161147e565b6000323314610fce5760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b3373db217a8bd47b0dcd77fa71c6536640b1c27671b0148061100357503373fc9f025e9192ceda964602b51dc801e35db9518b145b806110365750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b905090565b60008160011115801561104f575060025482105b801561047f575050600090815260076020526040902054600160e01b900460ff161590565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110db82611355565b9050836001600160a01b031681600001516001600160a01b0316146111125760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061113057506111308533610e0b565b8061114b57503361114084610763565b6001600160a01b0316145b90508061116b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661119257604051633a954ecd60e21b815260040160405180910390fd5b61119e60008487611074565b6001600160a01b038581166000908152600860209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600790945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611274576002548214611274578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461130c576040519150601f19603f3d011682016040523d82523d6000602084013e611311565b606091505b50509050806106cc5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016104c7565b60408051606081018252600080825260208201819052918101919091528180600111158015611385575060025481105b1561146557600081815260076020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906114635780516001600160a01b0316156113f9579392505050565b5060001901600081815260076020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561145e579392505050565b6113f9565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114e88282604051806020016040528060008152506116f0565b5050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611521903390899088908890600401611c9c565b602060405180830381600087803b15801561153b57600080fd5b505af192505050801561156b575060408051601f3d908101601f1916820190925261156891810190611b53565b60015b6115c6573d808015611599576040519150601f19603f3d011682016040523d82523d6000602084013e61159e565b606091505b5080516115be576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600680546106e090611daf565b6060816116165750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611640578061162a81611dea565b91506116399050600a83611d39565b915061161a565b60008167ffffffffffffffff81111561165b5761165b611e71565b6040519080825280601f01601f191660200182016040528015611685576020820181803683370190505b5090505b8415610ee25761169a600183611d6c565b91506116a7600a86611e05565b6116b2906030611d21565b60f81b8183815181106116c7576116c7611e5b565b60200101906001600160f81b031916908160001a9053506116e9600a86611d39565b9450611689565b6002546001600160a01b03841661171957604051622e076360e81b815260040160405180910390fd5b826117375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260086020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600790925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b1561185b575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461182460008784806001019550876114ec565b611841576040516368d2bf6b60e11b815260040160405180910390fd5b8082106117d957826002541461185657600080fd5b6118a0565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061185c575b50600255610d80600085838684565b8280546118bb90611daf565b90600052602060002090601f0160209004810192826118dd5760008555611923565b82601f106118f65782800160ff19823516178555611923565b82800160010185558215611923579182015b82811115611923578235825591602001919060010190611908565b5061192f929150611933565b5090565b5b8082111561192f5760008155600101611934565b60006020828403121561195a57600080fd5b8135610e0481611e87565b6000806040838503121561197857600080fd5b823561198381611e87565b9150602083013561199381611e87565b809150509250929050565b6000806000606084860312156119b357600080fd5b83356119be81611e87565b925060208401356119ce81611e87565b929592945050506040919091013590565b600080600080608085870312156119f557600080fd5b8435611a0081611e87565b93506020850135611a1081611e87565b925060408501359150606085013567ffffffffffffffff80821115611a3457600080fd5b818701915087601f830112611a4857600080fd5b813581811115611a5a57611a5a611e71565b604051601f8201601f19908116603f01168101908382118183101715611a8257611a82611e71565b816040528281528a6020848701011115611a9b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611ad257600080fd5b8235611add81611e87565b9150602083013561199381611e9c565b60008060408385031215611b0057600080fd5b8235611b0b81611e87565b946020939093013593505050565b600060208284031215611b2b57600080fd5b8151610e0481611e9c565b600060208284031215611b4857600080fd5b8135610e0481611eaa565b600060208284031215611b6557600080fd5b8151610e0481611eaa565b600060208284031215611b8257600080fd5b8151610e0481611e87565b60008060208385031215611ba057600080fd5b823567ffffffffffffffff80821115611bb857600080fd5b818501915085601f830112611bcc57600080fd5b813581811115611bdb57600080fd5b866020828501011115611bed57600080fd5b60209290920196919550909350505050565b600060208284031215611c1157600080fd5b5035919050565b600060208284031215611c2a57600080fd5b5051919050565b60008151808452611c49816020860160208601611d83565b601f01601f19169290920160200192915050565b60008351611c6f818460208801611d83565b835190830190611c83818360208801611d83565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ccf90830184611c31565b9695505050505050565b602081526000610e046020830184611c31565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d3457611d34611e19565b500190565b600082611d4857611d48611e2f565b500490565b6000816000190483118215151615611d6757611d67611e19565b500290565b600082821015611d7e57611d7e611e19565b500390565b60005b83811015611d9e578181015183820152602001611d86565b83811115610d805750506000910152565b600181811c90821680611dc357607f821691505b60208210811415611de457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611dfe57611dfe611e19565b5060010190565b600082611e1457611e14611e2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108d357600080fd5b80151581146108d357600080fd5b6001600160e01b0319811681146108d357600080fdfea2646970667358221220569100ec299d4e67875f1d82bf78c7108ae493a7e4a388e2cbfc257ada5cb75c64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101405760003560e01c80636352211e116100b6578063a0712d681161006f578063a0712d6814610377578063a22cb4651461038a578063b88d4fde146103aa578063c87b56dd146103ca578063e985e9c5146103ea578063f2fde38b1461040a57600080fd5b80636352211e146102c757806370a08231146102e7578063715018a61461030757806389cd503a1461031c5780638da5cb5b1461034457806395d89b411461036257600080fd5b806318160ddd1161010857806318160ddd1461020b57806323b872dd146102325780633eb1d7771461025257806342842e0e1461027257806355f804b314610292578063629f349d146102b257600080fd5b806301ffc9a714610145578063045767731461017a57806306fdde0314610191578063081812fc146101b3578063095ea7b3146101eb575b600080fd5b34801561015157600080fd5b50610165610160366004611b36565b61042a565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610485565b005b34801561019d57600080fd5b506101a66106d1565b6040516101719190611cd9565b3480156101bf57600080fd5b506101d36101ce366004611bff565b610763565b6040516001600160a01b039091168152602001610171565b3480156101f757600080fd5b5061018f610206366004611aed565b6107a7565b34801561021757600080fd5b5060035460025403600019015b604051908152602001610171565b34801561023e57600080fd5b5061018f61024d36600461199e565b610830565b34801561025e57600080fd5b5061018f61026d366004611bff565b61083b565b34801561027e57600080fd5b5061018f61028d36600461199e565b6108d6565b34801561029e57600080fd5b5061018f6102ad366004611b8d565b6108f1565b3480156102be57600080fd5b5061018f610927565b3480156102d357600080fd5b506101d36102e2366004611bff565b6109c7565b3480156102f357600080fd5b50610224610302366004611948565b6109d9565b34801561031357600080fd5b5061018f610a28565b34801561032857600080fd5b506101d373a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561035057600080fd5b506000546001600160a01b03166101d3565b34801561036e57600080fd5b506101a6610a5e565b61018f610385366004611bff565b610a6d565b34801561039657600080fd5b5061018f6103a5366004611abf565b610c9f565b3480156103b657600080fd5b5061018f6103c53660046119df565b610d35565b3480156103d657600080fd5b506101a66103e5366004611bff565b610d86565b3480156103f657600080fd5b50610165610405366004611965565b610e0b565b34801561041657600080fd5b5061018f610425366004611948565b610eea565b60006001600160e01b031982166380ac58cd60e01b148061045b57506001600160e01b03198216635b5e139f60e01b145b8061047f57506001600160e01b0319821660009081526001602052604090205460ff165b92915050565b61048d610f82565b6104d05760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064015b60405180910390fd5b6040516370a0823160e01b815230600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29060009082906370a082319060240160206040518083038186803b15801561051f57600080fd5b505afa158015610533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105579190611c18565b90506001600160a01b03821663a9059cbb73db217a8bd47b0dcd77fa71c6536640b1c27671b0606461058a85605a611d4d565b6105949190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106129190611b19565b506001600160a01b03821663a9059cbb73fc9f025e9192ceda964602b51dc801e35db9518b606461064485600a611d4d565b61064e9190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cc9190611b19565b505050565b6060600c80546106e090611daf565b80601f016020809104026020016040519081016040528092919081815260200182805461070c90611daf565b80156107595780601f1061072e57610100808354040283529160200191610759565b820191906000526020600020905b81548152906001019060200180831161073c57829003601f168201915b5050505050905090565b600061076e8261103b565b61078b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600960205260409020546001600160a01b031690565b60006107b2826109c7565b9050806001600160a01b0316836001600160a01b031614156107e75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061080757506108058133610e0b565b155b15610825576040516367d9dca160e11b815260040160405180910390fd5b6106cc838383611074565b6106cc8383836110d0565b6000546001600160a01b031633146108655760405162461bcd60e51b81526004016104c790611cec565b60018111156108aa5760405162461bcd60e51b81526020600482015260116024820152700aee4dedcce40a6e8c2ceca4092dcc8caf607b1b60448201526064016104c7565b806108bc5750600e805460ff19169055565b80600114156108d357600e805460ff191660011790555b50565b6106cc83838360405180602001604052806000815250610d35565b6000546001600160a01b0316331461091b5760405162461bcd60e51b81526004016104c790611cec565b6106cc600683836118af565b61092f610f82565b61096d5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064016104c7565b476109a273db217a8bd47b0dcd77fa71c6536640b1c27671b0606461099384605a611d4d565b61099d9190611d39565b6112bf565b6108d373fc9f025e9192ceda964602b51dc801e35db9518b606461099384600a611d4d565b60006109d282611355565b5192915050565b60006001600160a01b038216610a02576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526008602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610a525760405162461bcd60e51b81526004016104c790611cec565b610a5c600061147e565b565b6060600d80546106e090611daf565b6000600e5460ff166001811115610a8657610a86611e45565b1415610ac35760405162461bcd60e51b815260206004820152600c60248201526b14dd1859d948131bd8dad95960a21b60448201526064016104c7565b6002600b541415610b165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c7565b6002600b55323314610b655760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b60008111610bac5760405162461bcd60e51b815260206004820152601460248201527305175616e746974792063616e6e6f7420626520360641b60448201526064016104c7565b60035460025460009190036000190133600090815260086020526040902054909150600160401b900467ffffffffffffffff166115b3610bec8484611d21565b1115610c3a5760405162461bcd60e51b815260206004820152601760248201527f4578636565647320436f6c6c656374696f6e2053697a6500000000000000000060448201526064016104c7565b6005610c468483611d21565b1115610c8b5760405162461bcd60e51b8152602060048201526014602482015273115e18d959591cc8105b1b1bddd95908135a5b9d60621b60448201526064016104c7565b610c9533846114ce565b50506001600b5550565b6001600160a01b038216331415610cc95760405163b06307db60e01b815260040160405180910390fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d408484846110d0565b6001600160a01b0383163b15158015610d625750610d60848484846114ec565b155b15610d80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d918261103b565b610dae57604051630a14c4b560e41b815260040160405180910390fd5b6000610db86115e3565b9050805160001415610dd95760405180602001604052806000815250610e04565b80610de3846115f2565b604051602001610df4929190611c5d565b6040516020818303038152906040525b9392505050565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190611b70565b6001600160a01b03161415610eb857600191505061047f565b6001600160a01b038085166000908152600a602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b03163314610f145760405162461bcd60e51b81526004016104c790611cec565b6001600160a01b038116610f795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c7565b6108d38161147e565b6000323314610fce5760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b3373db217a8bd47b0dcd77fa71c6536640b1c27671b0148061100357503373fc9f025e9192ceda964602b51dc801e35db9518b145b806110365750336001600160a01b037f000000000000000000000000ff0cc7aedeab95853318c1a55274056e931b207516145b905090565b60008160011115801561104f575060025482105b801561047f575050600090815260076020526040902054600160e01b900460ff161590565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110db82611355565b9050836001600160a01b031681600001516001600160a01b0316146111125760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061113057506111308533610e0b565b8061114b57503361114084610763565b6001600160a01b0316145b90508061116b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661119257604051633a954ecd60e21b815260040160405180910390fd5b61119e60008487611074565b6001600160a01b038581166000908152600860209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600790945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611274576002548214611274578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461130c576040519150601f19603f3d011682016040523d82523d6000602084013e611311565b606091505b50509050806106cc5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016104c7565b60408051606081018252600080825260208201819052918101919091528180600111158015611385575060025481105b1561146557600081815260076020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906114635780516001600160a01b0316156113f9579392505050565b5060001901600081815260076020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561145e579392505050565b6113f9565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114e88282604051806020016040528060008152506116f0565b5050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611521903390899088908890600401611c9c565b602060405180830381600087803b15801561153b57600080fd5b505af192505050801561156b575060408051601f3d908101601f1916820190925261156891810190611b53565b60015b6115c6573d808015611599576040519150601f19603f3d011682016040523d82523d6000602084013e61159e565b606091505b5080516115be576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600680546106e090611daf565b6060816116165750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611640578061162a81611dea565b91506116399050600a83611d39565b915061161a565b60008167ffffffffffffffff81111561165b5761165b611e71565b6040519080825280601f01601f191660200182016040528015611685576020820181803683370190505b5090505b8415610ee25761169a600183611d6c565b91506116a7600a86611e05565b6116b2906030611d21565b60f81b8183815181106116c7576116c7611e5b565b60200101906001600160f81b031916908160001a9053506116e9600a86611d39565b9450611689565b6002546001600160a01b03841661171957604051622e076360e81b815260040160405180910390fd5b826117375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260086020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600790925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b1561185b575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461182460008784806001019550876114ec565b611841576040516368d2bf6b60e11b815260040160405180910390fd5b8082106117d957826002541461185657600080fd5b6118a0565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061185c575b50600255610d80600085838684565b8280546118bb90611daf565b90600052602060002090601f0160209004810192826118dd5760008555611923565b82601f106118f65782800160ff19823516178555611923565b82800160010185558215611923579182015b82811115611923578235825591602001919060010190611908565b5061192f929150611933565b5090565b5b8082111561192f5760008155600101611934565b60006020828403121561195a57600080fd5b8135610e0481611e87565b6000806040838503121561197857600080fd5b823561198381611e87565b9150602083013561199381611e87565b809150509250929050565b6000806000606084860312156119b357600080fd5b83356119be81611e87565b925060208401356119ce81611e87565b929592945050506040919091013590565b600080600080608085870312156119f557600080fd5b8435611a0081611e87565b93506020850135611a1081611e87565b925060408501359150606085013567ffffffffffffffff80821115611a3457600080fd5b818701915087601f830112611a4857600080fd5b813581811115611a5a57611a5a611e71565b604051601f8201601f19908116603f01168101908382118183101715611a8257611a82611e71565b816040528281528a6020848701011115611a9b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611ad257600080fd5b8235611add81611e87565b9150602083013561199381611e9c565b60008060408385031215611b0057600080fd5b8235611b0b81611e87565b946020939093013593505050565b600060208284031215611b2b57600080fd5b8151610e0481611e9c565b600060208284031215611b4857600080fd5b8135610e0481611eaa565b600060208284031215611b6557600080fd5b8151610e0481611eaa565b600060208284031215611b8257600080fd5b8151610e0481611e87565b60008060208385031215611ba057600080fd5b823567ffffffffffffffff80821115611bb857600080fd5b818501915085601f830112611bcc57600080fd5b813581811115611bdb57600080fd5b866020828501011115611bed57600080fd5b60209290920196919550909350505050565b600060208284031215611c1157600080fd5b5035919050565b600060208284031215611c2a57600080fd5b5051919050565b60008151808452611c49816020860160208601611d83565b601f01601f19169290920160200192915050565b60008351611c6f818460208801611d83565b835190830190611c83818360208801611d83565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ccf90830184611c31565b9695505050505050565b602081526000610e046020830184611c31565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d3457611d34611e19565b500190565b600082611d4857611d48611e2f565b500490565b6000816000190483118215151615611d6757611d67611e19565b500290565b600082821015611d7e57611d7e611e19565b500390565b60005b83811015611d9e578181015183820152602001611d86565b83811115610d805750506000910152565b600181811c90821680611dc357607f821691505b60208210811415611de457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611dfe57611dfe611e19565b5060010190565b600082611e1457611e14611e2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108d357600080fd5b80151581146108d357600080fd5b6001600160e01b0319811681146108d357600080fdfea2646970667358221220569100ec299d4e67875f1d82bf78c7108ae493a7e4a388e2cbfc257ada5cb75c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : URI_ (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

2349:3860:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24453:300:1;;;;;;;;;;-1:-1:-1;24453:300:1;;;;;:::i;:::-;;:::i;:::-;;;7367:14:3;;7360:22;7342:41;;7330:2;7315:18;24453:300:1;;;;;;;;5330:399:2;;;;;;;;;;;;;:::i;:::-;;3721:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29144:200:1:-;;;;;;;;;;-1:-1:-1;29144:200:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6386:32:3;;;6368:51;;6356:2;6341:18;29144:200:1;6222:203:3;28729:354:1;;;;;;;;;;-1:-1:-1;28729:354:1;;;;;:::i;:::-;;:::i;23715:306::-;;;;;;;;;;-1:-1:-1;23974:12:1;;23958:13;;:28;-1:-1:-1;;23958:46:1;23715:306;;;11671:25:3;;;11659:2;11644:18;23715:306:1;11525:177:3;29983:164:1;;;;;;;;;;-1:-1:-1;29983:164:1;;;;;:::i;:::-;;:::i;4594:230:2:-;;;;;;;;;;-1:-1:-1;4594:230:2;;;;;:::i;:::-;;:::i;30213:179:1:-;;;;;;;;;;-1:-1:-1;30213:179:1;;;;;:::i;:::-;;:::i;28577:95::-;;;;;;;;;;-1:-1:-1;28577:95:1;;;;;:::i;:::-;;:::i;5755:270:2:-;;;;;;;;;;;;;:::i;27296:123:1:-;;;;;;;;;;-1:-1:-1;27296:123:1;;;;;:::i;:::-;;:::i;24812:203::-;;;;;;;;;;-1:-1:-1;24812:203:1;;;;;:::i;:::-;;:::i;10007:101::-;;;;;;;;;;;;;:::i;2670:90:2:-;;;;;;;;;;;;2718:42;2670:90;;9375:85:1;;;;;;;;;;-1:-1:-1;9421:7:1;9447:6;-1:-1:-1;;;;;9447:6:1;9375:85;;3875:94:2;;;;;;;;;;;;;:::i;4845:451::-;;;;;;:::i;:::-;;:::i;29411:282:1:-;;;;;;;;;;-1:-1:-1;29411:282:1;;;;;:::i;:::-;;:::i;30458:359::-;;;;;;;;;;-1:-1:-1;30458:359:1;;;;;:::i;:::-;;:::i;27811:321::-;;;;;;;;;;-1:-1:-1;27811:321:1;;;;;:::i;:::-;;:::i;4035:334:2:-;;;;;;;;;;-1:-1:-1;4035:334:2;;;;;:::i;:::-;;:::i;10257:198:1:-;;;;;;;;;;-1:-1:-1;10257:198:1;;;;;:::i;:::-;;:::i;24453:300::-;24555:4;-1:-1:-1;;;;;;24590:40:1;;-1:-1:-1;;;24590:40:1;;:104;;-1:-1:-1;;;;;;;24646:48:1;;-1:-1:-1;;;24646:48:1;24590:104;:156;;;-1:-1:-1;;;;;;;1808:33:0;;1785:4;1808:33;;;:20;:33;;;;;;;;24710:36:1;24571:175;24453:300;-1:-1:-1;;24453:300:1:o;5330:399:2:-;5386:15;:13;:15::i;:::-;5378:42;;;;-1:-1:-1;;;5378:42:2;;10674:2:3;5378:42:2;;;10656:21:3;10713:2;10693:18;;;10686:30;-1:-1:-1;;;10732:18:3;;;10725:45;10787:18;;5378:42:2;;;;;;;;;5549:43;;-1:-1:-1;;;5549:43:2;;5586:4;5549:43;;;6368:51:3;2824:42:2;;5476:25;;2824:42;;5549:28;;6341:18:3;;5549:43:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5527:65;-1:-1:-1;;;;;;5599:27:2;;;3061:42;5656:3;5637:16;5527:65;5651:2;5637:16;:::i;:::-;:22;;;;:::i;:::-;5599:61;;-1:-1:-1;;;;;;5599:61:2;;;;;;;-1:-1:-1;;;;;7115:32:3;;;5599:61:2;;;7097:51:3;7164:18;;;7157:34;7070:18;;5599:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;5664:27:2;;;3134:42;5721:3;5702:16;:11;5716:2;5702:16;:::i;:::-;:22;;;;:::i;:::-;5664:61;;-1:-1:-1;;;;;;5664:61:2;;;;;;;-1:-1:-1;;;;;7115:32:3;;;5664:61:2;;;7097:51:3;7164:18;;;7157:34;7070:18;;5664:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5374:355;;5330:399::o;3721:90::-;3767:13;3799:5;3792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3721:90;:::o;29144:200:1:-;29212:7;29236:16;29244:7;29236;:16::i;:::-;29231:64;;29261:34;;-1:-1:-1;;;29261:34:1;;;;;;;;;;;29231:64;-1:-1:-1;29313:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;29313:24:1;;29144:200::o;28729:354::-;28801:13;28817:16;28825:7;28817;:16::i;:::-;28801:32;;28853:5;-1:-1:-1;;;;;28847:11:1;:2;-1:-1:-1;;;;;28847:11:1;;28843:48;;;28867:24;;-1:-1:-1;;;28867:24:1;;;;;;;;;;;28843:48;8852:10;-1:-1:-1;;;;;28906:21:1;;;;;;:63;;-1:-1:-1;28932:37:1;28949:5;8852:10;4035:334:2;:::i;28932:37:1:-;28931:38;28906:63;28902:136;;;28992:35;;-1:-1:-1;;;28992:35:1;;;;;;;;;;;28902:136;29048:28;29057:2;29061:7;29070:5;29048:8;:28::i;29983:164::-;30112:28;30122:4;30128:2;30132:7;30112:9;:28::i;4594:230:2:-;9421:7:1;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;4673:1:2::1;4661:8;:13;;4653:43;;;::::0;-1:-1:-1;;;4653:43:2;;8580:2:3;4653:43:2::1;::::0;::::1;8562:21:3::0;8619:2;8599:18;;;8592:30;-1:-1:-1;;;8638:18:3;;;8631:47;8695:18;;4653:43:2::1;8378:341:3::0;4653:43:2::1;4703:13:::0;4700:121:::1;;-1:-1:-1::0;4723:13:2::1;:28:::0;;-1:-1:-1;;4723:28:2::1;::::0;;4594:230::o;4700:121::-:1;4767:8;4779:1;4767:13;4764:57;;;4787:13;:29:::0;;-1:-1:-1;;4787:29:2::1;4803:13;4787:29;::::0;;4764:57:::1;4594:230:::0;:::o;30213:179:1:-;30346:39;30363:4;30369:2;30373:7;30346:39;;;;;;;;;;;;:16;:39::i;28577:95::-;9421:7;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;28655:10:::1;:4;28662:3:::0;;28655:10:::1;:::i;5755:270:2:-:0;5804:15;:13;:15::i;:::-;5796:42;;;;-1:-1:-1;;;5796:42:2;;10674:2:3;5796:42:2;;;10656:21:3;10713:2;10693:18;;;10686:30;-1:-1:-1;;;10732:18:3;;;10725:45;10787:18;;5796:42:2;10472:339:3;5796:42:2;5907:21;5933:42;3061;5971:3;5953:15;5907:21;5966:2;5953:15;:::i;:::-;:21;;;;:::i;:::-;5933:10;:42::i;:::-;5979;3134;6017:3;5999:15;:10;6012:2;5999:15;:::i;27296:123:1:-;27360:7;27386:21;27399:7;27386:12;:21::i;:::-;:26;;27296:123;-1:-1:-1;;27296:123:1:o;24812:203::-;24876:7;-1:-1:-1;;;;;24899:19:1;;24895:60;;24927:28;;-1:-1:-1;;;24927:28:1;;;;;;;;;;;24895:60;-1:-1:-1;;;;;;24980:19:1;;;;;:12;:19;;;;;:27;;;;24812:203::o;10007:101::-;9421:7;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;10071:30:::1;10098:1;10071:18;:30::i;:::-;10007:101::o:0;3875:94:2:-;3923:13;3955:7;3948:14;;;;;:::i;4845:451::-;3499:12;3482:13;;;;;:29;;;;;;;:::i;:::-;;;3474:54;;;;-1:-1:-1;;;3474:54:2;;9988:2:3;3474:54:2;;;9970:21:3;10027:2;10007:18;;;10000:30;-1:-1:-1;;;10046:18:3;;;10039:42;10098:18;;3474:54:2;9786:336:3;3474:54:2;1137:1:::1;1718:7;;:19;;1710:63;;;::::0;-1:-1:-1;;;1710:63:2;;11367:2:3;1710:63:2::1;::::0;::::1;11349:21:3::0;11406:2;11386:18;;;11379:30;11445:33;11425:18;;;11418:61;11496:18;;1710:63:2::1;11165:355:3::0;1710:63:2::1;1137:1;1848:7;:18:::0;3361:9:::2;3374:10;3361:23;3353:60;;;::::0;-1:-1:-1;;;3353:60:2;;8227:2:3;3353:60:2::2;::::0;::::2;8209:21:3::0;8266:2;8246:18;;;8239:30;-1:-1:-1;;;8285:18:3;;;8278:54;8349:18;;3353:60:2::2;8025:348:3::0;3353:60:2::2;4953:1:::3;4942:8;:12;4934:45;;;::::0;-1:-1:-1;;;4934:45:2;;11018:2:3;4934:45:2::3;::::0;::::3;11000:21:3::0;11057:2;11037:18;;;11030:30;-1:-1:-1;;;11076:18:3;;;11069:50;11136:18;;4934:45:2::3;10816:344:3::0;4934:45:2::3;23974:12:1::0;;23958:13;;4983:21:2::3;::::0;23958:28:1;;-1:-1:-1;;23958:46:1;5065:10:2::3;5024:24;25187:19:1::0;;;:12;:19;;;;;:32;4983:37:2;;-1:-1:-1;;;;25187:32:1;;;;2923:4:2::3;5105:24;5121:8:::0;4983:37;5105:24:::3;:::i;:::-;:40;;5097:76;;;::::0;-1:-1:-1;;;5097:76:2;;8926:2:3;5097:76:2::3;::::0;::::3;8908:21:3::0;8965:2;8945:18;;;8938:30;9004:25;8984:18;;;8977:53;9047:18;;5097:76:2::3;8724:347:3::0;5097:76:2::3;2988:1;5185:27;5204:8:::0;5185:16;:27:::3;:::i;:::-;:46;;5177:79;;;::::0;-1:-1:-1;;;5177:79:2;;9278:2:3;5177:79:2::3;::::0;::::3;9260:21:3::0;9317:2;9297:18;;;9290:30;-1:-1:-1;;;9336:18:3;;;9329:50;9396:18;;5177:79:2::3;9076:344:3::0;5177:79:2::3;5261:31;5271:10;5283:8;5261:9;:31::i;:::-;-1:-1:-1::0;;1094:1:2::1;2021:7;:22:::0;-1:-1:-1;4845:451:2:o;29411:282:1:-;-1:-1:-1;;;;;29509:24:1;;8852:10;29509:24;29505:54;;;29542:17;;-1:-1:-1;;;29542:17:1;;;;;;;;;;;29505:54;8852:10;29570:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29570:42:1;;;;;;;;;;;;:53;;-1:-1:-1;;29570:53:1;;;;;;;;;;29638:48;;7342:41:3;;;29570:42:1;;8852:10;29638:48;;7315:18:3;29638:48:1;;;;;;;29411:282;;:::o;30458:359::-;30619:28;30629:4;30635:2;30639:7;30619:9;:28::i;:::-;-1:-1:-1;;;;;30661:13:1;;14061:19;:23;;30661:76;;;;;30681:56;30712:4;30718:2;30722:7;30731:5;30681:30;:56::i;:::-;30680:57;30661:76;30657:154;;;30760:40;;-1:-1:-1;;;30760:40:1;;;;;;;;;;;30657:154;30458:359;;;;:::o;27811:321::-;27884:13;27914:16;27922:7;27914;:16::i;:::-;27909:59;;27939:29;;-1:-1:-1;;;27939:29:1;;;;;;;;;;;27909:59;27979:21;28003:10;:8;:10::i;:::-;27979:34;;28036:7;28030:21;28055:1;28030:26;;:95;;;;;;;;;;;;;;;;;28083:7;28092:18;:7;:16;:18::i;:::-;28066:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28030:95;28023:102;27811:321;-1:-1:-1;;;27811:321:1:o;4035:334:2:-;4228:28;;-1:-1:-1;;;4228:28:2;;-1:-1:-1;;;;;6386:32:3;;;4228:28:2;;;6368:51:3;4124:4:2;;2718:42;;4220:49;;;2718:42;;4228:21;;6341:18:3;;4228:28:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4220:49:2;;4216:91;;;4292:4;4285:11;;;;;4216:91;-1:-1:-1;;;;;29879:25:1;;;29856:4;29879:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;4324:38:2;4317:45;4035:334;-1:-1:-1;;;;4035:334:2:o;10257:198:1:-;9421:7;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;10345:22:1;::::1;10337:73;;;::::0;-1:-1:-1;;;10337:73:1;;7820:2:3;10337:73:1::1;::::0;::::1;7802:21:3::0;7859:2;7839:18;;;7832:30;7898:34;7878:18;;;7871:62;-1:-1:-1;;;7949:18:3;;;7942:36;7995:19;;10337:73:1::1;7618:402:3::0;10337:73:1::1;10420:28;10439:8;10420:18;:28::i;4400:161:2:-:0;4459:4;3361:9;3374:10;3361:23;3353:60;;;;-1:-1:-1;;;3353:60:2;;8227:2:3;3353:60:2;;;8209:21:3;8266:2;8246:18;;;8239:30;-1:-1:-1;;;8285:18:3;;;8278:54;8349:18;;3353:60:2;8025:348:3;3353:60:2;4477:10:::1;3061:42;4477:22;::::0;4476:52:::1;;-1:-1:-1::0;4505:10:2::1;3134:42;4505:22;4476:52;:80;;;-1:-1:-1::0;4533:10:2::1;-1:-1:-1::0;;;;;4547:8:2::1;4533:22;;4476:80;4469:87;;4400:161:::0;:::o;31063:172:1:-;31120:4;31162:7;23578:1;31143:26;;:53;;;;;31183:13;;31173:7;:23;31143:53;:85;;;;-1:-1:-1;;31201:20:1;;;;:11;:20;;;;;:27;-1:-1:-1;;;31201:27:1;;;;31200:28;;31063:172::o;40043:189::-;40153:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40153:29:1;-1:-1:-1;;;;;40153:29:1;;;;;;;;;40197:28;;40153:24;;40197:28;;;;;;;40043:189;;;:::o;35119:2082::-;35229:35;35267:21;35280:7;35267:12;:21::i;:::-;35229:59;;35325:4;-1:-1:-1;;;;;35303:26:1;:13;:18;;;-1:-1:-1;;;;;35303:26:1;;35299:67;;35338:28;;-1:-1:-1;;;35338:28:1;;;;;;;;;;;35299:67;35377:22;8852:10;-1:-1:-1;;;;;35403:20:1;;;;:72;;-1:-1:-1;35439:36:1;35456:4;8852:10;4035:334:2;:::i;35439:36:1:-;35403:124;;;-1:-1:-1;8852:10:1;35491:20;35503:7;35491:11;:20::i;:::-;-1:-1:-1;;;;;35491:36:1;;35403:124;35377:151;;35544:17;35539:66;;35570:35;;-1:-1:-1;;;35570:35:1;;;;;;;;;;;35539:66;-1:-1:-1;;;;;35619:16:1;;35615:52;;35644:23;;-1:-1:-1;;;35644:23:1;;;;;;;;;;;35615:52;35783:35;35800:1;35804:7;35813:4;35783:8;:35::i;:::-;-1:-1:-1;;;;;36108:18:1;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36108:31:1;;;;;;;-1:-1:-1;;36108:31:1;;;;;;;36153:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36153:29:1;;;;;;;;;;;36231:20;;;:11;:20;;;;;;36265:18;;-1:-1:-1;;;;;;36297:49:1;;;;-1:-1:-1;;;36330:15:1;36297:49;;;;;;;;;;36616:11;;36675:24;;;;;36717:13;;36231:20;;36675:24;;36717:13;36713:377;;36924:13;;36909:11;:28;36905:171;;36961:20;;37029:28;;;;37003:54;;-1:-1:-1;;;37003:54:1;-1:-1:-1;;;;;;37003:54:1;;;-1:-1:-1;;;;;36961:20:1;;37003:54;;;;36905:171;36084:1016;;;37134:7;37130:2;-1:-1:-1;;;;;37115:27:1;37124:4;-1:-1:-1;;;;;37115:27:1;;;;;;;;;;;35219:1982;;35119:2082;;;:::o;6028:179:2:-;6103:12;6121:8;-1:-1:-1;;;;;6121:13:2;6142:7;6121:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6102:52;;;6172:7;6164:36;;;;-1:-1:-1;;;6164:36:2;;10329:2:3;6164:36:2;;;10311:21:3;10368:2;10348:18;;;10341:30;-1:-1:-1;;;10387:18:3;;;10380:46;10443:18;;6164:36:2;10127:340:3;26155:1084:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26265:7:1;;23578:1;26311:23;;:47;;;;;26345:13;;26338:4;:20;26311:47;26307:868;;;26378:31;26412:17;;;:11;:17;;;;;;;;;26378:51;;;;;;;;;-1:-1:-1;;;;;26378:51:1;;;;-1:-1:-1;;;26378:51:1;;;;;;;;;;;-1:-1:-1;;;26378:51:1;;;;;;;;;;;;;;26447:714;;26496:14;;-1:-1:-1;;;;;26496:28:1;;26492:99;;26559:9;26155:1084;-1:-1:-1;;;26155:1084:1:o;26492:99::-;-1:-1:-1;;;26927:6:1;26971:17;;;;:11;:17;;;;;;;;;26959:29;;;;;;;;;-1:-1:-1;;;;;26959:29:1;;;;;-1:-1:-1;;;26959:29:1;;;;;;;;;;;-1:-1:-1;;;26959:29:1;;;;;;;;;;;;;27018:28;27014:107;;27085:9;26155:1084;-1:-1:-1;;;26155:1084:1:o;27014:107::-;26888:255;;;26360:815;26307:868;27201:31;;-1:-1:-1;;;27201:31:1;;;;;;;;;;;10609:187;10682:16;10701:6;;-1:-1:-1;;;;;10717:17:1;;;-1:-1:-1;;;;;;10717:17:1;;;;;;10749:40;;10701:6;;;;;;;10749:40;;10682:16;10749:40;10672:124;10609:187;:::o;31314:102::-;31382:27;31392:2;31396:8;31382:27;;;;;;;;;;;;:9;:27::i;:::-;31314:102;;:::o;40713:650::-;40891:72;;-1:-1:-1;;;40891:72:1;;40871:4;;-1:-1:-1;;;;;40891:36:1;;;;;:72;;8852:10;;40942:4;;40948:7;;40957:5;;40891:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40891:72:1;;;;;;;;-1:-1:-1;;40891:72:1;;;;;;;;;;;;:::i;:::-;;;40887:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41122:13:1;;41118:229;;41167:40;;-1:-1:-1;;;41167:40:1;;;;;;;;;;;41118:229;41307:6;41301:13;41292:6;41288:2;41284:15;41277:38;40887:470;-1:-1:-1;;;;;;41009:55:1;-1:-1:-1;;;41009:55:1;;-1:-1:-1;40713:650:1;;;;;;:::o;28373:94::-;28424:13;28456:4;28449:11;;;;;:::i;11017:703::-;11073:13;11290:10;11286:51;;-1:-1:-1;;11316:10:1;;;;;;;;;;;;-1:-1:-1;;;11316:10:1;;;;;11017:703::o;11286:51::-;11361:5;11346:12;11400:75;11407:9;;11400:75;;11432:8;;;;:::i;:::-;;-1:-1:-1;11454:10:1;;-1:-1:-1;11462:2:1;11454:10;;:::i;:::-;;;11400:75;;;11484:19;11516:6;11506:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11506:17:1;;11484:39;;11533:150;11540:10;;11533:150;;11566:11;11576:1;11566:11;;:::i;:::-;;-1:-1:-1;11634:10:1;11642:2;11634:5;:10;:::i;:::-;11621:24;;:2;:24;:::i;:::-;11608:39;;11591:6;11598;11591:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11591:56:1;;;;;;;;-1:-1:-1;11661:11:1;11670:2;11661:11;;:::i;:::-;;;11533:150;;31776:1708;31917:13;;-1:-1:-1;;;;;31944:16:1;;31940:48;;31969:19;;-1:-1:-1;;;31969:19:1;;;;;;;;;;;31940:48;32002:13;31998:44;;32024:18;;-1:-1:-1;;;32024:18:1;;;;;;;;;;;31998:44;-1:-1:-1;;;;;32385:16:1;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;32443:49:1;;32385:44;;;;;;;;32443:49;;;-1:-1:-1;;;;;32385:44:1;;;;;;32443:49;;;;;;;;;;;;;;;;32507:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;32556:66:1;;;-1:-1:-1;;;32606:15:1;32556:66;;;;;;;;;;;;;32507:25;;32700:23;;;;14061:19;:23;32738:618;;32777:308;32807:38;;32832:12;;-1:-1:-1;;;;;32807:38:1;;;32824:1;;32807:38;;32824:1;;32807:38;32872:69;32911:1;32915:2;32919:14;;;;;;32935:5;32872:30;:69::i;:::-;32867:172;;32976:40;;-1:-1:-1;;;32976:40:1;;;;;;;;;;;32867:172;33080:3;33065:12;:18;32777:308;;33164:12;33147:13;;:29;33143:43;;33178:8;;;33143:43;32738:618;;;33225:117;33255:40;;33280:14;;;;;-1:-1:-1;;;;;33255:40:1;;;33272:1;;33255:40;;33272:1;;33255:40;33337:3;33322:12;:18;33225:117;;32738:618;-1:-1:-1;33369:13:1;:28;33417:60;33446:1;33450:2;33454:12;33468:8;33417:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:3;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:3;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:3;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:3;1090:18;;;;1077:32;;659:456::o;1120:1266::-;1215:6;1223;1231;1239;1292:3;1280:9;1271:7;1267:23;1263:33;1260:53;;;1309:1;1306;1299:12;1260:53;1348:9;1335:23;1367:31;1392:5;1367:31;:::i;:::-;1417:5;-1:-1:-1;1474:2:3;1459:18;;1446:32;1487:33;1446:32;1487:33;:::i;:::-;1539:7;-1:-1:-1;1593:2:3;1578:18;;1565:32;;-1:-1:-1;1648:2:3;1633:18;;1620:32;1671:18;1701:14;;;1698:34;;;1728:1;1725;1718:12;1698:34;1766:6;1755:9;1751:22;1741:32;;1811:7;1804:4;1800:2;1796:13;1792:27;1782:55;;1833:1;1830;1823:12;1782:55;1869:2;1856:16;1891:2;1887;1884:10;1881:36;;;1897:18;;:::i;:::-;1972:2;1966:9;1940:2;2026:13;;-1:-1:-1;;2022:22:3;;;2046:2;2018:31;2014:40;2002:53;;;2070:18;;;2090:22;;;2067:46;2064:72;;;2116:18;;:::i;:::-;2156:10;2152:2;2145:22;2191:2;2183:6;2176:18;2231:7;2226:2;2221;2217;2213:11;2209:20;2206:33;2203:53;;;2252:1;2249;2242:12;2203:53;2308:2;2303;2299;2295:11;2290:2;2282:6;2278:15;2265:46;2353:1;2348:2;2343;2335:6;2331:15;2327:24;2320:35;2374:6;2364:16;;;;;;;1120:1266;;;;;;;:::o;2391:382::-;2456:6;2464;2517:2;2505:9;2496:7;2492:23;2488:32;2485:52;;;2533:1;2530;2523:12;2485:52;2572:9;2559:23;2591:31;2616:5;2591:31;:::i;:::-;2641:5;-1:-1:-1;2698:2:3;2683:18;;2670:32;2711:30;2670:32;2711:30;:::i;2778:315::-;2846:6;2854;2907:2;2895:9;2886:7;2882:23;2878:32;2875:52;;;2923:1;2920;2913:12;2875:52;2962:9;2949:23;2981:31;3006:5;2981:31;:::i;:::-;3031:5;3083:2;3068:18;;;;3055:32;;-1:-1:-1;;;2778:315:3:o;3098:245::-;3165:6;3218:2;3206:9;3197:7;3193:23;3189:32;3186:52;;;3234:1;3231;3224:12;3186:52;3266:9;3260:16;3285:28;3307:5;3285:28;:::i;3348:245::-;3406:6;3459:2;3447:9;3438:7;3434:23;3430:32;3427:52;;;3475:1;3472;3465:12;3427:52;3514:9;3501:23;3533:30;3557:5;3533:30;:::i;3598:249::-;3667:6;3720:2;3708:9;3699:7;3695:23;3691:32;3688:52;;;3736:1;3733;3726:12;3688:52;3768:9;3762:16;3787:30;3811:5;3787:30;:::i;3852:280::-;3951:6;4004:2;3992:9;3983:7;3979:23;3975:32;3972:52;;;4020:1;4017;4010:12;3972:52;4052:9;4046:16;4071:31;4096:5;4071:31;:::i;4137:592::-;4208:6;4216;4269:2;4257:9;4248:7;4244:23;4240:32;4237:52;;;4285:1;4282;4275:12;4237:52;4325:9;4312:23;4354:18;4395:2;4387:6;4384:14;4381:34;;;4411:1;4408;4401:12;4381:34;4449:6;4438:9;4434:22;4424:32;;4494:7;4487:4;4483:2;4479:13;4475:27;4465:55;;4516:1;4513;4506:12;4465:55;4556:2;4543:16;4582:2;4574:6;4571:14;4568:34;;;4598:1;4595;4588:12;4568:34;4643:7;4638:2;4629:6;4625:2;4621:15;4617:24;4614:37;4611:57;;;4664:1;4661;4654:12;4611:57;4695:2;4687:11;;;;;4717:6;;-1:-1:-1;4137:592:3;;-1:-1:-1;;;;4137:592:3:o;4734:180::-;4793:6;4846:2;4834:9;4825:7;4821:23;4817:32;4814:52;;;4862:1;4859;4852:12;4814:52;-1:-1:-1;4885:23:3;;4734:180;-1:-1:-1;4734:180:3:o;4919:184::-;4989:6;5042:2;5030:9;5021:7;5017:23;5013:32;5010:52;;;5058:1;5055;5048:12;5010:52;-1:-1:-1;5081:16:3;;4919:184;-1:-1:-1;4919:184:3:o;5108:257::-;5149:3;5187:5;5181:12;5214:6;5209:3;5202:19;5230:63;5286:6;5279:4;5274:3;5270:14;5263:4;5256:5;5252:16;5230:63;:::i;:::-;5347:2;5326:15;-1:-1:-1;;5322:29:3;5313:39;;;;5354:4;5309:50;;5108:257;-1:-1:-1;;5108:257:3:o;5370:637::-;5650:3;5688:6;5682:13;5704:53;5750:6;5745:3;5738:4;5730:6;5726:17;5704:53;:::i;:::-;5820:13;;5779:16;;;;5842:57;5820:13;5779:16;5876:4;5864:17;;5842:57;:::i;:::-;-1:-1:-1;;;5921:20:3;;5950:22;;;5999:1;5988:13;;5370:637;-1:-1:-1;;;;5370:637:3:o;6430:488::-;-1:-1:-1;;;;;6699:15:3;;;6681:34;;6751:15;;6746:2;6731:18;;6724:43;6798:2;6783:18;;6776:34;;;6846:3;6841:2;6826:18;;6819:31;;;6624:4;;6867:45;;6892:19;;6884:6;6867:45;:::i;:::-;6859:53;6430:488;-1:-1:-1;;;;;;6430:488:3:o;7394:219::-;7543:2;7532:9;7525:21;7506:4;7563:44;7603:2;7592:9;7588:18;7580:6;7563:44;:::i;9425:356::-;9627:2;9609:21;;;9646:18;;;9639:30;9705:34;9700:2;9685:18;;9678:62;9772:2;9757:18;;9425:356::o;11707:128::-;11747:3;11778:1;11774:6;11771:1;11768:13;11765:39;;;11784:18;;:::i;:::-;-1:-1:-1;11820:9:3;;11707:128::o;11840:120::-;11880:1;11906;11896:35;;11911:18;;:::i;:::-;-1:-1:-1;11945:9:3;;11840:120::o;11965:168::-;12005:7;12071:1;12067;12063:6;12059:14;12056:1;12053:21;12048:1;12041:9;12034:17;12030:45;12027:71;;;12078:18;;:::i;:::-;-1:-1:-1;12118:9:3;;11965:168::o;12138:125::-;12178:4;12206:1;12203;12200:8;12197:34;;;12211:18;;:::i;:::-;-1:-1:-1;12248:9:3;;12138:125::o;12268:258::-;12340:1;12350:113;12364:6;12361:1;12358:13;12350:113;;;12440:11;;;12434:18;12421:11;;;12414:39;12386:2;12379:10;12350:113;;;12481:6;12478:1;12475:13;12472:48;;;-1:-1:-1;;12516:1:3;12498:16;;12491:27;12268:258::o;12531:380::-;12610:1;12606:12;;;;12653;;;12674:61;;12728:4;12720:6;12716:17;12706:27;;12674:61;12781:2;12773:6;12770:14;12750:18;12747:38;12744:161;;;12827:10;12822:3;12818:20;12815:1;12808:31;12862:4;12859:1;12852:15;12890:4;12887:1;12880:15;12744:161;;12531:380;;;:::o;12916:135::-;12955:3;-1:-1:-1;;12976:17:3;;12973:43;;;12996:18;;:::i;:::-;-1:-1:-1;13043:1:3;13032:13;;12916:135::o;13056:112::-;13088:1;13114;13104:35;;13119:18;;:::i;:::-;-1:-1:-1;13153:9:3;;13056:112::o;13173:127::-;13234:10;13229:3;13225:20;13222:1;13215:31;13265:4;13262:1;13255:15;13289:4;13286:1;13279:15;13305:127;13366:10;13361:3;13357:20;13354:1;13347:31;13397:4;13394:1;13387:15;13421:4;13418:1;13411:15;13437:127;13498:10;13493:3;13489:20;13486:1;13479:31;13529:4;13526:1;13519:15;13553:4;13550:1;13543:15;13569:127;13630:10;13625:3;13621:20;13618:1;13611:31;13661:4;13658:1;13651:15;13685:4;13682:1;13675:15;13701:127;13762:10;13757:3;13753:20;13750:1;13743:31;13793:4;13790:1;13783:15;13817:4;13814:1;13807:15;13833:131;-1:-1:-1;;;;;13908:31:3;;13898:42;;13888:70;;13954:1;13951;13944:12;13969:118;14055:5;14048:13;14041:21;14034:5;14031:32;14021:60;;14077:1;14074;14067:12;14092:131;-1:-1:-1;;;;;;14166:32:3;;14156:43;;14146:71;;14213:1;14210;14203:12

Swarm Source

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