ETH Price: $2,537.85 (+0.25%)

Token

PixelApe (pApe)
 

Overview

Max Total Supply

684 pApe

Holders

38

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 pApe
0x240c912e6790fb38e2916251181d06e85a5cd554
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:
PixelApe

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 6 : PixelApe.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract PixelApe is ERC721A, Ownable, ReentrancyGuard {
    uint256 private _collectionSize = 10000;
    uint256 private _batchSize = 1;
    bool private _paused = true;
    string private _baseTokenURI =
        "ipfs://bafybeidldridsqko7yn4abhsuplpggh7i437cclsdjupsexb3p56tyctdi/";

    constructor() ERC721A("PixelApe", "pApe") {}

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

    function airdrop(address to, uint256 quantity) public onlyOwner {
        require(
            totalSupply() + quantity <= _collectionSize,
            "Reached max supply."
        );
        _safeMint(to, quantity);
    }

    function mint() public nonReentrant {
        require(!_paused, "Public mint has not begun yet.");
        require(tx.origin == msg.sender, "The caller is another contract.");
        require(
            totalSupply() + _batchSize <= _collectionSize,
            "Reached max supply."
        );
        require(
            _numberMinted(msg.sender) < _batchSize,
            "Can not mint this many."
        );
        _safeMint(msg.sender, _batchSize);
    }

    function openPublicMint(bool state) public onlyOwner {
        _paused = !state;
    }

    function setBatchSize(uint256 size) public onlyOwner {
        _batchSize = size;
    }

    function setBaseURI(string calldata baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

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

File 2 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 3 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 4 of 6 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 virtual {
        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;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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 '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 virtual {
        uint256 startTokenId = _currentIndex;
        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 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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 virtual {
        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 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 virtual {
        _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 Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(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++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        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 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 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;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

File 5 of 6 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
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();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores 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 via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

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

pragma solidity ^0.8.0;

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"name":"setBatchSize","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"}]

6080604052612710600a556001600b556001600c60006101000a81548160ff0219169083151502179055506040518060800160405280604381526020016200302b60439139600d908162000054919062000486565b503480156200006257600080fd5b506040518060400160405280600881526020017f506978656c4170650000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f70417065000000000000000000000000000000000000000000000000000000008152508160029081620000e0919062000486565b508060039081620000f2919062000486565b50620001036200013960201b60201c565b60008190555050506200012b6200011f6200013e60201b60201c565b6200014660201b60201c565b60016009819055506200056d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200020c565b67ffffffffffffffff811115620004ad57620004ac62000217565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b612aae806200057d6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb46514610350578063af947cec1461036c578063b88d4fde14610388578063c87b56dd146103a4578063e985e9c5146103d4578063f2fde38b146104045761014d565b80636352211e1461028e57806370a08231146102be578063715018a6146102ee5780638ba4cc3c146102f85780638da5cb5b1461031457806395d89b41146103325761014d565b806318160ddd1161011557806318160ddd146101f657806323b872dd146102145780633ccfd60b1461023057806342842e0e1461023a57806355f804b314610256578063576f35e3146102725761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780631249c58b146101ec575b600080fd5b61016c60048036038101906101679190611bf7565b610420565b6040516101799190611c3f565b60405180910390f35b61018a6104b2565b6040516101979190611cea565b60405180910390f35b6101ba60048036038101906101b59190611d42565b610544565b6040516101c79190611db0565b60405180910390f35b6101ea60048036038101906101e59190611df7565b6105c3565b005b6101f4610707565b005b6101fe6108cd565b60405161020b9190611e46565b60405180910390f35b61022e60048036038101906102299190611e61565b6108e4565b005b610238610c06565b005b610254600480360381019061024f9190611e61565b610d12565b005b610270600480360381019061026b9190611f19565b610d32565b005b61028c60048036038101906102879190611d42565b610d50565b005b6102a860048036038101906102a39190611d42565b610d62565b6040516102b59190611db0565b60405180910390f35b6102d860048036038101906102d39190611f66565b610d74565b6040516102e59190611e46565b60405180910390f35b6102f6610e2c565b005b610312600480360381019061030d9190611df7565b610e40565b005b61031c610ead565b6040516103299190611db0565b60405180910390f35b61033a610ed7565b6040516103479190611cea565b60405180910390f35b61036a60048036038101906103659190611fbf565b610f69565b005b61038660048036038101906103819190611fff565b6110e0565b005b6103a2600480360381019061039d919061215c565b611106565b005b6103be60048036038101906103b99190611d42565b611179565b6040516103cb9190611cea565b60405180910390f35b6103ee60048036038101906103e991906121df565b611217565b6040516103fb9190611c3f565b60405180910390f35b61041e60048036038101906104199190611f66565b6112ab565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061047b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ab5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546104c19061224e565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061224e565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b5050505050905090565b600061054f8261132e565b610585576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105ce82610d62565b90508073ffffffffffffffffffffffffffffffffffffffff166105ef61138d565b73ffffffffffffffffffffffffffffffffffffffff16146106525761061b8161061661138d565b611217565b610651576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60026009540361074c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610743906122cb565b60405180910390fd5b6002600981905550600c60009054906101000a900460ff16156107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90612337565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610809906123a3565b60405180910390fd5b600a54600b546108206108cd565b61082a91906123f2565b111561086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612472565b60405180910390fd5b600b5461087733611395565b106108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae906124de565b60405180910390fd5b6108c333600b546113ec565b6001600981905550565b60006108d761140a565b6001546000540303905090565b60006108ef8261140f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610956576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610962846114db565b91509150610978818761097361138d565b611502565b6109c45761098d8661098861138d565b611217565b6109c3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610a2a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a378686866001611546565b8015610a4257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b1085610aec88888761154c565b7c020000000000000000000000000000000000000000000000000000000017611574565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b965760006001850190506000600460008381526020019081526020016000205403610b94576000548114610b93578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610bfe868686600161159f565b505050505050565b610c0e6115a5565b600260095403610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a906122cb565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c819061252f565b60006040518083038185875af1925050503d8060008114610cbe576040519150601f19603f3d011682016040523d82523d6000602084013e610cc3565b606091505b5050905080610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90612590565b60405180910390fd5b506001600981905550565b610d2d83838360405180602001604052806000815250611106565b505050565b610d3a6115a5565b8181600d9182610d4b929190612767565b505050565b610d586115a5565b80600b8190555050565b6000610d6d8261140f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ddb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e346115a5565b610e3e6000611623565b565b610e486115a5565b600a5481610e546108cd565b610e5e91906123f2565b1115610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690612472565b60405180910390fd5b610ea982826113ec565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ee69061224e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f129061224e565b8015610f5f5780601f10610f3457610100808354040283529160200191610f5f565b820191906000526020600020905b815481529060010190602001808311610f4257829003601f168201915b5050505050905090565b610f7161138d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fd5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fe261138d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661108f61138d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110d49190611c3f565b60405180910390a35050565b6110e86115a5565b8015600c60006101000a81548160ff02191690831515021790555050565b6111118484846108e4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146111735761113c848484846116e9565b611172576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606111848261132e565b6111ba576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c4611839565b905060008151036111e4576040518060200160405280600081525061120f565b806111ee846118cb565b6040516020016111ff929190612873565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112b36115a5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612909565b60405180910390fd5b61132b81611623565b50565b60008161133961140a565b11158015611348575060005482105b8015611386575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611406828260405180602001604052806000815250611912565b5050565b600090565b6000808290508061141e61140a565b116114a4576000548110156114a35760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036114a1575b6000810361149757600460008360019003935083815260200190815260200160002054905061146d565b80925050506114d6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86115638686846119af565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6115ad6119b8565b73ffffffffffffffffffffffffffffffffffffffff166115cb610ead565b73ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890612975565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261170f61138d565b8786866040518563ffffffff1660e01b815260040161173194939291906129ea565b6020604051808303816000875af192505050801561176d57506040513d601f19601f8201168201806040525081019061176a9190612a4b565b60015b6117e6573d806000811461179d576040519150601f19603f3d011682016040523d82523d6000602084013e6117a2565b606091505b5060008151036117de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546118489061224e565b80601f01602080910402602001604051908101604052809291908181526020018280546118749061224e565b80156118c15780601f10611896576101008083540402835291602001916118c1565b820191906000526020600020905b8154815290600101906020018083116118a457829003601f168201915b5050505050905090565b606060806040510190508060405280825b6001156118fe57600183039250600a81066030018353600a81049050806118dc575b508181036020830392508083525050919050565b61191c83836119c0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119aa57600080549050600083820390505b61195c60008683806001019450866116e9565b611992576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106119495781600054146119a757600080fd5b50505b505050565b60009392505050565b600033905090565b60008054905060008203611a00576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a0d6000848385611546565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611a8483611a75600086600061154c565b611a7e85611b7b565b17611574565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611b2557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611aea565b5060008203611b60576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611b76600084838561159f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bd481611b9f565b8114611bdf57600080fd5b50565b600081359050611bf181611bcb565b92915050565b600060208284031215611c0d57611c0c611b95565b5b6000611c1b84828501611be2565b91505092915050565b60008115159050919050565b611c3981611c24565b82525050565b6000602082019050611c546000830184611c30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c94578082015181840152602081019050611c79565b60008484015250505050565b6000601f19601f8301169050919050565b6000611cbc82611c5a565b611cc68185611c65565b9350611cd6818560208601611c76565b611cdf81611ca0565b840191505092915050565b60006020820190508181036000830152611d048184611cb1565b905092915050565b6000819050919050565b611d1f81611d0c565b8114611d2a57600080fd5b50565b600081359050611d3c81611d16565b92915050565b600060208284031215611d5857611d57611b95565b5b6000611d6684828501611d2d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d9a82611d6f565b9050919050565b611daa81611d8f565b82525050565b6000602082019050611dc56000830184611da1565b92915050565b611dd481611d8f565b8114611ddf57600080fd5b50565b600081359050611df181611dcb565b92915050565b60008060408385031215611e0e57611e0d611b95565b5b6000611e1c85828601611de2565b9250506020611e2d85828601611d2d565b9150509250929050565b611e4081611d0c565b82525050565b6000602082019050611e5b6000830184611e37565b92915050565b600080600060608486031215611e7a57611e79611b95565b5b6000611e8886828701611de2565b9350506020611e9986828701611de2565b9250506040611eaa86828701611d2d565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611ed957611ed8611eb4565b5b8235905067ffffffffffffffff811115611ef657611ef5611eb9565b5b602083019150836001820283011115611f1257611f11611ebe565b5b9250929050565b60008060208385031215611f3057611f2f611b95565b5b600083013567ffffffffffffffff811115611f4e57611f4d611b9a565b5b611f5a85828601611ec3565b92509250509250929050565b600060208284031215611f7c57611f7b611b95565b5b6000611f8a84828501611de2565b91505092915050565b611f9c81611c24565b8114611fa757600080fd5b50565b600081359050611fb981611f93565b92915050565b60008060408385031215611fd657611fd5611b95565b5b6000611fe485828601611de2565b9250506020611ff585828601611faa565b9150509250929050565b60006020828403121561201557612014611b95565b5b600061202384828501611faa565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61206982611ca0565b810181811067ffffffffffffffff8211171561208857612087612031565b5b80604052505050565b600061209b611b8b565b90506120a78282612060565b919050565b600067ffffffffffffffff8211156120c7576120c6612031565b5b6120d082611ca0565b9050602081019050919050565b82818337600083830152505050565b60006120ff6120fa846120ac565b612091565b90508281526020810184848401111561211b5761211a61202c565b5b6121268482856120dd565b509392505050565b600082601f83011261214357612142611eb4565b5b81356121538482602086016120ec565b91505092915050565b6000806000806080858703121561217657612175611b95565b5b600061218487828801611de2565b945050602061219587828801611de2565b93505060406121a687828801611d2d565b925050606085013567ffffffffffffffff8111156121c7576121c6611b9a565b5b6121d38782880161212e565b91505092959194509250565b600080604083850312156121f6576121f5611b95565b5b600061220485828601611de2565b925050602061221585828601611de2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061226657607f821691505b6020821081036122795761227861221f565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006122b5601f83611c65565b91506122c08261227f565b602082019050919050565b600060208201905081810360008301526122e4816122a8565b9050919050565b7f5075626c6963206d696e7420686173206e6f7420626567756e207965742e0000600082015250565b6000612321601e83611c65565b915061232c826122eb565b602082019050919050565b6000602082019050818103600083015261235081612314565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163742e00600082015250565b600061238d601f83611c65565b915061239882612357565b602082019050919050565b600060208201905081810360008301526123bc81612380565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006123fd82611d0c565b915061240883611d0c565b92508282019050808211156124205761241f6123c3565b5b92915050565b7f52656163686564206d617820737570706c792e00000000000000000000000000600082015250565b600061245c601383611c65565b915061246782612426565b602082019050919050565b6000602082019050818103600083015261248b8161244f565b9050919050565b7f43616e206e6f74206d696e742074686973206d616e792e000000000000000000600082015250565b60006124c8601783611c65565b91506124d382612492565b602082019050919050565b600060208201905081810360008301526124f7816124bb565b9050919050565b600081905092915050565b50565b60006125196000836124fe565b915061252482612509565b600082019050919050565b600061253a8261250c565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061257a601083611c65565b915061258582612544565b602082019050919050565b600060208201905081810360008301526125a98161256d565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261261d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826125e0565b61262786836125e0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061266461265f61265a84611d0c565b61263f565b611d0c565b9050919050565b6000819050919050565b61267e83612649565b61269261268a8261266b565b8484546125ed565b825550505050565b600090565b6126a761269a565b6126b2818484612675565b505050565b5b818110156126d6576126cb60008261269f565b6001810190506126b8565b5050565b601f82111561271b576126ec816125bb565b6126f5846125d0565b81016020851015612704578190505b612718612710856125d0565b8301826126b7565b50505b505050565b600082821c905092915050565b600061273e60001984600802612720565b1980831691505092915050565b6000612757838361272d565b9150826002028217905092915050565b61277183836125b0565b67ffffffffffffffff81111561278a57612789612031565b5b612794825461224e565b61279f8282856126da565b6000601f8311600181146127ce57600084156127bc578287013590505b6127c6858261274b565b86555061282e565b601f1984166127dc866125bb565b60005b82811015612804578489013582556001820191506020850194506020810190506127df565b86831015612821578489013561281d601f89168261272d565b8355505b6001600288020188555050505b50505050505050565b600081905092915050565b600061284d82611c5a565b6128578185612837565b9350612867818560208601611c76565b80840191505092915050565b600061287f8285612842565b915061288b8284612842565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006128f3602683611c65565b91506128fe82612897565b604082019050919050565b60006020820190508181036000830152612922816128e6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061295f602083611c65565b915061296a82612929565b602082019050919050565b6000602082019050818103600083015261298e81612952565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006129bc82612995565b6129c681856129a0565b93506129d6818560208601611c76565b6129df81611ca0565b840191505092915050565b60006080820190506129ff6000830187611da1565b612a0c6020830186611da1565b612a196040830185611e37565b8181036060830152612a2b81846129b1565b905095945050505050565b600081519050612a4581611bcb565b92915050565b600060208284031215612a6157612a60611b95565b5b6000612a6f84828501612a36565b9150509291505056fea2646970667358221220bdfacedc62dc13048e0df67345229798a1edece84a7727e19fe446f3c070a75164736f6c63430008100033697066733a2f2f62616679626569646c6472696473716b6f37796e346162687375706c70676768376934333763636c73646a757073657862337035367479637464692f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb46514610350578063af947cec1461036c578063b88d4fde14610388578063c87b56dd146103a4578063e985e9c5146103d4578063f2fde38b146104045761014d565b80636352211e1461028e57806370a08231146102be578063715018a6146102ee5780638ba4cc3c146102f85780638da5cb5b1461031457806395d89b41146103325761014d565b806318160ddd1161011557806318160ddd146101f657806323b872dd146102145780633ccfd60b1461023057806342842e0e1461023a57806355f804b314610256578063576f35e3146102725761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780631249c58b146101ec575b600080fd5b61016c60048036038101906101679190611bf7565b610420565b6040516101799190611c3f565b60405180910390f35b61018a6104b2565b6040516101979190611cea565b60405180910390f35b6101ba60048036038101906101b59190611d42565b610544565b6040516101c79190611db0565b60405180910390f35b6101ea60048036038101906101e59190611df7565b6105c3565b005b6101f4610707565b005b6101fe6108cd565b60405161020b9190611e46565b60405180910390f35b61022e60048036038101906102299190611e61565b6108e4565b005b610238610c06565b005b610254600480360381019061024f9190611e61565b610d12565b005b610270600480360381019061026b9190611f19565b610d32565b005b61028c60048036038101906102879190611d42565b610d50565b005b6102a860048036038101906102a39190611d42565b610d62565b6040516102b59190611db0565b60405180910390f35b6102d860048036038101906102d39190611f66565b610d74565b6040516102e59190611e46565b60405180910390f35b6102f6610e2c565b005b610312600480360381019061030d9190611df7565b610e40565b005b61031c610ead565b6040516103299190611db0565b60405180910390f35b61033a610ed7565b6040516103479190611cea565b60405180910390f35b61036a60048036038101906103659190611fbf565b610f69565b005b61038660048036038101906103819190611fff565b6110e0565b005b6103a2600480360381019061039d919061215c565b611106565b005b6103be60048036038101906103b99190611d42565b611179565b6040516103cb9190611cea565b60405180910390f35b6103ee60048036038101906103e991906121df565b611217565b6040516103fb9190611c3f565b60405180910390f35b61041e60048036038101906104199190611f66565b6112ab565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061047b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ab5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546104c19061224e565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061224e565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b5050505050905090565b600061054f8261132e565b610585576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105ce82610d62565b90508073ffffffffffffffffffffffffffffffffffffffff166105ef61138d565b73ffffffffffffffffffffffffffffffffffffffff16146106525761061b8161061661138d565b611217565b610651576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60026009540361074c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610743906122cb565b60405180910390fd5b6002600981905550600c60009054906101000a900460ff16156107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079b90612337565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610809906123a3565b60405180910390fd5b600a54600b546108206108cd565b61082a91906123f2565b111561086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612472565b60405180910390fd5b600b5461087733611395565b106108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae906124de565b60405180910390fd5b6108c333600b546113ec565b6001600981905550565b60006108d761140a565b6001546000540303905090565b60006108ef8261140f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610956576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610962846114db565b91509150610978818761097361138d565b611502565b6109c45761098d8661098861138d565b611217565b6109c3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610a2a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a378686866001611546565b8015610a4257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b1085610aec88888761154c565b7c020000000000000000000000000000000000000000000000000000000017611574565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b965760006001850190506000600460008381526020019081526020016000205403610b94576000548114610b93578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610bfe868686600161159f565b505050505050565b610c0e6115a5565b600260095403610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a906122cb565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c819061252f565b60006040518083038185875af1925050503d8060008114610cbe576040519150601f19603f3d011682016040523d82523d6000602084013e610cc3565b606091505b5050905080610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90612590565b60405180910390fd5b506001600981905550565b610d2d83838360405180602001604052806000815250611106565b505050565b610d3a6115a5565b8181600d9182610d4b929190612767565b505050565b610d586115a5565b80600b8190555050565b6000610d6d8261140f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ddb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e346115a5565b610e3e6000611623565b565b610e486115a5565b600a5481610e546108cd565b610e5e91906123f2565b1115610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690612472565b60405180910390fd5b610ea982826113ec565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ee69061224e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f129061224e565b8015610f5f5780601f10610f3457610100808354040283529160200191610f5f565b820191906000526020600020905b815481529060010190602001808311610f4257829003601f168201915b5050505050905090565b610f7161138d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fd5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fe261138d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661108f61138d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110d49190611c3f565b60405180910390a35050565b6110e86115a5565b8015600c60006101000a81548160ff02191690831515021790555050565b6111118484846108e4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146111735761113c848484846116e9565b611172576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606111848261132e565b6111ba576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c4611839565b905060008151036111e4576040518060200160405280600081525061120f565b806111ee846118cb565b6040516020016111ff929190612873565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112b36115a5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612909565b60405180910390fd5b61132b81611623565b50565b60008161133961140a565b11158015611348575060005482105b8015611386575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611406828260405180602001604052806000815250611912565b5050565b600090565b6000808290508061141e61140a565b116114a4576000548110156114a35760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036114a1575b6000810361149757600460008360019003935083815260200190815260200160002054905061146d565b80925050506114d6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86115638686846119af565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6115ad6119b8565b73ffffffffffffffffffffffffffffffffffffffff166115cb610ead565b73ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890612975565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261170f61138d565b8786866040518563ffffffff1660e01b815260040161173194939291906129ea565b6020604051808303816000875af192505050801561176d57506040513d601f19601f8201168201806040525081019061176a9190612a4b565b60015b6117e6573d806000811461179d576040519150601f19603f3d011682016040523d82523d6000602084013e6117a2565b606091505b5060008151036117de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546118489061224e565b80601f01602080910402602001604051908101604052809291908181526020018280546118749061224e565b80156118c15780601f10611896576101008083540402835291602001916118c1565b820191906000526020600020905b8154815290600101906020018083116118a457829003601f168201915b5050505050905090565b606060806040510190508060405280825b6001156118fe57600183039250600a81066030018353600a81049050806118dc575b508181036020830392508083525050919050565b61191c83836119c0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119aa57600080549050600083820390505b61195c60008683806001019450866116e9565b611992576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106119495781600054146119a757600080fd5b50505b505050565b60009392505050565b600033905090565b60008054905060008203611a00576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a0d6000848385611546565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611a8483611a75600086600061154c565b611a7e85611b7b565b17611574565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611b2557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611aea565b5060008203611b60576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611b76600084838561159f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611bd481611b9f565b8114611bdf57600080fd5b50565b600081359050611bf181611bcb565b92915050565b600060208284031215611c0d57611c0c611b95565b5b6000611c1b84828501611be2565b91505092915050565b60008115159050919050565b611c3981611c24565b82525050565b6000602082019050611c546000830184611c30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c94578082015181840152602081019050611c79565b60008484015250505050565b6000601f19601f8301169050919050565b6000611cbc82611c5a565b611cc68185611c65565b9350611cd6818560208601611c76565b611cdf81611ca0565b840191505092915050565b60006020820190508181036000830152611d048184611cb1565b905092915050565b6000819050919050565b611d1f81611d0c565b8114611d2a57600080fd5b50565b600081359050611d3c81611d16565b92915050565b600060208284031215611d5857611d57611b95565b5b6000611d6684828501611d2d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d9a82611d6f565b9050919050565b611daa81611d8f565b82525050565b6000602082019050611dc56000830184611da1565b92915050565b611dd481611d8f565b8114611ddf57600080fd5b50565b600081359050611df181611dcb565b92915050565b60008060408385031215611e0e57611e0d611b95565b5b6000611e1c85828601611de2565b9250506020611e2d85828601611d2d565b9150509250929050565b611e4081611d0c565b82525050565b6000602082019050611e5b6000830184611e37565b92915050565b600080600060608486031215611e7a57611e79611b95565b5b6000611e8886828701611de2565b9350506020611e9986828701611de2565b9250506040611eaa86828701611d2d565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112611ed957611ed8611eb4565b5b8235905067ffffffffffffffff811115611ef657611ef5611eb9565b5b602083019150836001820283011115611f1257611f11611ebe565b5b9250929050565b60008060208385031215611f3057611f2f611b95565b5b600083013567ffffffffffffffff811115611f4e57611f4d611b9a565b5b611f5a85828601611ec3565b92509250509250929050565b600060208284031215611f7c57611f7b611b95565b5b6000611f8a84828501611de2565b91505092915050565b611f9c81611c24565b8114611fa757600080fd5b50565b600081359050611fb981611f93565b92915050565b60008060408385031215611fd657611fd5611b95565b5b6000611fe485828601611de2565b9250506020611ff585828601611faa565b9150509250929050565b60006020828403121561201557612014611b95565b5b600061202384828501611faa565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61206982611ca0565b810181811067ffffffffffffffff8211171561208857612087612031565b5b80604052505050565b600061209b611b8b565b90506120a78282612060565b919050565b600067ffffffffffffffff8211156120c7576120c6612031565b5b6120d082611ca0565b9050602081019050919050565b82818337600083830152505050565b60006120ff6120fa846120ac565b612091565b90508281526020810184848401111561211b5761211a61202c565b5b6121268482856120dd565b509392505050565b600082601f83011261214357612142611eb4565b5b81356121538482602086016120ec565b91505092915050565b6000806000806080858703121561217657612175611b95565b5b600061218487828801611de2565b945050602061219587828801611de2565b93505060406121a687828801611d2d565b925050606085013567ffffffffffffffff8111156121c7576121c6611b9a565b5b6121d38782880161212e565b91505092959194509250565b600080604083850312156121f6576121f5611b95565b5b600061220485828601611de2565b925050602061221585828601611de2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061226657607f821691505b6020821081036122795761227861221f565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006122b5601f83611c65565b91506122c08261227f565b602082019050919050565b600060208201905081810360008301526122e4816122a8565b9050919050565b7f5075626c6963206d696e7420686173206e6f7420626567756e207965742e0000600082015250565b6000612321601e83611c65565b915061232c826122eb565b602082019050919050565b6000602082019050818103600083015261235081612314565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163742e00600082015250565b600061238d601f83611c65565b915061239882612357565b602082019050919050565b600060208201905081810360008301526123bc81612380565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006123fd82611d0c565b915061240883611d0c565b92508282019050808211156124205761241f6123c3565b5b92915050565b7f52656163686564206d617820737570706c792e00000000000000000000000000600082015250565b600061245c601383611c65565b915061246782612426565b602082019050919050565b6000602082019050818103600083015261248b8161244f565b9050919050565b7f43616e206e6f74206d696e742074686973206d616e792e000000000000000000600082015250565b60006124c8601783611c65565b91506124d382612492565b602082019050919050565b600060208201905081810360008301526124f7816124bb565b9050919050565b600081905092915050565b50565b60006125196000836124fe565b915061252482612509565b600082019050919050565b600061253a8261250c565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061257a601083611c65565b915061258582612544565b602082019050919050565b600060208201905081810360008301526125a98161256d565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261261d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826125e0565b61262786836125e0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061266461265f61265a84611d0c565b61263f565b611d0c565b9050919050565b6000819050919050565b61267e83612649565b61269261268a8261266b565b8484546125ed565b825550505050565b600090565b6126a761269a565b6126b2818484612675565b505050565b5b818110156126d6576126cb60008261269f565b6001810190506126b8565b5050565b601f82111561271b576126ec816125bb565b6126f5846125d0565b81016020851015612704578190505b612718612710856125d0565b8301826126b7565b50505b505050565b600082821c905092915050565b600061273e60001984600802612720565b1980831691505092915050565b6000612757838361272d565b9150826002028217905092915050565b61277183836125b0565b67ffffffffffffffff81111561278a57612789612031565b5b612794825461224e565b61279f8282856126da565b6000601f8311600181146127ce57600084156127bc578287013590505b6127c6858261274b565b86555061282e565b601f1984166127dc866125bb565b60005b82811015612804578489013582556001820191506020850194506020810190506127df565b86831015612821578489013561281d601f89168261272d565b8355505b6001600288020188555050505b50505050505050565b600081905092915050565b600061284d82611c5a565b6128578185612837565b9350612867818560208601611c76565b80840191505092915050565b600061287f8285612842565b915061288b8284612842565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006128f3602683611c65565b91506128fe82612897565b604082019050919050565b60006020820190508181036000830152612922816128e6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061295f602083611c65565b915061296a82612929565b602082019050919050565b6000602082019050818103600083015261298e81612952565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006129bc82612995565b6129c681856129a0565b93506129d6818560208601611c76565b6129df81611ca0565b840191505092915050565b60006080820190506129ff6000830187611da1565b612a0c6020830186611da1565b612a196040830185611e37565b8181036060830152612a2b81846129b1565b905095945050505050565b600081519050612a4581611bcb565b92915050565b600060208284031215612a6157612a60611b95565b5b6000612a6f84828501612a36565b9150509291505056fea2646970667358221220bdfacedc62dc13048e0df67345229798a1edece84a7727e19fe446f3c070a75164736f6c63430008100033

Deployed Bytecode Sourcemap

223:1716:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9112:630:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9996:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16309:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;931:475:3;;;:::i;:::-;;5851:317:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19918:2756;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1719:217:3;;;:::i;:::-;;22765:179:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1607:104:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1510:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11348:150:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7002:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;:::i;:::-;;694:229:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10165:102:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16850:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1414:88:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23525:388:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10368:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17303:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9112:630:4;9197:4;9530:10;9515:25;;:11;:25;;;;:101;;;;9606:10;9591:25;;:11;:25;;;;9515:101;:177;;;;9682:10;9667:25;;:11;:25;;;;9515:177;9496:196;;9112:630;;;:::o;9996:98::-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;;;;;;;;;;;;;16404:64;16486:15;:24;16502:7;16486:24;;;;;;;;;;;:30;;;;;;;;;;;;16479:37;;16309:214;;;:::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;;15919:5;15896:28;;:19;:17;:19::i;:::-;:28;;;15892:172;;15943:44;15960:5;15967:19;:17;:19::i;:::-;15943:16;:44::i;:::-;15938:126;;16014:35;;;;;;;;;;;;;;15938:126;15892:172;16107:2;16074:15;:24;16090:7;16074:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16144:7;16140:2;16124:28;;16133:5;16124:28;;;;;;;;;;;;15839:320;15769:390;;:::o;931:475:3:-;1744:1:1;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;987:7:3::1;;;;;;;;;;;986:8;978:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1061:10;1048:23;;:9;:23;;;1040:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1170:15;;1156:10;;1140:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:45;;1118:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1293:10;;1265:25;1279:10;1265:13;:25::i;:::-;:38;1243:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;1365:33;1375:10;1387;;1365:9;:33::i;:::-;1701:1:1::0;2628:7;:22;;;;931:475:3:o;5851:317:4:-;5912:7;6136:15;:13;:15::i;:::-;6121:12;;6105:13;;:28;:46;6098:53;;5851:317;:::o;19918:2756::-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;20119:45;;20135:19;20119:45;;;20115:86;;20173:28;;;;;;;;;;;;;;20115:86;20213:27;20242:23;20269:35;20296:7;20269:26;:35::i;:::-;20212:92;;;;20401:68;20426:15;20443:4;20449:19;:17;:19::i;:::-;20401:24;:68::i;:::-;20396:179;;20488:43;20505:4;20511:19;:17;:19::i;:::-;20488:16;:43::i;:::-;20483:92;;20540:35;;;;;;;;;;;;;;20483:92;20396:179;20604:1;20590:16;;:2;:16;;;20586:52;;20615:23;;;;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;21307:18;:24;21326:4;21307:24;;;;;;;;;;;;;;;;21305:26;;;;;;;;;;;;21375:18;:22;21394:2;21375:22;;;;;;;;;;;;;;;;21373:24;;;;;;;;;;;21690:143;21726:2;21774:45;21789:4;21795:2;21799:19;21774:14;:45::i;:::-;2349:8;21746:73;21690:18;:143::i;:::-;21661:17;:26;21679:7;21661:26;;;;;;;;;;;:172;;;;22001:1;2349:8;21950:19;:47;:52;21946:617;;22022:19;22054:1;22044:7;:11;22022:33;;22209:1;22175:17;:30;22193:11;22175:30;;;;;;;;;;;;:35;22171:378;;22311:13;;22296:11;:28;22292:239;;22489:19;22456:17;:30;22474:11;22456:30;;;;;;;;;;;:52;;;;22292:239;22171:378;22004:559;21946:617;22607:7;22603:2;22588:27;;22597:4;22588:27;;;;;;;;;;;;22625:42;22646:4;22652:2;22656:7;22665:1;22625:20;:42::i;:::-;20037:2637;;;19918:2756;;;:::o;1719:217:3:-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1781:12:3::2;1807:10;1799:24;;1845:21;1799:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1780:101;;;1900:7;1892:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1769:167;1701:1:1::1;2628:7;:22;;;;1719:217:3:o:0;22765:179:4:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;1607:104:3:-;1094:13:0;:11;:13::i;:::-;1696:7:3::1;;1680:13;:23;;;;;;;:::i;:::-;;1607:104:::0;;:::o;1510:89::-;1094:13:0;:11;:13::i;:::-;1587:4:3::1;1574:10;:17;;;;1510:89:::0;:::o;11348:150:4:-;11420:7;11462:27;11481:7;11462:18;:27::i;:::-;11439:52;;11348:150;;;:::o;7002:230::-;7074:7;7114:1;7097:19;;:5;:19;;;7093:60;;7125:28;;;;;;;;;;;;;;7093:60;1317:13;7170:18;:25;7189:5;7170:25;;;;;;;;;;;;;;;;:55;7163:62;;7002:230;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;694:229:3:-;1094:13:0;:11;:13::i;:::-;819:15:3::1;;807:8;791:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;769:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;892:23;902:2;906:8;892:9;:23::i;:::-;694:229:::0;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;10165:102:4:-;10221:13;10253:7;10246:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10165:102;:::o;16850:303::-;16960:19;:17;:19::i;:::-;16948:31;;:8;:31;;;16944:61;;16988:17;;;;;;;;;;;;;;16944:61;17068:8;17016:18;:39;17035:19;:17;:19::i;:::-;17016:39;;;;;;;;;;;;;;;:49;17056:8;17016:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17127:8;17091:55;;17106:19;:17;:19::i;:::-;17091:55;;;17137:8;17091:55;;;;;;:::i;:::-;;;;;;;;16850:303;;:::o;1414:88:3:-;1094:13:0;:11;:13::i;:::-;1489:5:3::1;1488:6;1478:7;;:16;;;;;;;;;;;;;;;;;;1414:88:::0;:::o;23525:388:4:-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;23749:1;23731:2;:14;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;;;;;;;;;;;;;23764:143;23727:180;23525:388;;;;:::o;10368:313::-;10441:13;10471:16;10479:7;10471;:16::i;:::-;10466:59;;10496:29;;;;;;;;;;;;;;10466:59;10536:21;10560:10;:8;:10::i;:::-;10536:34;;10612:1;10593:7;10587:21;:26;:87;;;;;;;;;;;;;;;;;10640:7;10649:18;10659:7;10649:9;:18::i;:::-;10623:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10587:87;10580:94;;;10368:313;;;:::o;17303:162::-;17400:4;17423:18;:25;17442:5;17423:25;;;;;;;;;;;;;;;:35;17449:8;17423:35;;;;;;;;;;;;;;;;;;;;;;;;;17416:42;;17303:162;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;17714:277:4:-;17779:4;17833:7;17814:15;:13;:15::i;:::-;:26;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;;17964:1;2075:8;17916:17;:26;17934:7;17916:26;;;;;;;;;;;;:44;:49;17814:151;17795:170;;17714:277;;;:::o;38922:103::-;38982:7;39008:10;39001:17;;38922:103;:::o;7309:176::-;7370:7;1317:13;1452:2;7397:18;:25;7416:5;7397:25;;;;;;;;;;;;;;;;:50;;7396:82;7389:89;;7309:176;;;:::o;32908:110::-;32984:27;32994:2;32998:8;32984:27;;;;;;;;;;;;:9;:27::i;:::-;32908:110;;:::o;5383:90::-;5439:7;5383:90;:::o;12472:1249::-;12539:7;12558:12;12573:7;12558:22;;12638:4;12619:15;:13;:15::i;:::-;:23;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:17;:23;12743:4;12725:23;;;;;;;;;;;;12708:40;;12840:1;2075:8;12812:6;:24;:29;12808:831;;13467:111;13484:1;13474:6;:11;13467:111;;13526:17;:25;13544:6;;;;;;;13526:25;;;;;;;;;;;;13517:34;;13467:111;;;13610:6;13603:13;;;;;;12808:831;12686:971;12660:997;12615:1042;13683:31;;;;;;;;;;;;;;12472:1249;;;;:::o;18849:468::-;18948:27;18977:23;19016:38;19057:15;:24;19073:7;19057:24;;;;;;;;;;;19016:65;;19225:18;19202:41;;19281:19;19275:26;19256:45;;19188:123;18849:468;;;:::o;18095:646::-;18240:11;18402:16;18395:5;18391:28;18382:37;;18560:16;18549:9;18545:32;18532:45;;18708:15;18697:9;18694:30;18686:5;18675:9;18672:20;18669:56;18659:66;;18095:646;;;;;:::o;24557:154::-;;;;;:::o;38249:304::-;38380:7;38399:16;2470:3;38425:19;:41;;38399:68;;2470:3;38492:31;38503:4;38509:2;38513:9;38492:10;:31::i;:::-;38484:40;;:62;;38477:69;;;38249:304;;;;;:::o;14254:443::-;14334:14;14499:16;14492:5;14488:28;14479:37;;14674:5;14660:11;14635:23;14631:41;14628:52;14621:5;14618:63;14608:73;;14254:443;;;;:::o;25358:153::-;;;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;2433:187::-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;25939:697:4:-;26097:4;26142:2;26117:45;;;26163:19;:17;:19::i;:::-;26184:4;26190:7;26199:5;26117:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26412:1;26395:6;:13;:18;26391:229;;26440:40;;;;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;26283:54;;;26273:64;;;:6;:64;;;;26266:71;;;25939:697;;;;;;:::o;572:114:3:-;632:13;665;658:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;572:114;:::o;39122:1548:4:-;39187:17;39606:4;39599;39593:11;39589:22;39582:29;;39696:3;39690:4;39683:17;39799:3;40033:5;40015:419;40041:1;40015:419;;;40080:1;40075:3;40071:11;40064:18;;40248:2;40242:4;40238:13;40234:2;40230:22;40225:3;40217:36;40340:2;40334:4;40330:13;40322:21;;40405:4;40015:419;40395:25;40015:419;40019:21;40471:3;40466;40462:13;40584:4;40579:3;40575:14;40568:21;;40647:6;40642:3;40635:19;39225:1439;;39122:1548;;;:::o;32160:669::-;32286:19;32292:2;32296:8;32286:5;:19::i;:::-;32362:1;32344:2;:14;;;:19;32340:473;;32383:11;32397:13;;32383:27;;32428:13;32450:8;32444:3;:14;32428:30;;32476:229;32506:62;32545:1;32549:2;32553:7;;;;;;32562:5;32506:30;:62::i;:::-;32501:165;;32603:40;;;;;;;;;;;;;;32501:165;32700:3;32692:5;:11;32476:229;;32785:3;32768:13;;:20;32764:34;;32790:8;;;32764:34;32365:448;;32340:473;32160:669;;;:::o;37960:143::-;38093:6;37960:143;;;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;27082:2396:4:-;27154:20;27177:13;;27154:36;;27216:1;27204:8;:13;27200:44;;27226:18;;;;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;27788:1;1452:2;27758:1;:26;;27757:32;27745:8;:45;27719:18;:22;27738:2;27719:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28060:136;28096:2;28149:33;28172:1;28176:2;28180:1;28149:14;:33::i;:::-;28116:30;28137:8;28116:20;:30::i;:::-;:66;28060:18;:136::i;:::-;28026:17;:31;28044:12;28026:31;;;;;;;;;;;:170;;;;28211:16;28241:11;28270:8;28255:12;:23;28241:37;;28520:16;28516:2;28512:25;28500:37;;28884:12;28845:8;28805:1;28744:25;28686:1;28626;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29088:7;29084:15;29073:26;;28946:339;;;28950:75;29328:1;29316:8;:13;29312:45;;29338:19;;;;;;;;;;;;;;29312:45;29388:3;29372:13;:19;;;;27499:1903;;29411:60;29440:1;29444:2;29448:12;29462:8;29411:20;:60::i;:::-;27144:2334;27082:2396;;:::o;14794:318::-;14864:14;15093:1;15083:8;15080:15;15054:24;15050:46;15040:56;;14794:318;;;:::o;7:75:6:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6250:553;6308:8;6318:6;6368:3;6361:4;6353:6;6349:17;6345:27;6335:122;;6376:79;;:::i;:::-;6335:122;6489:6;6476:20;6466:30;;6519:18;6511:6;6508:30;6505:117;;;6541:79;;:::i;:::-;6505:117;6655:4;6647:6;6643:17;6631:29;;6709:3;6701:4;6693:6;6689:17;6679:8;6675:32;6672:41;6669:128;;;6716:79;;:::i;:::-;6669:128;6250:553;;;;;:::o;6809:529::-;6880:6;6888;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7091:1;7080:9;7076:17;7063:31;7121:18;7113:6;7110:30;7107:117;;;7143:79;;:::i;:::-;7107:117;7256:65;7313:7;7304:6;7293:9;7289:22;7256:65;:::i;:::-;7238:83;;;;7034:297;6809:529;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7679:116::-;7749:21;7764:5;7749:21;:::i;:::-;7742:5;7739:32;7729:60;;7785:1;7782;7775:12;7729:60;7679:116;:::o;7801:133::-;7844:5;7882:6;7869:20;7860:29;;7898:30;7922:5;7898:30;:::i;:::-;7801:133;;;;:::o;7940:468::-;8005:6;8013;8062:2;8050:9;8041:7;8037:23;8033:32;8030:119;;;8068:79;;:::i;:::-;8030:119;8188:1;8213:53;8258:7;8249:6;8238:9;8234:22;8213:53;:::i;:::-;8203:63;;8159:117;8315:2;8341:50;8383:7;8374:6;8363:9;8359:22;8341:50;:::i;:::-;8331:60;;8286:115;7940:468;;;;;:::o;8414:323::-;8470:6;8519:2;8507:9;8498:7;8494:23;8490:32;8487:119;;;8525:79;;:::i;:::-;8487:119;8645:1;8670:50;8712:7;8703:6;8692:9;8688:22;8670:50;:::i;:::-;8660:60;;8616:114;8414:323;;;;:::o;8743:117::-;8852:1;8849;8842:12;8866:180;8914:77;8911:1;8904:88;9011:4;9008:1;9001:15;9035:4;9032:1;9025:15;9052:281;9135:27;9157:4;9135:27;:::i;:::-;9127:6;9123:40;9265:6;9253:10;9250:22;9229:18;9217:10;9214:34;9211:62;9208:88;;;9276:18;;:::i;:::-;9208:88;9316:10;9312:2;9305:22;9095:238;9052:281;;:::o;9339:129::-;9373:6;9400:20;;:::i;:::-;9390:30;;9429:33;9457:4;9449:6;9429:33;:::i;:::-;9339:129;;;:::o;9474:307::-;9535:4;9625:18;9617:6;9614:30;9611:56;;;9647:18;;:::i;:::-;9611:56;9685:29;9707:6;9685:29;:::i;:::-;9677:37;;9769:4;9763;9759:15;9751:23;;9474:307;;;:::o;9787:146::-;9884:6;9879:3;9874;9861:30;9925:1;9916:6;9911:3;9907:16;9900:27;9787:146;;;:::o;9939:423::-;10016:5;10041:65;10057:48;10098:6;10057:48;:::i;:::-;10041:65;:::i;:::-;10032:74;;10129:6;10122:5;10115:21;10167:4;10160:5;10156:16;10205:3;10196:6;10191:3;10187:16;10184:25;10181:112;;;10212:79;;:::i;:::-;10181:112;10302:54;10349:6;10344:3;10339;10302:54;:::i;:::-;10022:340;9939:423;;;;;:::o;10381:338::-;10436:5;10485:3;10478:4;10470:6;10466:17;10462:27;10452:122;;10493:79;;:::i;:::-;10452:122;10610:6;10597:20;10635:78;10709:3;10701:6;10694:4;10686:6;10682:17;10635:78;:::i;:::-;10626:87;;10442:277;10381:338;;;;:::o;10725:943::-;10820:6;10828;10836;10844;10893:3;10881:9;10872:7;10868:23;10864:33;10861:120;;;10900:79;;:::i;:::-;10861:120;11020:1;11045:53;11090:7;11081:6;11070:9;11066:22;11045:53;:::i;:::-;11035:63;;10991:117;11147:2;11173:53;11218:7;11209:6;11198:9;11194:22;11173:53;:::i;:::-;11163:63;;11118:118;11275:2;11301:53;11346:7;11337:6;11326:9;11322:22;11301:53;:::i;:::-;11291:63;;11246:118;11431:2;11420:9;11416:18;11403:32;11462:18;11454:6;11451:30;11448:117;;;11484:79;;:::i;:::-;11448:117;11589:62;11643:7;11634:6;11623:9;11619:22;11589:62;:::i;:::-;11579:72;;11374:287;10725:943;;;;;;;:::o;11674:474::-;11742:6;11750;11799:2;11787:9;11778:7;11774:23;11770:32;11767:119;;;11805:79;;:::i;:::-;11767:119;11925:1;11950:53;11995:7;11986:6;11975:9;11971:22;11950:53;:::i;:::-;11940:63;;11896:117;12052:2;12078:53;12123:7;12114:6;12103:9;12099:22;12078:53;:::i;:::-;12068:63;;12023:118;11674:474;;;;;:::o;12154:180::-;12202:77;12199:1;12192:88;12299:4;12296:1;12289:15;12323:4;12320:1;12313:15;12340:320;12384:6;12421:1;12415:4;12411:12;12401:22;;12468:1;12462:4;12458:12;12489:18;12479:81;;12545:4;12537:6;12533:17;12523:27;;12479:81;12607:2;12599:6;12596:14;12576:18;12573:38;12570:84;;12626:18;;:::i;:::-;12570:84;12391:269;12340:320;;;:::o;12666:181::-;12806:33;12802:1;12794:6;12790:14;12783:57;12666:181;:::o;12853:366::-;12995:3;13016:67;13080:2;13075:3;13016:67;:::i;:::-;13009:74;;13092:93;13181:3;13092:93;:::i;:::-;13210:2;13205:3;13201:12;13194:19;;12853:366;;;:::o;13225:419::-;13391:4;13429:2;13418:9;13414:18;13406:26;;13478:9;13472:4;13468:20;13464:1;13453:9;13449:17;13442:47;13506:131;13632:4;13506:131;:::i;:::-;13498:139;;13225:419;;;:::o;13650:180::-;13790:32;13786:1;13778:6;13774:14;13767:56;13650:180;:::o;13836:366::-;13978:3;13999:67;14063:2;14058:3;13999:67;:::i;:::-;13992:74;;14075:93;14164:3;14075:93;:::i;:::-;14193:2;14188:3;14184:12;14177:19;;13836:366;;;:::o;14208:419::-;14374:4;14412:2;14401:9;14397:18;14389:26;;14461:9;14455:4;14451:20;14447:1;14436:9;14432:17;14425:47;14489:131;14615:4;14489:131;:::i;:::-;14481:139;;14208:419;;;:::o;14633:181::-;14773:33;14769:1;14761:6;14757:14;14750:57;14633:181;:::o;14820:366::-;14962:3;14983:67;15047:2;15042:3;14983:67;:::i;:::-;14976:74;;15059:93;15148:3;15059:93;:::i;:::-;15177:2;15172:3;15168:12;15161:19;;14820:366;;;:::o;15192:419::-;15358:4;15396:2;15385:9;15381:18;15373:26;;15445:9;15439:4;15435:20;15431:1;15420:9;15416:17;15409:47;15473:131;15599:4;15473:131;:::i;:::-;15465:139;;15192:419;;;:::o;15617:180::-;15665:77;15662:1;15655:88;15762:4;15759:1;15752:15;15786:4;15783:1;15776:15;15803:191;15843:3;15862:20;15880:1;15862:20;:::i;:::-;15857:25;;15896:20;15914:1;15896:20;:::i;:::-;15891:25;;15939:1;15936;15932:9;15925:16;;15960:3;15957:1;15954:10;15951:36;;;15967:18;;:::i;:::-;15951:36;15803:191;;;;:::o;16000:169::-;16140:21;16136:1;16128:6;16124:14;16117:45;16000:169;:::o;16175:366::-;16317:3;16338:67;16402:2;16397:3;16338:67;:::i;:::-;16331:74;;16414:93;16503:3;16414:93;:::i;:::-;16532:2;16527:3;16523:12;16516:19;;16175:366;;;:::o;16547:419::-;16713:4;16751:2;16740:9;16736:18;16728:26;;16800:9;16794:4;16790:20;16786:1;16775:9;16771:17;16764:47;16828:131;16954:4;16828:131;:::i;:::-;16820:139;;16547:419;;;:::o;16972:173::-;17112:25;17108:1;17100:6;17096:14;17089:49;16972:173;:::o;17151:366::-;17293:3;17314:67;17378:2;17373:3;17314:67;:::i;:::-;17307:74;;17390:93;17479:3;17390:93;:::i;:::-;17508:2;17503:3;17499:12;17492:19;;17151:366;;;:::o;17523:419::-;17689:4;17727:2;17716:9;17712:18;17704:26;;17776:9;17770:4;17766:20;17762:1;17751:9;17747:17;17740:47;17804:131;17930:4;17804:131;:::i;:::-;17796:139;;17523:419;;;:::o;17948:147::-;18049:11;18086:3;18071:18;;17948:147;;;;:::o;18101:114::-;;:::o;18221:398::-;18380:3;18401:83;18482:1;18477:3;18401:83;:::i;:::-;18394:90;;18493:93;18582:3;18493:93;:::i;:::-;18611:1;18606:3;18602:11;18595:18;;18221:398;;;:::o;18625:379::-;18809:3;18831:147;18974:3;18831:147;:::i;:::-;18824:154;;18995:3;18988:10;;18625:379;;;:::o;19010:166::-;19150:18;19146:1;19138:6;19134:14;19127:42;19010:166;:::o;19182:366::-;19324:3;19345:67;19409:2;19404:3;19345:67;:::i;:::-;19338:74;;19421:93;19510:3;19421:93;:::i;:::-;19539:2;19534:3;19530:12;19523:19;;19182:366;;;:::o;19554:419::-;19720:4;19758:2;19747:9;19743:18;19735:26;;19807:9;19801:4;19797:20;19793:1;19782:9;19778:17;19771:47;19835:131;19961:4;19835:131;:::i;:::-;19827:139;;19554:419;;;:::o;19979:97::-;20038:6;20066:3;20056:13;;19979:97;;;;:::o;20082:141::-;20131:4;20154:3;20146:11;;20177:3;20174:1;20167:14;20211:4;20208:1;20198:18;20190:26;;20082:141;;;:::o;20229:93::-;20266:6;20313:2;20308;20301:5;20297:14;20293:23;20283:33;;20229:93;;;:::o;20328:107::-;20372:8;20422:5;20416:4;20412:16;20391:37;;20328:107;;;;:::o;20441:393::-;20510:6;20560:1;20548:10;20544:18;20583:97;20613:66;20602:9;20583:97;:::i;:::-;20701:39;20731:8;20720:9;20701:39;:::i;:::-;20689:51;;20773:4;20769:9;20762:5;20758:21;20749:30;;20822:4;20812:8;20808:19;20801:5;20798:30;20788:40;;20517:317;;20441:393;;;;;:::o;20840:60::-;20868:3;20889:5;20882:12;;20840:60;;;:::o;20906:142::-;20956:9;20989:53;21007:34;21016:24;21034:5;21016:24;:::i;:::-;21007:34;:::i;:::-;20989:53;:::i;:::-;20976:66;;20906:142;;;:::o;21054:75::-;21097:3;21118:5;21111:12;;21054:75;;;:::o;21135:269::-;21245:39;21276:7;21245:39;:::i;:::-;21306:91;21355:41;21379:16;21355:41;:::i;:::-;21347:6;21340:4;21334:11;21306:91;:::i;:::-;21300:4;21293:105;21211:193;21135:269;;;:::o;21410:73::-;21455:3;21410:73;:::o;21489:189::-;21566:32;;:::i;:::-;21607:65;21665:6;21657;21651:4;21607:65;:::i;:::-;21542:136;21489:189;;:::o;21684:186::-;21744:120;21761:3;21754:5;21751:14;21744:120;;;21815:39;21852:1;21845:5;21815:39;:::i;:::-;21788:1;21781:5;21777:13;21768:22;;21744:120;;;21684:186;;:::o;21876:543::-;21977:2;21972:3;21969:11;21966:446;;;22011:38;22043:5;22011:38;:::i;:::-;22095:29;22113:10;22095:29;:::i;:::-;22085:8;22081:44;22278:2;22266:10;22263:18;22260:49;;;22299:8;22284:23;;22260:49;22322:80;22378:22;22396:3;22378:22;:::i;:::-;22368:8;22364:37;22351:11;22322:80;:::i;:::-;21981:431;;21966:446;21876:543;;;:::o;22425:117::-;22479:8;22529:5;22523:4;22519:16;22498:37;;22425:117;;;;:::o;22548:169::-;22592:6;22625:51;22673:1;22669:6;22661:5;22658:1;22654:13;22625:51;:::i;:::-;22621:56;22706:4;22700;22696:15;22686:25;;22599:118;22548:169;;;;:::o;22722:295::-;22798:4;22944:29;22969:3;22963:4;22944:29;:::i;:::-;22936:37;;23006:3;23003:1;22999:11;22993:4;22990:21;22982:29;;22722:295;;;;:::o;23022:1403::-;23146:44;23186:3;23181;23146:44;:::i;:::-;23255:18;23247:6;23244:30;23241:56;;;23277:18;;:::i;:::-;23241:56;23321:38;23353:4;23347:11;23321:38;:::i;:::-;23406:67;23466:6;23458;23452:4;23406:67;:::i;:::-;23500:1;23529:2;23521:6;23518:14;23546:1;23541:632;;;;24217:1;24234:6;24231:84;;;24290:9;24285:3;24281:19;24268:33;24259:42;;24231:84;24341:67;24401:6;24394:5;24341:67;:::i;:::-;24335:4;24328:81;24190:229;23511:908;;23541:632;23593:4;23589:9;23581:6;23577:22;23627:37;23659:4;23627:37;:::i;:::-;23686:1;23700:215;23714:7;23711:1;23708:14;23700:215;;;23800:9;23795:3;23791:19;23778:33;23770:6;23763:49;23851:1;23843:6;23839:14;23829:24;;23898:2;23887:9;23883:18;23870:31;;23737:4;23734:1;23730:12;23725:17;;23700:215;;;23943:6;23934:7;23931:19;23928:186;;;24008:9;24003:3;23999:19;23986:33;24051:48;24093:4;24085:6;24081:17;24070:9;24051:48;:::i;:::-;24043:6;24036:64;23951:163;23928:186;24160:1;24156;24148:6;24144:14;24140:22;24134:4;24127:36;23548:625;;;23511:908;;23121:1304;;;23022:1403;;;:::o;24431:148::-;24533:11;24570:3;24555:18;;24431:148;;;;:::o;24585:390::-;24691:3;24719:39;24752:5;24719:39;:::i;:::-;24774:89;24856:6;24851:3;24774:89;:::i;:::-;24767:96;;24872:65;24930:6;24925:3;24918:4;24911:5;24907:16;24872:65;:::i;:::-;24962:6;24957:3;24953:16;24946:23;;24695:280;24585:390;;;;:::o;24981:435::-;25161:3;25183:95;25274:3;25265:6;25183:95;:::i;:::-;25176:102;;25295:95;25386:3;25377:6;25295:95;:::i;:::-;25288:102;;25407:3;25400:10;;24981:435;;;;;:::o;25422:225::-;25562:34;25558:1;25550:6;25546:14;25539:58;25631:8;25626:2;25618:6;25614:15;25607:33;25422:225;:::o;25653:366::-;25795:3;25816:67;25880:2;25875:3;25816:67;:::i;:::-;25809:74;;25892:93;25981:3;25892:93;:::i;:::-;26010:2;26005:3;26001:12;25994:19;;25653:366;;;:::o;26025:419::-;26191:4;26229:2;26218:9;26214:18;26206:26;;26278:9;26272:4;26268:20;26264:1;26253:9;26249:17;26242:47;26306:131;26432:4;26306:131;:::i;:::-;26298:139;;26025:419;;;:::o;26450:182::-;26590:34;26586:1;26578:6;26574:14;26567:58;26450:182;:::o;26638:366::-;26780:3;26801:67;26865:2;26860:3;26801:67;:::i;:::-;26794:74;;26877:93;26966:3;26877:93;:::i;:::-;26995:2;26990:3;26986:12;26979:19;;26638:366;;;:::o;27010:419::-;27176:4;27214:2;27203:9;27199:18;27191:26;;27263:9;27257:4;27253:20;27249:1;27238:9;27234:17;27227:47;27291:131;27417:4;27291:131;:::i;:::-;27283:139;;27010:419;;;:::o;27435:98::-;27486:6;27520:5;27514:12;27504:22;;27435:98;;;:::o;27539:168::-;27622:11;27656:6;27651:3;27644:19;27696:4;27691:3;27687:14;27672:29;;27539:168;;;;:::o;27713:373::-;27799:3;27827:38;27859:5;27827:38;:::i;:::-;27881:70;27944:6;27939:3;27881:70;:::i;:::-;27874:77;;27960:65;28018:6;28013:3;28006:4;27999:5;27995:16;27960:65;:::i;:::-;28050:29;28072:6;28050:29;:::i;:::-;28045:3;28041:39;28034:46;;27803:283;27713:373;;;;:::o;28092:640::-;28287:4;28325:3;28314:9;28310:19;28302:27;;28339:71;28407:1;28396:9;28392:17;28383:6;28339:71;:::i;:::-;28420:72;28488:2;28477:9;28473:18;28464:6;28420:72;:::i;:::-;28502;28570:2;28559:9;28555:18;28546:6;28502:72;:::i;:::-;28621:9;28615:4;28611:20;28606:2;28595:9;28591:18;28584:48;28649:76;28720:4;28711:6;28649:76;:::i;:::-;28641:84;;28092:640;;;;;;;:::o;28738:141::-;28794:5;28825:6;28819:13;28810:22;;28841:32;28867:5;28841:32;:::i;:::-;28738:141;;;;:::o;28885:349::-;28954:6;29003:2;28991:9;28982:7;28978:23;28974:32;28971:119;;;29009:79;;:::i;:::-;28971:119;29129:1;29154:63;29209:7;29200:6;29189:9;29185:22;29154:63;:::i;:::-;29144:73;;29100:127;28885:349;;;;:::o

Swarm Source

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