ETH Price: $3,375.16 (-3.10%)
Gas: 3 Gwei

Token

Phraze (PHRAZE)
 

Overview

Max Total Supply

5,000 PHRAZE

Holders

191

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
onono.eth
Balance
1 PHRAZE
0x07246c91dbf58dd091821070dd8d06cc4e0289bc
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:
Phraze

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-16
*/

// SPDX-License-Identifier: MIT


/**
ooooooooo.   ooooo   ooooo ooooooooo.         .o.        oooooooooooo oooooooooooo 
`888   `Y88. `888'   `888' `888   `Y88.      .888.      d'""""""d888' `888'     `8 
 888   .d88'  888     888   888   .d88'     .8"888.           .888P    888         
 888ooo88P'   888ooooo888   888ooo88P'     .8' `888.         d888'     888oooo8    
 888          888     888   888`88b.      .88ooo8888.      .888P       888    "    
 888          888     888   888  `88b.   .8'     `888.    d888'    .P  888       o 
o888o        o888o   o888o o888o  o888o o88o     o8888o .8888888888P  o888ooooood8 
**/                                                                                   
                                                                                   
                                           
// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Returns the auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/Phraze.sol


pragma solidity ^0.8.14;



contract Phraze is Ownable, ERC721A{
    uint256 public MAX_AMOUNT = 5000;
    uint256 public _max_per_wallet = 50;
    bool public _saleIsActive = true;
    string private _nftBaseURI = "ipfs://QmZdEiAK4sdBWojc5YCT4UWe5AcCnZwjJn1QoxTMLjHvRW/";
    uint256 public _listing_price = 0;
    mapping(address => uint256) public balances;

    constructor()
    ERC721A("Phraze", "PHRAZE")
    {}

    function setListingPrice(uint256 price) external onlyOwner {
      _listing_price = price;
    }

    function setMaxPerWallet(uint256 max_per_wallet) external onlyOwner {
      _max_per_wallet = max_per_wallet;
    }



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


    function setBaseURI(string calldata newURI) external onlyOwner{
      _nftBaseURI = newURI;
    }

    function flipSaleState() public onlyOwner {
        _saleIsActive = !_saleIsActive;
    }


    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
      }


    function mint(uint256 _amount) external payable {
        require(_saleIsActive, "sale not active");
        require(totalSupply() + _amount <= (MAX_AMOUNT), "supply limited");
        require(msg.value >= (_listing_price * _amount), "not enough funds submitted");
        require(balances[msg.sender] + _amount <= _max_per_wallet, "wallet limit reached");
        balances[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }

    function airDropMany(address[] memory _addr) external onlyOwner {
       require(totalSupply() + _addr.length <= (MAX_AMOUNT), "you would exceed the limit");

       for (uint i = 0; i < _addr.length; i++) {
           _safeMint(_addr[i], 1);

       }

   }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_listing_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_max_per_wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"}],"name":"airDropMany","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":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setListingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max_per_wallet","type":"uint256"}],"name":"setMaxPerWallet","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"}]

6113886009556032600a55600b805460ff1916600117905560e0604052603660808181529062001b8860a03980516200004191600c916020909101906200013a565b506000600d553480156200005457600080fd5b5060405180604001604052806006815260200165506872617a6560d01b81525060405180604001604052806006815260200165504852415a4560d01b815250620000ad620000a7620000e660201b60201c565b620000ea565b8151620000c29060039060208501906200013a565b508051620000d89060049060208401906200013a565b50506000600155506200021c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014890620001e0565b90600052602060002090601f0160209004810192826200016c5760008555620001b7565b82601f106200018757805160ff1916838001178555620001b7565b82800160010185558215620001b7579182015b82811115620001b75782518255916020019190600101906200019a565b50620001c5929150620001c9565b5090565b5b80821115620001c55760008155600101620001ca565b600181811c90821680620001f557607f821691505b6020821081036200021657634e487b7160e01b600052602260045260246000fd5b50919050565b61195c806200022c6000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f7578063a504743711610095578063d40dc87011610064578063d40dc870146104d3578063e268e4d3146104e9578063e985e9c514610509578063f2fde38b1461055257600080fd5b8063a50474371461045d578063b88d4fde14610473578063c87b56dd14610493578063cadf7c4d146104b357600080fd5b80638e0de7be116100d15780638e0de7be146103ff57806395d89b4114610415578063a0712d681461042a578063a22cb4651461043d57600080fd5b8063715018a6146103ac5780637c726b69146103c15780638da5cb5b146103e157600080fd5b806334918dfd1161016457806355f804b31161013e57806355f804b3146103325780635d893ba0146103525780636352211e1461036c57806370a082311461038c57600080fd5b806334918dfd146102e85780633ccfd60b146102fd57806342842e0e1461031257600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806318160ddd1461027857806323b872dd1461029b57806327e235e3146102bb57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e23660046113df565b610572565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b506102116105c4565b6040516101f39190611454565b34801561022a57600080fd5b5061023e610239366004611467565b610656565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b5061027661027136600461149c565b61069a565b005b34801561028457600080fd5b50600254600154035b6040519081526020016101f3565b3480156102a757600080fd5b506102766102b63660046114c6565b61076c565b3480156102c757600080fd5b5061028d6102d6366004611502565b600e6020526000908152604090205481565b3480156102f457600080fd5b5061027661077c565b34801561030957600080fd5b506102766107c3565b34801561031e57600080fd5b5061027661032d3660046114c6565b61082a565b34801561033e57600080fd5b5061027661034d36600461151d565b610845565b34801561035e57600080fd5b50600b546101e79060ff1681565b34801561037857600080fd5b5061023e610387366004611467565b61087b565b34801561039857600080fd5b5061028d6103a7366004611502565b610886565b3480156103b857600080fd5b506102766108d5565b3480156103cd57600080fd5b506102766103dc366004611467565b61090b565b3480156103ed57600080fd5b506000546001600160a01b031661023e565b34801561040b57600080fd5b5061028d600d5481565b34801561042157600080fd5b5061021161093a565b610276610438366004611467565b610949565b34801561044957600080fd5b5061027661045836600461158f565b610ad6565b34801561046957600080fd5b5061028d600a5481565b34801561047f57600080fd5b5061027661048e366004611612565b610b6b565b34801561049f57600080fd5b506102116104ae366004611467565b610bb5565b3480156104bf57600080fd5b506102766104ce3660046116d2565b610c39565b3480156104df57600080fd5b5061028d60095481565b3480156104f557600080fd5b50610276610504366004611467565b610d0d565b34801561051557600080fd5b506101e761052436600461177f565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561055e57600080fd5b5061027661056d366004611502565b610d3c565b60006301ffc9a760e01b6001600160e01b0319831614806105a357506380ac58cd60e01b6001600160e01b03198316145b806105be5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546105d3906117b2565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff906117b2565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b600061066182610dd4565b61067e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006106a582610dfc565b9050806001600160a01b0316836001600160a01b0316036106d95760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610710576106f38133610524565b610710576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610777838383610e63565b505050565b6000546001600160a01b031633146107af5760405162461bcd60e51b81526004016107a6906117ec565b60405180910390fd5b600b805460ff19811660ff90911615179055565b6000546001600160a01b031633146107ed5760405162461bcd60e51b81526004016107a6906117ec565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610827573d6000803e3d6000fd5b50565b61077783838360405180602001604052806000815250610b6b565b6000546001600160a01b0316331461086f5760405162461bcd60e51b81526004016107a6906117ec565b610777600c8383611330565b60006105be82610dfc565b60006001600160a01b0382166108af576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b031633146108ff5760405162461bcd60e51b81526004016107a6906117ec565b610909600061100a565b565b6000546001600160a01b031633146109355760405162461bcd60e51b81526004016107a6906117ec565b600d55565b6060600480546105d3906117b2565b600b5460ff1661098d5760405162461bcd60e51b815260206004820152600f60248201526e73616c65206e6f742061637469766560881b60448201526064016107a6565b6009548161099e6002546001540390565b6109a89190611837565b11156109e75760405162461bcd60e51b815260206004820152600e60248201526d1cdd5c1c1b1e481b1a5b5a5d195960921b60448201526064016107a6565b80600d546109f5919061184f565b341015610a445760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682066756e6473207375626d697474656400000000000060448201526064016107a6565b600a54336000908152600e6020526040902054610a62908390611837565b1115610aa75760405162461bcd60e51b81526020600482015260146024820152731dd85b1b195d081b1a5b5a5d081c995858da195960621b60448201526064016107a6565b336000908152600e602052604081208054839290610ac6908490611837565b909155506108279050338261105a565b336001600160a01b03831603610aff5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b76848484610e63565b6001600160a01b0383163b15610baf57610b9284848484611074565b610baf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610bc082610dd4565b610bdd57604051630a14c4b560e41b815260040160405180910390fd5b6000610be761115f565b90508051600003610c075760405180602001604052806000815250610c32565b80610c118461116e565b604051602001610c2292919061186e565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314610c635760405162461bcd60e51b81526004016107a6906117ec565b600954815160025460015403610c799190611837565b1115610cc75760405162461bcd60e51b815260206004820152601a60248201527f796f7520776f756c642065786365656420746865206c696d697400000000000060448201526064016107a6565b60005b8151811015610d0957610cf7828281518110610ce857610ce861189d565b6020026020010151600161105a565b80610d01816118b3565b915050610cca565b5050565b6000546001600160a01b03163314610d375760405162461bcd60e51b81526004016107a6906117ec565b600a55565b6000546001600160a01b03163314610d665760405162461bcd60e51b81526004016107a6906117ec565b6001600160a01b038116610dcb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a6565b6108278161100a565b6000600154821080156105be575050600090815260056020526040902054600160e01b161590565b600081600154811015610e4a5760008181526005602052604081205490600160e01b82169003610e48575b80600003610c32575060001901600081815260056020526040902054610e27565b505b604051636f96cda160e11b815260040160405180910390fd5b6000610e6e82610dfc565b9050836001600160a01b0316816001600160a01b031614610ea15760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610ebf5750610ebf8533610524565b80610eda575033610ecf84610656565b6001600160a01b0316145b905080610efa57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610f2157604051633a954ecd60e21b815260040160405180910390fd5b600083815260076020908152604080832080546001600160a01b03191690556001600160a01b038881168452600683528184208054600019019055871683528083208054600101905585835260059091528120600160e11b4260a01b8717811790915583169003610fc257600183016000818152600560205260408120549003610fc0576001548114610fc05760008181526005602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610d098282604051806020016040528060008152506111bd565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906110a99033908990889088906004016118cc565b6020604051808303816000875af19250505080156110e4575060408051601f3d908101601f191682019092526110e191810190611909565b60015b611142573d808015611112576040519150601f19603f3d011682016040523d82523d6000602084013e611117565b606091505b50805160000361113a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600c80546105d3906117b2565b604080516080810191829052607f0190826030600a8206018353600a90045b80156111ab57600183039250600a81066030018353600a900461118d565b50819003601f19909101908152919050565b6001546001600160a01b0384166111e657604051622e076360e81b815260040160405180910390fd5b826000036112075760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526006602090815260408083208054680100000000000000018902019055848352600590915290204260a01b86176001861460e11b1790558190818501903b156112dc575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46112a56000878480600101955087611074565b6112c2576040516368d2bf6b60e11b815260040160405180910390fd5b80821061125a5782600154146112d757600080fd5b611321565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106112dd575b50600155610baf600085838684565b82805461133c906117b2565b90600052602060002090601f01602090048101928261135e57600085556113a4565b82601f106113775782800160ff198235161785556113a4565b828001600101855582156113a4579182015b828111156113a4578235825591602001919060010190611389565b506113b09291506113b4565b5090565b5b808211156113b057600081556001016113b5565b6001600160e01b03198116811461082757600080fd5b6000602082840312156113f157600080fd5b8135610c32816113c9565b60005b838110156114175781810151838201526020016113ff565b83811115610baf5750506000910152565b600081518084526114408160208601602086016113fc565b601f01601f19169290920160200192915050565b602081526000610c326020830184611428565b60006020828403121561147957600080fd5b5035919050565b80356001600160a01b038116811461149757600080fd5b919050565b600080604083850312156114af57600080fd5b6114b883611480565b946020939093013593505050565b6000806000606084860312156114db57600080fd5b6114e484611480565b92506114f260208501611480565b9150604084013590509250925092565b60006020828403121561151457600080fd5b610c3282611480565b6000806020838503121561153057600080fd5b823567ffffffffffffffff8082111561154857600080fd5b818501915085601f83011261155c57600080fd5b81358181111561156b57600080fd5b86602082850101111561157d57600080fd5b60209290920196919550909350505050565b600080604083850312156115a257600080fd5b6115ab83611480565b9150602083013580151581146115c057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6115cb565b604052919050565b6000806000806080858703121561162857600080fd5b61163185611480565b93506020611640818701611480565b935060408601359250606086013567ffffffffffffffff8082111561166457600080fd5b818801915088601f83011261167857600080fd5b81358181111561168a5761168a6115cb565b61169c601f8201601f191685016115e1565b915080825289848285010111156116b257600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060208083850312156116e557600080fd5b823567ffffffffffffffff808211156116fd57600080fd5b818501915085601f83011261171157600080fd5b813581811115611723576117236115cb565b8060051b91506117348483016115e1565b818152918301840191848101908884111561174e57600080fd5b938501935b838510156117735761176485611480565b82529385019390850190611753565b98975050505050505050565b6000806040838503121561179257600080fd5b61179b83611480565b91506117a960208401611480565b90509250929050565b600181811c908216806117c657607f821691505b6020821081036117e657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561184a5761184a611821565b500190565b600081600019048311821515161561186957611869611821565b500290565b600083516118808184602088016113fc565b8351908301906118948183602088016113fc565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016118c5576118c5611821565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118ff90830184611428565b9695505050505050565b60006020828403121561191b57600080fd5b8151610c32816113c956fea264697066735822122040fc4975a5eaa0629ef64b24f0410cece74b5c7f7b83716b37dc308ebf5cbd0964736f6c634300080e0033697066733a2f2f516d5a644569414b34736442576f6a633559435434555765354163436e5a776a4a6e31516f78544d4c6a487652572f

Deployed Bytecode

0x6080604052600436106101c25760003560e01c8063715018a6116100f7578063a504743711610095578063d40dc87011610064578063d40dc870146104d3578063e268e4d3146104e9578063e985e9c514610509578063f2fde38b1461055257600080fd5b8063a50474371461045d578063b88d4fde14610473578063c87b56dd14610493578063cadf7c4d146104b357600080fd5b80638e0de7be116100d15780638e0de7be146103ff57806395d89b4114610415578063a0712d681461042a578063a22cb4651461043d57600080fd5b8063715018a6146103ac5780637c726b69146103c15780638da5cb5b146103e157600080fd5b806334918dfd1161016457806355f804b31161013e57806355f804b3146103325780635d893ba0146103525780636352211e1461036c57806370a082311461038c57600080fd5b806334918dfd146102e85780633ccfd60b146102fd57806342842e0e1461031257600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806318160ddd1461027857806323b872dd1461029b57806327e235e3146102bb57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e23660046113df565b610572565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b506102116105c4565b6040516101f39190611454565b34801561022a57600080fd5b5061023e610239366004611467565b610656565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b5061027661027136600461149c565b61069a565b005b34801561028457600080fd5b50600254600154035b6040519081526020016101f3565b3480156102a757600080fd5b506102766102b63660046114c6565b61076c565b3480156102c757600080fd5b5061028d6102d6366004611502565b600e6020526000908152604090205481565b3480156102f457600080fd5b5061027661077c565b34801561030957600080fd5b506102766107c3565b34801561031e57600080fd5b5061027661032d3660046114c6565b61082a565b34801561033e57600080fd5b5061027661034d36600461151d565b610845565b34801561035e57600080fd5b50600b546101e79060ff1681565b34801561037857600080fd5b5061023e610387366004611467565b61087b565b34801561039857600080fd5b5061028d6103a7366004611502565b610886565b3480156103b857600080fd5b506102766108d5565b3480156103cd57600080fd5b506102766103dc366004611467565b61090b565b3480156103ed57600080fd5b506000546001600160a01b031661023e565b34801561040b57600080fd5b5061028d600d5481565b34801561042157600080fd5b5061021161093a565b610276610438366004611467565b610949565b34801561044957600080fd5b5061027661045836600461158f565b610ad6565b34801561046957600080fd5b5061028d600a5481565b34801561047f57600080fd5b5061027661048e366004611612565b610b6b565b34801561049f57600080fd5b506102116104ae366004611467565b610bb5565b3480156104bf57600080fd5b506102766104ce3660046116d2565b610c39565b3480156104df57600080fd5b5061028d60095481565b3480156104f557600080fd5b50610276610504366004611467565b610d0d565b34801561051557600080fd5b506101e761052436600461177f565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561055e57600080fd5b5061027661056d366004611502565b610d3c565b60006301ffc9a760e01b6001600160e01b0319831614806105a357506380ac58cd60e01b6001600160e01b03198316145b806105be5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600380546105d3906117b2565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff906117b2565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b600061066182610dd4565b61067e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006106a582610dfc565b9050806001600160a01b0316836001600160a01b0316036106d95760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610710576106f38133610524565b610710576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610777838383610e63565b505050565b6000546001600160a01b031633146107af5760405162461bcd60e51b81526004016107a6906117ec565b60405180910390fd5b600b805460ff19811660ff90911615179055565b6000546001600160a01b031633146107ed5760405162461bcd60e51b81526004016107a6906117ec565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610827573d6000803e3d6000fd5b50565b61077783838360405180602001604052806000815250610b6b565b6000546001600160a01b0316331461086f5760405162461bcd60e51b81526004016107a6906117ec565b610777600c8383611330565b60006105be82610dfc565b60006001600160a01b0382166108af576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b031633146108ff5760405162461bcd60e51b81526004016107a6906117ec565b610909600061100a565b565b6000546001600160a01b031633146109355760405162461bcd60e51b81526004016107a6906117ec565b600d55565b6060600480546105d3906117b2565b600b5460ff1661098d5760405162461bcd60e51b815260206004820152600f60248201526e73616c65206e6f742061637469766560881b60448201526064016107a6565b6009548161099e6002546001540390565b6109a89190611837565b11156109e75760405162461bcd60e51b815260206004820152600e60248201526d1cdd5c1c1b1e481b1a5b5a5d195960921b60448201526064016107a6565b80600d546109f5919061184f565b341015610a445760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682066756e6473207375626d697474656400000000000060448201526064016107a6565b600a54336000908152600e6020526040902054610a62908390611837565b1115610aa75760405162461bcd60e51b81526020600482015260146024820152731dd85b1b195d081b1a5b5a5d081c995858da195960621b60448201526064016107a6565b336000908152600e602052604081208054839290610ac6908490611837565b909155506108279050338261105a565b336001600160a01b03831603610aff5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b76848484610e63565b6001600160a01b0383163b15610baf57610b9284848484611074565b610baf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610bc082610dd4565b610bdd57604051630a14c4b560e41b815260040160405180910390fd5b6000610be761115f565b90508051600003610c075760405180602001604052806000815250610c32565b80610c118461116e565b604051602001610c2292919061186e565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314610c635760405162461bcd60e51b81526004016107a6906117ec565b600954815160025460015403610c799190611837565b1115610cc75760405162461bcd60e51b815260206004820152601a60248201527f796f7520776f756c642065786365656420746865206c696d697400000000000060448201526064016107a6565b60005b8151811015610d0957610cf7828281518110610ce857610ce861189d565b6020026020010151600161105a565b80610d01816118b3565b915050610cca565b5050565b6000546001600160a01b03163314610d375760405162461bcd60e51b81526004016107a6906117ec565b600a55565b6000546001600160a01b03163314610d665760405162461bcd60e51b81526004016107a6906117ec565b6001600160a01b038116610dcb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a6565b6108278161100a565b6000600154821080156105be575050600090815260056020526040902054600160e01b161590565b600081600154811015610e4a5760008181526005602052604081205490600160e01b82169003610e48575b80600003610c32575060001901600081815260056020526040902054610e27565b505b604051636f96cda160e11b815260040160405180910390fd5b6000610e6e82610dfc565b9050836001600160a01b0316816001600160a01b031614610ea15760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610ebf5750610ebf8533610524565b80610eda575033610ecf84610656565b6001600160a01b0316145b905080610efa57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610f2157604051633a954ecd60e21b815260040160405180910390fd5b600083815260076020908152604080832080546001600160a01b03191690556001600160a01b038881168452600683528184208054600019019055871683528083208054600101905585835260059091528120600160e11b4260a01b8717811790915583169003610fc257600183016000818152600560205260408120549003610fc0576001548114610fc05760008181526005602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610d098282604051806020016040528060008152506111bd565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906110a99033908990889088906004016118cc565b6020604051808303816000875af19250505080156110e4575060408051601f3d908101601f191682019092526110e191810190611909565b60015b611142573d808015611112576040519150601f19603f3d011682016040523d82523d6000602084013e611117565b606091505b50805160000361113a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600c80546105d3906117b2565b604080516080810191829052607f0190826030600a8206018353600a90045b80156111ab57600183039250600a81066030018353600a900461118d565b50819003601f19909101908152919050565b6001546001600160a01b0384166111e657604051622e076360e81b815260040160405180910390fd5b826000036112075760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526006602090815260408083208054680100000000000000018902019055848352600590915290204260a01b86176001861460e11b1790558190818501903b156112dc575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46112a56000878480600101955087611074565b6112c2576040516368d2bf6b60e11b815260040160405180910390fd5b80821061125a5782600154146112d757600080fd5b611321565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106112dd575b50600155610baf600085838684565b82805461133c906117b2565b90600052602060002090601f01602090048101928261135e57600085556113a4565b82601f106113775782800160ff198235161785556113a4565b828001600101855582156113a4579182015b828111156113a4578235825591602001919060010190611389565b506113b09291506113b4565b5090565b5b808211156113b057600081556001016113b5565b6001600160e01b03198116811461082757600080fd5b6000602082840312156113f157600080fd5b8135610c32816113c9565b60005b838110156114175781810151838201526020016113ff565b83811115610baf5750506000910152565b600081518084526114408160208601602086016113fc565b601f01601f19169290920160200192915050565b602081526000610c326020830184611428565b60006020828403121561147957600080fd5b5035919050565b80356001600160a01b038116811461149757600080fd5b919050565b600080604083850312156114af57600080fd5b6114b883611480565b946020939093013593505050565b6000806000606084860312156114db57600080fd5b6114e484611480565b92506114f260208501611480565b9150604084013590509250925092565b60006020828403121561151457600080fd5b610c3282611480565b6000806020838503121561153057600080fd5b823567ffffffffffffffff8082111561154857600080fd5b818501915085601f83011261155c57600080fd5b81358181111561156b57600080fd5b86602082850101111561157d57600080fd5b60209290920196919550909350505050565b600080604083850312156115a257600080fd5b6115ab83611480565b9150602083013580151581146115c057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561160a5761160a6115cb565b604052919050565b6000806000806080858703121561162857600080fd5b61163185611480565b93506020611640818701611480565b935060408601359250606086013567ffffffffffffffff8082111561166457600080fd5b818801915088601f83011261167857600080fd5b81358181111561168a5761168a6115cb565b61169c601f8201601f191685016115e1565b915080825289848285010111156116b257600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060208083850312156116e557600080fd5b823567ffffffffffffffff808211156116fd57600080fd5b818501915085601f83011261171157600080fd5b813581811115611723576117236115cb565b8060051b91506117348483016115e1565b818152918301840191848101908884111561174e57600080fd5b938501935b838510156117735761176485611480565b82529385019390850190611753565b98975050505050505050565b6000806040838503121561179257600080fd5b61179b83611480565b91506117a960208401611480565b90509250929050565b600181811c908216806117c657607f821691505b6020821081036117e657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561184a5761184a611821565b500190565b600081600019048311821515161561186957611869611821565b500290565b600083516118808184602088016113fc565b8351908301906118948183602088016113fc565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016118c5576118c5611821565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118ff90830184611428565b9695505050505050565b60006020828403121561191b57600080fd5b8151610c32816113c956fea264697066735822122040fc4975a5eaa0629ef64b24f0410cece74b5c7f7b83716b37dc308ebf5cbd0964736f6c634300080e0033

Deployed Bytecode Sourcemap

42692:1819:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13928:615;;;;;;;;;;-1:-1:-1;13928:615:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;13928:615:0;;;;;;;;18941:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21009:204::-;;;;;;;;;;-1:-1:-1;21009:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;21009:204:0;1528:203:1;20469:474:0;;;;;;;;;;-1:-1:-1;20469:474:0;;;;;:::i;:::-;;:::i;:::-;;12982:315;;;;;;;;;;-1:-1:-1;13248:12:0;;13232:13;;:28;12982:315;;;2319:25:1;;;2307:2;2292:18;12982:315:0;2173:177:1;21895:170:0;;;;;;;;;;-1:-1:-1;21895:170:0;;;;;:::i;:::-;;:::i;42986:43::-;;;;;;;;;;-1:-1:-1;42986:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;43563:91;;;;;;;;;;;;;:::i;43664:106::-;;;;;;;;;;;;;:::i;22136:185::-;;;;;;;;;;-1:-1:-1;22136:185:0;;;;;:::i;:::-;;:::i;43456:99::-;;;;;;;;;;-1:-1:-1;43456:99:0;;;;;:::i;:::-;;:::i;42815:32::-;;;;;;;;;;-1:-1:-1;42815:32:0;;;;;;;;18730:144;;;;;;;;;;-1:-1:-1;18730:144:0;;;;;:::i;:::-;;:::i;14607:224::-;;;;;;;;;;-1:-1:-1;14607:224:0;;;;;:::i;:::-;;:::i;41808:103::-;;;;;;;;;;;;;:::i;43100:98::-;;;;;;;;;;-1:-1:-1;43100:98:0;;;;;:::i;:::-;;:::i;41157:87::-;;;;;;;;;;-1:-1:-1;41203:7:0;41230:6;-1:-1:-1;;;;;41230:6:0;41157:87;;42946:33;;;;;;;;;;;;;;;;19110:104;;;;;;;;;;;;;:::i;43780:450::-;;;;;;:::i;:::-;;:::i;21285:308::-;;;;;;;;;;-1:-1:-1;21285:308:0;;;;;:::i;:::-;;:::i;42773:35::-;;;;;;;;;;;;;;;;22392:396;;;;;;;;;;-1:-1:-1;22392:396:0;;;;;:::i;:::-;;:::i;19285:318::-;;;;;;;;;;-1:-1:-1;19285:318:0;;;;;:::i;:::-;;:::i;44238:266::-;;;;;;;;;;-1:-1:-1;44238:266:0;;;;;:::i;:::-;;:::i;42734:32::-;;;;;;;;;;;;;;;;43206:117;;;;;;;;;;-1:-1:-1;43206:117:0;;;;;:::i;:::-;;:::i;21664:164::-;;;;;;;;;;-1:-1:-1;21664:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;21785:25:0;;;21761:4;21785:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;21664:164;42066:201;;;;;;;;;;-1:-1:-1;42066:201:0;;;;;:::i;:::-;;:::i;13928:615::-;14013:4;-1:-1:-1;;;;;;;;;14313:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;14390:25:0;;;14313:102;:179;;;-1:-1:-1;;;;;;;;;;14467:25:0;;;14313:179;14293:199;13928:615;-1:-1:-1;;13928:615:0:o;18941:100::-;18995:13;19028:5;19021:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18941:100;:::o;21009:204::-;21077:7;21102:16;21110:7;21102;:16::i;:::-;21097:64;;21127:34;;-1:-1:-1;;;21127:34:0;;;;;;;;;;;21097:64;-1:-1:-1;21181:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;21181:24:0;;21009:204::o;20469:474::-;20542:13;20574:27;20593:7;20574:18;:27::i;:::-;20542:61;;20624:5;-1:-1:-1;;;;;20618:11:0;:2;-1:-1:-1;;;;;20618:11:0;;20614:48;;20638:24;;-1:-1:-1;;;20638:24:0;;;;;;;;;;;20614:48;37112:10;-1:-1:-1;;;;;20679:28:0;;;20675:175;;20727:44;20744:5;37112:10;21664:164;:::i;20727:44::-;20722:128;;20799:35;;-1:-1:-1;;;20799:35:0;;;;;;;;;;;20722:128;20862:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;20862:29:0;-1:-1:-1;;;;;20862:29:0;;;;;;;;;20907:28;;20862:24;;20907:28;;;;;;;20531:412;20469:474;;:::o;21895:170::-;22029:28;22039:4;22045:2;22049:7;22029:9;:28::i;:::-;21895:170;;;:::o;43563:91::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;;;;;;;;;43633:13:::1;::::0;;-1:-1:-1;;43616:30:0;::::1;43633:13;::::0;;::::1;43632:14;43616:30;::::0;;43563:91::o;43664:106::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;41203:7;41230:6;;43712:48:::1;::::0;-1:-1:-1;;;;;41230:6:0;;;;43738:21:::1;43712:48:::0;::::1;;;::::0;43738:21;;43712:48;41203:7;43712:48;43738:21;41230:6;43712:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43664:106::o:0;22136:185::-;22274:39;22291:4;22297:2;22301:7;22274:39;;;;;;;;;;;;:16;:39::i;43456:99::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;43527:20:::1;:11;43541:6:::0;;43527:20:::1;:::i;18730:144::-:0;18794:7;18837:27;18856:7;18837:18;:27::i;14607:224::-;14671:7;-1:-1:-1;;;;;14695:19:0;;14691:60;;14723:28;;-1:-1:-1;;;14723:28:0;;;;;;;;;;;14691:60;-1:-1:-1;;;;;;14769:25:0;;;;;:18;:25;;;;;;9946:13;14769:54;;14607:224::o;41808:103::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;41873:30:::1;41900:1;41873:18;:30::i;:::-;41808:103::o:0;43100:98::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;43168:14:::1;:22:::0;43100:98::o;19110:104::-;19166:13;19199:7;19192:14;;;;;:::i;43780:450::-;43847:13;;;;43839:41;;;;-1:-1:-1;;;43839:41:0;;7395:2:1;43839:41:0;;;7377:21:1;7434:2;7414:18;;;7407:30;-1:-1:-1;;;7453:18:1;;;7446:45;7508:18;;43839:41:0;7193:339:1;43839:41:0;43927:10;;43915:7;43899:13;13248:12;;13232:13;;:28;;12982:315;43899:13;:23;;;;:::i;:::-;:39;;43891:66;;;;-1:-1:-1;;;43891:66:0;;8004:2:1;43891:66:0;;;7986:21:1;8043:2;8023:18;;;8016:30;-1:-1:-1;;;8062:18:1;;;8055:44;8116:18;;43891:66:0;7802:338:1;43891:66:0;44007:7;43990:14;;:24;;;;:::i;:::-;43976:9;:39;;43968:78;;;;-1:-1:-1;;;43968:78:0;;8520:2:1;43968:78:0;;;8502:21:1;8559:2;8539:18;;;8532:30;8598:28;8578:18;;;8571:56;8644:18;;43968:78:0;8318:350:1;43968:78:0;44099:15;;44074:10;44065:20;;;;:8;:20;;;;;;:30;;44088:7;;44065:30;:::i;:::-;:49;;44057:82;;;;-1:-1:-1;;;44057:82:0;;8875:2:1;44057:82:0;;;8857:21:1;8914:2;8894:18;;;8887:30;-1:-1:-1;;;8933:18:1;;;8926:50;8993:18;;44057:82:0;8673:344:1;44057:82:0;44159:10;44150:20;;;;:8;:20;;;;;:31;;44174:7;;44150:20;:31;;44174:7;;44150:31;:::i;:::-;;;;-1:-1:-1;44192:30:0;;-1:-1:-1;44202:10:0;44214:7;44192:9;:30::i;21285:308::-;37112:10;-1:-1:-1;;;;;21384:31:0;;;21380:61;;21424:17;;-1:-1:-1;;;21424:17:0;;;;;;;;;;;21380:61;37112:10;21454:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;21454:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;21454:60:0;;;;;;;;;;21530:55;;540:41:1;;;21454:49:0;;37112:10;21530:55;;513:18:1;21530:55:0;;;;;;;21285:308;;:::o;22392:396::-;22559:28;22569:4;22575:2;22579:7;22559:9;:28::i;:::-;-1:-1:-1;;;;;22602:14:0;;;:19;22598:183;;22641:56;22672:4;22678:2;22682:7;22691:5;22641:30;:56::i;:::-;22636:145;;22725:40;;-1:-1:-1;;;22725:40:0;;;;;;;;;;;22636:145;22392:396;;;;:::o;19285:318::-;19358:13;19389:16;19397:7;19389;:16::i;:::-;19384:59;;19414:29;;-1:-1:-1;;;19414:29:0;;;;;;;;;;;19384:59;19456:21;19480:10;:8;:10::i;:::-;19456:34;;19514:7;19508:21;19533:1;19508:26;:87;;;;;;;;;;;;;;;;;19561:7;19570:18;19580:7;19570:9;:18::i;:::-;19544:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19508:87;19501:94;19285:318;-1:-1:-1;;;19285:318:0:o;44238:266::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;44353:10:::1;::::0;44336:12;;13248;;13232:13;;:28;44320::::1;;;;:::i;:::-;:44;;44312:83;;;::::0;-1:-1:-1;;;44312:83:0;;9699:2:1;44312:83:0::1;::::0;::::1;9681:21:1::0;9738:2;9718:18;;;9711:30;9777:28;9757:18;;;9750:56;9823:18;;44312:83:0::1;9497:350:1::0;44312:83:0::1;44412:6;44407:89;44428:5;:12;44424:1;:16;44407:89;;;44461:22;44471:5;44477:1;44471:8;;;;;;;;:::i;:::-;;;;;;;44481:1;44461:9;:22::i;:::-;44442:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44407:89;;;;44238:266:::0;:::o;43206:117::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;43283:15:::1;:32:::0;43206:117::o;42066:201::-;41203:7;41230:6;-1:-1:-1;;;;;41230:6:0;37112:10;41377:23;41369:68;;;;-1:-1:-1;;;41369:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42155:22:0;::::1;42147:73;;;::::0;-1:-1:-1;;;42147:73:0;;10326:2:1;42147:73:0::1;::::0;::::1;10308:21:1::0;10365:2;10345:18;;;10338:30;10404:34;10384:18;;;10377:62;-1:-1:-1;;;10455:18:1;;;10448:36;10501:19;;42147:73:0::1;10124:402:1::0;42147:73:0::1;42231:28;42250:8;42231:18;:28::i;23043:273::-:0;23100:4;23190:13;;23180:7;:23;23137:152;;;;-1:-1:-1;;23241:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;23241:43:0;:48;;23043:273::o;16245:1129::-;16312:7;16347;16449:13;;16442:4;:20;16438:869;;;16487:14;16504:23;;;:17;:23;;;;;;;-1:-1:-1;;;16593:23:0;;:28;;16589:699;;17112:113;17119:6;17129:1;17119:11;17112:113;;-1:-1:-1;;;17190:6:0;17172:25;;;;:17;:25;;;;;;17112:113;;16589:699;16464:843;16438:869;17335:31;;-1:-1:-1;;;17335:31:0;;;;;;;;;;;28282:2515;28397:27;28427;28446:7;28427:18;:27::i;:::-;28397:57;;28512:4;-1:-1:-1;;;;;28471:45:0;28487:19;-1:-1:-1;;;;;28471:45:0;;28467:86;;28525:28;;-1:-1:-1;;;28525:28:0;;;;;;;;;;;28467:86;28566:22;37112:10;-1:-1:-1;;;;;28592:27:0;;;;:87;;-1:-1:-1;28636:43:0;28653:4;37112:10;21664:164;:::i;28636:43::-;28592:147;;;-1:-1:-1;37112:10:0;28696:20;28708:7;28696:11;:20::i;:::-;-1:-1:-1;;;;;28696:43:0;;28592:147;28566:174;;28758:17;28753:66;;28784:35;;-1:-1:-1;;;28784:35:0;;;;;;;;;;;28753:66;-1:-1:-1;;;;;28834:16:0;;28830:52;;28859:23;;-1:-1:-1;;;28859:23:0;;;;;;;;;;;28830:52;29011:24;;;;:15;:24;;;;;;;;29004:31;;-1:-1:-1;;;;;;29004:31:0;;;-1:-1:-1;;;;;29403:24:0;;;;;:18;:24;;;;;29401:26;;-1:-1:-1;;29401:26:0;;;29472:22;;;;;;;29470:24;;-1:-1:-1;29470:24:0;;;29765:26;;;:17;:26;;;;;-1:-1:-1;;;29853:15:0;10600:3;29853:41;29811:84;;:128;;29765:174;;;30059:46;;:51;;30055:626;;30163:1;30153:11;;30131:19;30286:30;;;:17;:30;;;;;;:35;;30282:384;;30424:13;;30409:11;:28;30405:242;;30571:30;;;;:17;:30;;;;;:52;;;30405:242;30112:569;30055:626;30728:7;30724:2;-1:-1:-1;;;;;30709:27:0;30718:4;-1:-1:-1;;;;;30709:27:0;;;;;;;;;;;28386:2411;;28282:2515;;;:::o;42427:191::-;42501:16;42520:6;;-1:-1:-1;;;;;42537:17:0;;;-1:-1:-1;;;;;;42537:17:0;;;;;;42570:40;;42520:6;;;;;;;42570:40;;42501:16;42570:40;42490:128;42427:191;:::o;23400:104::-;23469:27;23479:2;23483:8;23469:27;;;;;;;;;;;;:9;:27::i;34494:716::-;34678:88;;-1:-1:-1;;;34678:88:0;;34657:4;;-1:-1:-1;;;;;34678:45:0;;;;;:88;;37112:10;;34745:4;;34751:7;;34760:5;;34678:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34678:88:0;;;;;;;;-1:-1:-1;;34678:88:0;;;;;;;;;;;;:::i;:::-;;;34674:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34961:6;:13;34978:1;34961:18;34957:235;;35007:40;;-1:-1:-1;;;35007:40:0;;;;;;;;;;;34957:235;35150:6;35144:13;35135:6;35131:2;35127:15;35120:38;34674:529;-1:-1:-1;;;;;;34837:64:0;-1:-1:-1;;;34837:64:0;;-1:-1:-1;34494:716:0;;;;;;:::o;43335:111::-;43395:13;43427:11;43420:18;;;;;:::i;37236:1959::-;37707:4;37701:11;;37714:3;37697:21;;37792:17;;;;38489:11;;;38368:5;38621:2;38635;38625:13;;38617:22;38489:11;38604:36;38676:2;38666:13;;38259:682;38695:4;38259:682;;;38870:1;38865:3;38861:11;38854:18;;38921:2;38915:4;38911:13;38907:2;38903:22;38898:3;38890:36;38791:2;38781:13;;38259:682;;;-1:-1:-1;38983:13:0;;;-1:-1:-1;;39098:12:0;;;39158:19;;;39098:12;37236:1959;-1:-1:-1;37236:1959:0:o;23877:2236::-;24023:13;;-1:-1:-1;;;;;24051:16:0;;24047:48;;24076:19;;-1:-1:-1;;;24076:19:0;;;;;;;;;;;24047:48;24110:8;24122:1;24110:13;24106:44;;24132:18;;-1:-1:-1;;;24132:18:0;;;;;;;;;;;24106:44;-1:-1:-1;;;;;24699:22:0;;;;;;:18;:22;;;;10083:2;24699:22;;;:70;;24737:31;24725:44;;24699:70;;;25012:31;;;:17;:31;;;;;25105:15;10600:3;25105:41;25063:84;;-1:-1:-1;25183:13:0;;10863:3;25168:56;25063:162;25012:213;;:31;;25306:23;;;;25350:14;:19;25346:635;;25390:313;25421:38;;25446:12;;-1:-1:-1;;;;;25421:38:0;;;25438:1;;25421:38;;25438:1;;25421:38;25487:69;25526:1;25530:2;25534:14;;;;;;25550:5;25487:30;:69::i;:::-;25482:174;;25592:40;;-1:-1:-1;;;25592:40:0;;;;;;;;;;;25482:174;25698:3;25683:12;:18;25390:313;;25784:12;25767:13;;:29;25763:43;;25798:8;;;25763:43;25346:635;;;25847:119;25878:40;;25903:14;;;;;-1:-1:-1;;;;;25878:40:0;;;25895:1;;25878:40;;25895:1;;25878:40;25961:3;25946:12;:18;25847:119;;25346:635;-1:-1:-1;25995:13:0;:28;26045:60;26074:1;26078:2;26082:12;26096:8;26045:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:592::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:52;;;3027:1;3024;3017:12;2979:52;3067:9;3054:23;3096:18;3137:2;3129:6;3126:14;3123:34;;;3153:1;3150;3143:12;3123:34;3191:6;3180:9;3176:22;3166:32;;3236:7;3229:4;3225:2;3221:13;3217:27;3207:55;;3258:1;3255;3248:12;3207:55;3298:2;3285:16;3324:2;3316:6;3313:14;3310:34;;;3340:1;3337;3330:12;3310:34;3385:7;3380:2;3371:6;3367:2;3363:15;3359:24;3356:37;3353:57;;;3406:1;3403;3396:12;3353:57;3437:2;3429:11;;;;;3459:6;;-1:-1:-1;2879:592:1;;-1:-1:-1;;;;2879:592:1:o;3476:347::-;3541:6;3549;3602:2;3590:9;3581:7;3577:23;3573:32;3570:52;;;3618:1;3615;3608:12;3570:52;3641:29;3660:9;3641:29;:::i;:::-;3631:39;;3720:2;3709:9;3705:18;3692:32;3767:5;3760:13;3753:21;3746:5;3743:32;3733:60;;3789:1;3786;3779:12;3733:60;3812:5;3802:15;;;3476:347;;;;;:::o;3828:127::-;3889:10;3884:3;3880:20;3877:1;3870:31;3920:4;3917:1;3910:15;3944:4;3941:1;3934:15;3960:275;4031:2;4025:9;4096:2;4077:13;;-1:-1:-1;;4073:27:1;4061:40;;4131:18;4116:34;;4152:22;;;4113:62;4110:88;;;4178:18;;:::i;:::-;4214:2;4207:22;3960:275;;-1:-1:-1;3960:275:1:o;4240:980::-;4335:6;4343;4351;4359;4412:3;4400:9;4391:7;4387:23;4383:33;4380:53;;;4429:1;4426;4419:12;4380:53;4452:29;4471:9;4452:29;:::i;:::-;4442:39;;4500:2;4521:38;4555:2;4544:9;4540:18;4521:38;:::i;:::-;4511:48;;4606:2;4595:9;4591:18;4578:32;4568:42;;4661:2;4650:9;4646:18;4633:32;4684:18;4725:2;4717:6;4714:14;4711:34;;;4741:1;4738;4731:12;4711:34;4779:6;4768:9;4764:22;4754:32;;4824:7;4817:4;4813:2;4809:13;4805:27;4795:55;;4846:1;4843;4836:12;4795:55;4882:2;4869:16;4904:2;4900;4897:10;4894:36;;;4910:18;;:::i;:::-;4952:53;4995:2;4976:13;;-1:-1:-1;;4972:27:1;4968:36;;4952:53;:::i;:::-;4939:66;;5028:2;5021:5;5014:17;5068:7;5063:2;5058;5054;5050:11;5046:20;5043:33;5040:53;;;5089:1;5086;5079:12;5040:53;5144:2;5139;5135;5131:11;5126:2;5119:5;5115:14;5102:45;5188:1;5183:2;5178;5171:5;5167:14;5163:23;5156:34;;5209:5;5199:15;;;;;4240:980;;;;;;;:::o;5225:952::-;5309:6;5340:2;5383;5371:9;5362:7;5358:23;5354:32;5351:52;;;5399:1;5396;5389:12;5351:52;5439:9;5426:23;5468:18;5509:2;5501:6;5498:14;5495:34;;;5525:1;5522;5515:12;5495:34;5563:6;5552:9;5548:22;5538:32;;5608:7;5601:4;5597:2;5593:13;5589:27;5579:55;;5630:1;5627;5620:12;5579:55;5666:2;5653:16;5688:2;5684;5681:10;5678:36;;;5694:18;;:::i;:::-;5740:2;5737:1;5733:10;5723:20;;5763:28;5787:2;5783;5779:11;5763:28;:::i;:::-;5825:15;;;5895:11;;;5891:20;;;5856:12;;;;5923:19;;;5920:39;;;5955:1;5952;5945:12;5920:39;5979:11;;;;5999:148;6015:6;6010:3;6007:15;5999:148;;;6081:23;6100:3;6081:23;:::i;:::-;6069:36;;6032:12;;;;6125;;;;5999:148;;;6166:5;5225:952;-1:-1:-1;;;;;;;;5225:952:1:o;6182:260::-;6250:6;6258;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;6350:29;6369:9;6350:29;:::i;:::-;6340:39;;6398:38;6432:2;6421:9;6417:18;6398:38;:::i;:::-;6388:48;;6182:260;;;;;:::o;6447:380::-;6526:1;6522:12;;;;6569;;;6590:61;;6644:4;6636:6;6632:17;6622:27;;6590:61;6697:2;6689:6;6686:14;6666:18;6663:38;6660:161;;6743:10;6738:3;6734:20;6731:1;6724:31;6778:4;6775:1;6768:15;6806:4;6803:1;6796:15;6660:161;;6447:380;;;:::o;6832:356::-;7034:2;7016:21;;;7053:18;;;7046:30;7112:34;7107:2;7092:18;;7085:62;7179:2;7164:18;;6832:356::o;7537:127::-;7598:10;7593:3;7589:20;7586:1;7579:31;7629:4;7626:1;7619:15;7653:4;7650:1;7643:15;7669:128;7709:3;7740:1;7736:6;7733:1;7730:13;7727:39;;;7746:18;;:::i;:::-;-1:-1:-1;7782:9:1;;7669:128::o;8145:168::-;8185:7;8251:1;8247;8243:6;8239:14;8236:1;8233:21;8228:1;8221:9;8214:17;8210:45;8207:71;;;8258:18;;:::i;:::-;-1:-1:-1;8298:9:1;;8145:168::o;9022:470::-;9201:3;9239:6;9233:13;9255:53;9301:6;9296:3;9289:4;9281:6;9277:17;9255:53;:::i;:::-;9371:13;;9330:16;;;;9393:57;9371:13;9330:16;9427:4;9415:17;;9393:57;:::i;:::-;9466:20;;9022:470;-1:-1:-1;;;;9022:470:1:o;9852:127::-;9913:10;9908:3;9904:20;9901:1;9894:31;9944:4;9941:1;9934:15;9968:4;9965:1;9958:15;9984:135;10023:3;10044:17;;;10041:43;;10064:18;;:::i;:::-;-1:-1:-1;10111:1:1;10100:13;;9984:135::o;10531:489::-;-1:-1:-1;;;;;10800:15:1;;;10782:34;;10852:15;;10847:2;10832:18;;10825:43;10899:2;10884:18;;10877:34;;;10947:3;10942:2;10927:18;;10920:31;;;10725:4;;10968:46;;10994:19;;10986:6;10968:46;:::i;:::-;10960:54;10531:489;-1:-1:-1;;;;;;10531:489:1:o;11025:249::-;11094:6;11147:2;11135:9;11126:7;11122:23;11118:32;11115:52;;;11163:1;11160;11153:12;11115:52;11195:9;11189:16;11214:30;11238:5;11214:30;:::i

Swarm Source

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