ETH Price: $3,333.47 (-3.58%)
 

Overview

Max Total Supply

212 APES

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 APES
0x40f37c6e4710110a8d6622014e3dbf63556aef17
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:
ApeSquadCharacterSheetNFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.1 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File contracts/ERC721Opt.sol



pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintToDeadAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error TransferToDeadAddress();
error UnableGetTokenOwnerByIndex();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3..).
 */
contract ERC721Opt is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    uint256 internal _nextTokenId = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owners details
    // An empty struct value does not necessarily mean the token is unowned. See ownerOf implementation for details.
    mapping(uint256 => address) internal _owners;

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

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

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

    // Address to use for burned accounting
    address constant DEAD_ADDR = 0x000000000000000000000000000000000000dEaD;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        // Counter underflow is impossible as burned cannot be incremented
        // more than _nextTokenId - 1 times
        unchecked {
            return (_nextTokenId - 1) - balanceOf(DEAD_ADDR);    
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _balances[owner];
    }

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

        unchecked {
            for (uint256 curr = tokenId;; curr--) {
                owner = _owners[curr];
                if (owner != address(0)) {
                    return owner;
                }
            }
        }
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = 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 virtual 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 (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer();
    }

    function _isApprovedOrOwner(address sender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ownerOf(tokenId);

        return (sender == owner ||
            getApproved(tokenId) == sender ||
            isApprovedForAll(owner, sender));
    }

    /**
     * @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 virtual returns (bool) {
        return tokenId > 0 && tokenId < _nextTokenId && _owners[tokenId] != DEAD_ADDR;
    }
    
    function _mint(address to, uint256 quantity) internal virtual {
        _mint(to, quantity, '', false);
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _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 virtual {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) internal virtual {
        uint256 startTokenId = _nextTokenId;
        if (to == address(0)) revert MintToZeroAddress();
        if (to == DEAD_ADDR) revert MintToDeadAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance overflow if current value + quantity > 1.56e77 (2**256) - 1
        // updatedIndex overflows if _nextTokenId + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _balances[to] += quantity;

            _owners[startTokenId] = to;

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    if (!_checkOnERC721Received(address(0), to, updatedIndex, _data)) revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _nextTokenId = 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 {
        address owner = ownerOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (owner != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();
        if (to == DEAD_ADDR) revert TransferToDeadAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _owners[tokenId] = to;

            // If the owner 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;
            if (_owners[nextTokenId] == address(0)) {
                // This will suffice for checking _exists(nextTokenId), 
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _nextTokenId) {
                    _owners[nextTokenId] = owner;
                }
            }
        }

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

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

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

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

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

            _owners[tokenId] = DEAD_ADDR;

            // If the owner 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;
            if (_owners[nextTokenId] == address(0)) {
                // This will suffice for checking _exists(nextTokenId), 
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _nextTokenId) { 
                    _owners[nextTokenId] = owner;
                }
            }
        }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File contracts/extensions/ERC721OptOwnersExplicit.sol



pragma solidity ^0.8.4;

error AllOwnersHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

abstract contract ERC721OptOwnersExplicit is ERC721Opt {
    uint256 public nextOwnerToExplicitlySet = 1;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        if (quantity == 0) revert QuantityMustBeNonZero();
        if (_nextTokenId == 1) revert NoTokensMintedYet();
        uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet;
        if (_nextOwnerToExplicitlySet >= _nextTokenId) revert AllOwnersHaveBeenSet();

        // Index underflow is impossible.
        // Counter or index overflow is incredibly unrealistic.
        unchecked {
            uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1;

            // Set the end index to be the last token index
            if (endIndex + 1 > _nextTokenId) {
                endIndex = _nextTokenId - 1;
            }

            for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) {
                if (_owners[i] == address(0) && _owners[i] != DEAD_ADDR) {
                    address ownership = ownerOf(i);
                    _owners[i] = ownership;
                }
            }

            nextOwnerToExplicitlySet = endIndex + 1;
        }
    }
}


// File contracts/extensions/ERC721OptBurnable.sol



pragma solidity ^0.8.4;

error BurnCallerNotOwnerNorApproved();

/**
 * @title ERC721Opt Burnable Token
 * @dev ERC721Opt Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721OptBurnable is ERC721Opt {

    /**
     * @dev Burns `tokenId`. See {ERC721Opt-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved();
        _burn(tokenId);
    }
}


// File contracts/extensions/ERC721OptBatchBurnable.sol



pragma solidity ^0.8.4;

/**
 * @title ERC721Opt Batch Burnable Token
 * @dev ERC721Opt Token that can be irreversibly batch burned (destroyed).
 */
abstract contract ERC721OptBatchBurnable is ERC721OptBurnable {
    /**
     * @dev Perform burn on a batch of tokens
     */
    function batchBurn(uint16[] memory tokenIds) public virtual {
        for (uint16 i = 0; i < tokenIds.length; ++i) {
            if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert BurnCallerNotOwnerNorApproved();
            _burn(tokenIds[i]);
        }
    }
}


// File contracts/extensions/ERC721OptBatchTransferable.sol



pragma solidity ^0.8.4;

/**
 * @title ERC721Opt Batch Transferable Token
 * @dev ERC721Opt Token that can be batch transfered
*/
abstract contract ERC721OptBatchTransferable is ERC721Opt {
    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
    */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint16[] tokenIds
    );

    /**
     * @dev Perform transferFrom on a batch of tokens
     */
    function batchTransferFrom(
        address from,
        address to,
        uint16[] memory tokenIds
    ) public virtual {
        for (uint16 i = 0; i < tokenIds.length; ++i) {
            if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved();
            transferFrom(from, to, tokenIds[i]);
        }

        emit TransferBatch(_msgSender(), from, to, tokenIds);
    }

    /**
     * @dev Perform safeTransferFrom on a batch of tokens
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint16[] memory tokenIds
    ) public virtual {
        safeBatchTransferFrom(from, to, tokenIds, '');
    }

    /**
     * @dev Perform safeTransferFrom on a batch of tokens
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint16[] memory tokenIds,
        bytes memory _data
    ) public virtual {
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved();
            safeTransferFrom(from, to, tokenIds[i], _data);
        }

        emit TransferBatch(_msgSender(), from, to, tokenIds);
    }
}


// File contracts/OpenSea.sol



pragma solidity ^0.8.4;

contract OpenSeaOwnableDelegateProxy {}

contract OpenSeaProxyRegistry {
    mapping(address => OpenSeaOwnableDelegateProxy) public proxies;
}


// File contracts/ApeSquadCharacterSheetNFT.sol



pragma solidity ^0.8.4;




error CharacterSheetTypeQueryForNonexistentToken();
error OnlyMintersCanMintCharacterSheets();
error InvalidPurchaseCharacterSheetTypeId();
error AllCharacterSheetsOfTypeMinted();
error NoCharacterSheetMintAmountProvided();
error InvalidUpdateCharacterSheetLengthsDontMatch();
error InvalidUpdateCharacterSheetTypeId();

contract ApeSquadCharacterSheetNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable {
     using Strings for uint256;

    struct CharacterSheetPurchase {
        uint16 characterSheetTypeId;
        uint16 amount;
    }

    struct CharacterSheetType {
        string name;
        uint16 maxCharacterSheets;
        uint16 minted;
    }

    /* Base URI for token URIs */
    string public baseURI;

    /* OpenSea user account proxy */
    address public openSeaProxyRegistryAddress;
    
    /* Minter addressess */
    mapping(address => bool) public minters;

    CharacterSheetType[] public characterSheetTypes;

    /* mapping of each token id to characterSheet type */
    mapping(uint256 => uint16) _tokenIdCharacterSheetTypes;
    
    /* mapping of each token id to rarity. 0 = common, 1 = rare, 2 = legendary */
    mapping(uint256 => uint8) public characterSheetRarity;
    
    constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) {
        baseURI = _initialBaseURI;
        openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress;
        
        for (uint256 i; i < _minters.length; i++) {
            minters[_minters[i]] = true;
        }

        _addCharacterSheet("Alex", 250);
        _addCharacterSheet("Borg", 250);
        _addCharacterSheet("Dax", 250);
        _addCharacterSheet("Kanoa", 250);
        _addCharacterSheet("Kazz", 250);
    }

    /**
     * @dev Get characterSheetType count
     */
    function characterSheetTypeCount() public view returns (uint256) {
        return characterSheetTypes.length;
    }

    /**
     * @dev Get characterSheets left for sale
     */
    function characterSheetsLeft(uint16 characterSheetTypeId) public view returns (uint256) {
        return characterSheetTypes[characterSheetTypeId].maxCharacterSheets - characterSheetTypes[characterSheetTypeId].minted;
    }

    /**
     * @dev Get the characterSheet type for a specific tokenId
     */
    function tokenCharacterSheetType(uint256 tokenId) public view returns (string memory) {
        if (!_exists(tokenId)) revert CharacterSheetTypeQueryForNonexistentToken();

        return characterSheetTypes[_tokenIdCharacterSheetTypes[tokenId]].name;
    }

    /**
     * @dev Override to if default approved for OS proxy accounts or normal approval
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (address(openSeaProxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return ERC721Opt.isApprovedForAll(owner, operator);
    }

    /**
     * @dev Override to change the baseURI used in tokenURI
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Override to change tokenURI format
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Mint of specific characterSheet type to address. 
     */
    function mint(address to, CharacterSheetPurchase[] calldata characterSheetPurchases) public {
        if(!minters[msg.sender]) revert OnlyMintersCanMintCharacterSheets();

        uint256 amountToMint;

        uint256 tokenId = _nextTokenId;

        for (uint16 i; i < characterSheetPurchases.length; i++) {
            CharacterSheetPurchase memory p = characterSheetPurchases[i];

            if(p.characterSheetTypeId >= characterSheetTypes.length) revert InvalidPurchaseCharacterSheetTypeId();

            if(p.amount > characterSheetsLeft(characterSheetPurchases[i].characterSheetTypeId)) revert AllCharacterSheetsOfTypeMinted();

            characterSheetTypes[p.characterSheetTypeId].minted += p.amount;
            amountToMint += p.amount;

            for (uint16 j; j < p.amount; j++) {
                _tokenIdCharacterSheetTypes[tokenId++] = p.characterSheetTypeId;
            }
        }
            
        if(amountToMint == 0) revert NoCharacterSheetMintAmountProvided();
        
        _safeMint(to, amountToMint, '');
    }

    /**
     * @dev Mint of specific poster type to address. 
     */
    function mintType(address to, uint16 characterSheetTypeId, uint16 amount) public {
        if(!minters[msg.sender]) revert OnlyMintersCanMintCharacterSheets();
            
        if(amount == 0) revert NoCharacterSheetMintAmountProvided();

        uint256 tokenId = _nextTokenId;
        if(characterSheetTypeId >= characterSheetTypes.length) revert InvalidPurchaseCharacterSheetTypeId();

        if(amount > characterSheetsLeft(characterSheetTypeId)) revert AllCharacterSheetsOfTypeMinted();

        characterSheetTypes[characterSheetTypeId].minted += amount;

        for (uint16 i; i < amount; i++) {
            _tokenIdCharacterSheetTypes[tokenId++] = characterSheetTypeId;
        }
        
        _safeMint(to, amount, '');
    }

    /**
     * @dev Set the base uri for token metadata
     */
    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    /**
     * @dev Set minter status for addresses
     */
    function setMinters(address[] calldata addresses, bool allowed) external onlyOwner {
        for(uint256 i; i < addresses.length; i++) {
            minters[addresses[i]] = allowed;
        }
    }

    /**
     * @dev Add new characterSheet
     */
    function _addCharacterSheet(string memory name, uint16 maxCharacterSheets) internal {
        CharacterSheetType memory cs;

        cs.name = name;
        cs.maxCharacterSheets = maxCharacterSheets;

        characterSheetTypes.push(cs);
    }

    /**
     * @dev Add new characterSheet
     */
    function addCharacterSheet(string calldata name, uint16 maxCharacterSheets) external onlyOwner {
        _addCharacterSheet(name, maxCharacterSheets);
    }

    /**
     * @dev Update characterSheet names
     */
    function updateCharacterSheetNames(uint16[] calldata characterSheetTypeIds, string[] calldata names) external onlyOwner {
        if(characterSheetTypeIds.length != names.length) revert InvalidUpdateCharacterSheetLengthsDontMatch();

        for (uint16 i; i < characterSheetTypeIds.length; i++) {
            if(characterSheetTypeIds[i] >= characterSheetTypes.length) revert InvalidUpdateCharacterSheetTypeId();

            characterSheetTypes[characterSheetTypeIds[i]].name = names[i];
        }
    }

    /**
     * @dev Update available characterSheets
     */
    function updateMaxCharacterSheets(uint16[] calldata characterSheetTypeIds, uint16[] calldata maxCharacterSheets) external onlyOwner {
        if(characterSheetTypeIds.length != maxCharacterSheets.length) revert InvalidUpdateCharacterSheetLengthsDontMatch();

        for (uint16 i; i < characterSheetTypeIds.length; i++) {
            if(characterSheetTypeIds[i] >= characterSheetTypes.length) revert InvalidUpdateCharacterSheetTypeId();

            characterSheetTypes[characterSheetTypeIds[i]].maxCharacterSheets = maxCharacterSheets[i];
        }
    }

    /**
     * @dev Upate Rarities on chain for future staking
     */
    function updateRarities(uint8 rarity, uint256[] calldata tokenIds) external onlyOwner {
        if (rarity == 0) {
            for(uint256 i; i < tokenIds.length; i++) {
                if (tokenIds[i] >= _nextTokenId) continue;

                delete characterSheetRarity[tokenIds[i]];
            }
        } else {
            for(uint256 i; i < tokenIds.length; i++) {
                if (tokenIds[i] >= _nextTokenId) continue;

                characterSheetRarity[tokenIds[i]] = rarity;
            }
        }
    }

    /**
     * @dev Force update all owners for better transfers
     */
    function updateOwners(uint256 quantity) external onlyOwner {
        _setOwnersExplicit(quantity);
    }
}


// File contracts/ApeSquadPosterNFT.sol



pragma solidity ^0.8.4;




error PosterTypeQueryForNonexistentToken();
error OnlyMintersCanMintPosters();
error InvalidPurchasePosterTypeId();
error AllPostersOfTypeMinted();
error NoPosterMintAmountProvided();
error InvalidUpdatePosterLengthsDontMatch();
error InvalidUpdatePosterTypeId();

contract ApeSquadPosterNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable {
     using Strings for uint256;

    struct PosterPurchase {
        uint16 posterTypeId;
        uint16 amount;
    }

    struct PosterType {
        string name;
        uint16 maxPosters;
        uint16 minted;
    }

    /* Base URI for token URIs */
    string public baseURI;

    /* OpenSea user account proxy */
    address public openSeaProxyRegistryAddress;
    
    /* Minter addressess */
    mapping(address => bool) public minters;

    PosterType[] public posterTypes;

    /* mapping of each token id to poster type */
    mapping(uint256 => uint16) _tokenIdPosterTypes;

    /* mapping of each token id to rarity. 0 = common, 1 = rare, 2 = legendary */
    mapping(uint256 => uint8) public posterRarity;
    
    constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) {
        baseURI = _initialBaseURI;
        openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress;
        
        for (uint256 i; i < _minters.length; i++) {
            minters[_minters[i]] = true;
        }

        _addPoster("Season 1", 1250);
    }

    /**
     * @dev Get posterType count
     */
    function posterTypeCount() public view returns (uint256) {
        return posterTypes.length;
    }

    /**
     * @dev Get posters left for sale
     */
    function postersLeft(uint16 posterTypeId) public view returns (uint256) {
        return posterTypes[posterTypeId].maxPosters - posterTypes[posterTypeId].minted;
    }

    /**
     * @dev Get the poster type for a specific tokenId
     */
    function tokenPosterType(uint256 tokenId) public view returns (string memory) {
        if (!_exists(tokenId)) revert PosterTypeQueryForNonexistentToken();

        return posterTypes[_tokenIdPosterTypes[tokenId]].name;
    }

    /**
     * @dev Override to if default approved for OS proxy accounts or normal approval
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (address(openSeaProxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return ERC721Opt.isApprovedForAll(owner, operator);
    }

    /**
     * @dev Override to change the baseURI used in tokenURI
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Override to change tokenURI format
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Mint of specific poster type to address. 
     */
    function mint(address to, PosterPurchase[] calldata posterPurchases) public {
        if(!minters[msg.sender]) revert OnlyMintersCanMintPosters();

        uint256 amountToMint;

        uint256 tokenId = _nextTokenId;

        for (uint16 i; i < posterPurchases.length; i++) {
            PosterPurchase memory p = posterPurchases[i];

            if(p.posterTypeId >= posterTypes.length) revert InvalidPurchasePosterTypeId();

            if(p.amount > postersLeft(posterPurchases[i].posterTypeId)) revert AllPostersOfTypeMinted();

            posterTypes[p.posterTypeId].minted += p.amount;
            amountToMint += p.amount;

            for (uint16 j; j < p.amount; j++) {
                _tokenIdPosterTypes[tokenId++] = p.posterTypeId;
            }
        }
            
        if(amountToMint == 0) revert NoPosterMintAmountProvided();
        
        _safeMint(to, amountToMint, '');
    }

    /**
     * @dev Mint of specific poster type to address. 
     */
    function mintType(address to, uint16 posterTypeId, uint16 amount) public {
        if(!minters[msg.sender]) revert OnlyMintersCanMintPosters();
            
        if(amount == 0) revert NoPosterMintAmountProvided();

        uint256 tokenId = _nextTokenId;
        if(posterTypeId >= posterTypes.length) revert InvalidPurchasePosterTypeId();

        if(amount > postersLeft(posterTypeId)) revert AllPostersOfTypeMinted();

        posterTypes[posterTypeId].minted += amount;

        for (uint16 i; i < amount; i++) {
            _tokenIdPosterTypes[tokenId++] = posterTypeId;
        }
        
        _safeMint(to, amount, '');
    }

    /**
     * @dev Set the base uri for token metadata
     */
    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    /**
     * @dev Set minter status for addresses
     */
    function setMinters(address[] calldata addresses, bool allowed) external onlyOwner {
        for(uint256 i; i < addresses.length; i++) {
            minters[addresses[i]] = allowed;
        }
    }

    /**
     * @dev Add new poster
     */
    function _addPoster(string memory name, uint16 maxPosters) internal {
        PosterType memory p;

        p.name = name;
        p.maxPosters = maxPosters;

        posterTypes.push(p);
    }
    
    /**
     * @dev Add new poster
     */
    function addPoster(string calldata name, uint16 maxPosters) external onlyOwner {
        _addPoster(name, maxPosters);
    }

    /**
     * @dev Update poster names
     */
    function updatePosterNames(uint16[] calldata posterTypeIds, string[] calldata names) external onlyOwner {
        if(posterTypeIds.length != names.length) revert InvalidUpdatePosterLengthsDontMatch();

        for (uint16 i; i < posterTypeIds.length; i++) {
            if(posterTypeIds[i] >= posterTypes.length) revert InvalidUpdatePosterTypeId();

            posterTypes[posterTypeIds[i]].name = names[i];
        }
    }
    /**
     * @dev Update available posters
     */
    function updateMaxPosters(uint16[] calldata posterTypeIds, uint16[] calldata maxPosters) external onlyOwner {
        if(posterTypeIds.length != maxPosters.length) revert InvalidUpdatePosterLengthsDontMatch();

        for (uint16 i; i < posterTypeIds.length; i++) {
            if(posterTypeIds[i] >= posterTypes.length) revert InvalidUpdatePosterTypeId();

            posterTypes[posterTypeIds[i]].maxPosters = maxPosters[i];
        }
    }

    /**
     * @dev Upate Rarities on chain for future staking
     */
    function updateRarities(uint8 rarity, uint256[] calldata tokenIds) external onlyOwner {
        if (rarity == 0) {
            for(uint256 i; i < tokenIds.length; i++) {
                if (tokenIds[i] >= _nextTokenId) continue;

                delete posterRarity[tokenIds[i]];
            }
        } else {
            for(uint256 i; i < tokenIds.length; i++) {
                if (tokenIds[i] >= _nextTokenId) continue;

                posterRarity[tokenIds[i]] = rarity;
            }
        }
    }

    /**
     * @dev Force update all owners for better transfers
     */
    function updateOwners(uint256 quantity) external onlyOwner {
        _setOwnersExplicit(quantity);
    }
}


// File contracts/ApeSquadMinter.sol


pragma solidity ^0.8.0;



contract ApeSquadMinter is Ownable {
    /* Character Sheet NFT contract */
    ApeSquadCharacterSheetNFT characterSheetNFTContract;
    /* Poster NFT contract */
    ApeSquadPosterNFT posterNFTContract;

    /* Is Sale Active */
    bool public saleIsActive;

    /* silver cards reserved for marketing */
    mapping(uint16 => uint16) public reservedCharacterSheets;
    /* posters reserved for marketing */
    uint16 public reservedSeason1Posters = 2;

    /* Price for character sheets */
    uint256 public characterSheetPrice = 0.08 ether;

    /* NFT Contracts that can get free poster */
    address[] public freeSeason1PosterNftContracts;

    /* Mapping of claimed posters */
    mapping(address => bool) public season1PosterClaimed;

    constructor(
        ApeSquadCharacterSheetNFT _characterSheetNFTContract,
        ApeSquadPosterNFT _posterNFTContract,
        address[] memory _freeSeason1PosterNftContracts
    ) {
        characterSheetNFTContract = _characterSheetNFTContract;
        posterNFTContract = _posterNFTContract;

        for (uint16 i; i < characterSheetNFTContract.characterSheetTypeCount(); i++) {
            reservedCharacterSheets[i] = 6;
        }

        freeSeason1PosterNftContracts = _freeSeason1PosterNftContracts;
    }
    
    function mint(ApeSquadCharacterSheetNFT.CharacterSheetPurchase[] calldata characterSheetPurchases, bool freeSeason1Poster) external payable {
        require(msg.sender == tx.origin, 'Only EOA');
        require(saleIsActive, 'Regular sale is not active');

        uint256 totalAmount;

        for (uint16 i; i < characterSheetPurchases.length; i++) {
            require(
                characterSheetPurchases[i].amount <= characterSheetNFTContract.characterSheetsLeft(characterSheetPurchases[i].characterSheetTypeId) - reservedCharacterSheets[characterSheetPurchases[i].characterSheetTypeId],
                'Sold Out'
            );
            totalAmount += characterSheetPurchases[i].amount;
        }

        if (freeSeason1Poster) {
            require(!season1PosterClaimed[msg.sender], 'Season 1 Poster already claimed');

            bool valid = totalAmount > 0 || characterSheetNFTContract.balanceOf(msg.sender) > 0;

            if (totalAmount == 0 && characterSheetNFTContract.balanceOf(msg.sender) == 0) {
                for (uint256 i; i < freeSeason1PosterNftContracts.length; i++) {
                   valid = valid || IERC721(freeSeason1PosterNftContracts[i]).balanceOf(msg.sender) > 0;
                   if (valid) break;
                }
            }

            require(valid, 'Season 1 Poster requirements not met');
            season1PosterClaimed[msg.sender] = true;
        }

        require(
            msg.value >= (totalAmount * characterSheetPrice),
            'Ether value sent is not correct'
        );

        if(totalAmount > 0) {
            characterSheetNFTContract.mint(msg.sender, characterSheetPurchases);
        }
        if (freeSeason1Poster) {
            posterNFTContract.mintType(msg.sender, 0, 1);
        }
    }

    function flipSaleState() external onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function setReserves(uint16[] calldata _characterSheetTypeIds, uint16[] calldata _characterSheetAmounts, uint16 _season1PosterAmount) external onlyOwner {
        require(
            _characterSheetTypeIds.length == _characterSheetAmounts.length,
            'Character Sheet Type Ids length should match Amounts length'
        );

        for (uint16 i; i < _characterSheetTypeIds.length; i++) {
            require(
                _characterSheetTypeIds[i] < characterSheetNFTContract.characterSheetTypeCount(),
                'Character Sheet Type Id should be with in range'
            );

            reservedCharacterSheets[_characterSheetTypeIds[i]] = _characterSheetAmounts[i];
        }

        reservedSeason1Posters = _season1PosterAmount;
    }

    function setFreeSeason1PosterNftContracts(address[] calldata _freeSeason1PosterNftContracts) external onlyOwner {
        freeSeason1PosterNftContracts = _freeSeason1PosterNftContracts;
    }

    function setPrice(uint256 _characterSheetPrice) external onlyOwner {
        characterSheetPrice = _characterSheetPrice;
    }

    function reserveMint(uint16[] calldata _characterSheetTypeIds, uint16[] calldata _characterSheetAmounts, uint16 season1Posters, address[] calldata to) external onlyOwner {
        require(
            _characterSheetTypeIds.length == _characterSheetAmounts.length,
            'Character Sheet Type Ids length should match Amounts length'
        );
        
        for (uint16 i; i < _characterSheetTypeIds.length; i++) {
            require(
                (_characterSheetAmounts[i] * to.length) <= reservedCharacterSheets[_characterSheetTypeIds[i]],
                'Not enough reserve left for team'
            );
        }

        require(
            (season1Posters * to.length) <= reservedSeason1Posters,
            'Not enough reserve left for team'
        );

        for (uint16 i = 0; i < to.length; i++) {
            for (uint16 j; j < _characterSheetTypeIds.length; j++) {
                characterSheetNFTContract.mintType(to[i], _characterSheetTypeIds[j], _characterSheetAmounts[j]);
            }

            if (season1Posters > 0 ) {
                posterNFTContract.mintType(to[i], 0, season1Posters);
            }
        }

        for (uint16 i; i < _characterSheetTypeIds.length; i++) {
            reservedCharacterSheets[_characterSheetTypeIds[i]] -= uint16(_characterSheetAmounts[i] * to.length);
        }

        reservedSeason1Posters -= uint16(season1Posters * to.length);
    }
    
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"address","name":"_openSeaProxyRegistryAddress","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllCharacterSheetsOfTypeMinted","type":"error"},{"inputs":[],"name":"AllOwnersHaveBeenSet","type":"error"},{"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":"BurnCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"CharacterSheetTypeQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"InvalidPurchaseCharacterSheetTypeId","type":"error"},{"inputs":[],"name":"InvalidUpdateCharacterSheetLengthsDontMatch","type":"error"},{"inputs":[],"name":"InvalidUpdateCharacterSheetTypeId","type":"error"},{"inputs":[],"name":"MintToDeadAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoCharacterSheetMintAmountProvided","type":"error"},{"inputs":[],"name":"NoTokensMintedYet","type":"error"},{"inputs":[],"name":"OnlyMintersCanMintCharacterSheets","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QuantityMustBeNonZero","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToDeadAddress","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"TransferBatch","type":"event"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxCharacterSheets","type":"uint16"}],"name":"addCharacterSheet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characterSheetRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"characterSheetTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characterSheetTypes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxCharacterSheets","type":"uint16"},{"internalType":"uint16","name":"minted","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"characterSheetTypeId","type":"uint16"}],"name":"characterSheetsLeft","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":"address","name":"to","type":"address"},{"components":[{"internalType":"uint16","name":"characterSheetTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"internalType":"struct ApeSquadCharacterSheetNFT.CharacterSheetPurchase[]","name":"characterSheetPurchases","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"characterSheetTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mintType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSeaProxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"owner","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":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setMinters","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":"tokenCharacterSheetType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"characterSheetTypeIds","type":"uint16[]"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"updateCharacterSheetNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"characterSheetTypeIds","type":"uint16[]"},{"internalType":"uint16[]","name":"maxCharacterSheets","type":"uint16[]"}],"name":"updateMaxCharacterSheets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"updateOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rarity","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"updateRarities","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001805560016008553480156200001a57600080fd5b50604051620036e9380380620036e98339810160408190526200003d9162000484565b84846200004a33620001ec565b81516200005f906002906020850190620002e3565b50805162000075906003906020840190620002e3565b505083516200008d91506009906020860190620002e3565b50600a80546001600160a01b0319166001600160a01b03841617905560005b815181101562000118576001600b6000848481518110620000d157620000d1620005c4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200010f81620005da565b915050620000ac565b50604080518082019091526004815263082d8caf60e31b6020820152620001419060fa6200023c565b604080518082019091526004815263426f726760e01b6020820152620001699060fa6200023c565b604080518082019091526003815262088c2f60eb1b6020820152620001909060fa6200023c565b6040805180820190915260058152644b616e6f6160d81b6020820152620001b99060fa6200023c565b60408051808201909152600481526325b0bd3d60e11b6020820152620001e19060fa6200023c565b505050505062000641565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192620002ab928492910190620002e3565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b828054620002f19062000604565b90600052602060002090601f01602090048101928262000315576000855562000360565b82601f106200033057805160ff191683800117855562000360565b8280016001018555821562000360579182015b828111156200036057825182559160200191906001019062000343565b506200036e92915062000372565b5090565b5b808211156200036e576000815560010162000373565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ca57620003ca62000389565b604052919050565b600082601f830112620003e457600080fd5b81516001600160401b0381111562000400576200040062000389565b602062000416601f8301601f191682016200039f565b82815285828487010111156200042b57600080fd5b60005b838110156200044b5785810183015182820184015282016200042e565b838111156200045d5760008385840101525b5095945050505050565b80516001600160a01b03811681146200047f57600080fd5b919050565b600080600080600060a086880312156200049d57600080fd5b85516001600160401b0380821115620004b557600080fd5b620004c389838a01620003d2565b9650602091508188015181811115620004db57600080fd5b620004e98a828b01620003d2565b965050604088015181811115620004ff57600080fd5b6200050d8a828b01620003d2565b9550506200051e6060890162000467565b93506080880151818111156200053357600080fd5b8801601f81018a136200054557600080fd5b8051828111156200055a576200055a62000389565b8060051b92506200056d8484016200039f565b818152928201840192848101908c8511156200058857600080fd5b928501925b84841015620005b157620005a18462000467565b825292850192908501906200058d565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620005fd57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200061957607f821691505b602082108114156200063b57634e487b7160e01b600052602260045260246000fd5b50919050565b61309880620006516000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c80638da5cb5b1161017b578063c6b2dd9f116100d8578063dffaf2d81161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063dffaf2d814610584578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd14610555578063d7224ba014610568578063df7dd9751461057157600080fd5b8063c6b2dd9f1461052f578063c83072381461054257600080fd5b8063a22cb4651161012f578063b7f47d3211610114578063b7f47d32146104f6578063b88d4fde14610509578063c5bdcb9f1461051c57600080fd5b8063a22cb465146104d0578063a818fc3b146104e357600080fd5b806395d89b411161016057806395d89b41146104a25780639a97545b146104aa5780639b9cf33b146104bd57600080fd5b80638da5cb5b1461047e5780638f5ea8da1461048f57600080fd5b806342842e0e116102295780636c0360eb116101dd57806370a08231116101c257806370a0823114610450578063715018a6146104635780638754101c1461046b57600080fd5b80636c0360eb146104135780636c49f3761461041b57600080fd5b806353d8f7801161020e57806353d8f780146103da57806355f804b3146103ed5780636352211e1461040057600080fd5b806342842e0e146103b457806342966c68146103c757600080fd5b806318160ddd116102805780632ef7c967116102655780632ef7c9671461038657806330faa0d114610399578063416b136c146103ac57600080fd5b806318160ddd1461035d57806323b872dd1461037357600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b31461033557806316c655271461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61034861035836600461268f565b6107b8565b610365610935565b6040519081526020016102ec565b6103486103813660046126fb565b61094d565b610348610394366004612753565b610958565b6102fd6103a73660046125e9565b610ae3565b600c54610365565b6103486103c23660046126fb565b610bd4565b6103486103d53660046125e9565b610bef565b6103486103e836600461268f565b610c22565b6103486103fb366004612837565b610d7f565b61031d61040e3660046125e9565b610dde565b6102fd610e37565b61043e6104293660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b61036561045e366004612880565b610ec5565b610348610f0a565b610348610479366004612924565b610f5e565b6000546001600160a01b031661031d565b61034861049d366004612924565b611054565b6102fd61106f565b6103656104b8366004612986565b61107e565b6103486104cb3660046129a1565b6110fa565b6103486104de3660046129e6565b61116a565b6103486104f1366004612a1b565b611200565b600a5461031d906001600160a01b031681565b610348610517366004612ab3565b611289565b61034861052a366004612b1f565b6112bd565b61034861053d3660046125e9565b6114e1565b610348610550366004612ba7565b611532565b6102fd6105633660046125e9565b6115eb565b61036560085481565b61034861057f366004612bf2565b611675565b6105976105923660046125e9565b6117c8565b6040516102ec93929190612c4d565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612880565b611953565b6102e06105da366004612880565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610dde565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b6000546001600160a01b031633146108055760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b82811461082557604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff841681811061084d5761084d612d6c565b90506020020160208101906108629190612986565b61ffff161061088457604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff1681811061089a5761089a612d6c565b90506020020160208101906108af9190612986565b600c86868461ffff168181106108c7576108c7612d6c565b90506020020160208101906108dc9190612986565b61ffff16815481106108f0576108f0612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff160217905550808061092690612d98565b915050610828565b5050505050565b600061094261dead610ec5565b600180540303905090565b6107b3838383611b92565b336000908152600b602052604090205460ff1661098857604051631936ec9960e31b815260040160405180910390fd5b61ffff81166109aa576040516332e516b960e01b815260040160405180910390fd5b600154600c5461ffff8416106109d3576040516355f0e58160e11b815260040160405180910390fd5b6109dc8361107e565b8261ffff161115610a0057604051631879a53760e01b815260040160405180910390fd5b81600c8461ffff1681548110610a1857610a18612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a459190612dba565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610abe5783600d600084610a8181612de0565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610ab690612d98565b915050610a62565b50610add848361ffff1660405180602001604052806000815250611d64565b50505050565b6060610aee82611afa565b610b0b57604051631dea22b760e11b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610b3357610b33612d6c565b90600052602060002090600202016000018054610b4f90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7b90612d31565b8015610bc85780601f10610b9d57610100808354040283529160200191610bc8565b820191906000526020600020905b815481529060010190602001808311610bab57829003601f168201915b50505050509050919050565b6107b383838360405180602001604052806000815250611289565b610bf93382611d71565b610c165760405163871b97e160e01b815260040160405180910390fd5b610c1f81611dc8565b50565b6000546001600160a01b03163314610c6a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b828114610c8a57604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff8416818110610cb257610cb2612d6c565b9050602002016020810190610cc79190612986565b61ffff1610610ce957604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff16818110610cff57610cff612d6c565b9050602002810190610d119190612dfb565b600c87878561ffff16818110610d2957610d29612d6c565b9050602002016020810190610d3e9190612986565b61ffff1681548110610d5257610d52612d6c565b60009182526020909120610d6c9360029092020191612437565b5080610d7781612d98565b915050610c8d565b6000546001600160a01b03163314610dc75760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b8051610dda9060099060208401906124bb565b5050565b6000610de982611afa565b610e0657604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610e2e5750919050565b60001901610e08565b60098054610e4490612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7090612d31565b8015610ebd5780601f10610e9257610100808354040283529160200191610ebd565b820191906000526020600020905b815481529060010190602001808311610ea057829003601f168201915b505050505081565b60006001600160a01b038216610eee576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610f525760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610f5c6000611ecc565b565b60005b81518161ffff161015610ff357610f9a335b838361ffff1681518110610f8957610f89612d6c565b602002602001015161ffff16611d71565b610fb757604051632ce44b5f60e11b815260040160405180910390fd5b610fe38484848461ffff1681518110610fd257610fd2612d6c565b602002602001015161ffff1661094d565b610fec81612d98565b9050610f61565b50816001600160a01b0316836001600160a01b031661100f3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516110479190612e42565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b6000600c8261ffff168154811061109757611097612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff16815481106110ce576110ce612d6c565b60009182526020909120600160029092020101546110f0919061ffff16612e8a565b61ffff1692915050565b60005b81518161ffff161015610dda5761111333610f73565b6111305760405163871b97e160e01b815260040160405180910390fd5b61115a828261ffff168151811061114957611149612d6c565b602002602001015161ffff16611dc8565b61116381612d98565b90506110fd565b6001600160a01b0382163314156111945760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146112485760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611f1c915050565b611294848484611b92565b6112a084848484611fc1565b610add576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166112ed57604051631936ec9960e31b815260040160405180910390fd5b600154600090815b61ffff81168411156114a857600085858361ffff1681811061131957611319612d6c565b90506040020180360381019061132f9190612ead565b600c54815191925061ffff9091161061135b576040516355f0e58160e11b815260040160405180910390fd5b61138a86868461ffff1681811061137457611374612d6c565b6104b89260206040909202019081019150612986565b816020015161ffff1611156113b257604051631879a53760e01b815260040160405180910390fd5b8060200151600c826000015161ffff16815481106113d2576113d2612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166113ff9190612dba565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff168461142d9190612f08565b935060005b816020015161ffff168161ffff161015611493578151600d60008661145681612de0565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061148b90612d98565b915050611432565b505080806114a090612d98565b9150506112f5565b50816114c7576040516332e516b960e01b815260040160405180910390fd5b61092e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115295760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610c1f816120c0565b6000546001600160a01b0316331461157a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60005b82811015610add5781600b600086868581811061159c5761159c612d6c565b90506020020160208101906115b19190612880565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806115e381612de0565b91505061157d565b60606115f682611afa565b61161357604051630a14c4b560e41b815260040160405180910390fd5b60006009805461162290612d31565b90501161163e576040518060200160405280600081525061064e565b6116466121da565b61164f836121e9565b604051602001611660929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146116bd5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60ff83166117405760005b81811015610add576001548383838181106116e5576116e5612d6c565b90506020020135106116f65761172e565b600e600084848481811061170c5761170c612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061173881612de0565b9150506116c8565b60005b81811015610add5760015483838381811061176057611760612d6c565b9050602002013510611771576117b6565b83600e600085858581811061178857611788612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b806117c081612de0565b915050611743565b600c81815481106117d857600080fd5b90600052602060002090600202016000915090508060000180546117fb90612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461182790612d31565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107fc565b610c1f81611ecc565b60005b8251811015611a9857611a4233848381518110610f8957610f89612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611289565b611a9181612de0565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e42565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610dde565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461092e565b6107b383838360016122ff565b600080611d7d83610dde565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610dde565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f899284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610dde565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de0565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff81111561225257612252612798565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b5060015561092e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c1f57600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610add5750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c1f57600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b60008083601f84011261265557600080fd5b50813567ffffffffffffffff81111561266d57600080fd5b6020830191508360208260051b850101111561268857600080fd5b9250929050565b600080600080604085870312156126a557600080fd5b843567ffffffffffffffff808211156126bd57600080fd5b6126c988838901612643565b909650945060208701359150808211156126e257600080fd5b506126ef87828801612643565b95989497509550505050565b60008060006060848603121561271057600080fd5b833561271b81612602565b9250602084013561272b81612602565b929592945050506040919091013590565b803561ffff8116811461274e57600080fd5b919050565b60008060006060848603121561276857600080fd5b833561277381612602565b92506127816020850161273c565b915061278f6040850161273c565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127d7576127d7612798565b604052919050565b600067ffffffffffffffff8311156127f9576127f9612798565b61280c601f8401601f19166020016127ae565b905082815283838301111561282057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561284957600080fd5b813567ffffffffffffffff81111561286057600080fd5b8201601f8101841361287157600080fd5b61194b848235602084016127df565b60006020828403121561289257600080fd5b813561257781612602565b600082601f8301126128ae57600080fd5b8135602067ffffffffffffffff8211156128ca576128ca612798565b8160051b6128d98282016127ae565b92835284810182019282810190878511156128f357600080fd5b83870192505b848310156129195761290a8361273c565b825291830191908301906128f9565b979650505050505050565b60008060006060848603121561293957600080fd5b833561294481612602565b9250602084013561295481612602565b9150604084013567ffffffffffffffff81111561297057600080fd5b61297c8682870161289d565b9150509250925092565b60006020828403121561299857600080fd5b6125778261273c565b6000602082840312156129b357600080fd5b813567ffffffffffffffff8111156129ca57600080fd5b61194b8482850161289d565b8035801515811461274e57600080fd5b600080604083850312156129f957600080fd5b8235612a0481612602565b9150612a12602084016129d6565b90509250929050565b600080600060408486031215612a3057600080fd5b833567ffffffffffffffff80821115612a4857600080fd5b818601915086601f830112612a5c57600080fd5b813581811115612a6b57600080fd5b876020828501011115612a7d57600080fd5b60209283019550935061278f918601905061273c565b600082601f830112612aa457600080fd5b612577838335602085016127df565b60008060008060808587031215612ac957600080fd5b8435612ad481612602565b93506020850135612ae481612602565b925060408501359150606085013567ffffffffffffffff811115612b0757600080fd5b612b1387828801612a93565b91505092959194509250565b600080600060408486031215612b3457600080fd5b8335612b3f81612602565b9250602084013567ffffffffffffffff80821115612b5c57600080fd5b818601915086601f830112612b7057600080fd5b813581811115612b7f57600080fd5b8760208260061b8501011115612b9457600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bbc57600080fd5b833567ffffffffffffffff811115612bd357600080fd5b612bdf86828701612643565b909450925061278f9050602085016129d6565b600080600060408486031215612c0757600080fd5b833560ff81168114612c1857600080fd5b9250602084013567ffffffffffffffff811115612c3457600080fd5b612c4086828701612643565b9497909650939450505050565b606081526000612c6060608301866125aa565b61ffff94851660208401529290931660409091015292915050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161289d565b93506060870135915080821115612d2457600080fd5b50612b1387828801612a93565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681811415612db057612db0612d82565b6001019392505050565b600061ffff808316818516808303821115612dd757612dd7612d82565b01949350505050565b6000600019821415612df457612df4612d82565b5060010190565b6000808335601e19843603018112612e1257600080fd5b83018035915067ffffffffffffffff821115612e2d57600080fd5b60200191503681900382131561268857600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612e7e57835161ffff1683529284019291840191600101612e5e565b50909695505050505050565b600061ffff83811690831681811015612ea557612ea5612d82565b039392505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee2612798565b604052612eee8361273c565b8152612efc6020840161273c565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f3bfb2ace60a15c0a4c4221cd4f34a7c24af6ac32e8f458c4c823bafac71be8064736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004868747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f6368617261637465722d7368656574732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102c85760003560e01c80638da5cb5b1161017b578063c6b2dd9f116100d8578063dffaf2d81161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063dffaf2d814610584578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd14610555578063d7224ba014610568578063df7dd9751461057157600080fd5b8063c6b2dd9f1461052f578063c83072381461054257600080fd5b8063a22cb4651161012f578063b7f47d3211610114578063b7f47d32146104f6578063b88d4fde14610509578063c5bdcb9f1461051c57600080fd5b8063a22cb465146104d0578063a818fc3b146104e357600080fd5b806395d89b411161016057806395d89b41146104a25780639a97545b146104aa5780639b9cf33b146104bd57600080fd5b80638da5cb5b1461047e5780638f5ea8da1461048f57600080fd5b806342842e0e116102295780636c0360eb116101dd57806370a08231116101c257806370a0823114610450578063715018a6146104635780638754101c1461046b57600080fd5b80636c0360eb146104135780636c49f3761461041b57600080fd5b806353d8f7801161020e57806353d8f780146103da57806355f804b3146103ed5780636352211e1461040057600080fd5b806342842e0e146103b457806342966c68146103c757600080fd5b806318160ddd116102805780632ef7c967116102655780632ef7c9671461038657806330faa0d114610399578063416b136c146103ac57600080fd5b806318160ddd1461035d57806323b872dd1461037357600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b31461033557806316c655271461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61034861035836600461268f565b6107b8565b610365610935565b6040519081526020016102ec565b6103486103813660046126fb565b61094d565b610348610394366004612753565b610958565b6102fd6103a73660046125e9565b610ae3565b600c54610365565b6103486103c23660046126fb565b610bd4565b6103486103d53660046125e9565b610bef565b6103486103e836600461268f565b610c22565b6103486103fb366004612837565b610d7f565b61031d61040e3660046125e9565b610dde565b6102fd610e37565b61043e6104293660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b61036561045e366004612880565b610ec5565b610348610f0a565b610348610479366004612924565b610f5e565b6000546001600160a01b031661031d565b61034861049d366004612924565b611054565b6102fd61106f565b6103656104b8366004612986565b61107e565b6103486104cb3660046129a1565b6110fa565b6103486104de3660046129e6565b61116a565b6103486104f1366004612a1b565b611200565b600a5461031d906001600160a01b031681565b610348610517366004612ab3565b611289565b61034861052a366004612b1f565b6112bd565b61034861053d3660046125e9565b6114e1565b610348610550366004612ba7565b611532565b6102fd6105633660046125e9565b6115eb565b61036560085481565b61034861057f366004612bf2565b611675565b6105976105923660046125e9565b6117c8565b6040516102ec93929190612c4d565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612880565b611953565b6102e06105da366004612880565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610dde565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b6000546001600160a01b031633146108055760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b82811461082557604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff841681811061084d5761084d612d6c565b90506020020160208101906108629190612986565b61ffff161061088457604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff1681811061089a5761089a612d6c565b90506020020160208101906108af9190612986565b600c86868461ffff168181106108c7576108c7612d6c565b90506020020160208101906108dc9190612986565b61ffff16815481106108f0576108f0612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff160217905550808061092690612d98565b915050610828565b5050505050565b600061094261dead610ec5565b600180540303905090565b6107b3838383611b92565b336000908152600b602052604090205460ff1661098857604051631936ec9960e31b815260040160405180910390fd5b61ffff81166109aa576040516332e516b960e01b815260040160405180910390fd5b600154600c5461ffff8416106109d3576040516355f0e58160e11b815260040160405180910390fd5b6109dc8361107e565b8261ffff161115610a0057604051631879a53760e01b815260040160405180910390fd5b81600c8461ffff1681548110610a1857610a18612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a459190612dba565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610abe5783600d600084610a8181612de0565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610ab690612d98565b915050610a62565b50610add848361ffff1660405180602001604052806000815250611d64565b50505050565b6060610aee82611afa565b610b0b57604051631dea22b760e11b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610b3357610b33612d6c565b90600052602060002090600202016000018054610b4f90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7b90612d31565b8015610bc85780601f10610b9d57610100808354040283529160200191610bc8565b820191906000526020600020905b815481529060010190602001808311610bab57829003601f168201915b50505050509050919050565b6107b383838360405180602001604052806000815250611289565b610bf93382611d71565b610c165760405163871b97e160e01b815260040160405180910390fd5b610c1f81611dc8565b50565b6000546001600160a01b03163314610c6a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b828114610c8a57604051638bbbd08360e01b815260040160405180910390fd5b60005b61ffff811684111561092e57600c54858561ffff8416818110610cb257610cb2612d6c565b9050602002016020810190610cc79190612986565b61ffff1610610ce957604051633cf397bd60e21b815260040160405180910390fd5b82828261ffff16818110610cff57610cff612d6c565b9050602002810190610d119190612dfb565b600c87878561ffff16818110610d2957610d29612d6c565b9050602002016020810190610d3e9190612986565b61ffff1681548110610d5257610d52612d6c565b60009182526020909120610d6c9360029092020191612437565b5080610d7781612d98565b915050610c8d565b6000546001600160a01b03163314610dc75760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b8051610dda9060099060208401906124bb565b5050565b6000610de982611afa565b610e0657604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610e2e5750919050565b60001901610e08565b60098054610e4490612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7090612d31565b8015610ebd5780601f10610e9257610100808354040283529160200191610ebd565b820191906000526020600020905b815481529060010190602001808311610ea057829003601f168201915b505050505081565b60006001600160a01b038216610eee576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610f525760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610f5c6000611ecc565b565b60005b81518161ffff161015610ff357610f9a335b838361ffff1681518110610f8957610f89612d6c565b602002602001015161ffff16611d71565b610fb757604051632ce44b5f60e11b815260040160405180910390fd5b610fe38484848461ffff1681518110610fd257610fd2612d6c565b602002602001015161ffff1661094d565b610fec81612d98565b9050610f61565b50816001600160a01b0316836001600160a01b031661100f3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516110479190612e42565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b6000600c8261ffff168154811061109757611097612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff16815481106110ce576110ce612d6c565b60009182526020909120600160029092020101546110f0919061ffff16612e8a565b61ffff1692915050565b60005b81518161ffff161015610dda5761111333610f73565b6111305760405163871b97e160e01b815260040160405180910390fd5b61115a828261ffff168151811061114957611149612d6c565b602002602001015161ffff16611dc8565b61116381612d98565b90506110fd565b6001600160a01b0382163314156111945760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146112485760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611f1c915050565b611294848484611b92565b6112a084848484611fc1565b610add576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166112ed57604051631936ec9960e31b815260040160405180910390fd5b600154600090815b61ffff81168411156114a857600085858361ffff1681811061131957611319612d6c565b90506040020180360381019061132f9190612ead565b600c54815191925061ffff9091161061135b576040516355f0e58160e11b815260040160405180910390fd5b61138a86868461ffff1681811061137457611374612d6c565b6104b89260206040909202019081019150612986565b816020015161ffff1611156113b257604051631879a53760e01b815260040160405180910390fd5b8060200151600c826000015161ffff16815481106113d2576113d2612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166113ff9190612dba565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff168461142d9190612f08565b935060005b816020015161ffff168161ffff161015611493578151600d60008661145681612de0565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061148b90612d98565b915050611432565b505080806114a090612d98565b9150506112f5565b50816114c7576040516332e516b960e01b815260040160405180910390fd5b61092e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115295760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b610c1f816120c0565b6000546001600160a01b0316331461157a5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60005b82811015610add5781600b600086868581811061159c5761159c612d6c565b90506020020160208101906115b19190612880565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806115e381612de0565b91505061157d565b60606115f682611afa565b61161357604051630a14c4b560e41b815260040160405180910390fd5b60006009805461162290612d31565b90501161163e576040518060200160405280600081525061064e565b6116466121da565b61164f836121e9565b604051602001611660929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146116bd5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b60ff83166117405760005b81811015610add576001548383838181106116e5576116e5612d6c565b90506020020135106116f65761172e565b600e600084848481811061170c5761170c612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061173881612de0565b9150506116c8565b60005b81811015610add5760015483838381811061176057611760612d6c565b9050602002013510611771576117b6565b83600e600085858581811061178857611788612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b806117c081612de0565b915050611743565b600c81815481106117d857600080fd5b90600052602060002090600202016000915090508060000180546117fb90612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461182790612d31565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064016107fc565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107fc565b610c1f81611ecc565b60005b8251811015611a9857611a4233848381518110610f8957610f89612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611289565b611a9181612de0565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e42565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610dde565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461092e565b6107b383838360016122ff565b600080611d7d83610dde565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610dde565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f899284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610dde565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de0565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff81111561225257612252612798565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b5060015561092e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c1f57600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610add5750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c1f57600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b60008083601f84011261265557600080fd5b50813567ffffffffffffffff81111561266d57600080fd5b6020830191508360208260051b850101111561268857600080fd5b9250929050565b600080600080604085870312156126a557600080fd5b843567ffffffffffffffff808211156126bd57600080fd5b6126c988838901612643565b909650945060208701359150808211156126e257600080fd5b506126ef87828801612643565b95989497509550505050565b60008060006060848603121561271057600080fd5b833561271b81612602565b9250602084013561272b81612602565b929592945050506040919091013590565b803561ffff8116811461274e57600080fd5b919050565b60008060006060848603121561276857600080fd5b833561277381612602565b92506127816020850161273c565b915061278f6040850161273c565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127d7576127d7612798565b604052919050565b600067ffffffffffffffff8311156127f9576127f9612798565b61280c601f8401601f19166020016127ae565b905082815283838301111561282057600080fd5b828260208301376000602084830101529392505050565b60006020828403121561284957600080fd5b813567ffffffffffffffff81111561286057600080fd5b8201601f8101841361287157600080fd5b61194b848235602084016127df565b60006020828403121561289257600080fd5b813561257781612602565b600082601f8301126128ae57600080fd5b8135602067ffffffffffffffff8211156128ca576128ca612798565b8160051b6128d98282016127ae565b92835284810182019282810190878511156128f357600080fd5b83870192505b848310156129195761290a8361273c565b825291830191908301906128f9565b979650505050505050565b60008060006060848603121561293957600080fd5b833561294481612602565b9250602084013561295481612602565b9150604084013567ffffffffffffffff81111561297057600080fd5b61297c8682870161289d565b9150509250925092565b60006020828403121561299857600080fd5b6125778261273c565b6000602082840312156129b357600080fd5b813567ffffffffffffffff8111156129ca57600080fd5b61194b8482850161289d565b8035801515811461274e57600080fd5b600080604083850312156129f957600080fd5b8235612a0481612602565b9150612a12602084016129d6565b90509250929050565b600080600060408486031215612a3057600080fd5b833567ffffffffffffffff80821115612a4857600080fd5b818601915086601f830112612a5c57600080fd5b813581811115612a6b57600080fd5b876020828501011115612a7d57600080fd5b60209283019550935061278f918601905061273c565b600082601f830112612aa457600080fd5b612577838335602085016127df565b60008060008060808587031215612ac957600080fd5b8435612ad481612602565b93506020850135612ae481612602565b925060408501359150606085013567ffffffffffffffff811115612b0757600080fd5b612b1387828801612a93565b91505092959194509250565b600080600060408486031215612b3457600080fd5b8335612b3f81612602565b9250602084013567ffffffffffffffff80821115612b5c57600080fd5b818601915086601f830112612b7057600080fd5b813581811115612b7f57600080fd5b8760208260061b8501011115612b9457600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bbc57600080fd5b833567ffffffffffffffff811115612bd357600080fd5b612bdf86828701612643565b909450925061278f9050602085016129d6565b600080600060408486031215612c0757600080fd5b833560ff81168114612c1857600080fd5b9250602084013567ffffffffffffffff811115612c3457600080fd5b612c4086828701612643565b9497909650939450505050565b606081526000612c6060608301866125aa565b61ffff94851660208401529290931660409091015292915050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161289d565b93506060870135915080821115612d2457600080fd5b50612b1387828801612a93565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681811415612db057612db0612d82565b6001019392505050565b600061ffff808316818516808303821115612dd757612dd7612d82565b01949350505050565b6000600019821415612df457612df4612d82565b5060010190565b6000808335601e19843603018112612e1257600080fd5b83018035915067ffffffffffffffff821115612e2d57600080fd5b60200191503681900382131561268857600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612e7e57835161ffff1683529284019291840191600101612e5e565b50909695505050505050565b600061ffff83811690831681811015612ea557612ea5612d82565b039392505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee2612798565b604052612eee8361273c565b8152612efc6020840161273c565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f3bfb2ace60a15c0a4c4221cd4f34a7c24af6ac32e8f458c4c823bafac71be8064736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004868747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f6368617261637465722d7368656574732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8

-----Decoded View---------------
Arg [0] : name_ (string): ApeSquad
Arg [1] : symbol_ (string): APES
Arg [2] : _initialBaseURI (string): https://qtxa4e7zxk.execute-api.us-east-1.amazonaws.com/character-sheets/
Arg [3] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [4] : _minters (address[]): 0x6AB6B9C8ed19A464722198E8f4ef113E10c298B8

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4170655371756164000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4150455300000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000048
Arg [10] : 68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75
Arg [11] : 732d656173742d312e616d617a6f6e6177732e636f6d2f636861726163746572
Arg [12] : 2d7368656574732f000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8


Deployed Bytecode Sourcemap

44669:8716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25389:305:0;;;;;;;;26488:100;;;:::i;:::-;;;;;;;:::i;27965:212::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:55:1;;;1674:74;;1662:2;1647:18;27965:212:0;1528:226:1;27554:345:0;;;;;;:::i;:::-;;:::i;:::-;;52009:564;;;;;;:::i;:::-;;:::i;25028:289::-;;;:::i;:::-;;;3529:25:1;;;3517:2;3502:18;25028:289:0;3383:177:1;28838:170:0;;;;;;:::i;:::-;;:::i;49611:760::-;;;;;;:::i;:::-;;:::i;46835:261::-;;;;;;:::i;:::-;;:::i;46330:117::-;46413:19;:26;46330:117;;29079:185;;;;;;:::i;:::-;;:::i;41292:176::-;;;;;;:::i;:::-;;:::i;51425:512::-;;;;;;:::i;:::-;;:::i;50446:106::-;;;;;;:::i;:::-;;:::i;26014:407::-;;;;;;:::i;:::-;;:::i;45112:21::-;;;:::i;45577:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6825:4:1;6813:17;;;6795:36;;6783:2;6768:18;45577:53:0;6653:184:1;25758:194:0;;;;;;:::i;:::-;;:::i;2713:103::-;;;:::i;42762:427::-;;;;;;:::i;:::-;;:::i;2062:87::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;43274:196;;;;;;:::i;:::-;;:::i;26657:104::-;;;:::i;46520:225::-;;;;;;:::i;:::-;;:::i;41829:273::-;;;;;;:::i;:::-;;:::i;28249:287::-;;;;;;:::i;:::-;;:::i;51200:158::-;;;;;;:::i;:::-;;:::i;45180:42::-;;;;;-1:-1:-1;;;;;45180:42:0;;;29335:316;;;;;;:::i;:::-;;:::i;48455:1075::-;;;;;;:::i;:::-;;:::i;53276:106::-;;;;;;:::i;:::-;;:::i;50623:201::-;;;;;;:::i;:::-;;:::i;47985:381::-;;;;;;:::i;:::-;;:::i;39575:43::-;;;;;;52655:537;;;;;;:::i;:::-;;:::i;45312:47::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;47208:508::-;;;;;;:::i;:::-;;:::i;2971:201::-;;;;;;:::i;:::-;;:::i;45264:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43555:472;;;;;;:::i;:::-;;:::i;25389:305::-;25491:4;-1:-1:-1;;;;;;25528:40:0;;-1:-1:-1;;;25528:40:0;;:105;;-1:-1:-1;;;;;;;25585:48:0;;-1:-1:-1;;;25585:48:0;25528:105;:158;;;-1:-1:-1;;;;;;;;;;22804:40:0;;;25650:36;25508:178;25389:305;-1:-1:-1;;25389:305:0:o;26488:100::-;26542:13;26575:5;26568:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26488:100;:::o;27965:212::-;28041:7;28066:16;28074:7;28066;:16::i;:::-;28061:64;;28091:34;;-1:-1:-1;;;28091:34:0;;;;;;;;;;;28061:64;-1:-1:-1;28145:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28145:24:0;;27965:212::o;27554:345::-;27635:13;27651:16;27659:7;27651;:16::i;:::-;27635:32;;27688:5;-1:-1:-1;;;;;27682:11:0;:2;-1:-1:-1;;;;;27682:11:0;;27678:48;;;27702:24;;-1:-1:-1;;;27702:24:0;;;;;;;;;;;27678:48;860:10;-1:-1:-1;;;;;27743:21:0;;;;;;:63;;-1:-1:-1;27769:37:0;27786:5;860:10;47208:508;:::i;27769:37::-;27768:38;27743:63;27739:111;;;27815:35;;-1:-1:-1;;;27815:35:0;;;;;;;;;;;27739:111;27863:28;27872:2;27876:7;27885:5;27863:8;:28::i;:::-;27624:275;27554:345;;:::o;52009:564::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;;;;;;;;;52155:57;;::::1;52152:114;;52221:45;;-1:-1:-1::0;;;52221:45:0::1;;;;;;;;;;;52152:114;52284:8;52279:287;52294:32;::::0;::::1;::::0;-1:-1:-1;52279:287:0::1;;;52379:19;:26:::0;52351:21;;:24:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:54;;;52348:101;;52414:35;;-1:-1:-1::0;;;52414:35:0::1;;;;;;;;;;;52348:101;52533:18;;52552:1;52533:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52466:19;52486:21;;52508:1;52486:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52466:45;;;;;;;;;;:::i;:::-;;;;;;;;;;;:64;;;:88;;;;;;;;;;;;;;;;;;52328:3;;;;;:::i;:::-;;;;52279:287;;;;52009:564:::0;;;;:::o;25028:289::-;25080:7;25274:20;24785:42;25274:9;:20::i;:::-;25269:1;25254:12;;:16;25253:41;25246:48;;25028:289;:::o;28838:170::-;28972:28;28982:4;28988:2;28992:7;28972:9;:28::i;49611:760::-;49715:10;49707:19;;;;:7;:19;;;;;;;;49703:67;;49735:35;;-1:-1:-1;;;49735:35:0;;;;;;;;;;;49703:67;49798:11;;;49795:59;;49818:36;;-1:-1:-1;;;49818:36:0;;;;;;;;;;;49795:59;49885:12;;49935:19;:26;49911:50;;;;49908:99;;49970:37;;-1:-1:-1;;;49970:37:0;;;;;;;;;;;49908:99;50032:41;50052:20;50032:19;:41::i;:::-;50023:6;:50;;;50020:94;;;50082:32;;-1:-1:-1;;;50082:32:0;;;;;;;;;;;50020:94;50179:6;50127:19;50147:20;50127:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50203:8;50198:120;50217:6;50213:10;;:1;:10;;;50198:120;;;50286:20;50245:27;:38;50273:9;;;;:::i;:::-;;;50245:38;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;50225:3;;;;;:::i;:::-;;;;50198:120;;;;50338:25;50348:2;50352:6;50338:25;;;;;;;;;;;;;;:9;:25::i;:::-;49692:679;49611:760;;;:::o;46835:261::-;46906:13;46937:16;46945:7;46937;:16::i;:::-;46932:74;;46962:44;;-1:-1:-1;;;46962:44:0;;;;;;;;;;;46932:74;47046:36;;;;:27;:36;;;;;;47026:19;:57;;:19;;47046:36;;;47026:57;;;;;;:::i;:::-;;;;;;;;;;;:62;;47019:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46835:261;;;:::o;29079:185::-;29217:39;29234:4;29240:2;29244:7;29217:39;;;;;;;;;;;;:16;:39::i;41292:176::-;41354:41;860:10;41387:7;41354:18;:41::i;:::-;41349:86;;41404:31;;-1:-1:-1;;;41404:31:0;;;;;;;;;;;41349:86;41446:14;41452:7;41446:5;:14::i;:::-;41292:176;:::o;51425:512::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;51559:44;;::::1;51556:101;;51612:45;;-1:-1:-1::0;;;51612:45:0::1;;;;;;;;;;;51556:101;51675:8;51670:260;51685:32;::::0;::::1;::::0;-1:-1:-1;51670:260:0::1;;;51770:19;:26:::0;51742:21;;:24:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:54;;;51739:101;;51805:35;;-1:-1:-1::0;;;51805:35:0::1;;;;;;;;;;;51739:101;51910:5;;51916:1;51910:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;51857:19;51877:21;;51899:1;51877:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51857:45;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61:::1;::::0;:45:::1;::::0;;::::1;;::::0;:61:::1;:::i;:::-;-1:-1:-1::0;51719:3:0;::::1;::::0;::::1;:::i;:::-;;;;51670:260;;50446:106:::0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;50523:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50446:106:::0;:::o;26014:407::-;26086:13;26117:16;26125:7;26117;:16::i;:::-;26112:61;;26142:31;;-1:-1:-1;;;26142:31:0;;;;;;;;;;;26112:61;26231:7;26211:192;26276:13;;;;:7;:13;;;;;;-1:-1:-1;;;;;26276:13:0;;-1:-1:-1;26312:19:0;;26308:80;;26356:12;26014:407;;;:::o;26308:80::-;-1:-1:-1;;26241:6:0;26211:192;;45112:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25758:194::-;25830:7;-1:-1:-1;;;;;25854:19:0;;25850:60;;25882:28;;-1:-1:-1;;;25882:28:0;;;;;;;;;;;25850:60;-1:-1:-1;;;;;;25928:16:0;;;;;:9;:16;;;;;;;25758:194::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;42762:427::-;42906:8;42901:216;42924:8;:15;42920:1;:19;;;42901:216;;;42966:45;860:10;42985:12;42999:8;43008:1;42999:11;;;;;;;;;;:::i;:::-;;;;;;;42966:45;;:18;:45::i;:::-;42961:94;;43020:35;;-1:-1:-1;;;43020:35:0;;;;;;;;;;;42961:94;43070:35;43083:4;43089:2;43093:8;43102:1;43093:11;;;;;;;;;;:::i;:::-;;;;;;;43070:35;;:12;:35::i;:::-;42941:3;;;:::i;:::-;;;42901:216;;;;43168:2;-1:-1:-1;;;;;43134:47:0;43162:4;-1:-1:-1;;;;;43134:47:0;43148:12;860:10;;780:98;43148:12;-1:-1:-1;;;;;43134:47:0;;43172:8;43134:47;;;;;;:::i;:::-;;;;;;;;42762:427;;;:::o;43274:196::-;43417:45;43439:4;43445:2;43449:8;43417:45;;;;;;;;;;;;:21;:45::i;26657:104::-;26713:13;26746:7;26739:14;;;;;:::i;46520:225::-;46599:7;46689:19;46709:20;46689:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;;;;;;;;;;46626:19;46646:20;46626:41;;;;;;;;;;:::i;:::-;;;;;;;;;:60;:41;;;;;:60;;:111;;;:60;;:111;:::i;:::-;46619:118;;;46520:225;-1:-1:-1;;46520:225:0:o;41829:273::-;41905:8;41900:195;41923:8;:15;41919:1;:19;;;41900:195;;;41965:45;860:10;41984:12;780:98;41965:45;41960:90;;42019:31;;-1:-1:-1;;;42019:31:0;;;;;;;;;;;41960:90;42065:18;42071:8;42080:1;42071:11;;;;;;;;;;:::i;:::-;;;;;;;42065:18;;:5;:18::i;:::-;41940:3;;;:::i;:::-;;;41900:195;;28249:287;-1:-1:-1;;;;;28348:24:0;;860:10;28348:24;28344:54;;;28381:17;;-1:-1:-1;;;28381:17:0;;;;;;;;;;;28344:54;860:10;28411:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28411:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28411:53:0;;;;;;;;;;28480:48;;540:41:1;;;28411:42:0;;860:10;28480:48;;513:18:1;28480:48:0;;;;;;;28249:287;;:::o;51200:158::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;51306:44:::1;51325:4;;51306:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;51331:18:0;;-1:-1:-1;51306:18:0::1;::::0;-1:-1:-1;;51306:44:0:i:1;29335:316::-:0;29502:28;29512:4;29518:2;29522:7;29502:9;:28::i;:::-;29546:48;29569:4;29575:2;29579:7;29588:5;29546:22;:48::i;:::-;29541:102;;29603:40;;-1:-1:-1;;;29603:40:0;;;;;;;;;;;48455:1075;48570:10;48562:19;;;;:7;:19;;;;;;;;48558:67;;48590:35;;-1:-1:-1;;;48590:35:0;;;;;;;;;;;48558:67;48689:12;;48638:20;;;48714:667;48729:34;;;;-1:-1:-1;48714:667:0;;;48785:31;48819:23;;48843:1;48819:26;;;;;;;;;:::i;:::-;;;;;;48785:60;;;;;;;;;;:::i;:::-;48891:19;:26;48865:22;;48785:60;;-1:-1:-1;48865:52:0;;;;;48862:101;;48926:37;;-1:-1:-1;;;48926:37:0;;;;;;;;;;;48862:101;48994:68;49014:23;;49038:1;49014:26;;;;;;;;;:::i;:::-;:47;;;:26;;;;;:47;;;;-1:-1:-1;49014:47:0;:::i;48994:68::-;48983:1;:8;;;:79;;;48980:123;;;49071:32;;-1:-1:-1;;;49071:32:0;;;;;;;;;;;48980:123;49174:1;:8;;;49120:19;49140:1;:22;;;49120:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;;:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49213:1;:8;;;49197:24;;;;;;;:::i;:::-;;;49243:8;49238:132;49257:1;:8;;;49253:12;;:1;:12;;;49238:132;;;49332:22;;49291:27;49332:22;49319:9;;;;:::i;:::-;;;49291:38;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;49267:3;;;;;:::i;:::-;;;;49238:132;;;;48770:611;48765:3;;;;;:::i;:::-;;;;48714:667;;;-1:-1:-1;49408:17:0;49405:65;;49434:36;;-1:-1:-1;;;49434:36:0;;;;;;;;;;;49405:65;49491:31;49501:2;49505:12;49491:31;;;;;;;;;;;;:9;:31::i;53276:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;53346:28:::1;53365:8;53346:18;:28::i;50623:201::-:0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;50721:9:::1;50717:100;50732:20:::0;;::::1;50717:100;;;50798:7;50774;:21;50782:9;;50792:1;50782:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50774:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50774:21:0;:31;;-1:-1:-1;;50774:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50754:3;::::1;::::0;::::1;:::i;:::-;;;;50717:100;;47985:381:::0;48103:13;48139:16;48147:7;48139;:16::i;:::-;48134:59;;48164:29;;-1:-1:-1;;;48164:29:0;;;;;;;;;;;48134:59;48250:1;48232:7;48226:21;;;;;:::i;:::-;;;:25;:132;;;;;;;;;;;;;;;;;48295:10;:8;:10::i;:::-;48307:18;:7;:16;:18::i;:::-;48278:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48206:152;47985:381;-1:-1:-1;;47985:381:0:o;52655:537::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;52756:11:::1;::::0;::::1;52752:433;;52788:9;52784:178;52799:19:::0;;::::1;52784:178;;;52863:12;;52848:8;;52857:1;52848:11;;;;;;;:::i;:::-;;;;;;;:27;52844:41;;52877:8;;52844:41;52913:20;:33;52934:8;;52943:1;52934:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;52913:33:::0;;-1:-1:-1;52913:33:0;::::1;::::0;;;;;;-1:-1:-1;52913:33:0;52906:40;;-1:-1:-1;;52906:40:0::1;::::0;;52784:178:::1;52820:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52784:178;;52752:433;52998:9;52994:180;53009:19:::0;;::::1;52994:180;;;53073:12;;53058:8;;53067:1;53058:11;;;;;;;:::i;:::-;;;;;;;:27;53054:41;;53087:8;;53054:41;53152:6;53116:20;:33;53137:8;;53146:1;53137:11;;;;;;;:::i;:::-;;;;;;;53116:33;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;52994:180;53030:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52994:180;;45312:47:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45312:47:0;;;;;;;-1:-1:-1;;45312:47:0;;;;;;;;;;:::o;47208:508::-;47497:27;;47558:35;;-1:-1:-1;;;47558:35:0;;-1:-1:-1;;;;;1692:55:1;;;47558:35:0;;;1674:74:1;47333:4:0;;47497:27;;;47550:56;;;;47497:27;;47558:28;;1647:18:1;;47558:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47550:56:0;;47546:100;;;47630:4;47623:11;;;;;47546:100;-1:-1:-1;;;;;28728:25:0;;;28704:4;28728:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47665:43;47658:50;47208:508;-1:-1:-1;;;;47208:508:0:o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;15175:2:1;2274:68:0;;;15157:21:1;;;15194:18;;;15187:30;-1:-1:-1;;;;;;;;;;;15233:18:1;;;15226:62;15305:18;;2274:68:0;14973:356:1;2274:68:0;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;19369:2:1;3052:73:0::1;::::0;::::1;19351:21:1::0;19408:2;19388:18;;;19381:30;19447:34;19427:18;;;19420:62;19518:8;19498:18;;;19491:36;19544:19;;3052:73:0::1;19167:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;43555:472::-:0;43732:9;43727:228;43751:8;:15;43747:1;:19;43727:228;;;43793:45;860:10;43826:8;43835:1;43826:11;;;;;;;;:::i;43793:45::-;43788:94;;43847:35;;-1:-1:-1;;;43847:35:0;;;;;;;;;;;43788:94;43897:46;43914:4;43920:2;43924:8;43933:1;43924:11;;;;;;;;:::i;:::-;;;;;;;43897:46;;43937:5;43897:16;:46::i;:::-;43768:3;;;:::i;:::-;;;43727:228;;;;44006:2;-1:-1:-1;;;;;43972:47:0;44000:4;-1:-1:-1;;;;;43972:47:0;43986:12;860:10;;780:98;43986:12;-1:-1:-1;;;;;43972:47:0;;44010:8;43972:47;;;;;;:::i;:::-;;;;;;;;43555:472;;;;:::o;30195:167::-;30260:4;30294:1;30284:7;:11;:37;;;;;30309:12;;30299:7;:22;30284:37;:70;;;;-1:-1:-1;30325:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;30325:16:0;24785:42;30325:29;;30277:77;30195:167;-1:-1:-1;;30195:167:0:o;34926:196::-;35041:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35041:29:0;-1:-1:-1;;;;;35041:29:0;;;;;;;;;35086:28;;35041:24;;35086:28;;;;;;;34926:196;;;:::o;32937:1871::-;33052:13;33068:16;33076:7;33068;:16::i;:::-;33052:32;-1:-1:-1;33097:22:0;860:10;-1:-1:-1;;;;;33123:21:0;;;;:75;;-1:-1:-1;33161:37:0;33178:5;860:10;47208:508;:::i;33161:37::-;33123:128;;;-1:-1:-1;860:10:0;33215:20;33227:7;33215:11;:20::i;:::-;-1:-1:-1;;;;;33215:36:0;;33123:128;33097:155;;33270:17;33265:66;;33296:35;;-1:-1:-1;;;33296:35:0;;;;;;;;;;;33265:66;33355:4;-1:-1:-1;;;;;33346:13:0;:5;-1:-1:-1;;;;;33346:13:0;;33342:54;;33368:28;;-1:-1:-1;;;33368:28:0;;;;;;;;;;;33342:54;-1:-1:-1;;;;;33411:16:0;;33407:52;;33436:23;;-1:-1:-1;;;33436:23:0;;;;;;;;;;;33407:52;-1:-1:-1;;;;;33474:15:0;;24785:42;33474:15;33470:51;;;33498:23;;-1:-1:-1;;;33498:23:0;;;;;;;;;;;33470:51;33642:36;33659:1;33663:7;33672:5;33642:8;:36::i;:::-;-1:-1:-1;;;;;33970:15:0;;;;;;;:9;:15;;;;;;;;:20;;-1:-1:-1;;33970:20:0;;;34005:13;;;;;;;;;:18;;33989:1;34005:18;;;;;;34040:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34040:21:0;;;;;;34345:11;;;34375:20;;;;;;34345:11;;34375:20;34371:321;;34592:12;;34578:11;:26;34574:103;;;34629:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;34629:28:0;-1:-1:-1;;;;;34629:28:0;;;;;34574:103;33945:758;34739:7;34735:2;-1:-1:-1;;;;;34720:27:0;34729:4;-1:-1:-1;;;;;34720:27:0;;;;;;;;;;;34758:42;49611:760;30968:171;31099:32;31105:2;31109:8;31119:5;31126:4;31099:5;:32::i;29659:281::-;29751:4;29768:13;29784:16;29792:7;29784;:16::i;:::-;29768:32;;29831:5;-1:-1:-1;;;;;29821:15:0;:6;-1:-1:-1;;;;;29821:15:0;;:62;;;;29877:6;-1:-1:-1;;;;;29853:30:0;:20;29865:7;29853:11;:20::i;:::-;-1:-1:-1;;;;;29853:30:0;;29821:62;:110;;;;29900:31;29917:5;29924:6;29900:16;:31::i;35351:1422::-;35411:13;35427:16;35435:7;35427;:16::i;:::-;35411:32;;35573:36;35590:1;35594:7;35603:5;35573:8;:36::i;:::-;-1:-1:-1;;;;;35901:16:0;;;;;;;:9;:16;;;;;;;;:21;;-1:-1:-1;;35901:21:0;;;35937:20;:25;;35921:1;35937:25;;;;;;35979:16;;;:7;:16;;;;;;:28;;-1:-1:-1;;;;;;35979:28:0;24785:42;35979:28;;;36291:11;;;36321:20;;;;;;36291:11;;36321:20;36317:322;;36538:12;;36524:11;:26;36520:104;;;36576:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;36576:28:0;-1:-1:-1;;;;;36576:28:0;;;;;36520:104;-1:-1:-1;36667:36:0;;36695:7;;36691:1;;-1:-1:-1;;;;;36667:36:0;;;;;36691:1;;36667:36;50523:21:::1;50446:106:::0;:::o;3332:191::-;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;50886:252::-;-1:-1:-1;;;;;;;;;;;;;;;51022:14:0;;;51047:42;;;-1:-1:-1;;;;51047:42:0;;;;51102:19;:28;;;;;;;;;;;;;-1:-1:-1;;;;51102:28:0;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51102:28:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51102:28:0;;;;;;;;;;;;;;;-1:-1:-1;;;50886:252:0:o;37338:765::-;37493:4;-1:-1:-1;;;;;37514:13:0;;12717:19;:23;37510:586;;37550:72;;-1:-1:-1;;;37550:72:0;;-1:-1:-1;;;;;37550:36:0;;;;;:72;;860:10;;37601:4;;37607:7;;37616:5;;37550:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37550:72:0;;;;;;;;-1:-1:-1;;37550:72:0;;;;;;;;;;;;:::i;:::-;;;37546:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37796:13:0;;37792:234;;37823:40;;-1:-1:-1;;;37823:40:0;;;;;;;;;;;37792:234;37976:6;37970:13;37961:6;37957:2;37953:15;37946:38;37546:495;-1:-1:-1;;;;;;37673:55:0;-1:-1:-1;;;37673:55:0;;-1:-1:-1;37666:62:0;;37510:586;-1:-1:-1;38080:4:0;37338:765;;;;;;:::o;39731:1074::-;39801:13;39797:49;;39823:23;;-1:-1:-1;;;39823:23:0;;;;;;;;;;;39797:49;39861:12;;39877:1;39861:17;39857:49;;;39887:19;;-1:-1:-1;;;39887:19:0;;;;;;;;;;;39857:49;39953:24;;40021:12;;39992:41;;39988:76;;40042:22;;-1:-1:-1;;;40042:22:0;;;;;;;;;;;39988:76;40268:1;40366:12;40229:36;;;-1:-1:-1;;40229:40:0;;;-1:-1:-1;40347:95:0;;;-1:-1:-1;40425:1:0;40410:12;-1:-1:-1;;40410:16:0;40347:95;40475:25;40458:273;40507:8;40502:1;:13;40458:273;;40567:1;40545:10;;;:7;:10;;;;;;-1:-1:-1;;;;;40545:10:0;:24;:51;;;;-1:-1:-1;40573:10:0;;;;:7;:10;;;;;;-1:-1:-1;;;;;40573:10:0;24785:42;40573:23;;40545:51;40541:175;;;40621:17;40641:10;40649:1;40641:7;:10::i;:::-;40674;;;;:7;:10;;;;;:22;;-1:-1:-1;;;;;;40674:22:0;-1:-1:-1;;;;;40674:22:0;;;;;;;;;;-1:-1:-1;40541:175:0;40517:3;;40458:273;;;-1:-1:-1;40785:1:0;40774:12;40747:24;:39;-1:-1:-1;;39731:1074:0:o;47803:108::-;47863:13;47896:7;47889:14;;;;;:::i;20065:723::-;20121:13;20342:10;20338:53;;-1:-1:-1;;20369:10:0;;;;;;;;;;;;-1:-1:-1;;;20369:10:0;;;;;20065:723::o;20338:53::-;20416:5;20401:12;20457:78;20464:9;;20457:78;;20490:8;;;;:::i;:::-;;-1:-1:-1;20513:10:0;;-1:-1:-1;20521:2:0;20513:10;;:::i;:::-;;;20457:78;;;20545:19;20577:6;20567:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20567:17:0;;20545:39;;20595:154;20602:10;;20595:154;;20629:11;20639:1;20629:11;;:::i;:::-;;-1:-1:-1;20698:10:0;20706:2;20698:5;:10;:::i;:::-;20685:24;;:2;:24;:::i;:::-;20672:39;;20655:6;20662;20655:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;20726:11:0;20735:2;20726:11;;:::i;:::-;;;20595:154;;31398:1285;31568:12;;-1:-1:-1;;;;;31595:16:0;;31591:48;;31620:19;;-1:-1:-1;;;31620:19:0;;;;;;;;;;;31591:48;-1:-1:-1;;;;;31654:15:0;;24785:42;31654:15;31650:47;;;31678:19;;-1:-1:-1;;;31678:19:0;;;;;;;;;;;31650:47;31712:13;31708:44;;31734:18;;-1:-1:-1;;;31734:18:0;;;;;;;;;;;31708:44;-1:-1:-1;;;;;32079:13:0;;;;;;:9;:13;;;;;;;;:25;;;;;;32121:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;32121:26:0;;;;;;;32129:12;;32216:332;32236:8;32232:1;:12;32216:332;;;32275:38;;32300:12;;-1:-1:-1;;;;;32275:38:0;;;32292:1;;32275:38;;32292:1;;32275:38;32336:4;32332:166;;;32370:59;32401:1;32405:2;32409:12;32423:5;32370:22;:59::i;:::-;32365:113;;32438:40;;-1:-1:-1;;;32438:40:0;;;;;;;;;;;32365:113;32518:14;;;;;32246:3;32216:332;;;-1:-1:-1;32564:12:0;:27;32615:60;49611:760;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1759:154::-;-1:-1:-1;;;;;1838:5:1;1834:54;1827:5;1824:65;1814:93;;1903:1;1900;1893:12;1918:315;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;2223:2;2208:18;;;;2195:32;;-1:-1:-1;;;1918:315:1:o;2238:366::-;2300:8;2310:6;2364:3;2357:4;2349:6;2345:17;2341:27;2331:55;;2382:1;2379;2372:12;2331:55;-1:-1:-1;2405:20:1;;2448:18;2437:30;;2434:50;;;2480:1;2477;2470:12;2434:50;2517:4;2509:6;2505:17;2493:29;;2577:3;2570:4;2560:6;2557:1;2553:14;2545:6;2541:27;2537:38;2534:47;2531:67;;;2594:1;2591;2584:12;2531:67;2238:366;;;;;:::o;2609:769::-;2729:6;2737;2745;2753;2806:2;2794:9;2785:7;2781:23;2777:32;2774:52;;;2822:1;2819;2812:12;2774:52;2862:9;2849:23;2891:18;2932:2;2924:6;2921:14;2918:34;;;2948:1;2945;2938:12;2918:34;2987:69;3048:7;3039:6;3028:9;3024:22;2987:69;:::i;:::-;3075:8;;-1:-1:-1;2961:95:1;-1:-1:-1;3163:2:1;3148:18;;3135:32;;-1:-1:-1;3179:16:1;;;3176:36;;;3208:1;3205;3198:12;3176:36;;3247:71;3310:7;3299:8;3288:9;3284:24;3247:71;:::i;:::-;2609:769;;;;-1:-1:-1;3337:8:1;-1:-1:-1;;;;2609:769:1:o;3565:456::-;3642:6;3650;3658;3711:2;3699:9;3690:7;3686:23;3682:32;3679:52;;;3727:1;3724;3717:12;3679:52;3766:9;3753:23;3785:31;3810:5;3785:31;:::i;:::-;3835:5;-1:-1:-1;3892:2:1;3877:18;;3864:32;3905:33;3864:32;3905:33;:::i;:::-;3565:456;;3957:7;;-1:-1:-1;;;4011:2:1;3996:18;;;;3983:32;;3565:456::o;4026:159::-;4093:20;;4153:6;4142:18;;4132:29;;4122:57;;4175:1;4172;4165:12;4122:57;4026:159;;;:::o;4190:391::-;4265:6;4273;4281;4334:2;4322:9;4313:7;4309:23;4305:32;4302:52;;;4350:1;4347;4340:12;4302:52;4389:9;4376:23;4408:31;4433:5;4408:31;:::i;:::-;4458:5;-1:-1:-1;4482:37:1;4515:2;4500:18;;4482:37;:::i;:::-;4472:47;;4538:37;4571:2;4560:9;4556:18;4538:37;:::i;:::-;4528:47;;4190:391;;;;;:::o;5373:127::-;5434:10;5429:3;5425:20;5422:1;5415:31;5465:4;5462:1;5455:15;5489:4;5486:1;5479:15;5505:275;5576:2;5570:9;5641:2;5622:13;;-1:-1:-1;;5618:27:1;5606:40;;5676:18;5661:34;;5697:22;;;5658:62;5655:88;;;5723:18;;:::i;:::-;5759:2;5752:22;5505:275;;-1:-1:-1;5505:275:1:o;5785:407::-;5850:5;5884:18;5876:6;5873:30;5870:56;;;5906:18;;:::i;:::-;5944:57;5989:2;5968:15;;-1:-1:-1;;5964:29:1;5995:4;5960:40;5944:57;:::i;:::-;5935:66;;6024:6;6017:5;6010:21;6064:3;6055:6;6050:3;6046:16;6043:25;6040:45;;;6081:1;6078;6071:12;6040:45;6130:6;6125:3;6118:4;6111:5;6107:16;6094:43;6184:1;6177:4;6168:6;6161:5;6157:18;6153:29;6146:40;5785:407;;;;;:::o;6197:451::-;6266:6;6319:2;6307:9;6298:7;6294:23;6290:32;6287:52;;;6335:1;6332;6325:12;6287:52;6375:9;6362:23;6408:18;6400:6;6397:30;6394:50;;;6440:1;6437;6430:12;6394:50;6463:22;;6516:4;6508:13;;6504:27;-1:-1:-1;6494:55:1;;6545:1;6542;6535:12;6494:55;6568:74;6634:7;6629:2;6616:16;6611:2;6607;6603:11;6568:74;:::i;6842:247::-;6901:6;6954:2;6942:9;6933:7;6929:23;6925:32;6922:52;;;6970:1;6967;6960:12;6922:52;7009:9;6996:23;7028:31;7053:5;7028:31;:::i;7094:716::-;7147:5;7200:3;7193:4;7185:6;7181:17;7177:27;7167:55;;7218:1;7215;7208:12;7167:55;7254:6;7241:20;7280:4;7303:18;7299:2;7296:26;7293:52;;;7325:18;;:::i;:::-;7371:2;7368:1;7364:10;7394:28;7418:2;7414;7410:11;7394:28;:::i;:::-;7456:15;;;7526;;;7522:24;;;7487:12;;;;7558:15;;;7555:35;;;7586:1;7583;7576:12;7555:35;7622:2;7614:6;7610:15;7599:26;;7634:147;7650:6;7645:3;7642:15;7634:147;;;7716:22;7734:3;7716:22;:::i;:::-;7704:35;;7667:12;;;;7759;;;;7634:147;;;7799:5;7094:716;-1:-1:-1;;;;;;;7094:716:1:o;7815:622::-;7916:6;7924;7932;7985:2;7973:9;7964:7;7960:23;7956:32;7953:52;;;8001:1;7998;7991:12;7953:52;8040:9;8027:23;8059:31;8084:5;8059:31;:::i;:::-;8109:5;-1:-1:-1;8166:2:1;8151:18;;8138:32;8179:33;8138:32;8179:33;:::i;:::-;8231:7;-1:-1:-1;8289:2:1;8274:18;;8261:32;8316:18;8305:30;;8302:50;;;8348:1;8345;8338:12;8302:50;8371:60;8423:7;8414:6;8403:9;8399:22;8371:60;:::i;:::-;8361:70;;;7815:622;;;;;:::o;8442:184::-;8500:6;8553:2;8541:9;8532:7;8528:23;8524:32;8521:52;;;8569:1;8566;8559:12;8521:52;8592:28;8610:9;8592:28;:::i;8631:346::-;8714:6;8767:2;8755:9;8746:7;8742:23;8738:32;8735:52;;;8783:1;8780;8773:12;8735:52;8823:9;8810:23;8856:18;8848:6;8845:30;8842:50;;;8888:1;8885;8878:12;8842:50;8911:60;8963:7;8954:6;8943:9;8939:22;8911:60;:::i;8982:160::-;9047:20;;9103:13;;9096:21;9086:32;;9076:60;;9132:1;9129;9122:12;9147:315;9212:6;9220;9273:2;9261:9;9252:7;9248:23;9244:32;9241:52;;;9289:1;9286;9279:12;9241:52;9328:9;9315:23;9347:31;9372:5;9347:31;:::i;:::-;9397:5;-1:-1:-1;9421:35:1;9452:2;9437:18;;9421:35;:::i;:::-;9411:45;;9147:315;;;;;:::o;9467:670::-;9546:6;9554;9562;9615:2;9603:9;9594:7;9590:23;9586:32;9583:52;;;9631:1;9628;9621:12;9583:52;9671:9;9658:23;9700:18;9741:2;9733:6;9730:14;9727:34;;;9757:1;9754;9747:12;9727:34;9795:6;9784:9;9780:22;9770:32;;9840:7;9833:4;9829:2;9825:13;9821:27;9811:55;;9862:1;9859;9852:12;9811:55;9902:2;9889:16;9928:2;9920:6;9917:14;9914:34;;;9944:1;9941;9934:12;9914:34;9991:7;9984:4;9975:6;9971:2;9967:15;9963:26;9960:39;9957:59;;;10012:1;10009;10002:12;9957:59;10043:4;10035:13;;;;-1:-1:-1;10067:6:1;-1:-1:-1;10092:39:1;;10110:20;;;-1:-1:-1;10092:39:1;:::i;10142:221::-;10184:5;10237:3;10230:4;10222:6;10218:17;10214:27;10204:55;;10255:1;10252;10245:12;10204:55;10277:80;10353:3;10344:6;10331:20;10324:4;10316:6;10312:17;10277:80;:::i;10368:665::-;10463:6;10471;10479;10487;10540:3;10528:9;10519:7;10515:23;10511:33;10508:53;;;10557:1;10554;10547:12;10508:53;10596:9;10583:23;10615:31;10640:5;10615:31;:::i;:::-;10665:5;-1:-1:-1;10722:2:1;10707:18;;10694:32;10735:33;10694:32;10735:33;:::i;:::-;10787:7;-1:-1:-1;10841:2:1;10826:18;;10813:32;;-1:-1:-1;10896:2:1;10881:18;;10868:32;10923:18;10912:30;;10909:50;;;10955:1;10952;10945:12;10909:50;10978:49;11019:7;11010:6;10999:9;10995:22;10978:49;:::i;:::-;10968:59;;;10368:665;;;;;;;:::o;11038:792::-;11175:6;11183;11191;11244:2;11232:9;11223:7;11219:23;11215:32;11212:52;;;11260:1;11257;11250:12;11212:52;11299:9;11286:23;11318:31;11343:5;11318:31;:::i;:::-;11368:5;-1:-1:-1;11424:2:1;11409:18;;11396:32;11447:18;11477:14;;;11474:34;;;11504:1;11501;11494:12;11474:34;11542:6;11531:9;11527:22;11517:32;;11587:7;11580:4;11576:2;11572:13;11568:27;11558:55;;11609:1;11606;11599:12;11558:55;11649:2;11636:16;11675:2;11667:6;11664:14;11661:34;;;11691:1;11688;11681:12;11661:34;11744:7;11739:2;11729:6;11726:1;11722:14;11718:2;11714:23;11710:32;11707:45;11704:65;;;11765:1;11762;11755:12;11704:65;11796:2;11792;11788:11;11778:21;;11818:6;11808:16;;;;;11038:792;;;;;:::o;11835:504::-;11927:6;11935;11943;11996:2;11984:9;11975:7;11971:23;11967:32;11964:52;;;12012:1;12009;12002:12;11964:52;12052:9;12039:23;12085:18;12077:6;12074:30;12071:50;;;12117:1;12114;12107:12;12071:50;12156:69;12217:7;12208:6;12197:9;12193:22;12156:69;:::i;:::-;12244:8;;-1:-1:-1;12130:95:1;-1:-1:-1;12298:35:1;;-1:-1:-1;12329:2:1;12314:18;;12298:35;:::i;12344:593::-;12437:6;12445;12453;12506:2;12494:9;12485:7;12481:23;12477:32;12474:52;;;12522:1;12519;12512:12;12474:52;12561:9;12548:23;12611:4;12604:5;12600:16;12593:5;12590:27;12580:55;;12631:1;12628;12621:12;12580:55;12654:5;-1:-1:-1;12710:2:1;12695:18;;12682:32;12737:18;12726:30;;12723:50;;;12769:1;12766;12759:12;12723:50;12808:69;12869:7;12860:6;12849:9;12845:22;12808:69;:::i;:::-;12344:593;;12896:8;;-1:-1:-1;12782:95:1;;-1:-1:-1;;;;12344:593:1:o;12942:401::-;13143:2;13132:9;13125:21;13106:4;13163:45;13204:2;13193:9;13189:18;13181:6;13163:45;:::i;:::-;13227:6;13269:15;;;13264:2;13249:18;;13242:43;13321:15;;;;13316:2;13301:18;;;13294:43;13155:53;12942:401;-1:-1:-1;;12942:401:1:o;13348:388::-;13416:6;13424;13477:2;13465:9;13456:7;13452:23;13448:32;13445:52;;;13493:1;13490;13483:12;13445:52;13532:9;13519:23;13551:31;13576:5;13551:31;:::i;:::-;13601:5;-1:-1:-1;13658:2:1;13643:18;;13630:32;13671:33;13630:32;13671:33;:::i;:::-;13723:7;13713:17;;;13348:388;;;;;:::o;13741:842::-;13860:6;13868;13876;13884;13937:3;13925:9;13916:7;13912:23;13908:33;13905:53;;;13954:1;13951;13944:12;13905:53;13993:9;13980:23;14012:31;14037:5;14012:31;:::i;:::-;14062:5;-1:-1:-1;14119:2:1;14104:18;;14091:32;14132:33;14091:32;14132:33;:::i;:::-;14184:7;-1:-1:-1;14242:2:1;14227:18;;14214:32;14265:18;14295:14;;;14292:34;;;14322:1;14319;14312:12;14292:34;14345:60;14397:7;14388:6;14377:9;14373:22;14345:60;:::i;:::-;14335:70;;14458:2;14447:9;14443:18;14430:32;14414:48;;14487:2;14477:8;14474:16;14471:36;;;14503:1;14500;14493:12;14471:36;;14526:51;14569:7;14558:8;14547:9;14543:24;14526:51;:::i;14588:380::-;14667:1;14663:12;;;;14710;;;14731:61;;14785:4;14777:6;14773:17;14763:27;;14731:61;14838:2;14830:6;14827:14;14807:18;14804:38;14801:161;;;14884:10;14879:3;14875:20;14872:1;14865:31;14919:4;14916:1;14909:15;14947:4;14944:1;14937:15;14801:161;;14588:380;;;:::o;15334:127::-;15395:10;15390:3;15386:20;15383:1;15376:31;15426:4;15423:1;15416:15;15450:4;15447:1;15440:15;15466:127;15527:10;15522:3;15518:20;15515:1;15508:31;15558:4;15555:1;15548:15;15582:4;15579:1;15572:15;15598:197;15636:3;15664:6;15705:2;15698:5;15694:14;15732:2;15723:7;15720:15;15717:41;;;15738:18;;:::i;:::-;15787:1;15774:15;;15598:197;-1:-1:-1;;;15598:197:1:o;15800:224::-;15839:3;15867:6;15900:2;15897:1;15893:10;15930:2;15927:1;15923:10;15961:3;15957:2;15953:12;15948:3;15945:21;15942:47;;;15969:18;;:::i;:::-;16005:13;;15800:224;-1:-1:-1;;;;15800:224:1:o;16029:135::-;16068:3;-1:-1:-1;;16089:17:1;;16086:43;;;16109:18;;:::i;:::-;-1:-1:-1;16156:1:1;16145:13;;16029:135::o;16169:522::-;16247:4;16253:6;16313:11;16300:25;16407:2;16403:7;16392:8;16376:14;16372:29;16368:43;16348:18;16344:68;16334:96;;16426:1;16423;16416:12;16334:96;16453:33;;16505:20;;;-1:-1:-1;16548:18:1;16537:30;;16534:50;;;16580:1;16577;16570:12;16534:50;16613:4;16601:17;;-1:-1:-1;16644:14:1;16640:27;;;16630:38;;16627:58;;;16681:1;16678;16671:12;16696:643;16865:2;16917:21;;;16987:13;;16890:18;;;17009:22;;;16836:4;;16865:2;17088:15;;;;17062:2;17047:18;;;16836:4;17131:182;17145:6;17142:1;17139:13;17131:182;;;17210:13;;17225:6;17206:26;17194:39;;17288:15;;;;17253:12;;;;17167:1;17160:9;17131:182;;;-1:-1:-1;17330:3:1;;16696:643;-1:-1:-1;;;;;;16696:643:1:o;17344:217::-;17383:4;17412:6;17468:10;;;;17438;;17490:12;;;17487:38;;;17505:18;;:::i;:::-;17542:13;;17344:217;-1:-1:-1;;;17344:217:1:o;17566:529::-;17665:6;17718:2;17706:9;17697:7;17693:23;17689:32;17686:52;;;17734:1;17731;17724:12;17686:52;17767:2;17761:9;17809:2;17801:6;17797:15;17878:6;17866:10;17863:22;17842:18;17830:10;17827:34;17824:62;17821:88;;;17889:18;;:::i;:::-;17925:2;17918:22;17964:28;17982:9;17964:28;:::i;:::-;17956:6;17949:44;18026:37;18059:2;18048:9;18044:18;18026:37;:::i;:::-;18021:2;18009:15;;18002:62;18013:6;17566:529;-1:-1:-1;;;17566:529:1:o;18100:128::-;18140:3;18171:1;18167:6;18164:1;18161:13;18158:39;;;18177:18;;:::i;:::-;-1:-1:-1;18213:9:1;;18100:128::o;18233:637::-;18513:3;18551:6;18545:13;18567:53;18613:6;18608:3;18601:4;18593:6;18589:17;18567:53;:::i;:::-;18683:13;;18642:16;;;;18705:57;18683:13;18642:16;18739:4;18727:17;;18705:57;:::i;:::-;18827:7;18784:20;;18813:22;;;18862:1;18851:13;;18233:637;-1:-1:-1;;;;18233:637:1:o;18875:287::-;18981:6;19034:2;19022:9;19013:7;19009:23;19005:32;19002:52;;;19050:1;19047;19040:12;19002:52;19082:9;19076:16;19101:31;19126:5;19101:31;:::i;19574:512::-;19768:4;-1:-1:-1;;;;;19878:2:1;19870:6;19866:15;19855:9;19848:34;19930:2;19922:6;19918:15;19913:2;19902:9;19898:18;19891:43;;19970:6;19965:2;19954:9;19950:18;19943:34;20013:3;20008:2;19997:9;19993:18;19986:31;20034:46;20075:3;20064:9;20060:19;20052:6;20034:46;:::i;:::-;20026:54;19574:512;-1:-1:-1;;;;;;19574:512:1:o;20091:249::-;20160:6;20213:2;20201:9;20192:7;20188:23;20184:32;20181:52;;;20229:1;20226;20219:12;20181:52;20261:9;20255:16;20280:30;20304:5;20280:30;:::i;20345:127::-;20406:10;20401:3;20397:20;20394:1;20387:31;20437:4;20434:1;20427:15;20461:4;20458:1;20451:15;20477:120;20517:1;20543;20533:35;;20548:18;;:::i;:::-;-1:-1:-1;20582:9:1;;20477:120::o;20602:125::-;20642:4;20670:1;20667;20664:8;20661:34;;;20675:18;;:::i;:::-;-1:-1:-1;20712:9:1;;20602:125::o;20732:112::-;20764:1;20790;20780:35;;20795:18;;:::i;:::-;-1:-1:-1;20829:9:1;;20732:112::o

Swarm Source

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