ETH Price: $3,248.75 (+0.24%)

Token

ApeSquad (APES)
 

Overview

Max Total Supply

91 APES

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

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

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":"AllOwnersHaveBeenSet","type":"error"},{"inputs":[],"name":"AllPostersOfTypeMinted","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":"InvalidPurchasePosterTypeId","type":"error"},{"inputs":[],"name":"InvalidUpdatePosterLengthsDontMatch","type":"error"},{"inputs":[],"name":"InvalidUpdatePosterTypeId","type":"error"},{"inputs":[],"name":"MintToDeadAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoPosterMintAmountProvided","type":"error"},{"inputs":[],"name":"NoTokensMintedYet","type":"error"},{"inputs":[],"name":"OnlyMintersCanMintPosters","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"PosterTypeQueryForNonexistentToken","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":"maxPosters","type":"uint16"}],"name":"addPoster","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":"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":"posterTypeId","type":"uint16"},{"internalType":"uint16","name":"amount","type":"uint16"}],"internalType":"struct ApeSquadPosterNFT.PosterPurchase[]","name":"posterPurchases","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"posterTypeId","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"posterRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"posterTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"posterTypes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"maxPosters","type":"uint16"},{"internalType":"uint16","name":"minted","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"posterTypeId","type":"uint16"}],"name":"postersLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokenPosterType","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":"posterTypeIds","type":"uint16[]"},{"internalType":"uint16[]","name":"maxPosters","type":"uint16[]"}],"name":"updateMaxPosters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"updateOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"posterTypeIds","type":"uint16[]"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"updatePosterNames","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"}]

60806040526001805560016008553480156200001a57600080fd5b506040516200364e3803806200364e8339810160408190526200003d91620003e9565b84846200004a3362000151565b81516200005f90600290602085019062000248565b5080516200007590600390602084019062000248565b505083516200008d9150600990602086019062000248565b50600a80546001600160a01b0319166001600160a01b03841617905560005b815181101562000118576001600b6000848481518110620000d157620000d162000529565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200010f816200053f565b915050620000ac565b50604080518082019091526008815267536561736f6e203160c01b602082015262000146906104e2620001a1565b5050505050620005a6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701926200021092849291019062000248565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b828054620002569062000569565b90600052602060002090601f0160209004810192826200027a5760008555620002c5565b82601f106200029557805160ff1916838001178555620002c5565b82800160010185558215620002c5579182015b82811115620002c5578251825591602001919060010190620002a8565b50620002d3929150620002d7565b5090565b5b80821115620002d35760008155600101620002d8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200032f576200032f620002ee565b604052919050565b600082601f8301126200034957600080fd5b81516001600160401b03811115620003655762000365620002ee565b60206200037b601f8301601f1916820162000304565b82815285828487010111156200039057600080fd5b60005b83811015620003b057858101830151828201840152820162000393565b83811115620003c25760008385840101525b5095945050505050565b80516001600160a01b0381168114620003e457600080fd5b919050565b600080600080600060a086880312156200040257600080fd5b85516001600160401b03808211156200041a57600080fd5b6200042889838a0162000337565b96506020915081880151818111156200044057600080fd5b6200044e8a828b0162000337565b9650506040880151818111156200046457600080fd5b620004728a828b0162000337565b9550506200048360608901620003cc565b93506080880151818111156200049857600080fd5b8801601f81018a13620004aa57600080fd5b805182811115620004bf57620004bf620002ee565b8060051b9250620004d284840162000304565b818152928201840192848101908c851115620004ed57600080fd5b928501925b8484101562000516576200050684620003cc565b82529285019290850190620004f2565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200056257634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200057e57607f821691505b60208210811415620005a057634e487b7160e01b600052602260045260246000fd5b50919050565b61309880620005b66000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c8063715018a61161017b578063c6b2dd9f116100d8578063df7dd9751161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063df7dd97514610593578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd1461056f578063cd86d6a014610582578063d7224ba01461058a57600080fd5b8063c6b2dd9f14610549578063c83072381461055c57600080fd5b80639b9cf33b1161012f578063b7f47d3211610114578063b7f47d3214610510578063b88d4fde14610523578063c5bdcb9f1461053657600080fd5b80639b9cf33b146104ea578063a22cb465146104fd57600080fd5b80638da5cb5b116101605780638da5cb5b146104be5780638f5ea8da146104cf57806395d89b41146104e257600080fd5b8063715018a6146104a35780638754101c146104ab57600080fd5b806330f685f01161022957806361a70469116101dd5780636b4ae1f6116101c25780636b4ae1f6146104755780636c0360eb1461048857806370a082311461049057600080fd5b806361a704691461044f5780636352211e1461046257600080fd5b806342966c681161020e57806342966c6814610416578063534778891461042957806355f804b31461043c57600080fd5b806330f685f0146103f057806342842e0e1461040357600080fd5b806318160ddd1161028057806323b872dd1161026557806323b872dd146103a857806328d55c8c146103bb5780632ef7c967146103dd57600080fd5b806318160ddd1461037f57806318d9f85f1461039557600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b3146103355780630de64d6b1461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61036d6103583660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b6103876107b8565b6040519081526020016102ec565b6103876103a336600461265a565b6107d0565b6103486103b6366004612675565b61084c565b6103ce6103c93660046125e9565b610857565b6040516102ec939291906126b6565b6103486103eb3660046126e4565b610921565b6103486103fe366004612775565b610aac565b610348610411366004612675565b610c15565b6103486104243660046125e9565b610c30565b6102fd6104373660046125e9565b610c63565b61034861044a366004612880565b610d54565b61034861045d366004612775565b610db3565b61031d6104703660046125e9565b610f24565b6103486104833660046128c9565b610f7d565b6102fd611006565b61038761049e366004612941565b611094565b6103486110d9565b6103486104b93660046129e5565b61112d565b6000546001600160a01b031661031d565b6103486104dd3660046129e5565b611223565b6102fd61123e565b6103486104f8366004612a47565b61124d565b61034861050b366004612a8c565b6112bd565b600a5461031d906001600160a01b031681565b610348610531366004612ae1565b611353565b610348610544366004612b4d565b611387565b6103486105573660046125e9565b6115ab565b61034861056a366004612bd5565b6115fc565b6102fd61057d3660046125e9565b6116b5565b600c54610387565b61038760085481565b6103486105a1366004612c20565b61173f565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612941565b611953565b6102e06105da366004612941565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610f24565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b60006107c561dead611094565b600180540303905090565b6000600c8261ffff16815481106107e9576107e9612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff168154811061082057610820612d6c565b6000918252602090912060016002909202010154610842919061ffff16612d98565b61ffff1692915050565b6107b3838383611b92565b600c818154811061086757600080fd5b906000526020600020906002020160009150905080600001805461088a90612d31565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690612d31565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b336000908152600b602052604090205460ff1661095157604051636eb6d98760e01b815260040160405180910390fd5b61ffff8116610973576040516331d1901d60e21b815260040160405180910390fd5b600154600c5461ffff84161061099c57604051630f5fbd9f60e01b815260040160405180910390fd5b6109a5836107d0565b8261ffff1611156109c957604051631855313360e01b815260040160405180910390fd5b81600c8461ffff16815481106109e1576109e1612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a0e9190612dbb565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610a875783600d600084610a4a81612de1565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610a7f90612dfc565b915050610a2b565b50610aa6848361ffff1660405180602001604052806000815250611d64565b50505050565b6000546001600160a01b03163314610af95760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b828114610b19576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610b4157610b41612d6c565b9050602002016020810190610b56919061265a565b61ffff1610610b78576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610b8e57610b8e612d6c565b9050602002810190610ba09190612e1e565b600c87878561ffff16818110610bb857610bb8612d6c565b9050602002016020810190610bcd919061265a565b61ffff1681548110610be157610be1612d6c565b60009182526020909120610bfb9360029092020191612437565b5080610c0681612dfc565b915050610b1c565b5050505050565b6107b383838360405180602001604052806000815250611353565b610c3a3382611d71565b610c575760405163871b97e160e01b815260040160405180910390fd5b610c6081611dc8565b50565b6060610c6e82611afa565b610c8b576040516331cbbc9760e01b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610cb357610cb3612d6c565b90600052602060002090600202016000018054610ccf90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfb90612d31565b8015610d485780601f10610d1d57610100808354040283529160200191610d48565b820191906000526020600020905b815481529060010190602001808311610d2b57829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610d9c5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b8051610daf9060099060208401906124bb565b5050565b6000546001600160a01b03163314610dfb5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b828114610e1b576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610e4357610e43612d6c565b9050602002016020810190610e58919061265a565b61ffff1610610e7a576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610e9057610e90612d6c565b9050602002016020810190610ea5919061265a565b600c86868461ffff16818110610ebd57610ebd612d6c565b9050602002016020810190610ed2919061265a565b61ffff1681548110610ee657610ee6612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff1602179055508080610f1c90612dfc565b915050610e1e565b6000610f2f82611afa565b610f4c57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610f745750919050565b60001901610f4e565b6000546001600160a01b03163314610fc55760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611ecc915050565b6009805461101390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461103f90612d31565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b505050505081565b60006001600160a01b0382166110bd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031633146111215760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b61112b6000611f71565b565b60005b81518161ffff1610156111c257611169335b838361ffff168151811061115857611158612d6c565b602002602001015161ffff16611d71565b61118657604051632ce44b5f60e11b815260040160405180910390fd5b6111b28484848461ffff16815181106111a1576111a1612d6c565b602002602001015161ffff1661084c565b6111bb81612dfc565b9050611130565b50816001600160a01b0316836001600160a01b03166111de3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516112169190612e65565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b60005b81518161ffff161015610daf5761126633611142565b6112835760405163871b97e160e01b815260040160405180910390fd5b6112ad828261ffff168151811061129c5761129c612d6c565b602002602001015161ffff16611dc8565b6112b681612dfc565b9050611250565b6001600160a01b0382163314156112e75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61135e848484611b92565b61136a84848484611fc1565b610aa6576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166113b757604051636eb6d98760e01b815260040160405180910390fd5b600154600090815b61ffff811684111561157257600085858361ffff168181106113e3576113e3612d6c565b9050604002018036038101906113f99190612ead565b600c54815191925061ffff9091161061142557604051630f5fbd9f60e01b815260040160405180910390fd5b61145486868461ffff1681811061143e5761143e612d6c565b6103a3926020604090920201908101915061265a565b816020015161ffff16111561147c57604051631855313360e01b815260040160405180910390fd5b8060200151600c826000015161ffff168154811061149c5761149c612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166114c99190612dbb565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff16846114f79190612f08565b935060005b816020015161ffff168161ffff16101561155d578151600d60008661152081612de1565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061155590612dfc565b9150506114fc565b5050808061156a90612dfc565b9150506113bf565b5081611591576040516331d1901d60e21b815260040160405180910390fd5b610c0e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115f35760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b610c60816120c0565b6000546001600160a01b031633146116445760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60005b82811015610aa65781600b600086868581811061166657611666612d6c565b905060200201602081019061167b9190612941565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806116ad81612de1565b915050611647565b60606116c082611afa565b6116dd57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546116ec90612d31565b905011611708576040518060200160405280600081525061064e565b6117106121da565b611719836121e9565b60405160200161172a929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146117875760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60ff831661180a5760005b81811015610aa6576001548383838181106117af576117af612d6c565b90506020020135106117c0576117f8565b600e60008484848181106117d6576117d6612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061180281612de1565b915050611792565b60005b81811015610aa65760015483838381811061182a5761182a612d6c565b905060200201351061183b57611880565b83600e600085858581811061185257611852612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b8061188a81612de1565b91505061180d565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af0565b610c6081611f71565b60005b8251811015611a9857611a423384838151811061115857611158612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611353565b611a9181612de1565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e65565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610f24565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c0e565b6107b383838360016122ff565b600080611d7d83610f24565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610f24565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f399284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610f24565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de1565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff811115612252576122526127e1565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b50600155610c0e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c6057600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610aa65750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c6057600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b803561ffff8116811461265557600080fd5b919050565b60006020828403121561266c57600080fd5b61257782612643565b60008060006060848603121561268a57600080fd5b833561269581612602565b925060208401356126a581612602565b929592945050506040919091013590565b6060815260006126c960608301866125aa565b61ffff94851660208401529290931660409091015292915050565b6000806000606084860312156126f957600080fd5b833561270481612602565b925061271260208501612643565b915061272060408501612643565b90509250925092565b60008083601f84011261273b57600080fd5b50813567ffffffffffffffff81111561275357600080fd5b6020830191508360208260051b850101111561276e57600080fd5b9250929050565b6000806000806040858703121561278b57600080fd5b843567ffffffffffffffff808211156127a357600080fd5b6127af88838901612729565b909650945060208701359150808211156127c857600080fd5b506127d587828801612729565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612820576128206127e1565b604052919050565b600067ffffffffffffffff831115612842576128426127e1565b612855601f8401601f19166020016127f7565b905082815283838301111561286957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561289257600080fd5b813567ffffffffffffffff8111156128a957600080fd5b8201601f810184136128ba57600080fd5b61194b84823560208401612828565b6000806000604084860312156128de57600080fd5b833567ffffffffffffffff808211156128f657600080fd5b818601915086601f83011261290a57600080fd5b81358181111561291957600080fd5b87602082850101111561292b57600080fd5b6020928301955093506127209186019050612643565b60006020828403121561295357600080fd5b813561257781612602565b600082601f83011261296f57600080fd5b8135602067ffffffffffffffff82111561298b5761298b6127e1565b8160051b61299a8282016127f7565b92835284810182019282810190878511156129b457600080fd5b83870192505b848310156129da576129cb83612643565b825291830191908301906129ba565b979650505050505050565b6000806000606084860312156129fa57600080fd5b8335612a0581612602565b92506020840135612a1581612602565b9150604084013567ffffffffffffffff811115612a3157600080fd5b612a3d8682870161295e565b9150509250925092565b600060208284031215612a5957600080fd5b813567ffffffffffffffff811115612a7057600080fd5b61194b8482850161295e565b8035801515811461265557600080fd5b60008060408385031215612a9f57600080fd5b8235612aaa81612602565b9150612ab860208401612a7c565b90509250929050565b600082601f830112612ad257600080fd5b61257783833560208501612828565b60008060008060808587031215612af757600080fd5b8435612b0281612602565b93506020850135612b1281612602565b925060408501359150606085013567ffffffffffffffff811115612b3557600080fd5b612b4187828801612ac1565b91505092959194509250565b600080600060408486031215612b6257600080fd5b8335612b6d81612602565b9250602084013567ffffffffffffffff80821115612b8a57600080fd5b818601915086601f830112612b9e57600080fd5b813581811115612bad57600080fd5b8760208260061b8501011115612bc257600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bea57600080fd5b833567ffffffffffffffff811115612c0157600080fd5b612c0d86828701612729565b9094509250612720905060208501612a7c565b600080600060408486031215612c3557600080fd5b833560ff81168114612c4657600080fd5b9250602084013567ffffffffffffffff811115612c6257600080fd5b612c6e86828701612729565b9497909650939450505050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161295e565b93506060870135915080821115612d2457600080fd5b50612b4187828801612ac1565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff83811690831681811015612db357612db3612d82565b039392505050565b600061ffff808316818516808303821115612dd857612dd8612d82565b01949350505050565b6000600019821415612df557612df5612d82565b5060010190565b600061ffff80831681811415612e1457612e14612d82565b6001019392505050565b6000808335601e19843603018112612e3557600080fd5b83018035915067ffffffffffffffff821115612e5057600080fd5b60200191503681900382131561276e57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612ea157835161ffff1683529284019291840191600101612e81565b50909695505050505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee26127e1565b604052612eee83612643565b8152612efc60208401612643565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122070518d2da60eaf9c13cddb2780d4621fc402a79caf02f808fb199df4bcfafba864736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f706f73746572732f0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102c85760003560e01c8063715018a61161017b578063c6b2dd9f116100d8578063df7dd9751161008c578063f2fde38b11610071578063f2fde38b146105b9578063f46eccc4146105cc578063f7a885c9146105ef57600080fd5b8063df7dd97514610593578063e985e9c5146105a657600080fd5b8063c87b56dd116100bd578063c87b56dd1461056f578063cd86d6a014610582578063d7224ba01461058a57600080fd5b8063c6b2dd9f14610549578063c83072381461055c57600080fd5b80639b9cf33b1161012f578063b7f47d3211610114578063b7f47d3214610510578063b88d4fde14610523578063c5bdcb9f1461053657600080fd5b80639b9cf33b146104ea578063a22cb465146104fd57600080fd5b80638da5cb5b116101605780638da5cb5b146104be5780638f5ea8da146104cf57806395d89b41146104e257600080fd5b8063715018a6146104a35780638754101c146104ab57600080fd5b806330f685f01161022957806361a70469116101dd5780636b4ae1f6116101c25780636b4ae1f6146104755780636c0360eb1461048857806370a082311461049057600080fd5b806361a704691461044f5780636352211e1461046257600080fd5b806342966c681161020e57806342966c6814610416578063534778891461042957806355f804b31461043c57600080fd5b806330f685f0146103f057806342842e0e1461040357600080fd5b806318160ddd1161028057806323b872dd1161026557806323b872dd146103a857806328d55c8c146103bb5780632ef7c967146103dd57600080fd5b806318160ddd1461037f57806318d9f85f1461039557600080fd5b8063081812fc116102b1578063081812fc1461030a578063095ea7b3146103355780630de64d6b1461034a57600080fd5b806301ffc9a7146102cd57806306fdde03146102f5575b600080fd5b6102e06102db36600461255a565b610602565b60405190151581526020015b60405180910390f35b6102fd610654565b6040516102ec91906125d6565b61031d6103183660046125e9565b6106e6565b6040516001600160a01b0390911681526020016102ec565b610348610343366004612617565b61072a565b005b61036d6103583660046125e9565b600e6020526000908152604090205460ff1681565b60405160ff90911681526020016102ec565b6103876107b8565b6040519081526020016102ec565b6103876103a336600461265a565b6107d0565b6103486103b6366004612675565b61084c565b6103ce6103c93660046125e9565b610857565b6040516102ec939291906126b6565b6103486103eb3660046126e4565b610921565b6103486103fe366004612775565b610aac565b610348610411366004612675565b610c15565b6103486104243660046125e9565b610c30565b6102fd6104373660046125e9565b610c63565b61034861044a366004612880565b610d54565b61034861045d366004612775565b610db3565b61031d6104703660046125e9565b610f24565b6103486104833660046128c9565b610f7d565b6102fd611006565b61038761049e366004612941565b611094565b6103486110d9565b6103486104b93660046129e5565b61112d565b6000546001600160a01b031661031d565b6103486104dd3660046129e5565b611223565b6102fd61123e565b6103486104f8366004612a47565b61124d565b61034861050b366004612a8c565b6112bd565b600a5461031d906001600160a01b031681565b610348610531366004612ae1565b611353565b610348610544366004612b4d565b611387565b6103486105573660046125e9565b6115ab565b61034861056a366004612bd5565b6115fc565b6102fd61057d3660046125e9565b6116b5565b600c54610387565b61038760085481565b6103486105a1366004612c20565b61173f565b6102e06105b4366004612c7b565b611892565b6103486105c7366004612941565b611953565b6102e06105da366004612941565b600b6020526000908152604090205460ff1681565b6103486105fd366004612cb4565b611a20565b60006001600160e01b031982166380ac58cd60e01b148061063357506001600160e01b03198216635b5e139f60e01b145b8061064e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461066390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90612d31565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611afa565b61070e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061073582610f24565b9050806001600160a01b0316836001600160a01b0316141561076a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061078a57506107888133611892565b155b156107a8576040516367d9dca160e11b815260040160405180910390fd5b6107b3838383611b36565b505050565b60006107c561dead611094565b600180540303905090565b6000600c8261ffff16815481106107e9576107e9612d6c565b906000526020600020906002020160010160029054906101000a900461ffff16600c8361ffff168154811061082057610820612d6c565b6000918252602090912060016002909202010154610842919061ffff16612d98565b61ffff1692915050565b6107b3838383611b92565b600c818154811061086757600080fd5b906000526020600020906002020160009150905080600001805461088a90612d31565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690612d31565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b5050506001909301549192505061ffff808216916201000090041683565b336000908152600b602052604090205460ff1661095157604051636eb6d98760e01b815260040160405180910390fd5b61ffff8116610973576040516331d1901d60e21b815260040160405180910390fd5b600154600c5461ffff84161061099c57604051630f5fbd9f60e01b815260040160405180910390fd5b6109a5836107d0565b8261ffff1611156109c957604051631855313360e01b815260040160405180910390fd5b81600c8461ffff16815481106109e1576109e1612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff16610a0e9190612dbb565b92506101000a81548161ffff021916908361ffff16021790555060005b8261ffff168161ffff161015610a875783600d600084610a4a81612de1565b9550815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610a7f90612dfc565b915050610a2b565b50610aa6848361ffff1660405180602001604052806000815250611d64565b50505050565b6000546001600160a01b03163314610af95760405162461bcd60e51b8152602060048201819052602482015260008051602061304383398151915260448201526064015b60405180910390fd5b828114610b19576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610b4157610b41612d6c565b9050602002016020810190610b56919061265a565b61ffff1610610b78576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610b8e57610b8e612d6c565b9050602002810190610ba09190612e1e565b600c87878561ffff16818110610bb857610bb8612d6c565b9050602002016020810190610bcd919061265a565b61ffff1681548110610be157610be1612d6c565b60009182526020909120610bfb9360029092020191612437565b5080610c0681612dfc565b915050610b1c565b5050505050565b6107b383838360405180602001604052806000815250611353565b610c3a3382611d71565b610c575760405163871b97e160e01b815260040160405180910390fd5b610c6081611dc8565b50565b6060610c6e82611afa565b610c8b576040516331cbbc9760e01b815260040160405180910390fd5b6000828152600d6020526040902054600c8054909161ffff16908110610cb357610cb3612d6c565b90600052602060002090600202016000018054610ccf90612d31565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfb90612d31565b8015610d485780601f10610d1d57610100808354040283529160200191610d48565b820191906000526020600020905b815481529060010190602001808311610d2b57829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610d9c5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b8051610daf9060099060208401906124bb565b5050565b6000546001600160a01b03163314610dfb5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b828114610e1b576040516321d3252f60e21b815260040160405180910390fd5b60005b61ffff8116841115610c0e57600c54858561ffff8416818110610e4357610e43612d6c565b9050602002016020810190610e58919061265a565b61ffff1610610e7a576040516330ad51cb60e01b815260040160405180910390fd5b82828261ffff16818110610e9057610e90612d6c565b9050602002016020810190610ea5919061265a565b600c86868461ffff16818110610ebd57610ebd612d6c565b9050602002016020810190610ed2919061265a565b61ffff1681548110610ee657610ee6612d6c565b906000526020600020906002020160010160006101000a81548161ffff021916908361ffff1602179055508080610f1c90612dfc565b915050610e1e565b6000610f2f82611afa565b610f4c57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610f745750919050565b60001901610f4e565b6000546001600160a01b03163314610fc55760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6107b383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611ecc915050565b6009805461101390612d31565b80601f016020809104026020016040519081016040528092919081815260200182805461103f90612d31565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b505050505081565b60006001600160a01b0382166110bd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031633146111215760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b61112b6000611f71565b565b60005b81518161ffff1610156111c257611169335b838361ffff168151811061115857611158612d6c565b602002602001015161ffff16611d71565b61118657604051632ce44b5f60e11b815260040160405180910390fd5b6111b28484848461ffff16815181106111a1576111a1612d6c565b602002602001015161ffff1661084c565b6111bb81612dfc565b9050611130565b50816001600160a01b0316836001600160a01b03166111de3390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d204846040516112169190612e65565b60405180910390a4505050565b6107b383838360405180602001604052806000815250611a20565b60606003805461066390612d31565b60005b81518161ffff161015610daf5761126633611142565b6112835760405163871b97e160e01b815260040160405180910390fd5b6112ad828261ffff168151811061129c5761129c612d6c565b602002602001015161ffff16611dc8565b6112b681612dfc565b9050611250565b6001600160a01b0382163314156112e75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61135e848484611b92565b61136a84848484611fc1565b610aa6576040516368d2bf6b60e11b815260040160405180910390fd5b336000908152600b602052604090205460ff166113b757604051636eb6d98760e01b815260040160405180910390fd5b600154600090815b61ffff811684111561157257600085858361ffff168181106113e3576113e3612d6c565b9050604002018036038101906113f99190612ead565b600c54815191925061ffff9091161061142557604051630f5fbd9f60e01b815260040160405180910390fd5b61145486868461ffff1681811061143e5761143e612d6c565b6103a3926020604090920201908101915061265a565b816020015161ffff16111561147c57604051631855313360e01b815260040160405180910390fd5b8060200151600c826000015161ffff168154811061149c5761149c612d6c565b906000526020600020906002020160010160028282829054906101000a900461ffff166114c99190612dbb565b92506101000a81548161ffff021916908361ffff160217905550806020015161ffff16846114f79190612f08565b935060005b816020015161ffff168161ffff16101561155d578151600d60008661152081612de1565b9750815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808061155590612dfc565b9150506114fc565b5050808061156a90612dfc565b9150506113bf565b5081611591576040516331d1901d60e21b815260040160405180910390fd5b610c0e858360405180602001604052806000815250611d64565b6000546001600160a01b031633146115f35760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b610c60816120c0565b6000546001600160a01b031633146116445760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60005b82811015610aa65781600b600086868581811061166657611666612d6c565b905060200201602081019061167b9190612941565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806116ad81612de1565b915050611647565b60606116c082611afa565b6116dd57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546116ec90612d31565b905011611708576040518060200160405280600081525061064e565b6117106121da565b611719836121e9565b60405160200161172a929190612f20565b60405160208183030381529060405292915050565b6000546001600160a01b031633146117875760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b60ff831661180a5760005b81811015610aa6576001548383838181106117af576117af612d6c565b90506020020135106117c0576117f8565b600e60008484848181106117d6576117d6612d6c565b60209081029290920135835250810191909152604001600020805460ff191690555b8061180281612de1565b915050611792565b60005b81811015610aa65760015483838381811061182a5761182a612d6c565b905060200201351061183b57611880565b83600e600085858581811061185257611852612d6c565b90506020020135815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b8061188a81612de1565b91505061180d565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190612f77565b6001600160a01b0316141561192157600191505061064e565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b0316331461199b5760405162461bcd60e51b815260206004820181905260248201526000805160206130438339815191526044820152606401610af0565b6001600160a01b038116611a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af0565b610c6081611f71565b60005b8251811015611a9857611a423384838151811061115857611158612d6c565b611a5f57604051632ce44b5f60e11b815260040160405180910390fd5b611a888585858481518110611a7657611a76612d6c565b602002602001015161ffff1685611353565b611a9181612de1565b9050611a23565b50826001600160a01b0316846001600160a01b0316611ab43390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20485604051611aec9190612e65565b60405180910390a450505050565b60008082118015611b0c575060015482105b801561064e57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9d82610f24565b90506000336001600160a01b0383161480611bbd5750611bbd8233611892565b80611bd8575033611bcd846106e6565b6001600160a01b0316145b905080611bf857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611c295760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead1415611c7c57604051630278d60f60e11b815260040160405180910390fd5b611c8860008484611b36565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b0319169091179055908601808352912054909116611d1d57600154811015611d1d57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c0e565b6107b383838360016122ff565b600080611d7d83610f24565b9050806001600160a01b0316846001600160a01b03161480611db85750836001600160a01b0316611dad846106e6565b6001600160a01b0316145b8061194b575061194b8185611892565b6000611dd382610f24565b9050611de160008383611b36565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead179055908501808352912054909116611e8f57600154811015611e8f57600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60408051606081018252600091810182905283815261ffff8316602080830191909152600c80546001810182559352815180519293849360029091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70192611f399284929101906124bb565b5060208201516001909101805460409093015161ffff908116620100000263ffffffff19909416921691909117919091179055505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156120b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612005903390899088908890600401612f94565b6020604051808303816000875af1925050508015612040575060408051601f3d908101601f1916820190925261203d91810190612fd0565b60015b61209b573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b508051612093576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061194b565b506001949350505050565b806120de576040516356be441560e01b815260040160405180910390fd5b600154600114156121025760405163c0367cab60e01b815260040160405180910390fd5b600854600154811061212757604051630a596e2160e21b815260040160405180910390fd5b60015482820160001981019110156121425750600154600019015b815b8181116121cf576000818152600460205260409020546001600160a01b031615801561218957506000818152600460205260409020546001600160a01b031661dead14155b156121c757600061219982610f24565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101612144565b506001016008555050565b60606009805461066390612d31565b60608161220d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612237578061222181612de1565b91506122309050600a83613003565b9150612211565b60008167ffffffffffffffff811115612252576122526127e1565b6040519080825280601f01601f19166020018201604052801561227c576020820181803683370190505b5090505b841561194b57612291600183613017565b915061229e600a8661302e565b6122a9906030612f08565b60f81b8183815181106122be576122be612d6c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122f8600a86613003565b9450612280565b6001546001600160a01b03851661232857604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead141561235457604051631617320f60e01b815260040160405180910390fd5b836123725760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b8581101561242e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612422576124056000888488611fc1565b612422576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016123b2565b50600155610c0e565b82805461244390612d31565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e5782800160ff198235161785556124ab565b828001600101855582156124ab579182015b828111156124ab578235825591602001919060010190612490565b506124b792915061252f565b5090565b8280546124c790612d31565b90600052602060002090601f0160209004810192826124e957600085556124ab565b82601f1061250257805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612514565b5b808211156124b75760008155600101612530565b6001600160e01b031981168114610c6057600080fd5b60006020828403121561256c57600080fd5b813561257781612544565b9392505050565b60005b83811015612599578181015183820152602001612581565b83811115610aa65750506000910152565b600081518084526125c281602086016020860161257e565b601f01601f19169290920160200192915050565b60208152600061257760208301846125aa565b6000602082840312156125fb57600080fd5b5035919050565b6001600160a01b0381168114610c6057600080fd5b6000806040838503121561262a57600080fd5b823561263581612602565b946020939093013593505050565b803561ffff8116811461265557600080fd5b919050565b60006020828403121561266c57600080fd5b61257782612643565b60008060006060848603121561268a57600080fd5b833561269581612602565b925060208401356126a581612602565b929592945050506040919091013590565b6060815260006126c960608301866125aa565b61ffff94851660208401529290931660409091015292915050565b6000806000606084860312156126f957600080fd5b833561270481612602565b925061271260208501612643565b915061272060408501612643565b90509250925092565b60008083601f84011261273b57600080fd5b50813567ffffffffffffffff81111561275357600080fd5b6020830191508360208260051b850101111561276e57600080fd5b9250929050565b6000806000806040858703121561278b57600080fd5b843567ffffffffffffffff808211156127a357600080fd5b6127af88838901612729565b909650945060208701359150808211156127c857600080fd5b506127d587828801612729565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612820576128206127e1565b604052919050565b600067ffffffffffffffff831115612842576128426127e1565b612855601f8401601f19166020016127f7565b905082815283838301111561286957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561289257600080fd5b813567ffffffffffffffff8111156128a957600080fd5b8201601f810184136128ba57600080fd5b61194b84823560208401612828565b6000806000604084860312156128de57600080fd5b833567ffffffffffffffff808211156128f657600080fd5b818601915086601f83011261290a57600080fd5b81358181111561291957600080fd5b87602082850101111561292b57600080fd5b6020928301955093506127209186019050612643565b60006020828403121561295357600080fd5b813561257781612602565b600082601f83011261296f57600080fd5b8135602067ffffffffffffffff82111561298b5761298b6127e1565b8160051b61299a8282016127f7565b92835284810182019282810190878511156129b457600080fd5b83870192505b848310156129da576129cb83612643565b825291830191908301906129ba565b979650505050505050565b6000806000606084860312156129fa57600080fd5b8335612a0581612602565b92506020840135612a1581612602565b9150604084013567ffffffffffffffff811115612a3157600080fd5b612a3d8682870161295e565b9150509250925092565b600060208284031215612a5957600080fd5b813567ffffffffffffffff811115612a7057600080fd5b61194b8482850161295e565b8035801515811461265557600080fd5b60008060408385031215612a9f57600080fd5b8235612aaa81612602565b9150612ab860208401612a7c565b90509250929050565b600082601f830112612ad257600080fd5b61257783833560208501612828565b60008060008060808587031215612af757600080fd5b8435612b0281612602565b93506020850135612b1281612602565b925060408501359150606085013567ffffffffffffffff811115612b3557600080fd5b612b4187828801612ac1565b91505092959194509250565b600080600060408486031215612b6257600080fd5b8335612b6d81612602565b9250602084013567ffffffffffffffff80821115612b8a57600080fd5b818601915086601f830112612b9e57600080fd5b813581811115612bad57600080fd5b8760208260061b8501011115612bc257600080fd5b6020830194508093505050509250925092565b600080600060408486031215612bea57600080fd5b833567ffffffffffffffff811115612c0157600080fd5b612c0d86828701612729565b9094509250612720905060208501612a7c565b600080600060408486031215612c3557600080fd5b833560ff81168114612c4657600080fd5b9250602084013567ffffffffffffffff811115612c6257600080fd5b612c6e86828701612729565b9497909650939450505050565b60008060408385031215612c8e57600080fd5b8235612c9981612602565b91506020830135612ca981612602565b809150509250929050565b60008060008060808587031215612cca57600080fd5b8435612cd581612602565b93506020850135612ce581612602565b9250604085013567ffffffffffffffff80821115612d0257600080fd5b612d0e8883890161295e565b93506060870135915080821115612d2457600080fd5b50612b4187828801612ac1565b600181811c90821680612d4557607f821691505b60208210811415612d6657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff83811690831681811015612db357612db3612d82565b039392505050565b600061ffff808316818516808303821115612dd857612dd8612d82565b01949350505050565b6000600019821415612df557612df5612d82565b5060010190565b600061ffff80831681811415612e1457612e14612d82565b6001019392505050565b6000808335601e19843603018112612e3557600080fd5b83018035915067ffffffffffffffff821115612e5057600080fd5b60200191503681900382131561276e57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015612ea157835161ffff1683529284019291840191600101612e81565b50909695505050505050565b600060408284031215612ebf57600080fd5b6040516040810181811067ffffffffffffffff82111715612ee257612ee26127e1565b604052612eee83612643565b8152612efc60208401612643565b60208201529392505050565b60008219821115612f1b57612f1b612d82565b500190565b60008351612f3281846020880161257e565b835190830190612f4681836020880161257e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600060208284031215612f8957600080fd5b815161257781612602565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612fc660808301846125aa565b9695505050505050565b600060208284031215612fe257600080fd5b815161257781612544565b634e487b7160e01b600052601260045260246000fd5b60008261301257613012612fed565b500490565b60008282101561302957613029612d82565b500390565b60008261303d5761303d612fed565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122070518d2da60eaf9c13cddb2780d4621fc402a79caf02f808fb199df4bcfafba864736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000008417065537175616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044150455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f68747470733a2f2f717478613465377a786b2e657865637574652d6170692e75732d656173742d312e616d617a6f6e6177732e636f6d2f706f73746572732f0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ab6b9c8ed19a464722198e8f4ef113e10c298b8

-----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/posters/
Arg [3] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [4] : _minters (address[]): 0x6AB6B9C8ed19A464722198E8f4ef113E10c298B8

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


Deployed Bytecode Sourcemap

53744:7755: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;:::-;;54576:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2410:4:1;2398:17;;;2380:36;;2368:2;2353:18;54576:45:0;2238:184:1;25028:289:0;;;:::i;:::-;;;2573:25:1;;;2561:2;2546:18;25028:289:0;2427:177:1;55308:169:0;;;;;;:::i;:::-;;:::i;28838:170::-;;;;;;:::i;:::-;;:::i;54347:31::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;58151:656::-;;;;;;:::i;:::-;;:::i;59757:432::-;;;;;;:::i;:::-;;:::i;29079:185::-;;;;;;:::i;:::-;;:::i;41292:176::-;;;;;;:::i;:::-;;:::i;55559:229::-;;;;;;:::i;:::-;;:::i;58882:106::-;;;;;;:::i;:::-;;:::i;60251:452::-;;;;;;:::i;:::-;;:::i;26014:407::-;;;;;;:::i;:::-;;:::i;59572:126::-;;;;;;:::i;:::-;;:::i;54147:21::-;;;:::i;25758:194::-;;;;;;:::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;41829:273::-;;;;;;:::i;:::-;;:::i;28249:287::-;;;;;;:::i;:::-;;:::i;54215:42::-;;;;;-1:-1:-1;;;;;54215:42:0;;;29335:316;;;;;;:::i;:::-;;:::i;57139:931::-;;;;;;:::i;:::-;;:::i;61390:106::-;;;;;;:::i;:::-;;:::i;59059:201::-;;;;;;:::i;:::-;;:::i;56677:381::-;;;;;;:::i;:::-;;:::i;55142:101::-;55217:11;:18;55142:101;;39575:43;;;;;;60785:521;;;;;;:::i;:::-;;:::i;55900:508::-;;;;;;:::i;:::-;;:::i;2971:201::-;;;;;;:::i;:::-;;:::i;54299: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;55900: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;25028:289::-;25080:7;25274:20;24785:42;25274:9;:20::i;:::-;25269:1;25254:12;;:16;25253:41;25246:48;;25028:289;:::o;55308:169::-;55371:7;55437:11;55449:12;55437:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;;;;;;;;;;55398:11;55410:12;55398:25;;;;;;;;;;:::i;:::-;;;;;;;;;:36;:25;;;;;:36;;:71;;;:36;;:71;:::i;:::-;55391:78;;;55308:169;-1:-1:-1;;55308:169:0:o;28838:170::-;28972:28;28982:4;28988:2;28992:7;28972:9;:28::i;54347:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54347:31:0;;;;;;;-1:-1:-1;;54347:31:0;;;;;;;;;;:::o;58151:656::-;58247:10;58239:19;;;;:7;:19;;;;;;;;58235:59;;58267:27;;-1:-1:-1;;;58267:27:0;;;;;;;;;;;58235:59;58322:11;;;58319:51;;58342:28;;-1:-1:-1;;;58342:28:0;;;;;;;;;;;58319:51;58401:12;;58443:11;:18;58427:34;;;;58424:75;;58470:29;;-1:-1:-1;;;58470:29:0;;;;;;;;;;;58424:75;58524:25;58536:12;58524:11;:25::i;:::-;58515:6;:34;;;58512:70;;;58558:24;;-1:-1:-1;;;58558:24:0;;;;;;;;;;;58512:70;58631:6;58595:11;58607:12;58595:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58655:8;58650:104;58669:6;58665:10;;:1;:10;;;58650:104;;;58730:12;58697:19;:30;58717:9;;;;:::i;:::-;;;58697:30;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;58677:3;;;;;:::i;:::-;;;;58650:104;;;;58774:25;58784:2;58788:6;58774:25;;;;;;;;;;;;;;:9;:25::i;:::-;58224:583;58151:656;;;:::o;59757:432::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;;;;;;;;;59875:36;;::::1;59872:85;;59920:37;;-1:-1:-1::0;;;59920:37:0::1;;;;;;;;;;;59872:85;59975:8;59970:212;59985:24;::::0;::::1;::::0;-1:-1:-1;59970:212:0::1;;;60054:11;:18:::0;60034:13;;:16:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:38;;;60031:77;;60081:27;;-1:-1:-1::0;;;60081:27:0::1;;;;;;;;;;;60031:77;60162:5;;60168:1;60162:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;60125:11;60137:13;;60151:1;60137:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60125:29;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:45:::1;::::0;:29:::1;::::0;;::::1;;::::0;:45:::1;:::i;:::-;-1:-1:-1::0;60011:3:0;::::1;::::0;::::1;:::i;:::-;;;;59970:212;;;;59757:432:::0;;;;:::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;55559:229::-;55622:13;55653:16;55661:7;55653;:16::i;:::-;55648:66;;55678:36;;-1:-1:-1;;;55678:36:0;;;;;;;;;;;55648:66;55746:28;;;;:19;:28;;;;;;55734:11;:41;;:11;;55746:28;;;55734:41;;;;;;:::i;:::-;;;;;;;;;;;:46;;55727:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55559:229;;;:::o;58882:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;58959:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58882:106:::0;:::o;60251:452::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;60373:41;;::::1;60370:90;;60423:37;;-1:-1:-1::0;;;60423:37:0::1;;;;;;;;;;;60370:90;60478:8;60473:223;60488:24;::::0;::::1;::::0;-1:-1:-1;60473:223:0::1;;;60557:11;:18:::0;60537:13;;:16:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:38;;;60534:77;;60584:27;;-1:-1:-1::0;;;60584:27:0::1;;;;;;;;;;;60534:77;60671:10;;60682:1;60671:13;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60628:11;60640:13;;60654:1;60640:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60628:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;:56;;;;;;;;;;;;;;;;;;60514:3;;;;;:::i;:::-;;;;60473:223;;26014:407:::0;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;;59572:126;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;59662:28:::1;59673:4;;59662:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;59679:10:0;;-1:-1:-1;59662:10:0::1;::::0;-1:-1:-1;;59662:28:0:i:1;54147:21::-:0;;;;;;;:::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;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022: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;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;29335:316::-;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;;;;;;;;;;;57139:931;57238:10;57230:19;;;;:7;:19;;;;;;;;57226:59;;57258:27;;-1:-1:-1;;;57258:27:0;;;;;;;;;;;57226:59;57349:12;;57298:20;;;57374:555;57389:26;;;;-1:-1:-1;57374:555:0;;;57437:23;57463:15;;57479:1;57463:18;;;;;;;;;:::i;:::-;;;;;;57437:44;;;;;;;;;;:::i;:::-;57519:11;:18;57501:14;;57437:44;;-1:-1:-1;57501:36:0;;;;;57498:77;;57546:29;;-1:-1:-1;;;57546:29:0;;;;;;;;;;;57498:77;57606:44;57618:15;;57634:1;57618:18;;;;;;;;;:::i;:::-;:31;;;:18;;;;;:31;;;;-1:-1:-1;57618:31:0;:::i;57606:44::-;57595:1;:8;;;:55;;;57592:91;;;57659:24;;-1:-1:-1;;;57659:24:0;;;;;;;;;;;57592:91;57738:1;:8;;;57700:11;57712:1;:14;;;57700:27;;;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57777:1;:8;;;57761:24;;;;;;;:::i;:::-;;;57807:8;57802:116;57821:1;:8;;;57817:12;;:1;:12;;;57802:116;;;57888:14;;57855:19;57888:14;57875:9;;;;:::i;:::-;;;57855:30;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;57831:3;;;;;:::i;:::-;;;;57802:116;;;;57422:507;57417:3;;;;;:::i;:::-;;;;57374:555;;;-1:-1:-1;57956:17:0;57953:57;;57982:28;;-1:-1:-1;;;57982:28:0;;;;;;;;;;;57953:57;58031:31;58041:2;58045:12;58031:31;;;;;;;;;;;;:9;:31::i;61390:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;61460:28:::1;61479:8;61460:18;:28::i;59059:201::-:0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;59157:9:::1;59153:100;59168:20:::0;;::::1;59153:100;;;59234:7;59210;:21;59218:9;;59228:1;59218:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59210:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;59210:21:0;:31;;-1:-1:-1;;59210:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59190:3;::::1;::::0;::::1;:::i;:::-;;;;59153:100;;56677:381:::0;56795:13;56831:16;56839:7;56831;:16::i;:::-;56826:59;;56856:29;;-1:-1:-1;;;56856:29:0;;;;;;;;;;;56826:59;56942:1;56924:7;56918:21;;;;;:::i;:::-;;;:25;:132;;;;;;;;;;;;;;;;;56987:10;:8;:10::i;:::-;56999:18;:7;:16;:18::i;:::-;56970:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56898:152;56677:381;-1:-1:-1;;56677:381:0:o;60785:521::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;60886:11:::1;::::0;::::1;60882:417;;60918:9;60914:170;60929:19:::0;;::::1;60914:170;;;60993:12;;60978:8;;60987:1;60978:11;;;;;;;:::i;:::-;;;;;;;:27;60974:41;;61007:8;;60974:41;61043:12;:25;61056:8;;61065:1;61056:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;61043:25:::0;;-1:-1:-1;61043:25:0;::::1;::::0;;;;;;-1:-1:-1;61043:25:0;61036:32;;-1:-1:-1;;61036:32:0::1;::::0;;60914:170:::1;60950:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60914:170;;60882:417;61120:9;61116:172;61131:19:::0;;::::1;61116:172;;;61195:12;;61180:8;;61189:1;61180:11;;;;;;;:::i;:::-;;;;;;;:27;61176:41;;61209:8;;61176:41;61266:6;61238:12;:25;61251:8;;61260:1;61251:11;;;;;;;:::i;:::-;;;;;;;61238:25;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;61116:172;61152:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61116:172;;55900:508:::0;56189:27;;56250:35;;-1:-1:-1;;;56250:35:0;;-1:-1:-1;;;;;1692:55:1;;;56250:35:0;;;1674:74:1;56025:4:0;;56189:27;;;56242:56;;;;56189:27;;56250:28;;1647:18:1;;56250:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56242:56:0;;56238:100;;;56322:4;56315:11;;;;;56238:100;-1:-1:-1;;;;;28728:25:0;;;28704:4;28728:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;56357:43;56350:50;55900:508;-1:-1:-1;;;;55900: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;;16224:2:1;2274:68:0;;;16206:21:1;;;16243:18;;;16236:30;-1:-1:-1;;;;;;;;;;;16282:18:1;;;16275:62;16354:18;;2274:68:0;16022:356:1;2274:68:0;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;19353:2:1;3052:73:0::1;::::0;::::1;19335:21:1::0;19392:2;19372:18;;;19365:30;19431:34;19411:18;;;19404:62;19502:8;19482:18;;;19475:36;19528:19;;3052:73:0::1;19151: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;55900: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;58151:656;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;58959:21:::1;58882:106:::0;:::o;59314:200::-;-1:-1:-1;;;;;;;;;;;;;;;59425:13:0;;;59449:25;;;-1:-1:-1;;;;59449:25:0;;;;59487:11;:19;;;;;;;;;;;;;-1:-1:-1;;;;59487:19:0;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59487:19:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59487:19:0;;;;;;;;;;;;;;;-1:-1:-1;;;59314:200: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;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;56495:108::-;56555:13;56588:7;56581: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;58151:656;-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;2609:159::-;2676:20;;2736:6;2725:18;;2715:29;;2705:57;;2758:1;2755;2748:12;2705:57;2609:159;;;:::o;2773:184::-;2831:6;2884:2;2872:9;2863:7;2859:23;2855:32;2852:52;;;2900:1;2897;2890:12;2852:52;2923:28;2941:9;2923:28;:::i;2962:456::-;3039:6;3047;3055;3108:2;3096:9;3087:7;3083:23;3079:32;3076:52;;;3124:1;3121;3114:12;3076:52;3163:9;3150:23;3182:31;3207:5;3182:31;:::i;:::-;3232:5;-1:-1:-1;3289:2:1;3274:18;;3261:32;3302:33;3261:32;3302:33;:::i;:::-;2962:456;;3354:7;;-1:-1:-1;;;3408:2:1;3393:18;;;;3380:32;;2962:456::o;3423:401::-;3624:2;3613:9;3606:21;3587:4;3644:45;3685:2;3674:9;3670:18;3662:6;3644:45;:::i;:::-;3708:6;3750:15;;;3745:2;3730:18;;3723:43;3802:15;;;;3797:2;3782:18;;;3775:43;3636:53;3423:401;-1:-1:-1;;3423:401:1:o;3829:391::-;3904:6;3912;3920;3973:2;3961:9;3952:7;3948:23;3944:32;3941:52;;;3989:1;3986;3979:12;3941:52;4028:9;4015:23;4047:31;4072:5;4047:31;:::i;:::-;4097:5;-1:-1:-1;4121:37:1;4154:2;4139:18;;4121:37;:::i;:::-;4111:47;;4177:37;4210:2;4199:9;4195:18;4177:37;:::i;:::-;4167:47;;3829:391;;;;;:::o;4225:366::-;4287:8;4297:6;4351:3;4344:4;4336:6;4332:17;4328:27;4318:55;;4369:1;4366;4359:12;4318:55;-1:-1:-1;4392:20:1;;4435:18;4424:30;;4421:50;;;4467:1;4464;4457:12;4421:50;4504:4;4496:6;4492:17;4480:29;;4564:3;4557:4;4547:6;4544:1;4540:14;4532:6;4528:27;4524:38;4521:47;4518:67;;;4581:1;4578;4571:12;4518:67;4225:366;;;;;:::o;4596:782::-;4729:6;4737;4745;4753;4806:2;4794:9;4785:7;4781:23;4777:32;4774:52;;;4822:1;4819;4812:12;4774:52;4862:9;4849:23;4891:18;4932:2;4924:6;4921:14;4918:34;;;4948:1;4945;4938:12;4918:34;4987:69;5048:7;5039:6;5028:9;5024:22;4987:69;:::i;:::-;5075:8;;-1:-1:-1;4961:95:1;-1:-1:-1;5163:2:1;5148:18;;5135:32;;-1:-1:-1;5179:16:1;;;5176:36;;;5208:1;5205;5198:12;5176:36;;5247:71;5310:7;5299:8;5288:9;5284:24;5247:71;:::i;:::-;4596:782;;;;-1:-1:-1;5337:8:1;-1:-1:-1;;;;4596:782:1:o;5383:127::-;5444:10;5439:3;5435:20;5432:1;5425:31;5475:4;5472:1;5465:15;5499:4;5496:1;5489:15;5515:275;5586:2;5580:9;5651:2;5632:13;;-1:-1:-1;;5628:27:1;5616:40;;5686:18;5671:34;;5707:22;;;5668:62;5665:88;;;5733:18;;:::i;:::-;5769:2;5762:22;5515:275;;-1:-1:-1;5515:275:1:o;5795:407::-;5860:5;5894:18;5886:6;5883:30;5880:56;;;5916:18;;:::i;:::-;5954:57;5999:2;5978:15;;-1:-1:-1;;5974:29:1;6005:4;5970:40;5954:57;:::i;:::-;5945:66;;6034:6;6027:5;6020:21;6074:3;6065:6;6060:3;6056:16;6053:25;6050:45;;;6091:1;6088;6081:12;6050:45;6140:6;6135:3;6128:4;6121:5;6117:16;6104:43;6194:1;6187:4;6178:6;6171:5;6167:18;6163:29;6156:40;5795:407;;;;;:::o;6207:451::-;6276:6;6329:2;6317:9;6308:7;6304:23;6300:32;6297:52;;;6345:1;6342;6335:12;6297:52;6385:9;6372:23;6418:18;6410:6;6407:30;6404:50;;;6450:1;6447;6440:12;6404:50;6473:22;;6526:4;6518:13;;6514:27;-1:-1:-1;6504:55:1;;6555:1;6552;6545:12;6504:55;6578:74;6644:7;6639:2;6626:16;6621:2;6617;6613:11;6578:74;:::i;7437:670::-;7516:6;7524;7532;7585:2;7573:9;7564:7;7560:23;7556:32;7553:52;;;7601:1;7598;7591:12;7553:52;7641:9;7628:23;7670:18;7711:2;7703:6;7700:14;7697:34;;;7727:1;7724;7717:12;7697:34;7765:6;7754:9;7750:22;7740:32;;7810:7;7803:4;7799:2;7795:13;7791:27;7781:55;;7832:1;7829;7822:12;7781:55;7872:2;7859:16;7898:2;7890:6;7887:14;7884:34;;;7914:1;7911;7904:12;7884:34;7961:7;7954:4;7945:6;7941:2;7937:15;7933:26;7930:39;7927:59;;;7982:1;7979;7972:12;7927:59;8013:4;8005:13;;;;-1:-1:-1;8037:6:1;-1:-1:-1;8062:39:1;;8080:20;;;-1:-1:-1;8062:39:1;:::i;8112:247::-;8171:6;8224:2;8212:9;8203:7;8199:23;8195:32;8192:52;;;8240:1;8237;8230:12;8192:52;8279:9;8266:23;8298:31;8323:5;8298:31;:::i;8364:716::-;8417:5;8470:3;8463:4;8455:6;8451:17;8447:27;8437:55;;8488:1;8485;8478:12;8437:55;8524:6;8511:20;8550:4;8573:18;8569:2;8566:26;8563:52;;;8595:18;;:::i;:::-;8641:2;8638:1;8634:10;8664:28;8688:2;8684;8680:11;8664:28;:::i;:::-;8726:15;;;8796;;;8792:24;;;8757:12;;;;8828:15;;;8825:35;;;8856:1;8853;8846:12;8825:35;8892:2;8884:6;8880:15;8869:26;;8904:147;8920:6;8915:3;8912:15;8904:147;;;8986:22;9004:3;8986:22;:::i;:::-;8974:35;;8937:12;;;;9029;;;;8904:147;;;9069:5;8364:716;-1:-1:-1;;;;;;;8364:716:1:o;9085:622::-;9186:6;9194;9202;9255:2;9243:9;9234:7;9230:23;9226:32;9223:52;;;9271:1;9268;9261:12;9223:52;9310:9;9297:23;9329:31;9354:5;9329:31;:::i;:::-;9379:5;-1:-1:-1;9436:2:1;9421:18;;9408:32;9449:33;9408:32;9449:33;:::i;:::-;9501:7;-1:-1:-1;9559:2:1;9544:18;;9531:32;9586:18;9575:30;;9572:50;;;9618:1;9615;9608:12;9572:50;9641:60;9693:7;9684:6;9673:9;9669:22;9641:60;:::i;:::-;9631:70;;;9085:622;;;;;:::o;9712:346::-;9795:6;9848:2;9836:9;9827:7;9823:23;9819:32;9816:52;;;9864:1;9861;9854:12;9816:52;9904:9;9891:23;9937:18;9929:6;9926:30;9923:50;;;9969:1;9966;9959:12;9923:50;9992:60;10044:7;10035:6;10024:9;10020:22;9992:60;:::i;10063:160::-;10128:20;;10184:13;;10177:21;10167:32;;10157:60;;10213:1;10210;10203:12;10228:315;10293:6;10301;10354:2;10342:9;10333:7;10329:23;10325:32;10322:52;;;10370:1;10367;10360:12;10322:52;10409:9;10396:23;10428:31;10453:5;10428:31;:::i;:::-;10478:5;-1:-1:-1;10502:35:1;10533:2;10518:18;;10502:35;:::i;:::-;10492:45;;10228:315;;;;;:::o;10548:221::-;10590:5;10643:3;10636:4;10628:6;10624:17;10620:27;10610:55;;10661:1;10658;10651:12;10610:55;10683:80;10759:3;10750:6;10737:20;10730:4;10722:6;10718:17;10683:80;:::i;10774:665::-;10869:6;10877;10885;10893;10946:3;10934:9;10925:7;10921:23;10917:33;10914:53;;;10963:1;10960;10953:12;10914:53;11002:9;10989:23;11021:31;11046:5;11021:31;:::i;:::-;11071:5;-1:-1:-1;11128:2:1;11113:18;;11100:32;11141:33;11100:32;11141:33;:::i;:::-;11193:7;-1:-1:-1;11247:2:1;11232:18;;11219:32;;-1:-1:-1;11302:2:1;11287:18;;11274:32;11329:18;11318:30;;11315:50;;;11361:1;11358;11351:12;11315:50;11384:49;11425:7;11416:6;11405:9;11401:22;11384:49;:::i;:::-;11374:59;;;10774:665;;;;;;;:::o;11444:784::-;11573:6;11581;11589;11642:2;11630:9;11621:7;11617:23;11613:32;11610:52;;;11658:1;11655;11648:12;11610:52;11697:9;11684:23;11716:31;11741:5;11716:31;:::i;:::-;11766:5;-1:-1:-1;11822:2:1;11807:18;;11794:32;11845:18;11875:14;;;11872:34;;;11902:1;11899;11892:12;11872:34;11940:6;11929:9;11925:22;11915:32;;11985:7;11978:4;11974:2;11970:13;11966:27;11956:55;;12007:1;12004;11997:12;11956:55;12047:2;12034:16;12073:2;12065:6;12062:14;12059:34;;;12089:1;12086;12079:12;12059:34;12142:7;12137:2;12127:6;12124:1;12120:14;12116:2;12112:23;12108:32;12105:45;12102:65;;;12163:1;12160;12153:12;12102:65;12194:2;12190;12186:11;12176:21;;12216:6;12206:16;;;;;11444:784;;;;;:::o;12233:504::-;12325:6;12333;12341;12394:2;12382:9;12373:7;12369:23;12365:32;12362:52;;;12410:1;12407;12400:12;12362:52;12450:9;12437:23;12483:18;12475:6;12472:30;12469:50;;;12515:1;12512;12505:12;12469:50;12554:69;12615:7;12606:6;12595:9;12591:22;12554:69;:::i;:::-;12642:8;;-1:-1:-1;12528:95:1;-1:-1:-1;12696:35:1;;-1:-1:-1;12727:2:1;12712:18;;12696:35;:::i;12742:593::-;12835:6;12843;12851;12904:2;12892:9;12883:7;12879:23;12875:32;12872:52;;;12920:1;12917;12910:12;12872:52;12959:9;12946:23;13009:4;13002:5;12998:16;12991:5;12988:27;12978:55;;13029:1;13026;13019:12;12978:55;13052:5;-1:-1:-1;13108:2:1;13093:18;;13080:32;13135:18;13124:30;;13121:50;;;13167:1;13164;13157:12;13121:50;13206:69;13267:7;13258:6;13247:9;13243:22;13206:69;:::i;:::-;12742:593;;13294:8;;-1:-1:-1;13180:95:1;;-1:-1:-1;;;;12742:593:1:o;13340:388::-;13408:6;13416;13469:2;13457:9;13448:7;13444:23;13440:32;13437:52;;;13485:1;13482;13475:12;13437:52;13524:9;13511:23;13543:31;13568:5;13543:31;:::i;:::-;13593:5;-1:-1:-1;13650:2:1;13635:18;;13622:32;13663:33;13622:32;13663:33;:::i;:::-;13715:7;13705:17;;;13340:388;;;;;:::o;13733:842::-;13852:6;13860;13868;13876;13929:3;13917:9;13908:7;13904:23;13900:33;13897:53;;;13946:1;13943;13936:12;13897:53;13985:9;13972:23;14004:31;14029:5;14004:31;:::i;:::-;14054:5;-1:-1:-1;14111:2:1;14096:18;;14083:32;14124:33;14083:32;14124:33;:::i;:::-;14176:7;-1:-1:-1;14234:2:1;14219:18;;14206:32;14257:18;14287:14;;;14284:34;;;14314:1;14311;14304:12;14284:34;14337:60;14389:7;14380:6;14369:9;14365:22;14337:60;:::i;:::-;14327:70;;14450:2;14439:9;14435:18;14422:32;14406:48;;14479:2;14469:8;14466:16;14463:36;;;14495:1;14492;14485:12;14463:36;;14518:51;14561:7;14550:8;14539:9;14535:24;14518:51;:::i;14580:380::-;14659:1;14655:12;;;;14702;;;14723:61;;14777:4;14769:6;14765:17;14755:27;;14723:61;14830:2;14822:6;14819:14;14799:18;14796:38;14793:161;;;14876:10;14871:3;14867:20;14864:1;14857:31;14911:4;14908:1;14901:15;14939:4;14936:1;14929:15;14793:161;;14580:380;;;:::o;14965:127::-;15026:10;15021:3;15017:20;15014:1;15007:31;15057:4;15054:1;15047:15;15081:4;15078:1;15071:15;15097:127;15158:10;15153:3;15149:20;15146:1;15139:31;15189:4;15186:1;15179:15;15213:4;15210:1;15203:15;15229:217;15268:4;15297:6;15353:10;;;;15323;;15375:12;;;15372:38;;;15390:18;;:::i;:::-;15427:13;;15229:217;-1:-1:-1;;;15229:217:1:o;15451:224::-;15490:3;15518:6;15551:2;15548:1;15544:10;15581:2;15578:1;15574:10;15612:3;15608:2;15604:12;15599:3;15596:21;15593:47;;;15620:18;;:::i;:::-;15656:13;;15451:224;-1:-1:-1;;;;15451:224:1:o;15680:135::-;15719:3;-1:-1:-1;;15740:17:1;;15737:43;;;15760:18;;:::i;:::-;-1:-1:-1;15807:1:1;15796:13;;15680:135::o;15820:197::-;15858:3;15886:6;15927:2;15920:5;15916:14;15954:2;15945:7;15942:15;15939:41;;;15960:18;;:::i;:::-;16009:1;15996:15;;15820:197;-1:-1:-1;;;15820:197:1:o;16383:522::-;16461:4;16467:6;16527:11;16514:25;16621:2;16617:7;16606:8;16590:14;16586:29;16582:43;16562:18;16558:68;16548:96;;16640:1;16637;16630:12;16548:96;16667:33;;16719:20;;;-1:-1:-1;16762:18:1;16751:30;;16748:50;;;16794:1;16791;16784:12;16748:50;16827:4;16815:17;;-1:-1:-1;16858:14:1;16854:27;;;16844:38;;16841:58;;;16895:1;16892;16885:12;16910:643;17079:2;17131:21;;;17201:13;;17104:18;;;17223:22;;;17050:4;;17079:2;17302:15;;;;17276:2;17261:18;;;17050:4;17345:182;17359:6;17356:1;17353:13;17345:182;;;17424:13;;17439:6;17420:26;17408:39;;17502:15;;;;17467:12;;;;17381:1;17374:9;17345:182;;;-1:-1:-1;17544:3:1;;16910:643;-1:-1:-1;;;;;;16910:643:1:o;17558:521::-;17649:6;17702:2;17690:9;17681:7;17677:23;17673:32;17670:52;;;17718:1;17715;17708:12;17670:52;17751:2;17745:9;17793:2;17785:6;17781:15;17862:6;17850:10;17847:22;17826:18;17814:10;17811:34;17808:62;17805:88;;;17873:18;;:::i;:::-;17909:2;17902:22;17948:28;17966:9;17948:28;:::i;:::-;17940:6;17933:44;18010:37;18043:2;18032:9;18028:18;18010:37;:::i;:::-;18005:2;17993:15;;17986:62;17997:6;17558:521;-1:-1:-1;;;17558:521:1:o;18084:128::-;18124:3;18155:1;18151:6;18148:1;18145:13;18142:39;;;18161:18;;:::i;:::-;-1:-1:-1;18197:9:1;;18084:128::o;18217:637::-;18497:3;18535:6;18529:13;18551:53;18597:6;18592:3;18585:4;18577:6;18573:17;18551:53;:::i;:::-;18667:13;;18626:16;;;;18689:57;18667:13;18626:16;18723:4;18711:17;;18689:57;:::i;:::-;18811:7;18768:20;;18797:22;;;18846:1;18835:13;;18217:637;-1:-1:-1;;;;18217:637:1:o;18859:287::-;18965:6;19018:2;19006:9;18997:7;18993:23;18989:32;18986:52;;;19034:1;19031;19024:12;18986:52;19066:9;19060:16;19085:31;19110:5;19085:31;:::i;19558:512::-;19752:4;-1:-1:-1;;;;;19862:2:1;19854:6;19850:15;19839:9;19832:34;19914:2;19906:6;19902:15;19897:2;19886:9;19882:18;19875:43;;19954:6;19949:2;19938:9;19934:18;19927:34;19997:3;19992:2;19981:9;19977:18;19970:31;20018:46;20059:3;20048:9;20044:19;20036:6;20018:46;:::i;:::-;20010:54;19558:512;-1:-1:-1;;;;;;19558:512:1:o;20075:249::-;20144:6;20197:2;20185:9;20176:7;20172:23;20168:32;20165:52;;;20213:1;20210;20203:12;20165:52;20245:9;20239:16;20264:30;20288:5;20264:30;:::i;20329:127::-;20390:10;20385:3;20381:20;20378:1;20371:31;20421:4;20418:1;20411:15;20445:4;20442:1;20435:15;20461:120;20501:1;20527;20517:35;;20532:18;;:::i;:::-;-1:-1:-1;20566:9:1;;20461:120::o;20586:125::-;20626:4;20654:1;20651;20648:8;20645:34;;;20659:18;;:::i;:::-;-1:-1:-1;20696:9:1;;20586:125::o;20716:112::-;20748:1;20774;20764:35;;20779:18;;:::i;:::-;-1:-1:-1;20813:9:1;;20716:112::o

Swarm Source

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