ETH Price: $3,355.77 (+0.13%)

Token

RareApepeGrlzYC (RAG)
 

Overview

Max Total Supply

10,000 RAG

Holders

3,102

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
whatsupduck.eth
Balance
1 RAG
0x4C9B1E04031d03F48132F27B1FA0a06Aed94b8c5
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:
RareApepeGrlzYC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-14
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

    // ==============================
    //            IERC721
    // ==============================

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

    /**
     * @dev 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

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

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

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

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

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

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/StrangeMeInNFT.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);
    }
}




pragma solidity ^0.8.0;



contract RareApepeGrlzYC is ERC721A, Ownable {
	using Strings for uint;

	uint public constant MINT_PRICE = 0.003 ether;
	uint public constant MAX_NFT_PER_TRAN = 10;
    uint public constant MAX_PER_WALLET = 100;
	uint public maxSupply = 10000;
    uint public MAX_FREE_PER_WALLET = 2;

	bool public isPaused = true;
    bool public isMetadataFinal;
    string private _baseURL = "ipfs://bafybeigf75fku4axlj47ri4glvf7b53dtkwbur2gmcybjqpkkiqsvto5zm/";
	string public prerevealURL = '';
	mapping(address => uint) private _walletMintedCount;

	constructor()
    // Name
	ERC721A('RareApepeGrlzYC', 'RAG') {
    }

	function _baseURI() internal view override returns (string memory) {
		return _baseURL;
	}

	function _startTokenId() internal pure override returns (uint) {
		return 1;
	}

	function contractURI() public pure returns (string memory) {
		return "";
	}

    function finalizeMetadata() external onlyOwner {
        isMetadataFinal = true;
    }

	function reveal(string memory url) external onlyOwner {
        require(!isMetadataFinal, "Metadata is finalized");
		_baseURL = url;
	}

    function mintedCount(address owner) external view returns (uint) {
        return _walletMintedCount[owner];
    }

	function setPause(bool value) external onlyOwner {
		isPaused = value;
	}

	function withdraw() external onlyOwner {
		(bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success);
	}

	function devMint(address to, uint count) external onlyOwner {
		require(
			_totalMinted() + count <= maxSupply,
			'Exceeds max supply'
		);
		_safeMint(to, count);
	}

	function setMaxSupply(uint newMaxSupply) external onlyOwner {
		maxSupply = newMaxSupply;
	}

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

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

    function setFreeMintNumPerWallet(uint256 _limit) external onlyOwner
    {
        MAX_FREE_PER_WALLET = _limit;
    }

	function mint(uint count) external payable {
		require(!isPaused, 'Sales are off');
		require(count <= MAX_NFT_PER_TRAN,'Exceeds NFT per transaction limit');
		require(_totalMinted() + count <= maxSupply,'Exceeds max supply');
        require(_walletMintedCount[msg.sender] + count <= MAX_PER_WALLET,'Exceeds max per wallet');

        uint payForCount = count;
        uint mintedSoFar = _walletMintedCount[msg.sender];
        if(mintedSoFar < MAX_FREE_PER_WALLET) {
            uint remainingFreeMints = MAX_FREE_PER_WALLET - mintedSoFar;
            if(count > remainingFreeMints) {
                payForCount = count - remainingFreeMints;
            }
            else {
                payForCount = 0;
            }
        }

		require(
			msg.value >= payForCount * MINT_PRICE,
			'Ether value sent is not sufficient'
		);

		_walletMintedCount[msg.sender] += count;
		_safeMint(msg.sender, count);
	}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PER_TRAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeMetadata","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":[],"name":"isMetadataFinal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prerevealURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"reveal","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":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintNumPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526127106009556002600a556001600b60006101000a81548160ff021916908315150217905550604051806080016040528060438152602001620036fd60439139600c90805190602001906200005b92919062000245565b5060405180602001604052806000815250600d90805190602001906200008392919062000245565b503480156200009157600080fd5b506040518060400160405280600f81526020017f52617265417065706547726c7a594300000000000000000000000000000000008152506040518060400160405280600381526020017f524147000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200011692919062000245565b5080600390805190602001906200012f92919062000245565b50620001406200016e60201b60201c565b6000819055505050620001686200015c6200017760201b60201c565b6200017f60201b60201c565b6200035a565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025390620002f5565b90600052602060002090601f016020900481019282620002775760008555620002c3565b82601f106200029257805160ff1916838001178555620002c3565b82800160010185558215620002c3579182015b82811115620002c2578251825591602001919060010190620002a5565b5b509050620002d29190620002d6565b5090565b5b80821115620002f1576000816000905550600101620002d7565b5090565b600060028204905060018216806200030e57607f821691505b602082108114156200032557620003246200032b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613393806200036a6000396000f3fe6080604052600436106102045760003560e01c806395d89b4111610118578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d48514610722578063e985e9c51461074d578063f2fde38b1461078a578063f4a560a5146107b3578063fddcb5ea146107ca57610204565b8063c87b56dd14610664578063d5abeb01146106a1578063d8210482146106cc578063e193e7e2146106f757610204565b8063b187bd26116100e7578063b187bd2614610593578063b88d4fde146105be578063bedb86fb146105e7578063c002d23d14610610578063c1e3a4331461063b57610204565b806395d89b41146104f857806398710d1e14610523578063a0712d681461054e578063a22cb4651461056a57610204565b80633ccfd60b1161019b5780636352211e1161016a5780636352211e146104135780636f8b44b01461045057806370a0823114610479578063715018a6146104b65780638da5cb5b146104cd57610204565b80633ccfd60b1461038157806342842e0e146103985780634c261247146103c1578063627804af146103ea57610204565b80630de76de4116101d75780630de76de4146102d75780630f2cdd6c1461030257806318160ddd1461032d57806323b872dd1461035857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906126fb565b610807565b60405161023d9190612ac7565b60405180910390f35b34801561025257600080fd5b5061025b610899565b6040516102689190612ae2565b60405180910390f35b34801561027d57600080fd5b506102986004803603810190610293919061279e565b61092b565b6040516102a59190612a60565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061268e565b6109a7565b005b3480156102e357600080fd5b506102ec610ae8565b6040516102f99190612ac7565b60405180910390f35b34801561030e57600080fd5b50610317610afb565b6040516103249190612c24565b60405180910390f35b34801561033957600080fd5b50610342610b00565b60405161034f9190612c24565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190612578565b610b17565b005b34801561038d57600080fd5b50610396610e3c565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190612578565b610ebd565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190612755565b610edd565b005b3480156103f657600080fd5b50610411600480360381019061040c919061268e565b610f4f565b005b34801561041f57600080fd5b5061043a6004803603810190610435919061279e565b610fbc565b6040516104479190612a60565b60405180910390f35b34801561045c57600080fd5b506104776004803603810190610472919061279e565b610fce565b005b34801561048557600080fd5b506104a0600480360381019061049b919061250b565b610fe0565b6040516104ad9190612c24565b60405180910390f35b3480156104c257600080fd5b506104cb611099565b005b3480156104d957600080fd5b506104e26110ad565b6040516104ef9190612a60565b60405180910390f35b34801561050457600080fd5b5061050d6110d7565b60405161051a9190612ae2565b60405180910390f35b34801561052f57600080fd5b50610538611169565b6040516105459190612c24565b60405180910390f35b6105686004803603810190610563919061279e565b61116f565b005b34801561057657600080fd5b50610591600480360381019061058c919061264e565b611429565b005b34801561059f57600080fd5b506105a86115a1565b6040516105b59190612ac7565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906125cb565b6115b4565b005b3480156105f357600080fd5b5061060e600480360381019061060991906126ce565b611627565b005b34801561061c57600080fd5b5061062561164c565b6040516106329190612c24565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d919061279e565b611657565b005b34801561067057600080fd5b5061068b6004803603810190610686919061279e565b611669565b6040516106989190612ae2565b60405180910390f35b3480156106ad57600080fd5b506106b661178c565b6040516106c39190612c24565b60405180910390f35b3480156106d857600080fd5b506106e1611792565b6040516106ee9190612ae2565b60405180910390f35b34801561070357600080fd5b5061070c611820565b6040516107199190612c24565b60405180910390f35b34801561072e57600080fd5b50610737611825565b6040516107449190612ae2565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190612538565b61183c565b6040516107819190612ac7565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac919061250b565b6118d0565b005b3480156107bf57600080fd5b506107c8611954565b005b3480156107d657600080fd5b506107f160048036038101906107ec919061250b565b611979565b6040516107fe9190612c24565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108925750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108a890612edf565b80601f01602080910402602001604051908101604052809291908181526020018280546108d490612edf565b80156109215780601f106108f657610100808354040283529160200191610921565b820191906000526020600020905b81548152906001019060200180831161090457829003601f168201915b5050505050905090565b6000610936826119c2565b61096c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b282610fbc565b90508073ffffffffffffffffffffffffffffffffffffffff166109d3611a21565b73ffffffffffffffffffffffffffffffffffffffff1614610a36576109ff816109fa611a21565b61183c565b610a35576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b60019054906101000a900460ff1681565b606481565b6000610b0a611a29565b6001546000540303905090565b6000610b2282611a32565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b89576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b9584611b00565b91509150610bab8187610ba6611a21565b611b22565b610bf757610bc086610bbb611a21565b61183c565b610bf6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c5e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6b8686866001611b66565b8015610c7657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d4485610d20888887611b6c565b7c020000000000000000000000000000000000000000000000000000000017611b94565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610dcc576000600185019050600060046000838152602001908152602001600020541415610dca576000548114610dc9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e348686866001611bbf565b505050505050565b610e44611bc5565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610e6a90612a4b565b60006040518083038185875af1925050503d8060008114610ea7576040519150601f19603f3d011682016040523d82523d6000602084013e610eac565b606091505b5050905080610eba57600080fd5b50565b610ed8838383604051806020016040528060008152506115b4565b505050565b610ee5611bc5565b600b60019054906101000a900460ff1615610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90612b04565b60405180910390fd5b80600c9080519060200190610f4b92919061231f565b5050565b610f57611bc5565b60095481610f63611c43565b610f6d9190612d14565b1115610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590612b84565b60405180910390fd5b610fb88282611c56565b5050565b6000610fc782611a32565b9050919050565b610fd6611bc5565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611048576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110a1611bc5565b6110ab6000611c74565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110e690612edf565b80601f016020809104026020016040519081016040528092919081815260200182805461111290612edf565b801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905090565b600a5481565b600b60009054906101000a900460ff16156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690612b64565b60405180910390fd5b600a811115611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90612b44565b60405180910390fd5b6009548161120f611c43565b6112199190612d14565b111561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612b84565b60405180910390fd5b606481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112a79190612d14565b11156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90612c04565b60405180910390fd5b60008190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600a5481101561136f57600081600a5461134b9190612df5565b9050808411156113685780846113619190612df5565b925061136d565b600092505b505b660aa87bee538000826113829190612d9b565b3410156113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612ba4565b60405180910390fd5b82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114139190612d14565b925050819055506114243384611c56565b505050565b611431611a21565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611496576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114a3611a21565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611550611a21565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115959190612ac7565b60405180910390a35050565b600b60009054906101000a900460ff1681565b6115bf848484610b17565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611621576115ea84848484611d3a565b611620576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61162f611bc5565b80600b60006101000a81548160ff02191690831515021790555050565b660aa87bee53800081565b61165f611bc5565b80600a8190555050565b6060611674826119c2565b6116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90612be4565b60405180910390fd5b60006116bd611e9a565b511161175357600d80546116d090612edf565b80601f01602080910402602001604051908101604052809291908181526020018280546116fc90612edf565b80156117495780601f1061171e57610100808354040283529160200191611749565b820191906000526020600020905b81548152906001019060200180831161172c57829003601f168201915b5050505050611785565b61175b611e9a565b61176483611f2c565b604051602001611775929190612a1c565b6040516020818303038152906040525b9050919050565b60095481565b600d805461179f90612edf565b80601f01602080910402602001604051908101604052809291908181526020018280546117cb90612edf565b80156118185780601f106117ed57610100808354040283529160200191611818565b820191906000526020600020905b8154815290600101906020018083116117fb57829003601f168201915b505050505081565b600a81565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118d8611bc5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90612b24565b60405180910390fd5b61195181611c74565b50565b61195c611bc5565b6001600b60016101000a81548160ff021916908315150217905550565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816119cd611a29565b111580156119dc575060005482105b8015611a1a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611a41611a29565b11611ac957600054811015611ac85760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611ac6575b6000811415611abc576004600083600190039350838152602001908152602001600020549050611a91565b8092505050611afb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b8386868461208d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611bcd612096565b73ffffffffffffffffffffffffffffffffffffffff16611beb6110ad565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3890612bc4565b60405180910390fd5b565b6000611c4d611a29565b60005403905090565b611c7082826040518060200160405280600081525061209e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d60611a21565b8786866040518563ffffffff1660e01b8152600401611d829493929190612a7b565b602060405180830381600087803b158015611d9c57600080fd5b505af1925050508015611dcd57506040513d601f19601f82011682018060405250810190611dca9190612728565b60015b611e47573d8060008114611dfd576040519150601f19603f3d011682016040523d82523d6000602084013e611e02565b606091505b50600081511415611e3f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054611ea990612edf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed590612edf565b8015611f225780601f10611ef757610100808354040283529160200191611f22565b820191906000526020600020905b815481529060010190602001808311611f0557829003601f168201915b5050505050905090565b60606000821415611f74576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612088565b600082905060005b60008214611fa6578080611f8f90612f42565b915050600a82611f9f9190612d6a565b9150611f7c565b60008167ffffffffffffffff811115611fc257611fc1613078565b5b6040519080825280601f01601f191660200182016040528015611ff45781602001600182028036833780820191505090505b5090505b600085146120815760018261200d9190612df5565b9150600a8561201c9190612f8b565b60306120289190612d14565b60f81b81838151811061203e5761203d613049565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561207a9190612d6a565b9450611ff8565b8093505050505b919050565b60009392505050565b600033905090565b6120a8838361213b565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461213657600080549050600083820390505b6120e86000868380600101945086611d3a565b61211e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106120d557816000541461213357600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121a8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156121e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121f06000848385611b66565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612267836122586000866000611b6c565b6122618561230f565b17611b94565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061228b5780600081905550505061230a6000848385611bbf565b505050565b60006001821460e11b9050919050565b82805461232b90612edf565b90600052602060002090601f01602090048101928261234d5760008555612394565b82601f1061236657805160ff1916838001178555612394565b82800160010185558215612394579182015b82811115612393578251825591602001919060010190612378565b5b5090506123a191906123a5565b5090565b5b808211156123be5760008160009055506001016123a6565b5090565b60006123d56123d084612c64565b612c3f565b9050828152602081018484840111156123f1576123f06130ac565b5b6123fc848285612e9d565b509392505050565b600061241761241284612c95565b612c3f565b905082815260208101848484011115612433576124326130ac565b5b61243e848285612e9d565b509392505050565b60008135905061245581613301565b92915050565b60008135905061246a81613318565b92915050565b60008135905061247f8161332f565b92915050565b6000815190506124948161332f565b92915050565b600082601f8301126124af576124ae6130a7565b5b81356124bf8482602086016123c2565b91505092915050565b600082601f8301126124dd576124dc6130a7565b5b81356124ed848260208601612404565b91505092915050565b60008135905061250581613346565b92915050565b600060208284031215612521576125206130b6565b5b600061252f84828501612446565b91505092915050565b6000806040838503121561254f5761254e6130b6565b5b600061255d85828601612446565b925050602061256e85828601612446565b9150509250929050565b600080600060608486031215612591576125906130b6565b5b600061259f86828701612446565b93505060206125b086828701612446565b92505060406125c1868287016124f6565b9150509250925092565b600080600080608085870312156125e5576125e46130b6565b5b60006125f387828801612446565b945050602061260487828801612446565b9350506040612615878288016124f6565b925050606085013567ffffffffffffffff811115612636576126356130b1565b5b6126428782880161249a565b91505092959194509250565b60008060408385031215612665576126646130b6565b5b600061267385828601612446565b92505060206126848582860161245b565b9150509250929050565b600080604083850312156126a5576126a46130b6565b5b60006126b385828601612446565b92505060206126c4858286016124f6565b9150509250929050565b6000602082840312156126e4576126e36130b6565b5b60006126f28482850161245b565b91505092915050565b600060208284031215612711576127106130b6565b5b600061271f84828501612470565b91505092915050565b60006020828403121561273e5761273d6130b6565b5b600061274c84828501612485565b91505092915050565b60006020828403121561276b5761276a6130b6565b5b600082013567ffffffffffffffff811115612789576127886130b1565b5b612795848285016124c8565b91505092915050565b6000602082840312156127b4576127b36130b6565b5b60006127c2848285016124f6565b91505092915050565b6127d481612e29565b82525050565b6127e381612e3b565b82525050565b60006127f482612cc6565b6127fe8185612cdc565b935061280e818560208601612eac565b612817816130bb565b840191505092915050565b600061282d82612cd1565b6128378185612cf8565b9350612847818560208601612eac565b612850816130bb565b840191505092915050565b600061286682612cd1565b6128708185612d09565b9350612880818560208601612eac565b80840191505092915050565b6000612899601583612cf8565b91506128a4826130cc565b602082019050919050565b60006128bc602683612cf8565b91506128c7826130f5565b604082019050919050565b60006128df602183612cf8565b91506128ea82613144565b604082019050919050565b6000612902600d83612cf8565b915061290d82613193565b602082019050919050565b6000612925601283612cf8565b9150612930826131bc565b602082019050919050565b6000612948602283612cf8565b9150612953826131e5565b604082019050919050565b600061296b600583612d09565b915061297682613234565b600582019050919050565b600061298e602083612cf8565b91506129998261325d565b602082019050919050565b60006129b1602f83612cf8565b91506129bc82613286565b604082019050919050565b60006129d4600083612ced565b91506129df826132d5565b600082019050919050565b60006129f7601683612cf8565b9150612a02826132d8565b602082019050919050565b612a1681612e93565b82525050565b6000612a28828561285b565b9150612a34828461285b565b9150612a3f8261295e565b91508190509392505050565b6000612a56826129c7565b9150819050919050565b6000602082019050612a7560008301846127cb565b92915050565b6000608082019050612a9060008301876127cb565b612a9d60208301866127cb565b612aaa6040830185612a0d565b8181036060830152612abc81846127e9565b905095945050505050565b6000602082019050612adc60008301846127da565b92915050565b60006020820190508181036000830152612afc8184612822565b905092915050565b60006020820190508181036000830152612b1d8161288c565b9050919050565b60006020820190508181036000830152612b3d816128af565b9050919050565b60006020820190508181036000830152612b5d816128d2565b9050919050565b60006020820190508181036000830152612b7d816128f5565b9050919050565b60006020820190508181036000830152612b9d81612918565b9050919050565b60006020820190508181036000830152612bbd8161293b565b9050919050565b60006020820190508181036000830152612bdd81612981565b9050919050565b60006020820190508181036000830152612bfd816129a4565b9050919050565b60006020820190508181036000830152612c1d816129ea565b9050919050565b6000602082019050612c396000830184612a0d565b92915050565b6000612c49612c5a565b9050612c558282612f11565b919050565b6000604051905090565b600067ffffffffffffffff821115612c7f57612c7e613078565b5b612c88826130bb565b9050602081019050919050565b600067ffffffffffffffff821115612cb057612caf613078565b5b612cb9826130bb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d1f82612e93565b9150612d2a83612e93565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d5f57612d5e612fbc565b5b828201905092915050565b6000612d7582612e93565b9150612d8083612e93565b925082612d9057612d8f612feb565b5b828204905092915050565b6000612da682612e93565b9150612db183612e93565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dea57612de9612fbc565b5b828202905092915050565b6000612e0082612e93565b9150612e0b83612e93565b925082821015612e1e57612e1d612fbc565b5b828203905092915050565b6000612e3482612e73565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612eca578082015181840152602081019050612eaf565b83811115612ed9576000848401525b50505050565b60006002820490506001821680612ef757607f821691505b60208210811415612f0b57612f0a61301a565b5b50919050565b612f1a826130bb565b810181811067ffffffffffffffff82111715612f3957612f38613078565b5b80604052505050565b6000612f4d82612e93565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f8057612f7f612fbc565b5b600182019050919050565b6000612f9682612e93565b9150612fa183612e93565b925082612fb157612fb0612feb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d657461646174612069732066696e616c697a65640000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473204e465420706572207472616e73616374696f6e206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61330a81612e29565b811461331557600080fd5b50565b61332181612e3b565b811461332c57600080fd5b50565b61333881612e47565b811461334357600080fd5b50565b61334f81612e93565b811461335a57600080fd5b5056fea264697066735822122093330f90dfeaef632dc18f37f6569031bf780a44623b3d1568384abecac964dd64736f6c63430008070033697066733a2f2f6261667962656967663735666b753461786c6a3437726934676c76663762353364746b7762757232676d6379626a71706b6b69717376746f357a6d2f

Deployed Bytecode

0x6080604052600436106102045760003560e01c806395d89b4111610118578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d48514610722578063e985e9c51461074d578063f2fde38b1461078a578063f4a560a5146107b3578063fddcb5ea146107ca57610204565b8063c87b56dd14610664578063d5abeb01146106a1578063d8210482146106cc578063e193e7e2146106f757610204565b8063b187bd26116100e7578063b187bd2614610593578063b88d4fde146105be578063bedb86fb146105e7578063c002d23d14610610578063c1e3a4331461063b57610204565b806395d89b41146104f857806398710d1e14610523578063a0712d681461054e578063a22cb4651461056a57610204565b80633ccfd60b1161019b5780636352211e1161016a5780636352211e146104135780636f8b44b01461045057806370a0823114610479578063715018a6146104b65780638da5cb5b146104cd57610204565b80633ccfd60b1461038157806342842e0e146103985780634c261247146103c1578063627804af146103ea57610204565b80630de76de4116101d75780630de76de4146102d75780630f2cdd6c1461030257806318160ddd1461032d57806323b872dd1461035857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906126fb565b610807565b60405161023d9190612ac7565b60405180910390f35b34801561025257600080fd5b5061025b610899565b6040516102689190612ae2565b60405180910390f35b34801561027d57600080fd5b506102986004803603810190610293919061279e565b61092b565b6040516102a59190612a60565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061268e565b6109a7565b005b3480156102e357600080fd5b506102ec610ae8565b6040516102f99190612ac7565b60405180910390f35b34801561030e57600080fd5b50610317610afb565b6040516103249190612c24565b60405180910390f35b34801561033957600080fd5b50610342610b00565b60405161034f9190612c24565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190612578565b610b17565b005b34801561038d57600080fd5b50610396610e3c565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190612578565b610ebd565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190612755565b610edd565b005b3480156103f657600080fd5b50610411600480360381019061040c919061268e565b610f4f565b005b34801561041f57600080fd5b5061043a6004803603810190610435919061279e565b610fbc565b6040516104479190612a60565b60405180910390f35b34801561045c57600080fd5b506104776004803603810190610472919061279e565b610fce565b005b34801561048557600080fd5b506104a0600480360381019061049b919061250b565b610fe0565b6040516104ad9190612c24565b60405180910390f35b3480156104c257600080fd5b506104cb611099565b005b3480156104d957600080fd5b506104e26110ad565b6040516104ef9190612a60565b60405180910390f35b34801561050457600080fd5b5061050d6110d7565b60405161051a9190612ae2565b60405180910390f35b34801561052f57600080fd5b50610538611169565b6040516105459190612c24565b60405180910390f35b6105686004803603810190610563919061279e565b61116f565b005b34801561057657600080fd5b50610591600480360381019061058c919061264e565b611429565b005b34801561059f57600080fd5b506105a86115a1565b6040516105b59190612ac7565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906125cb565b6115b4565b005b3480156105f357600080fd5b5061060e600480360381019061060991906126ce565b611627565b005b34801561061c57600080fd5b5061062561164c565b6040516106329190612c24565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d919061279e565b611657565b005b34801561067057600080fd5b5061068b6004803603810190610686919061279e565b611669565b6040516106989190612ae2565b60405180910390f35b3480156106ad57600080fd5b506106b661178c565b6040516106c39190612c24565b60405180910390f35b3480156106d857600080fd5b506106e1611792565b6040516106ee9190612ae2565b60405180910390f35b34801561070357600080fd5b5061070c611820565b6040516107199190612c24565b60405180910390f35b34801561072e57600080fd5b50610737611825565b6040516107449190612ae2565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190612538565b61183c565b6040516107819190612ac7565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac919061250b565b6118d0565b005b3480156107bf57600080fd5b506107c8611954565b005b3480156107d657600080fd5b506107f160048036038101906107ec919061250b565b611979565b6040516107fe9190612c24565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108925750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108a890612edf565b80601f01602080910402602001604051908101604052809291908181526020018280546108d490612edf565b80156109215780601f106108f657610100808354040283529160200191610921565b820191906000526020600020905b81548152906001019060200180831161090457829003601f168201915b5050505050905090565b6000610936826119c2565b61096c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b282610fbc565b90508073ffffffffffffffffffffffffffffffffffffffff166109d3611a21565b73ffffffffffffffffffffffffffffffffffffffff1614610a36576109ff816109fa611a21565b61183c565b610a35576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b60019054906101000a900460ff1681565b606481565b6000610b0a611a29565b6001546000540303905090565b6000610b2282611a32565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b89576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b9584611b00565b91509150610bab8187610ba6611a21565b611b22565b610bf757610bc086610bbb611a21565b61183c565b610bf6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c5e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6b8686866001611b66565b8015610c7657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d4485610d20888887611b6c565b7c020000000000000000000000000000000000000000000000000000000017611b94565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610dcc576000600185019050600060046000838152602001908152602001600020541415610dca576000548114610dc9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e348686866001611bbf565b505050505050565b610e44611bc5565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610e6a90612a4b565b60006040518083038185875af1925050503d8060008114610ea7576040519150601f19603f3d011682016040523d82523d6000602084013e610eac565b606091505b5050905080610eba57600080fd5b50565b610ed8838383604051806020016040528060008152506115b4565b505050565b610ee5611bc5565b600b60019054906101000a900460ff1615610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90612b04565b60405180910390fd5b80600c9080519060200190610f4b92919061231f565b5050565b610f57611bc5565b60095481610f63611c43565b610f6d9190612d14565b1115610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590612b84565b60405180910390fd5b610fb88282611c56565b5050565b6000610fc782611a32565b9050919050565b610fd6611bc5565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611048576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110a1611bc5565b6110ab6000611c74565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546110e690612edf565b80601f016020809104026020016040519081016040528092919081815260200182805461111290612edf565b801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905090565b600a5481565b600b60009054906101000a900460ff16156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690612b64565b60405180910390fd5b600a811115611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90612b44565b60405180910390fd5b6009548161120f611c43565b6112199190612d14565b111561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190612b84565b60405180910390fd5b606481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112a79190612d14565b11156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90612c04565b60405180910390fd5b60008190506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600a5481101561136f57600081600a5461134b9190612df5565b9050808411156113685780846113619190612df5565b925061136d565b600092505b505b660aa87bee538000826113829190612d9b565b3410156113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90612ba4565b60405180910390fd5b82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114139190612d14565b925050819055506114243384611c56565b505050565b611431611a21565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611496576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114a3611a21565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611550611a21565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115959190612ac7565b60405180910390a35050565b600b60009054906101000a900460ff1681565b6115bf848484610b17565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611621576115ea84848484611d3a565b611620576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61162f611bc5565b80600b60006101000a81548160ff02191690831515021790555050565b660aa87bee53800081565b61165f611bc5565b80600a8190555050565b6060611674826119c2565b6116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90612be4565b60405180910390fd5b60006116bd611e9a565b511161175357600d80546116d090612edf565b80601f01602080910402602001604051908101604052809291908181526020018280546116fc90612edf565b80156117495780601f1061171e57610100808354040283529160200191611749565b820191906000526020600020905b81548152906001019060200180831161172c57829003601f168201915b5050505050611785565b61175b611e9a565b61176483611f2c565b604051602001611775929190612a1c565b6040516020818303038152906040525b9050919050565b60095481565b600d805461179f90612edf565b80601f01602080910402602001604051908101604052809291908181526020018280546117cb90612edf565b80156118185780601f106117ed57610100808354040283529160200191611818565b820191906000526020600020905b8154815290600101906020018083116117fb57829003601f168201915b505050505081565b600a81565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118d8611bc5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90612b24565b60405180910390fd5b61195181611c74565b50565b61195c611bc5565b6001600b60016101000a81548160ff021916908315150217905550565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816119cd611a29565b111580156119dc575060005482105b8015611a1a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611a41611a29565b11611ac957600054811015611ac85760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611ac6575b6000811415611abc576004600083600190039350838152602001908152602001600020549050611a91565b8092505050611afb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b8386868461208d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611bcd612096565b73ffffffffffffffffffffffffffffffffffffffff16611beb6110ad565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3890612bc4565b60405180910390fd5b565b6000611c4d611a29565b60005403905090565b611c7082826040518060200160405280600081525061209e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d60611a21565b8786866040518563ffffffff1660e01b8152600401611d829493929190612a7b565b602060405180830381600087803b158015611d9c57600080fd5b505af1925050508015611dcd57506040513d601f19601f82011682018060405250810190611dca9190612728565b60015b611e47573d8060008114611dfd576040519150601f19603f3d011682016040523d82523d6000602084013e611e02565b606091505b50600081511415611e3f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c8054611ea990612edf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed590612edf565b8015611f225780601f10611ef757610100808354040283529160200191611f22565b820191906000526020600020905b815481529060010190602001808311611f0557829003601f168201915b5050505050905090565b60606000821415611f74576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612088565b600082905060005b60008214611fa6578080611f8f90612f42565b915050600a82611f9f9190612d6a565b9150611f7c565b60008167ffffffffffffffff811115611fc257611fc1613078565b5b6040519080825280601f01601f191660200182016040528015611ff45781602001600182028036833780820191505090505b5090505b600085146120815760018261200d9190612df5565b9150600a8561201c9190612f8b565b60306120289190612d14565b60f81b81838151811061203e5761203d613049565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561207a9190612d6a565b9450611ff8565b8093505050505b919050565b60009392505050565b600033905090565b6120a8838361213b565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461213657600080549050600083820390505b6120e86000868380600101945086611d3a565b61211e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106120d557816000541461213357600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121a8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156121e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121f06000848385611b66565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612267836122586000866000611b6c565b6122618561230f565b17611b94565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061228b5780600081905550505061230a6000848385611bbf565b505050565b60006001821460e11b9050919050565b82805461232b90612edf565b90600052602060002090601f01602090048101928261234d5760008555612394565b82601f1061236657805160ff1916838001178555612394565b82800160010185558215612394579182015b82811115612393578251825591602001919060010190612378565b5b5090506123a191906123a5565b5090565b5b808211156123be5760008160009055506001016123a6565b5090565b60006123d56123d084612c64565b612c3f565b9050828152602081018484840111156123f1576123f06130ac565b5b6123fc848285612e9d565b509392505050565b600061241761241284612c95565b612c3f565b905082815260208101848484011115612433576124326130ac565b5b61243e848285612e9d565b509392505050565b60008135905061245581613301565b92915050565b60008135905061246a81613318565b92915050565b60008135905061247f8161332f565b92915050565b6000815190506124948161332f565b92915050565b600082601f8301126124af576124ae6130a7565b5b81356124bf8482602086016123c2565b91505092915050565b600082601f8301126124dd576124dc6130a7565b5b81356124ed848260208601612404565b91505092915050565b60008135905061250581613346565b92915050565b600060208284031215612521576125206130b6565b5b600061252f84828501612446565b91505092915050565b6000806040838503121561254f5761254e6130b6565b5b600061255d85828601612446565b925050602061256e85828601612446565b9150509250929050565b600080600060608486031215612591576125906130b6565b5b600061259f86828701612446565b93505060206125b086828701612446565b92505060406125c1868287016124f6565b9150509250925092565b600080600080608085870312156125e5576125e46130b6565b5b60006125f387828801612446565b945050602061260487828801612446565b9350506040612615878288016124f6565b925050606085013567ffffffffffffffff811115612636576126356130b1565b5b6126428782880161249a565b91505092959194509250565b60008060408385031215612665576126646130b6565b5b600061267385828601612446565b92505060206126848582860161245b565b9150509250929050565b600080604083850312156126a5576126a46130b6565b5b60006126b385828601612446565b92505060206126c4858286016124f6565b9150509250929050565b6000602082840312156126e4576126e36130b6565b5b60006126f28482850161245b565b91505092915050565b600060208284031215612711576127106130b6565b5b600061271f84828501612470565b91505092915050565b60006020828403121561273e5761273d6130b6565b5b600061274c84828501612485565b91505092915050565b60006020828403121561276b5761276a6130b6565b5b600082013567ffffffffffffffff811115612789576127886130b1565b5b612795848285016124c8565b91505092915050565b6000602082840312156127b4576127b36130b6565b5b60006127c2848285016124f6565b91505092915050565b6127d481612e29565b82525050565b6127e381612e3b565b82525050565b60006127f482612cc6565b6127fe8185612cdc565b935061280e818560208601612eac565b612817816130bb565b840191505092915050565b600061282d82612cd1565b6128378185612cf8565b9350612847818560208601612eac565b612850816130bb565b840191505092915050565b600061286682612cd1565b6128708185612d09565b9350612880818560208601612eac565b80840191505092915050565b6000612899601583612cf8565b91506128a4826130cc565b602082019050919050565b60006128bc602683612cf8565b91506128c7826130f5565b604082019050919050565b60006128df602183612cf8565b91506128ea82613144565b604082019050919050565b6000612902600d83612cf8565b915061290d82613193565b602082019050919050565b6000612925601283612cf8565b9150612930826131bc565b602082019050919050565b6000612948602283612cf8565b9150612953826131e5565b604082019050919050565b600061296b600583612d09565b915061297682613234565b600582019050919050565b600061298e602083612cf8565b91506129998261325d565b602082019050919050565b60006129b1602f83612cf8565b91506129bc82613286565b604082019050919050565b60006129d4600083612ced565b91506129df826132d5565b600082019050919050565b60006129f7601683612cf8565b9150612a02826132d8565b602082019050919050565b612a1681612e93565b82525050565b6000612a28828561285b565b9150612a34828461285b565b9150612a3f8261295e565b91508190509392505050565b6000612a56826129c7565b9150819050919050565b6000602082019050612a7560008301846127cb565b92915050565b6000608082019050612a9060008301876127cb565b612a9d60208301866127cb565b612aaa6040830185612a0d565b8181036060830152612abc81846127e9565b905095945050505050565b6000602082019050612adc60008301846127da565b92915050565b60006020820190508181036000830152612afc8184612822565b905092915050565b60006020820190508181036000830152612b1d8161288c565b9050919050565b60006020820190508181036000830152612b3d816128af565b9050919050565b60006020820190508181036000830152612b5d816128d2565b9050919050565b60006020820190508181036000830152612b7d816128f5565b9050919050565b60006020820190508181036000830152612b9d81612918565b9050919050565b60006020820190508181036000830152612bbd8161293b565b9050919050565b60006020820190508181036000830152612bdd81612981565b9050919050565b60006020820190508181036000830152612bfd816129a4565b9050919050565b60006020820190508181036000830152612c1d816129ea565b9050919050565b6000602082019050612c396000830184612a0d565b92915050565b6000612c49612c5a565b9050612c558282612f11565b919050565b6000604051905090565b600067ffffffffffffffff821115612c7f57612c7e613078565b5b612c88826130bb565b9050602081019050919050565b600067ffffffffffffffff821115612cb057612caf613078565b5b612cb9826130bb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d1f82612e93565b9150612d2a83612e93565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d5f57612d5e612fbc565b5b828201905092915050565b6000612d7582612e93565b9150612d8083612e93565b925082612d9057612d8f612feb565b5b828204905092915050565b6000612da682612e93565b9150612db183612e93565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dea57612de9612fbc565b5b828202905092915050565b6000612e0082612e93565b9150612e0b83612e93565b925082821015612e1e57612e1d612fbc565b5b828203905092915050565b6000612e3482612e73565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612eca578082015181840152602081019050612eaf565b83811115612ed9576000848401525b50505050565b60006002820490506001821680612ef757607f821691505b60208210811415612f0b57612f0a61301a565b5b50919050565b612f1a826130bb565b810181811067ffffffffffffffff82111715612f3957612f38613078565b5b80604052505050565b6000612f4d82612e93565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f8057612f7f612fbc565b5b600182019050919050565b6000612f9682612e93565b9150612fa183612e93565b925082612fb157612fb0612feb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d657461646174612069732066696e616c697a65640000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473204e465420706572207472616e73616374696f6e206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61330a81612e29565b811461331557600080fd5b50565b61332181612e3b565b811461332c57600080fd5b50565b61333881612e47565b811461334357600080fd5b50565b61334f81612e93565b811461335a57600080fd5b5056fea264697066735822122093330f90dfeaef632dc18f37f6569031bf780a44623b3d1568384abecac964dd64736f6c63430008070033

Deployed Bytecode Sourcemap

50444:3218:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18218:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25811:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25359:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50775:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50619:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17272:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35076:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51786:177;;;;;;;;;;;;;:::i;:::-;;26701:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51438:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51968:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23654:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52147:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18897:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2809:103;;;;;;;;;;;;;:::i;:::-;;2161:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24034:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50700:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52720:937;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26087:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50741:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26957:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51706:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50521:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52595:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52246:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50664:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50908:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50570:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51259:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26466:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3067:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51345:88;;;;;;;;;;;;;:::i;:::-;;51585:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18218:615;18303:4;18618:10;18603:25;;:11;:25;;;;:102;;;;18695:10;18680:25;;:11;:25;;;;18603:102;:179;;;;18772:10;18757:25;;:11;:25;;;;18603:179;18583:199;;18218:615;;;:::o;23865:100::-;23919:13;23952:5;23945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23865:100;:::o;25811:204::-;25879:7;25904:16;25912:7;25904;:16::i;:::-;25899:64;;25929:34;;;;;;;;;;;;;;25899:64;25983:15;:24;25999:7;25983:24;;;;;;;;;;;;;;;;;;;;;25976:31;;25811:204;;;:::o;25359:386::-;25432:13;25448:16;25456:7;25448;:16::i;:::-;25432:32;;25504:5;25481:28;;:19;:17;:19::i;:::-;:28;;;25477:175;;25529:44;25546:5;25553:19;:17;:19::i;:::-;25529:16;:44::i;:::-;25524:128;;25601:35;;;;;;;;;;;;;;25524:128;25477:175;25691:2;25664:15;:24;25680:7;25664:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25729:7;25725:2;25709:28;;25718:5;25709:28;;;;;;;;;;;;25421:324;25359:386;;:::o;50775:27::-;;;;;;;;;;;;;:::o;50619:41::-;50657:3;50619:41;:::o;17272:315::-;17325:7;17553:15;:13;:15::i;:::-;17538:12;;17522:13;;:28;:46;17515:53;;17272:315;:::o;35076:2800::-;35210:27;35240;35259:7;35240:18;:27::i;:::-;35210:57;;35325:4;35284:45;;35300:19;35284:45;;;35280:86;;35338:28;;;;;;;;;;;;;;35280:86;35380:27;35409:23;35436:28;35456:7;35436:19;:28::i;:::-;35379:85;;;;35564:62;35583:15;35600:4;35606:19;:17;:19::i;:::-;35564:18;:62::i;:::-;35559:174;;35646:43;35663:4;35669:19;:17;:19::i;:::-;35646:16;:43::i;:::-;35641:92;;35698:35;;;;;;;;;;;;;;35641:92;35559:174;35764:1;35750:16;;:2;:16;;;35746:52;;;35775:23;;;;;;;;;;;;;;35746:52;35811:43;35833:4;35839:2;35843:7;35852:1;35811:21;:43::i;:::-;35947:15;35944:160;;;36087:1;36066:19;36059:30;35944:160;36482:18;:24;36501:4;36482:24;;;;;;;;;;;;;;;;36480:26;;;;;;;;;;;;36551:18;:22;36570:2;36551:22;;;;;;;;;;;;;;;;36549:24;;;;;;;;;;;36873:145;36910:2;36958:45;36973:4;36979:2;36983:19;36958:14;:45::i;:::-;14500:8;36931:72;36873:18;:145::i;:::-;36844:17;:26;36862:7;36844:26;;;;;;;;;;;:174;;;;37188:1;14500:8;37138:19;:46;:51;37134:626;;;37210:19;37242:1;37232:7;:11;37210:33;;37399:1;37365:17;:30;37383:11;37365:30;;;;;;;;;;;;:35;37361:384;;;37503:13;;37488:11;:28;37484:242;;37683:19;37650:17;:30;37668:11;37650:30;;;;;;;;;;;:52;;;;37484:242;37361:384;37191:569;37134:626;37807:7;37803:2;37788:27;;37797:4;37788:27;;;;;;;;;;;;37826:42;37847:4;37853:2;37857:7;37866:1;37826:20;:42::i;:::-;35199:2677;;;35076:2800;;;:::o;51786:177::-;2047:13;:11;:13::i;:::-;51831:12:::1;51857:10;51849:24;;51895:21;51849:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51830:101;;;51950:7;51942:16;;;::::0;::::1;;51825:138;51786:177::o:0;26701:185::-;26839:39;26856:4;26862:2;26866:7;26839:39;;;;;;;;;;;;:16;:39::i;:::-;26701:185;;;:::o;51438:139::-;2047:13;:11;:13::i;:::-;51512:15:::1;;;;;;;;;;;51511:16;51503:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51569:3;51558:8;:14;;;;;;;;;;;;:::i;:::-;;51438:139:::0;:::o;51968:174::-;2047:13;:11;:13::i;:::-;52072:9:::1;;52063:5;52046:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:35;;52033:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;52117:20;52127:2;52131:5;52117:9;:20::i;:::-;51968:174:::0;;:::o;23654:144::-;23718:7;23761:27;23780:7;23761:18;:27::i;:::-;23738:52;;23654:144;;;:::o;52147:94::-;2047:13;:11;:13::i;:::-;52224:12:::1;52212:9;:24;;;;52147:94:::0;:::o;18897:224::-;18961:7;19002:1;18985:19;;:5;:19;;;18981:60;;;19013:28;;;;;;;;;;;;;;18981:60;13452:13;19059:18;:25;19078:5;19059:25;;;;;;;;;;;;;;;;:54;19052:61;;18897:224;;;:::o;2809:103::-;2047:13;:11;:13::i;:::-;2874:30:::1;2901:1;2874:18;:30::i;:::-;2809:103::o:0;2161:87::-;2207:7;2234:6;;;;;;;;;;;2227:13;;2161:87;:::o;24034:104::-;24090:13;24123:7;24116:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24034:104;:::o;50700:35::-;;;;:::o;52720:937::-;52777:8;;;;;;;;;;;52776:9;52768:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;50610:2;52816:5;:25;;52808:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52917:9;;52908:5;52891:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:35;;52883:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50657:3;53000:5;52967:18;:30;52986:10;52967:30;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:56;;52959:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;53062:16;53081:5;53062:24;;53097:16;53116:18;:30;53135:10;53116:30;;;;;;;;;;;;;;;;53097:49;;53174:19;;53160:11;:33;53157:313;;;53210:23;53258:11;53236:19;;:33;;;;:::i;:::-;53210:59;;53295:18;53287:5;:26;53284:175;;;53356:18;53348:5;:26;;;;:::i;:::-;53334:40;;53284:175;;;53442:1;53428:15;;53284:175;53195:275;53157:313;50555:11;53502;:24;;;;:::i;:::-;53489:9;:37;;53476:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53614:5;53580:18;:30;53599:10;53580:30;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;53624:28;53634:10;53646:5;53624:9;:28::i;:::-;52763:894;;52720:937;:::o;26087:308::-;26198:19;:17;:19::i;:::-;26186:31;;:8;:31;;;26182:61;;;26226:17;;;;;;;;;;;;;;26182:61;26308:8;26256:18;:39;26275:19;:17;:19::i;:::-;26256:39;;;;;;;;;;;;;;;:49;26296:8;26256:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26368:8;26332:55;;26347:19;:17;:19::i;:::-;26332:55;;;26378:8;26332:55;;;;;;:::i;:::-;;;;;;;;26087:308;;:::o;50741:27::-;;;;;;;;;;;;;:::o;26957:399::-;27124:31;27137:4;27143:2;27147:7;27124:12;:31::i;:::-;27188:1;27170:2;:14;;;:19;27166:183;;27209:56;27240:4;27246:2;27250:7;27259:5;27209:30;:56::i;:::-;27204:145;;27293:40;;;;;;;;;;;;;;27204:145;27166:183;26957:399;;;;:::o;51706:75::-;2047:13;:11;:13::i;:::-;51771:5:::1;51760:8;;:16;;;;;;;;;;;;;;;;;;51706:75:::0;:::o;50521:45::-;50555:11;50521:45;:::o;52595:120::-;2047:13;:11;:13::i;:::-;52701:6:::1;52679:19;:28;;;;52595:120:::0;:::o;52246:341::-;52320:13;52356:16;52364:7;52356;:16::i;:::-;52348:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52471:1;52450:10;:8;:10::i;:::-;52444:24;:28;:138;;52570:12;52444:138;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52513:10;:8;:10::i;:::-;52525:18;:7;:16;:18::i;:::-;52496:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52444:138;52437:145;;52246:341;;;:::o;50664:29::-;;;;:::o;50908:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50570:42::-;50610:2;50570:42;:::o;51259:78::-;51303:13;51323:9;;;;;;;;;;;;;;51259:78;:::o;26466:164::-;26563:4;26587:18;:25;26606:5;26587:25;;;;;;;;;;;;;;;:35;26613:8;26587:35;;;;;;;;;;;;;;;;;;;;;;;;;26580:42;;26466:164;;;;:::o;3067:201::-;2047:13;:11;:13::i;:::-;3176:1:::1;3156:22;;:8;:22;;;;3148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3232:28;3251:8;3232:18;:28::i;:::-;3067:201:::0;:::o;51345:88::-;2047:13;:11;:13::i;:::-;51421:4:::1;51403:15;;:22;;;;;;;;;;;;;;;;;;51345:88::o:0;51585:116::-;51644:4;51668:18;:25;51687:5;51668:25;;;;;;;;;;;;;;;;51661:32;;51585:116;;;:::o;27611:273::-;27668:4;27724:7;27705:15;:13;:15::i;:::-;:26;;:66;;;;;27758:13;;27748:7;:23;27705:66;:152;;;;;27856:1;14222:8;27809:17;:26;27827:7;27809:26;;;;;;;;;;;;:43;:48;27705:152;27685:172;;27611:273;;;:::o;46172:105::-;46232:7;46259:10;46252:17;;46172:105;:::o;51173:81::-;51230:4;51248:1;51241:8;;51173:81;:::o;20571:1129::-;20638:7;20658:12;20673:7;20658:22;;20741:4;20722:15;:13;:15::i;:::-;:23;20718:915;;20775:13;;20768:4;:20;20764:869;;;20813:14;20830:17;:23;20848:4;20830:23;;;;;;;;;;;;20813:40;;20946:1;14222:8;20919:6;:23;:28;20915:699;;;21438:113;21455:1;21445:6;:11;21438:113;;;21498:17;:25;21516:6;;;;;;;21498:25;;;;;;;;;;;;21489:34;;21438:113;;;21584:6;21577:13;;;;;;20915:699;20790:843;20764:869;20718:915;21661:31;;;;;;;;;;;;;;20571:1129;;;;:::o;33412:652::-;33507:27;33536:23;33577:53;33633:15;33577:71;;33819:7;33813:4;33806:21;33854:22;33848:4;33841:36;33930:4;33924;33914:21;33891:44;;34026:19;34020:26;34001:45;;33757:300;33412:652;;;:::o;34177:645::-;34319:11;34481:15;34475:4;34471:26;34463:34;;34640:15;34629:9;34625:31;34612:44;;34787:15;34776:9;34773:30;34766:4;34755:9;34752:19;34749:55;34739:65;;34177:645;;;;;:::o;45005:159::-;;;;;:::o;43317:309::-;43452:7;43472:16;14623:3;43498:19;:40;;43472:67;;14623:3;43565:31;43576:4;43582:2;43586:9;43565:10;:31::i;:::-;43557:40;;:61;;43550:68;;;43317:309;;;;;:::o;23145:447::-;23225:14;23393:15;23386:5;23382:27;23373:36;;23567:5;23553:11;23529:22;23525:40;23522:51;23515:5;23512:62;23502:72;;23145:447;;;;:::o;45823:158::-;;;;;:::o;2326:132::-;2401:12;:10;:12::i;:::-;2390:23;;:7;:5;:7::i;:::-;:23;;;2382:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2326:132::o;17685:285::-;17732:7;17936:15;:13;:15::i;:::-;17920:13;;:31;17913:38;;17685:285;:::o;27968:104::-;28037:27;28047:2;28051:8;28037:27;;;;;;;;;;;;:9;:27::i;:::-;27968:104;;:::o;3428:191::-;3502:16;3521:6;;;;;;;;;;;3502:25;;3547:8;3538:6;;:17;;;;;;;;;;;;;;;;;;3602:8;3571:40;;3592:8;3571:40;;;;;;;;;;;;3491:128;3428:191;:::o;41827:716::-;41990:4;42036:2;42011:45;;;42057:19;:17;:19::i;:::-;42078:4;42084:7;42093:5;42011:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42007:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42311:1;42294:6;:13;:18;42290:235;;;42340:40;;;;;;;;;;;;;;42290:235;42483:6;42477:13;42468:6;42464:2;42460:15;42453:38;42007:529;42180:54;;;42170:64;;;:6;:64;;;;42163:71;;;41827:716;;;;;;:::o;51076:92::-;51128:13;51155:8;51148:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51076:92;:::o;48648:723::-;48704:13;48934:1;48925:5;:10;48921:53;;;48952:10;;;;;;;;;;;;;;;;;;;;;48921:53;48984:12;48999:5;48984:20;;49015:14;49040:78;49055:1;49047:4;:9;49040:78;;49073:8;;;;;:::i;:::-;;;;49104:2;49096:10;;;;;:::i;:::-;;;49040:78;;;49128:19;49160:6;49150:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49128:39;;49178:154;49194:1;49185:5;:10;49178:154;;49222:1;49212:11;;;;;:::i;:::-;;;49289:2;49281:5;:10;;;;:::i;:::-;49268:2;:24;;;;:::i;:::-;49255:39;;49238:6;49245;49238:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;49318:2;49309:11;;;;;:::i;:::-;;;49178:154;;;49356:6;49342:21;;;;;48648:723;;;;:::o;44202:147::-;44339:6;44202:147;;;;;:::o;712:98::-;765:7;792:10;785:17;;712:98;:::o;28488:681::-;28611:19;28617:2;28621:8;28611:5;:19::i;:::-;28690:1;28672:2;:14;;;:19;28668:483;;28712:11;28726:13;;28712:27;;28758:13;28780:8;28774:3;:14;28758:30;;28807:233;28838:62;28877:1;28881:2;28885:7;;;;;;28894:5;28838:30;:62::i;:::-;28833:167;;28936:40;;;;;;;;;;;;;;28833:167;29035:3;29027:5;:11;28807:233;;29122:3;29105:13;;:20;29101:34;;29127:8;;;29101:34;28693:458;;28668:483;28488:681;;;:::o;29442:1529::-;29507:20;29530:13;;29507:36;;29572:1;29558:16;;:2;:16;;;29554:48;;;29583:19;;;;;;;;;;;;;;29554:48;29629:1;29617:8;:13;29613:44;;;29639:18;;;;;;;;;;;;;;29613:44;29670:61;29700:1;29704:2;29708:12;29722:8;29670:21;:61::i;:::-;30213:1;13589:2;30184:1;:25;;30183:31;30171:8;:44;30145:18;:22;30164:2;30145:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30492:139;30529:2;30583:33;30606:1;30610:2;30614:1;30583:14;:33::i;:::-;30550:30;30571:8;30550:20;:30::i;:::-;:66;30492:18;:139::i;:::-;30458:17;:31;30476:12;30458:31;;;;;;;;;;;:173;;;;30648:15;30666:12;30648:30;;30693:11;30722:8;30707:12;:23;30693:37;;30745:101;30797:9;;;;;;30793:2;30772:35;;30789:1;30772:35;;;;;;;;;;;;30841:3;30831:7;:13;30745:101;;30878:3;30862:13;:19;;;;29919:974;;30903:60;30932:1;30936:2;30940:12;30954:8;30903:20;:60::i;:::-;29496:1475;29442:1529;;:::o;24975:322::-;25045:14;25276:1;25266:8;25263:15;25238:23;25234:45;25224:55;;24975:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:400::-;11237:3;11258:84;11340:1;11335:3;11258:84;:::i;:::-;11251:91;;11351:93;11440:3;11351:93;:::i;:::-;11469:1;11464:3;11460:11;11453:18;;11077:400;;;:::o;11483:366::-;11625:3;11646:67;11710:2;11705:3;11646:67;:::i;:::-;11639:74;;11722:93;11811:3;11722:93;:::i;:::-;11840:2;11835:3;11831:12;11824:19;;11483:366;;;:::o;11855:::-;11997:3;12018:67;12082:2;12077:3;12018:67;:::i;:::-;12011:74;;12094:93;12183:3;12094:93;:::i;:::-;12212:2;12207:3;12203:12;12196:19;;11855:366;;;:::o;12227:398::-;12386:3;12407:83;12488:1;12483:3;12407:83;:::i;:::-;12400:90;;12499:93;12588:3;12499:93;:::i;:::-;12617:1;12612:3;12608:11;12601:18;;12227:398;;;:::o;12631:366::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12631:366;;;:::o;13003:118::-;13090:24;13108:5;13090:24;:::i;:::-;13085:3;13078:37;13003:118;;:::o;13127:701::-;13408:3;13430:95;13521:3;13512:6;13430:95;:::i;:::-;13423:102;;13542:95;13633:3;13624:6;13542:95;:::i;:::-;13535:102;;13654:148;13798:3;13654:148;:::i;:::-;13647:155;;13819:3;13812:10;;13127:701;;;;;:::o;13834:379::-;14018:3;14040:147;14183:3;14040:147;:::i;:::-;14033:154;;14204:3;14197:10;;13834:379;;;:::o;14219:222::-;14312:4;14350:2;14339:9;14335:18;14327:26;;14363:71;14431:1;14420:9;14416:17;14407:6;14363:71;:::i;:::-;14219:222;;;;:::o;14447:640::-;14642:4;14680:3;14669:9;14665:19;14657:27;;14694:71;14762:1;14751:9;14747:17;14738:6;14694:71;:::i;:::-;14775:72;14843:2;14832:9;14828:18;14819:6;14775:72;:::i;:::-;14857;14925:2;14914:9;14910:18;14901:6;14857:72;:::i;:::-;14976:9;14970:4;14966:20;14961:2;14950:9;14946:18;14939:48;15004:76;15075:4;15066:6;15004:76;:::i;:::-;14996:84;;14447:640;;;;;;;:::o;15093:210::-;15180:4;15218:2;15207:9;15203:18;15195:26;;15231:65;15293:1;15282:9;15278:17;15269:6;15231:65;:::i;:::-;15093:210;;;;:::o;15309:313::-;15422:4;15460:2;15449:9;15445:18;15437:26;;15509:9;15503:4;15499:20;15495:1;15484:9;15480:17;15473:47;15537:78;15610:4;15601:6;15537:78;:::i;:::-;15529:86;;15309:313;;;;:::o;15628:419::-;15794:4;15832:2;15821:9;15817:18;15809:26;;15881:9;15875:4;15871:20;15867:1;15856:9;15852:17;15845:47;15909:131;16035:4;15909:131;:::i;:::-;15901:139;;15628:419;;;:::o;16053:::-;16219:4;16257:2;16246:9;16242:18;16234:26;;16306:9;16300:4;16296:20;16292:1;16281:9;16277:17;16270:47;16334:131;16460:4;16334:131;:::i;:::-;16326:139;;16053:419;;;:::o;16478:::-;16644:4;16682:2;16671:9;16667:18;16659:26;;16731:9;16725:4;16721:20;16717:1;16706:9;16702:17;16695:47;16759:131;16885:4;16759:131;:::i;:::-;16751:139;;16478:419;;;:::o;16903:::-;17069:4;17107:2;17096:9;17092:18;17084:26;;17156:9;17150:4;17146:20;17142:1;17131:9;17127:17;17120:47;17184:131;17310:4;17184:131;:::i;:::-;17176:139;;16903:419;;;:::o;17328:::-;17494:4;17532:2;17521:9;17517:18;17509:26;;17581:9;17575:4;17571:20;17567:1;17556:9;17552:17;17545:47;17609:131;17735:4;17609:131;:::i;:::-;17601:139;;17328:419;;;:::o;17753:::-;17919:4;17957:2;17946:9;17942:18;17934:26;;18006:9;18000:4;17996:20;17992:1;17981:9;17977:17;17970:47;18034:131;18160:4;18034:131;:::i;:::-;18026:139;;17753:419;;;:::o;18178:::-;18344:4;18382:2;18371:9;18367:18;18359:26;;18431:9;18425:4;18421:20;18417:1;18406:9;18402:17;18395:47;18459:131;18585:4;18459:131;:::i;:::-;18451:139;;18178:419;;;:::o;18603:::-;18769:4;18807:2;18796:9;18792:18;18784:26;;18856:9;18850:4;18846:20;18842:1;18831:9;18827:17;18820:47;18884:131;19010:4;18884:131;:::i;:::-;18876:139;;18603:419;;;:::o;19028:::-;19194:4;19232:2;19221:9;19217:18;19209:26;;19281:9;19275:4;19271:20;19267:1;19256:9;19252:17;19245:47;19309:131;19435:4;19309:131;:::i;:::-;19301:139;;19028:419;;;:::o;19453:222::-;19546:4;19584:2;19573:9;19569:18;19561:26;;19597:71;19665:1;19654:9;19650:17;19641:6;19597:71;:::i;:::-;19453:222;;;;:::o;19681:129::-;19715:6;19742:20;;:::i;:::-;19732:30;;19771:33;19799:4;19791:6;19771:33;:::i;:::-;19681:129;;;:::o;19816:75::-;19849:6;19882:2;19876:9;19866:19;;19816:75;:::o;19897:307::-;19958:4;20048:18;20040:6;20037:30;20034:56;;;20070:18;;:::i;:::-;20034:56;20108:29;20130:6;20108:29;:::i;:::-;20100:37;;20192:4;20186;20182:15;20174:23;;19897:307;;;:::o;20210:308::-;20272:4;20362:18;20354:6;20351:30;20348:56;;;20384:18;;:::i;:::-;20348:56;20422:29;20444:6;20422:29;:::i;:::-;20414:37;;20506:4;20500;20496:15;20488:23;;20210:308;;;:::o;20524:98::-;20575:6;20609:5;20603:12;20593:22;;20524:98;;;:::o;20628:99::-;20680:6;20714:5;20708:12;20698:22;;20628:99;;;:::o;20733:168::-;20816:11;20850:6;20845:3;20838:19;20890:4;20885:3;20881:14;20866:29;;20733:168;;;;:::o;20907:147::-;21008:11;21045:3;21030:18;;20907:147;;;;:::o;21060:169::-;21144:11;21178:6;21173:3;21166:19;21218:4;21213:3;21209:14;21194:29;;21060:169;;;;:::o;21235:148::-;21337:11;21374:3;21359:18;;21235:148;;;;:::o;21389:305::-;21429:3;21448:20;21466:1;21448:20;:::i;:::-;21443:25;;21482:20;21500:1;21482:20;:::i;:::-;21477:25;;21636:1;21568:66;21564:74;21561:1;21558:81;21555:107;;;21642:18;;:::i;:::-;21555:107;21686:1;21683;21679:9;21672:16;;21389:305;;;;:::o;21700:185::-;21740:1;21757:20;21775:1;21757:20;:::i;:::-;21752:25;;21791:20;21809:1;21791:20;:::i;:::-;21786:25;;21830:1;21820:35;;21835:18;;:::i;:::-;21820:35;21877:1;21874;21870:9;21865:14;;21700:185;;;;:::o;21891:348::-;21931:7;21954:20;21972:1;21954:20;:::i;:::-;21949:25;;21988:20;22006:1;21988:20;:::i;:::-;21983:25;;22176:1;22108:66;22104:74;22101:1;22098:81;22093:1;22086:9;22079:17;22075:105;22072:131;;;22183:18;;:::i;:::-;22072:131;22231:1;22228;22224:9;22213:20;;21891:348;;;;:::o;22245:191::-;22285:4;22305:20;22323:1;22305:20;:::i;:::-;22300:25;;22339:20;22357:1;22339:20;:::i;:::-;22334:25;;22378:1;22375;22372:8;22369:34;;;22383:18;;:::i;:::-;22369:34;22428:1;22425;22421:9;22413:17;;22245:191;;;;:::o;22442:96::-;22479:7;22508:24;22526:5;22508:24;:::i;:::-;22497:35;;22442:96;;;:::o;22544:90::-;22578:7;22621:5;22614:13;22607:21;22596:32;;22544:90;;;:::o;22640:149::-;22676:7;22716:66;22709:5;22705:78;22694:89;;22640:149;;;:::o;22795:126::-;22832:7;22872:42;22865:5;22861:54;22850:65;;22795:126;;;:::o;22927:77::-;22964:7;22993:5;22982:16;;22927:77;;;:::o;23010:154::-;23094:6;23089:3;23084;23071:30;23156:1;23147:6;23142:3;23138:16;23131:27;23010:154;;;:::o;23170:307::-;23238:1;23248:113;23262:6;23259:1;23256:13;23248:113;;;23347:1;23342:3;23338:11;23332:18;23328:1;23323:3;23319:11;23312:39;23284:2;23281:1;23277:10;23272:15;;23248:113;;;23379:6;23376:1;23373:13;23370:101;;;23459:1;23450:6;23445:3;23441:16;23434:27;23370:101;23219:258;23170:307;;;:::o;23483:320::-;23527:6;23564:1;23558:4;23554:12;23544:22;;23611:1;23605:4;23601:12;23632:18;23622:81;;23688:4;23680:6;23676:17;23666:27;;23622:81;23750:2;23742:6;23739:14;23719:18;23716:38;23713:84;;;23769:18;;:::i;:::-;23713:84;23534:269;23483:320;;;:::o;23809:281::-;23892:27;23914:4;23892:27;:::i;:::-;23884:6;23880:40;24022:6;24010:10;24007:22;23986:18;23974:10;23971:34;23968:62;23965:88;;;24033:18;;:::i;:::-;23965:88;24073:10;24069:2;24062:22;23852:238;23809:281;;:::o;24096:233::-;24135:3;24158:24;24176:5;24158:24;:::i;:::-;24149:33;;24204:66;24197:5;24194:77;24191:103;;;24274:18;;:::i;:::-;24191:103;24321:1;24314:5;24310:13;24303:20;;24096:233;;;:::o;24335:176::-;24367:1;24384:20;24402:1;24384:20;:::i;:::-;24379:25;;24418:20;24436:1;24418:20;:::i;:::-;24413:25;;24457:1;24447:35;;24462:18;;:::i;:::-;24447:35;24503:1;24500;24496:9;24491:14;;24335:176;;;;:::o;24517:180::-;24565:77;24562:1;24555:88;24662:4;24659:1;24652:15;24686:4;24683:1;24676:15;24703:180;24751:77;24748:1;24741:88;24848:4;24845:1;24838:15;24872:4;24869:1;24862:15;24889:180;24937:77;24934:1;24927:88;25034:4;25031:1;25024:15;25058:4;25055:1;25048:15;25075:180;25123:77;25120:1;25113:88;25220:4;25217:1;25210:15;25244:4;25241:1;25234:15;25261:180;25309:77;25306:1;25299:88;25406:4;25403:1;25396:15;25430:4;25427:1;25420:15;25447:117;25556:1;25553;25546:12;25570:117;25679:1;25676;25669:12;25693:117;25802:1;25799;25792:12;25816:117;25925:1;25922;25915:12;25939:102;25980:6;26031:2;26027:7;26022:2;26015:5;26011:14;26007:28;25997:38;;25939:102;;;:::o;26047:171::-;26187:23;26183:1;26175:6;26171:14;26164:47;26047:171;:::o;26224:225::-;26364:34;26360:1;26352:6;26348:14;26341:58;26433:8;26428:2;26420:6;26416:15;26409:33;26224:225;:::o;26455:220::-;26595:34;26591:1;26583:6;26579:14;26572:58;26664:3;26659:2;26651:6;26647:15;26640:28;26455:220;:::o;26681:163::-;26821:15;26817:1;26809:6;26805:14;26798:39;26681:163;:::o;26850:168::-;26990:20;26986:1;26978:6;26974:14;26967:44;26850:168;:::o;27024:221::-;27164:34;27160:1;27152:6;27148:14;27141:58;27233:4;27228:2;27220:6;27216:15;27209:29;27024:221;:::o;27251:155::-;27391:7;27387:1;27379:6;27375:14;27368:31;27251:155;:::o;27412:182::-;27552:34;27548:1;27540:6;27536:14;27529:58;27412:182;:::o;27600:234::-;27740:34;27736:1;27728:6;27724:14;27717:58;27809:17;27804:2;27796:6;27792:15;27785:42;27600:234;:::o;27840:114::-;;:::o;27960:172::-;28100:24;28096:1;28088:6;28084:14;28077:48;27960:172;:::o;28138:122::-;28211:24;28229:5;28211:24;:::i;:::-;28204:5;28201:35;28191:63;;28250:1;28247;28240:12;28191:63;28138:122;:::o;28266:116::-;28336:21;28351:5;28336:21;:::i;:::-;28329:5;28326:32;28316:60;;28372:1;28369;28362:12;28316:60;28266:116;:::o;28388:120::-;28460:23;28477:5;28460:23;:::i;:::-;28453:5;28450:34;28440:62;;28498:1;28495;28488:12;28440:62;28388:120;:::o;28514:122::-;28587:24;28605:5;28587:24;:::i;:::-;28580:5;28577:35;28567:63;;28626:1;28623;28616:12;28567:63;28514:122;:::o

Swarm Source

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