ETH Price: $3,225.94 (+5.01%)

Token

MKs (MeatKites)
 

Overview

Max Total Supply

2,222 MeatKites

Holders

557

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 MeatKites
0xb17db9b43f07a29f07c53366c16770b490514629
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:
MeatKitesMaker

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-30
*/

// SPDX-License-Identifier: VPL - VIRAL PUBLIC LICENSE
pragma solidity ^0.8.13;

/*

MMMMMMMM               MMMMMMMMEEEEEEEEEEEEEEEEEEEEEE               AAA         TTTTTTTTTTTTTTTTTTTTTTT     
M:::::::M             M:::::::ME::::::::::::::::::::E              A:::A        T:::::::::::::::::::::T     
M::::::::M           M::::::::ME::::::::::::::::::::E             A:::::A       T:::::::::::::::::::::T     
M:::::::::M         M:::::::::MEE::::::EEEEEEEEE::::E            A:::::::A      T:::::TT:::::::TT:::::T     
M::::::::::M       M::::::::::M  E:::::E       EEEEEE           A:::::::::A     TTTTTT  T:::::T  TTTTTT     
M:::::::::::M     M:::::::::::M  E:::::E                       A:::::A:::::A            T:::::T               
M:::::::M::::M   M::::M:::::::M  E::::::EEEEEEEEEE            A:::::A A:::::A           T:::::T               
M::::::M M::::M M::::M M::::::M  E:::::::::::::::E           A:::::A   A:::::A          T:::::T               
M::::::M  M::::M::::M  M::::::M  E:::::::::::::::E          A:::::A     A:::::A         T:::::T               
M::::::M   M:::::::M   M::::::M  E::::::EEEEEEEEEE         A:::::AAAAAAAAA:::::A        T:::::T               
M::::::M    M:::::M    M::::::M  E:::::E                  A:::::::::::::::::::::A       T:::::T               
M::::::M     MMMMM     M::::::M  E:::::E       EEEEEE    A:::::AAAAAAAAAAAAA:::::A      T:::::T             
M::::::M               M::::::MEE::::::EEEEEEEE:::::E   A:::::A             A:::::A   TT:::::::TT           
M::::::M               M::::::ME::::::::::::::::::::E  A:::::A               A:::::A  T:::::::::T           
M::::::M               M::::::ME::::::::::::::::::::E A:::::A                 A:::::A T:::::::::T           
MMMMMMMM               MMMMMMMMEEEEEEEEEEEEEEEEEEEEEEAAAAAAA                   AAAAAAATTTTTTTTTTT           
                                                                                                                                                                                                          
               KKKKKKKKK    KKKKKKKIIIIIIIIIITTTTTTTTTTTTTTTTTTTTTTTEEEEEEEEEEEEEEEEEEEEEE   SSSSSSSSSSSSSSS 
              K:::::::K    K:::::KI::::::::IT:::::::::::::::::::::TE::::::::::::::::::::E SS:::::::::::::::S
             K:::::::K    K:::::KI::::::::IT:::::::::::::::::::::TE::::::::::::::::::::ES:::::SSSSSS::::::S
            K:::::::K   K::::::KII::::::IIT:::::TT:::::::TT:::::TEE::::::EEEEEEEEE::::ES:::::S     SSSSSSS
           KK::::::K  K:::::KKK  I::::I  TTTTTT  T:::::T  TTTTTT  E:::::E       EEEEEES:::::S            
            K:::::K K:::::K     I::::I          T:::::T          E:::::E             S:::::S            
           K::::::K:::::K      I::::I          T:::::T          E::::::EEEEEEEEEE    S::::SSSS         
          K:::::::::::K       I::::I          T:::::T          E:::::::::::::::E     SS::::::SSSSS    
         K:::::::::::K       I::::I          T:::::T          E:::::::::::::::E       SSS::::::::SS  
        K::::::K:::::K      I::::I          T:::::T          E::::::EEEEEEEEEE          SSSSSS::::S 
       K:::::K K:::::K     I::::I          T:::::T          E:::::E                         S:::::S
    KK::::::K  K:::::KKK  I::::I          T:::::T          E:::::E       EEEEEE            S:::::S
   K:::::::K   K::::::KII::::::II      TT:::::::TT      EE::::::EEEEEEEE:::::ESSSSSSS     S:::::S
  K:::::::K    K:::::KI::::::::I      T:::::::::T      E::::::::::::::::::::ES::::::SSSSSS:::::S
 K:::::::K    K:::::KI::::::::I      T:::::::::T      E::::::::::::::::::::ES:::::::::::::::SS 
KKKKKKKKK    KKKKKKKIIIIIIIIII      TTTTTTTTTTT      EEEEEEEEEEEEEEEEEEEEEE SSSSSSSSSSSSSSS   

       meatkites.xyz | twitter.com/no_side666
    
       The most exotic pets generated entirely 'in-chain'.

                                                            
                                                                              (copyleft) 2023 VPL no_side666

*/

/// @notice Library to encode strings in Base64.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol)
/// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>.
library Base64 {
    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// See: https://datatracker.ietf.org/doc/html/rfc4648
    /// @param fileSafe  Whether to replace '+' with '-' and '/' with '_'.
    /// @param noPadding Whether to strip away the padding.
    function encode(bytes memory data, bool fileSafe, bool noPadding)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            for { let dataLength := mload(data) } dataLength {} {
                // Multiply by 4/3 rounded up.
                // The `shl(2, ...)` is equivalent to multiplying by 4.
                let encodedLength := shl(2, div(add(dataLength, 2), 3))

                // Set `result` to point to the start of the free memory.
                result := mload(0x40)

                // Store the table into the scratch space.
                // Offsetted by -1 byte so that the `mload` will load the character.
                // We will rewrite the free memory pointer at `0x40` later with
                // the allocated size.
                // The magic constant 0x0230 will translate "-_" + "+/".
                mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef")
                mstore(0x3f, sub("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0230)))

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, encodedLength)

                // Run over the input, 3 bytes at a time.
                for {} 1 {} {
                    data := add(data, 3) // Advance 3 bytes.
                    let input := mload(data)

                    // Write 4 bytes. Optimized for fewer stack operations.
                    mstore8(ptr, mload(and(shr(18, input), 0x3F)))
                    mstore8(add(ptr, 1), mload(and(shr(12, input), 0x3F)))
                    mstore8(add(ptr, 2), mload(and(shr(6, input), 0x3F)))
                    mstore8(add(ptr, 3), mload(and(input, 0x3F)))

                    ptr := add(ptr, 4) // Advance 4 bytes.

                    if iszero(lt(ptr, end)) { break }
                }

                // Allocate the memory for the string.
                // Add 31 and mask with `not(31)` to round the
                // free memory pointer up the next multiple of 32.
                mstore(0x40, and(add(end, 31), not(31)))

                let r := mod(dataLength, 3)

                if iszero(noPadding) {
                    // Offset `ptr` and pad with '='. We can simply write over the end.
                    mstore8(sub(ptr, iszero(iszero(r))), 0x3d) // Pad at `ptr - 1` if `r > 0`.
                    mstore8(sub(ptr, shl(1, eq(r, 1))), 0x3d) // Pad at `ptr - 2` if `r == 1`.
                    // Write the length of the string.
                    mstore(result, encodedLength)
                    break
                }
                // Write the length of the string.
                mstore(result, sub(encodedLength, add(iszero(iszero(r)), eq(r, 1))))
                break
            }
        }
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, false, false)`.
    function encode(bytes memory data) internal pure returns (string memory result) {
        result = encode(data, false, false);
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, fileSafe, false)`.
    function encode(bytes memory data, bool fileSafe)
        internal
        pure
        returns (string memory result)
    {
        result = encode(data, fileSafe, false);
    }

    /// @dev Encodes base64 encoded `data`.
    ///
    /// Supports:
    /// - RFC 4648 (both standard and file-safe mode).
    /// - RFC 3501 (63: ',').
    ///
    /// Does not support:
    /// - Line breaks.
    ///
    /// Note: For performance reasons,
    /// this function will NOT revert on invalid `data` inputs.
    /// Outputs for invalid inputs will simply be undefined behaviour.
    /// It is the user's responsibility to ensure that the `data`
    /// is a valid base64 encoded string.
    function decode(string memory data) internal pure returns (bytes memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                let end := add(data, dataLength)
                let decodedLength := mul(shr(2, dataLength), 3)

                for {} 1 {} {
                    // If padded.
                    if iszero(and(dataLength, 3)) {
                        let t := xor(mload(end), 0x3d3d)
                        // forgefmt: disable-next-item
                        decodedLength := sub(
                            decodedLength,
                            add(iszero(byte(30, t)), iszero(byte(31, t)))
                        )
                        break
                    }
                    // If non-padded.
                    decodedLength := add(decodedLength, sub(and(dataLength, 3), 1))
                    break
                }
                result := mload(0x40)

                // Write the length of the string.
                mstore(result, decodedLength)

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)

                // Load the table into the scratch space.
                // Constants are optimized for smaller bytecode with zero gas overhead.
                // `m` also doubles as the mask of the upper 6 bits.
                let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc
                mstore(0x5b, m)
                mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064)
                mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4)

                for {} 1 {} {
                    // Read 4 bytes.
                    data := add(data, 4)
                    let input := mload(data)

                    // Write 3 bytes.
                    // forgefmt: disable-next-item
                    mstore(ptr, or(
                        and(m, mload(byte(28, input))),
                        shr(6, or(
                            and(m, mload(byte(29, input))),
                            shr(6, or(
                                and(m, mload(byte(30, input))),
                                shr(6, mload(byte(31, input)))
                            ))
                        ))
                    ))

                    ptr := add(ptr, 3)

                    if iszero(lt(data, end)) { break }
                }

                // Allocate the memory for the string.
                // Add 32 + 31 and mask with `not(31)` to round the
                // free memory pointer up the next multiple of 32.
                mstore(0x40, and(add(add(result, decodedLength), 63), not(31)))

                // Restore the zero slot.
                mstore(0x60, 0)
            }
        }
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

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

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}

/// @notice Read and write to persistent storage at a fraction of the cost.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SSTORE2.sol)
/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
library SSTORE2 {
    error SSTORE2_DEPLOYMENT_FAILED();
    error SSTORE2_READ_OUT_OF_BOUNDS();

    // We skip the first byte as it's a STOP opcode to ensure the contract can't be called.
    uint256 internal constant DATA_OFFSET = 1;

    /*//////////////////////////////////////////////////////////////
                               WRITE LOGIC
    //////////////////////////////////////////////////////////////*/

    function write(bytes memory data) internal returns (address pointer) {
        // Note: The assembly block below does not expand the memory.
        assembly {
            let originalDataLength := mload(data)

            // Add 1 to data size since we are prefixing it with a STOP opcode.
            let dataSize := add(originalDataLength, 1)

            /**
             * ------------------------------------------------------------------------------------+
             *   Opcode  | Opcode + Arguments  | Description       | Stack View                    |
             * ------------------------------------------------------------------------------------|
             *   0x61    | 0x61XXXX            | PUSH2 codeSize    | codeSize                      |
             *   0x80    | 0x80                | DUP1              | codeSize codeSize             |
             *   0x60    | 0x600A              | PUSH1 10          | 10 codeSize codeSize          |
             *   0x3D    | 0x3D                | RETURNDATASIZE    | 0 10 codeSize codeSize        |
             *   0x39    | 0x39                | CODECOPY          | codeSize                      |
             *   0x3D    | 0x3D                | RETURNDATASZIE    | 0 codeSize                    |
             *   0xF3    | 0xF3                | RETURN            |                               |
             *   0x00    | 0x00                | STOP              |                               |
             * ------------------------------------------------------------------------------------+
             * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called. Also PUSH2 is
             * used since max contract size cap is 24,576 bytes which is less than 2 ** 16.
             */
            mstore(
                data,
                or(
                    0x61000080600a3d393df300,
                    shl(64, dataSize) // shift `dataSize` so that it lines up with the 0000 after PUSH2
                )
            )

            // Deploy a new contract with the generated creation code.
            pointer := create(0, add(data, 21), add(dataSize, 10))

            // Restore original length of the variable size `data`
            mstore(data, originalDataLength)
        }

        if (pointer == address(0)) {
            revert SSTORE2_DEPLOYMENT_FAILED();
        }
    }

    /*//////////////////////////////////////////////////////////////
                               READ LOGIC
    //////////////////////////////////////////////////////////////*/

    function read(address pointer) internal view returns (bytes memory) {
        return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET);
    }

    function read(address pointer, uint256 start) internal view returns (bytes memory) {
        start += DATA_OFFSET;

        return readBytecode(pointer, start, pointer.code.length - start);
    }

    function read(
        address pointer,
        uint256 start,
        uint256 end
    ) internal view returns (bytes memory) {
        start += DATA_OFFSET;
        end += DATA_OFFSET;

        if (pointer.code.length < end) {
            revert SSTORE2_READ_OUT_OF_BOUNDS();
        }

        return readBytecode(pointer, start, end - start);
    }

    /*//////////////////////////////////////////////////////////////
                          INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function readBytecode(
        address pointer,
        uint256 start,
        uint256 size
    ) private view returns (bytes memory data) {
        assembly {
            // Get a pointer to some free memory.
            data := mload(0x40)

            // Update the free memory pointer to prevent overriding our data.
            // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)).
            // Adding 63 (32 + 31) to size and running the result through the logic
            // above ensures the memory pointer remains word-aligned, following
            // the Solidity convention.
            mstore(0x40, add(data, and(add(size, 63), not(31))))

            // Store the size of the data in the first 32 byte chunk of free memory.
            mstore(data, size)

            // Copy the code into memory right after the 32 bytes we used to store the size.
            extcodecopy(pointer, add(data, 32), start, size)
        }
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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

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

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

abstract contract MarketWares is ERC2981, Ownable {

    address immutable private _tokenImagePtr;

    address immutable private _royaltyReceiver;

    constructor(bytes memory bTokenImage) Ownable() {
        _royaltyReceiver = owner();
        _setDefaultRoyalty(_royaltyReceiver, 500); // ERC2981 5% royalty on secondary sales
        _tokenImagePtr = SSTORE2.write(bTokenImage);
    }
      
    // needed for opensea
    function contractURI() public view returns(string memory) {
        return string(abi.encodePacked(
                  "data:application/json;base64,", 
                  Base64.encode(abi.encodePacked("{\"name\": \"MeatKites\","
                       " \"description\": \"The most exotic pets generated entirely 'in-chain'. meatkites.xyz | twitter.com/no_side666\","
                       " \"image\": \"", 
                       "data:image/svg+xml;base64,",
                       Base64.encode(SSTORE2.read(_tokenImagePtr)), 
                       "\",",
                       " \"seller_fee_basis_points:\": \"500\","
                       " \"fee_recipient\": \"", Strings.toHexString(_royaltyReceiver) ,"\"}"))));
    }

    function sendETH() external {
        (bool success,) = owner().call{value: address(this).balance}("");
        require(success, "call failed.");
    }
}

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

abstract contract OperatorFilteredERC721 is ERC721, DefaultOperatorFilterer {

    constructor(
        string memory name_,
        string memory symbol_
    ) ERC721(name_, symbol_) {}

    // overrides for DefaultOperatorFilterer, which enables creator fees on opensea

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

interface IRenderer {
    function renderAttributes(uint256 tokenId) external view returns(string memory);
    function renderSVG(uint256 tokenId) external view returns(string memory);
}

contract MeatKitesMaker is OperatorFilteredERC721, MarketWares {
    
    uint256 public totalSupply;
    // qty's
    uint256 constant public FREE_MINT = 100;
    uint256 constant public PEOPLE_PRICES_MINT = 300;
    uint256 constant public MAX_SUPPLY = 2222;

    // prices
    uint256 constant public PEOPLE_PRICE = 0.01 ether;
    uint256 constant public WANKER_PRICE = 0.1 ether;

    uint256 public publicMintDate;

    IRenderer internal _renderer;

    constructor(address renderer_, bytes memory bTokenImage) OperatorFilteredERC721("MKs", "MeatKites") MarketWares(bTokenImage) {

        _renderer = IRenderer(renderer_);
    }

    function mint(address to) external payable returns(uint256 lastTokenId) {
        return _mintTo({to: to, discounted: false});
    }

    function mintDiscounted(address to) external payable returns(uint256 lastTokenId) {
        return _mintTo({to: to, discounted: callerOwnsSweetNFTs()}); 
    }

    function publicMintActive() public view returns(bool) {
        uint256 _publicMintDate = publicMintDate;
        return (_publicMintDate != 0) && (block.timestamp > _publicMintDate);
    }

    function currentPrice() external view returns(uint256) {
        return _currentPrice({totalSupply_: totalSupply, discounted: false});
    }

    function currentDiscountedPrice() external view returns(uint256) {
        return _currentPrice({
                  totalSupply_: totalSupply, 
                  discounted: callerOwnsSweetNFTs()});
    }

    function callerOwnsSweetNFTs() public view returns(bool isCoolOwner) {
        IERC721[4] memory coolNFTs = [
            IERC721(address(0x5078981549A1CC18673eb76fb47468f546aAdc51)), // FEETPIX wtf 
            IERC721(address(0xeF1a89cbfAbE59397FfdA11Fc5DF293E9bC5Db90)), // BASED GHOULS
            IERC721(address(0x5Af0D9827E0c53E4799BB226655A1de152A425a5)), // MILADY MAKER 
            IERC721(address(0x5DcE0bB0778694Ef3Ba79Bb702b88CAC1879cc7D))]; // bonSAI NFT
        for (uint256 i; i < coolNFTs.length; ++i) {
            if ((coolNFTs[i]).balanceOf(msg.sender) > 0) {
                isCoolOwner = true;
                break;
            } 
        }        
    }
    

    function tokenURI(uint256 tokenId) public view override returns(string memory) {

        require(tokenId < totalSupply, "tokenId dne.");
        string memory attributes = _renderer.renderAttributes(tokenId);
        assembly { // delete last comma
            mstore(attributes, sub(mload(attributes), 1))
        }

        return string(abi.encodePacked(
          "data:application/json;base64,", 
          Base64.encode(abi.encodePacked(
            "{\"name\":\"MeatKites ", Strings.toString(tokenId),
            "\", \"description\":\"the most exotic in-chain pets",
            "\", \"attributes\":[", attributes,
            "], \"image\":\"data:image/svg+xml;base64,", 
            Base64.encode(bytes(_renderer.renderSVG(tokenId))),
            "\"}"
        ))));
    }

    function renderSVG(uint256 tokenId) external view virtual returns(string memory) {
        require(tokenId < totalSupply, "tokenId dne.");
        return string(Base64.encode(bytes(_renderer.renderSVG(tokenId))));
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || 
               interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
               interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC721Metadata
               super.supportsInterface(interfaceId);
    }

    // priveledged fns
    
    function setPublicMintDate(uint256 publicMintDate_) external onlyOwner virtual {
        require(publicMintDate == 0, "can only set once.");
        publicMintDate = publicMintDate_;
    }

    // internal/private fns
    
    function _mintTo(address to, bool discounted) private returns(uint256 lastTokenId) {
        require(publicMintActive() || msg.sender == owner(), "!publicMintActive.");
        uint256 tokenId = totalSupply;
        uint256 currentPrice_ = _currentPrice({totalSupply_: tokenId, discounted: discounted});
        unchecked{
        uint256 qty = (currentPrice_ > 0) ? msg.value / currentPrice_ : 1;
        // means freeMint is qty=1 at a time
        _checkQty(qty, tokenId);
        for (uint256 i; i < qty; ++i) {
            _mint(to, tokenId++); 
        }
        lastTokenId = tokenId;
        totalSupply = lastTokenId;
        }//uc all math here safe
    }

    function _currentPrice(uint256 totalSupply_, bool discounted) private pure returns(uint256){
        unchecked{
        uint256 divisor = (discounted) ? 2 : 1;
        uint256[3] memory checkpoints = [FREE_MINT, PEOPLE_PRICES_MINT, MAX_SUPPLY];
        if (totalSupply_ < checkpoints[0]) {
            return 0; // free 
        } else if (totalSupply_ < checkpoints[1]) {
            return PEOPLE_PRICE / divisor;
        }
        return WANKER_PRICE / divisor;
        }//uc
    }

    function _checkQty(uint256 desiredQty, uint256 totalSupply_) private pure {
        require(desiredQty > 0, "msg.value must be n * currentPrice().");
        // this crosses over interval boundary thankfully
        unchecked{
        uint256 sum = desiredQty + totalSupply_; // won't overflow due to scarcity of eth and max supply
        require(sum <= MAX_SUPPLY, "all tokens minted.");
        if (desiredQty == 1) return; 
        uint256[3] memory checkpoints = [FREE_MINT, PEOPLE_PRICES_MINT, MAX_SUPPLY];
        bool inDifferentIntervals;
        for (uint256 i; i < checkpoints.length; ++i) {
            if ((totalSupply_ < checkpoints[i]) != (sum <= checkpoints[i])) {
                inDifferentIntervals = true;
                break;
            }
        }
        require(!inDifferentIntervals, "qty out of range.");
        }//uc
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"renderer_","type":"address"},{"internalType":"bytes","name":"bTokenImage","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"SSTORE2_DEPLOYMENT_FAILED","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEOPLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEOPLE_PRICES_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WANKER_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerOwnsSweetNFTs","outputs":[{"internalType":"bool","name":"isCoolOwner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDiscountedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintDiscounted","outputs":[{"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"renderSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"sendETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicMintDate_","type":"uint256"}],"name":"setPublicMintDate","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"}]

60c06040523480156200001157600080fd5b5060405162002cbd38038062002cbd833981016040819052620000349162000441565b80604051806040016040528060038152602001624d4b7360e81b815250604051806040016040528060098152602001684d6561744b6974657360b81b815250733cc6cdda760b79bafa08df41ecfa224f810dceb66001838381600090816200009d9190620005c6565b506001620000ac8282620005c6565b5050506daaeb6d7670e522a718067333cd4e3b15620001f45780156200014257604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200012357600080fd5b505af115801562000138573d6000803e3d6000fd5b50505050620001f4565b6001600160a01b03821615620001935760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000108565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050505b50505050620002126200020c6200027760201b60201c565b6200027b565b6008546001600160a01b031660a081905262000231906101f4620002cd565b6200024781620003d260201b62000efe1760201c565b6001600160a01b03908116608052600b80546001600160a01b031916949091169390931790925550620006929050565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620003415760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003995760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000338565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b0381166200042657604051632da4836960e21b815260040160405180910390fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200045557600080fd5b82516001600160a01b03811681146200046d57600080fd5b602084810151919350906001600160401b03808211156200048d57600080fd5b818601915086601f830112620004a257600080fd5b815181811115620004b757620004b76200042b565b604051601f8201601f19908116603f01168101908382118183101715620004e257620004e26200042b565b816040528281528986848701011115620004fb57600080fd5b600093505b828410156200051f578484018601518185018701529285019262000500565b60008684830101528096505050505050509250929050565b600181811c908216806200054c57607f821691505b6020821081036200056d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005c157600081815260208120601f850160051c810160208610156200059c5750805b601f850160051c820191505b81811015620005bd57828155600101620005a8565b5050505b505050565b81516001600160401b03811115620005e257620005e26200042b565b620005fa81620005f3845462000537565b8462000573565b602080601f831160018114620006325760008415620006195750858301515b600019600386901b1c1916600185901b178555620005bd565b600085815260208120601f198616915b82811015620006635788860151825594840194600190910190840162000642565b5085821015620006825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612605620006b86000396000610e2f01526000610e0601526126056000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063b67c25a3116100a0578063db065b1d1161006f578063db065b1d146105a9578063dd18964a146105be578063e8a3d485146105da578063e985e9c5146105ef578063f2fde38b1461062a57600080fd5b8063b67c25a314610534578063b88d4fde14610549578063c87b56dd14610569578063d12a4c981461058957600080fd5b80638da5cb5b116100e75780638da5cb5b146104b957806395d89b41146104d75780639d1b464a146104ec578063a22cb46514610501578063ae4229881461052157600080fd5b80636352211e146104515780636a6278421461047157806370a0823114610484578063715018a6146104a457600080fd5b80631d16d9a01161019b57806332cb6b0c1161016a57806332cb6b0c146103ce578063381679ae146103e457806341f43434146103f957806342842e0e1461041b57806352af43d11461043b57600080fd5b80631d16d9a01461033a5780631ee34fab1461034f57806323b872dd1461036f5780632a55205a1461038f57600080fd5b8063081812fc116101d7578063081812fc1461029f578063095ea7b3146102ed5780630c69a2741461030f57806318160ddd1461032457600080fd5b8063016f19a51461020957806301ffc9a71461023757806306fdde0314610267578063074a130d14610289575b600080fd5b34801561021557600080fd5b50610224662386f26fc1000081565b6040519081526020015b60405180910390f35b34801561024357600080fd5b50610257610252366004611e46565b61064a565b604051901515815260200161022e565b34801561027357600080fd5b5061027c6106ab565b60405161022e9190611e87565b34801561029557600080fd5b50610224600a5481565b3480156102ab57600080fd5b506102d56102ba366004611eba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022e565b3480156102f957600080fd5b5061030d610308366004611eea565b610739565b005b34801561031b57600080fd5b50610224610752565b34801561033057600080fd5b5061022460095481565b34801561034657600080fd5b5061030d61076c565b34801561035b57600080fd5b5061030d61036a366004611eba565b610817565b34801561037b57600080fd5b5061030d61038a366004611f14565b610869565b34801561039b57600080fd5b506103af6103aa366004611f50565b610894565b604080516001600160a01b03909316835260208301919091520161022e565b3480156103da57600080fd5b506102246108ae81565b3480156103f057600080fd5b50610257610940565b34801561040557600080fd5b506102d56daaeb6d7670e522a718067333cd4e81565b34801561042757600080fd5b5061030d610436366004611f14565b610a65565b34801561044757600080fd5b5061022461012c81565b34801561045d57600080fd5b506102d561046c366004611eba565b610a8a565b61022461047f366004611f72565b610ae1565b34801561049057600080fd5b5061022461049f366004611f72565b610aee565b3480156104b057600080fd5b5061030d610b51565b3480156104c557600080fd5b506008546001600160a01b03166102d5565b3480156104e357600080fd5b5061027c610b65565b3480156104f857600080fd5b50610224610b72565b34801561050d57600080fd5b5061030d61051c366004611f9b565b610b81565b61022461052f366004611f72565b610b95565b34801561054057600080fd5b50610257610ba8565b34801561055557600080fd5b5061030d610564366004611fd2565b610bc2565b34801561057557600080fd5b5061027c610584366004611eba565b610bf1565b34801561059557600080fd5b5061027c6105a4366004611eba565b610d84565b3480156105b557600080fd5b50610224606481565b3480156105ca57600080fd5b5061022467016345785d8a000081565b3480156105e657600080fd5b5061027c610df9565b3480156105fb57600080fd5b5061025761060a36600461206d565b600560209081526000928352604080842090915290825290205460ff1681565b34801561063657600080fd5b5061030d610645366004611f72565b610e88565b60006001600160e01b0319821663152a902d60e11b148061067b57506380ac58cd60e01b6001600160e01b03198316145b806106965750635b5e139f60e01b6001600160e01b03198316145b806106a557506106a582610f51565b92915050565b600080546106b8906120a0565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906120a0565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b8161074381610f86565b61074d838361103f565b505050565b6000610767600954610762610940565b611121565b905090565b60006107806008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146107ca576040519150601f19603f3d011682016040523d82523d6000602084013e6107cf565b606091505b50509050806108145760405162461bcd60e51b815260206004820152600c60248201526b31b0b636103330b4b632b21760a11b60448201526064015b60405180910390fd5b50565b61081f6111bb565b600a54156108645760405162461bcd60e51b815260206004820152601260248201527131b0b71037b7363c9039b2ba1037b731b29760711b604482015260640161080b565b600a55565b826001600160a01b03811633146108835761088333610f86565b61088e848484611215565b50505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109095750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610928906001600160601b0316876120f0565b610932919061211d565b915196919550909350505050565b60408051608081018252735078981549a1cc18673eb76fb47468f546aadc51815273ef1a89cbfabe59397ffda11fc5df293e9bc5db906020820152735af0d9827e0c53e4799bb226655a1de152a425a591810191909152735dce0bb0778694ef3ba79bb702b88cac1879cc7d6060820152600090815b6004811015610a605760008282600481106109d3576109d361213f565b60200201516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190612155565b1115610a505760019250505090565b610a598161216e565b90506109b6565b505090565b826001600160a01b0381163314610a7f57610a7f33610f86565b61088e8484846113dc565b6000818152600260205260409020546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161080b565b919050565b60006106a58260006114cf565b60006001600160a01b038216610b355760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161080b565b506001600160a01b031660009081526003602052604090205490565b610b596111bb565b610b63600061159f565b565b600180546106b8906120a0565b60006107676009546000611121565b81610b8b81610f86565b61074d83836115f1565b60006106a582610ba3610940565b6114cf565b600a546000908015801590610bbc57508042115b91505090565b846001600160a01b0381163314610bdc57610bdc33610f86565b610be9868686868661165d565b505050505050565b60606009548210610c335760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b546040516357e0286d60e11b8152600481018490526000916001600160a01b03169063afc050da90602401600060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca5919081019061219d565b905060018151038152610d5d610cba84611745565b600b54604051631a25499360e31b8152600481018790528491610d37916001600160a01b039091169063d12a4c98906024015b600060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d32919081019061219d565b6117d9565b604051602001610d499392919061224a565b6040516020818303038152906040526117d9565b604051602001610d6d9190612351565b604051602081830303815290604052915050919050565b60606009548210610dc65760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b54604051631a25499360e31b8152600481018490526106a5916001600160a01b03169063d12a4c9890602401610ced565b6060610e64610e2a610d327f00000000000000000000000000000000000000000000000000000000000000006117e7565b610e537f0000000000000000000000000000000000000000000000000000000000000000611808565b604051602001610d49929190612396565b604051602001610e749190612351565b604051602081830303815290604052905090565b610e906111bb565b6001600160a01b038116610ef55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080b565b6108148161159f565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b038116610adc57604051632da4836960e21b815260040160405180910390fd5b60006001600160e01b0319821663152a902d60e11b14806106a557506301ffc9a760e01b6001600160e01b03198316146106a5565b6daaeb6d7670e522a718067333cd4e3b1561081457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110179190612504565b61081457604051633b79c77360e21b81526001600160a01b038216600482015260240161080b565b6000818152600260205260409020546001600160a01b03163381148061108857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6110c55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008082611130576001611133565b60025b60408051606081018252606480825261012c60208301526108ae9282019290925260ff92909216925085101561116e576000925050506106a5565b602081015185101561119a5781662386f26fc100008161119057611190612107565b04925050506106a5565b8167016345785d8a0000816111b1576111b1612107565b0495945050505050565b6008546001600160a01b03163314610b635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080b565b6000818152600260205260409020546001600160a01b0384811691161461126b5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161080b565b6001600160a01b0382166112b55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b336001600160a01b03841614806112ef57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061131057506000818152600460205260409020546001600160a01b031633145b61134d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e7838383610869565b6001600160a01b0382163b15806114905750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612521565b6001600160e01b031916145b61074d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b60006114d9610ba8565b806114ee57506008546001600160a01b031633145b61152f5760405162461bcd60e51b815260206004820152601260248201527110b83ab13634b1a6b4b73a20b1ba34bb329760711b604482015260640161080b565b600954600061153e8285611121565b90506000808211611550576001611561565b81348161155f5761155f612107565b045b905061156d818461181e565b60005b8181101561159057611588878580600101965061198c565b600101611570565b50505060098190559392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611668858585610869565b6001600160a01b0384163b15806116ff5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906116b09033908a9089908990899060040161253e565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190612521565b6001600160e01b031916145b61173e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b5050505050565b6060600061175283611a97565b600101905060008167ffffffffffffffff81111561177257611772612187565b6040519080825280601f01601f19166020018201604052801561179c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117a6575b509392505050565b60606106a582600080611b6f565b60606106a5826001611803816001600160a01b0384163b612592565b611c6a565b60606106a56001600160a01b0383166014611c8d565b6000821161187c5760405162461bcd60e51b815260206004820152602560248201527f6d73672e76616c7565206d757374206265206e202a2063757272656e7450726960448201526431b294149760d91b606482015260840161080b565b8181016108ae8111156118c65760405162461bcd60e51b815260206004820152601260248201527130b636103a37b5b2b7399036b4b73a32b21760711b604482015260640161080b565b826001036118d357505050565b604080516060810182526064815261012c60208201526108ae918101919091526000805b6003811015611949578281600381106119125761191261213f565b602002015184111583826003811061192c5761192c61213f565b60200201518610146119415760019150611949565b6001016118f7565b50801561173e5760405162461bcd60e51b815260206004820152601160248201527038ba3c9037baba1037b3103930b733b29760791b604482015260640161080b565b6001600160a01b0382166119d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b6000818152600260205260409020546001600160a01b031615611a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161080b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611ad65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b02576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b2057662386f26fc10000830492506010015b6305f5e1008310611b38576305f5e100830492506008015b6127108310611b4c57612710830492506004015b60648310611b5e576064830492506002015b600a83106106a55760010192915050565b6060835180156117d1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611bdf57601f01601f19166040526003830685611c5357603d811515830353603d6001821460011b830353505082526117d1565b600181148115150183038552505050509392505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b60606000611c9c8360026120f0565b611ca79060026125a5565b67ffffffffffffffff811115611cbf57611cbf612187565b6040519080825280601f01601f191660200182016040528015611ce9576020820181803683370190505b509050600360fc1b81600081518110611d0457611d0461213f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d3357611d3361213f565b60200101906001600160f81b031916908160001a9053506000611d578460026120f0565b611d629060016125a5565b90505b6001811115611dda576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d9657611d9661213f565b1a60f81b828281518110611dac57611dac61213f565b60200101906001600160f81b031916908160001a90535060049490941c93611dd3816125b8565b9050611d65565b508315611e295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080b565b9392505050565b6001600160e01b03198116811461081457600080fd5b600060208284031215611e5857600080fd5b8135611e2981611e30565b60005b83811015611e7e578181015183820152602001611e66565b50506000910152565b6020815260008251806020840152611ea6816040850160208701611e63565b601f01601f19169190910160400192915050565b600060208284031215611ecc57600080fd5b5035919050565b80356001600160a01b0381168114610adc57600080fd5b60008060408385031215611efd57600080fd5b611f0683611ed3565b946020939093013593505050565b600080600060608486031215611f2957600080fd5b611f3284611ed3565b9250611f4060208501611ed3565b9150604084013590509250925092565b60008060408385031215611f6357600080fd5b50508035926020909101359150565b600060208284031215611f8457600080fd5b611e2982611ed3565b801515811461081457600080fd5b60008060408385031215611fae57600080fd5b611fb783611ed3565b91506020830135611fc781611f8d565b809150509250929050565b600080600080600060808688031215611fea57600080fd5b611ff386611ed3565b945061200160208701611ed3565b935060408601359250606086013567ffffffffffffffff8082111561202557600080fd5b818801915088601f83011261203957600080fd5b81358181111561204857600080fd5b89602082850101111561205a57600080fd5b9699959850939650602001949392505050565b6000806040838503121561208057600080fd5b61208983611ed3565b915061209760208401611ed3565b90509250929050565b600181811c908216806120b457607f821691505b6020821081036120d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106a5576106a56120da565b634e487b7160e01b600052601260045260246000fd5b60008261213a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561216757600080fd5b5051919050565b600060018201612180576121806120da565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121af57600080fd5b815167ffffffffffffffff808211156121c757600080fd5b818401915084601f8301126121db57600080fd5b8151818111156121ed576121ed612187565b604051601f8201601f19908116603f0116810190838211818310171561221557612215612187565b8160405282815287602084870101111561222e57600080fd5b61223f836020830160208801611e63565b979650505050505050565b7203d913730b6b2911d1126b2b0ba25b4ba32b99606d1b81528351600090612279816013850160208901611e63565b7f222c20226465736372697074696f6e223a22746865206d6f73742065786f74696013918401918201526e6320696e2d636861696e207065747360881b603382015270222c202261747472696275746573223a5b60781b604282015284516122e8816053840160208901611e63565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b626053929091019182015265185cd94d8d0b60d21b60738201528351612335816079840160208801611e63565b61227d60f01b60799290910191820152607b0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161238981601d850160208701611e63565b91909101601d0192915050565b7f7b226e616d65223a20224d6561744b69746573222c202264657363726970746981527f6f6e223a2022546865206d6f73742065786f74696320706574732067656e657260208201527f6174656420656e746972656c792027696e2d636861696e272e206d6561746b6960408201527f7465732e78797a207c20747769747465722e636f6d2f6e6f5f7369646536363660608201526c1116101134b6b0b3b2911d101160991b60808201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608d8201526000835161247c8160a7850160208801611e63565b61088b60f21b60a7918401918201527f202273656c6c65725f6665655f62617369735f706f696e74733a223a2022353060a98201527518111610113332b2afb932b1b4b834b2b73a111d101160511b60c982015283516124e38160df840160208801611e63565b6124fa60df8284010161227d60f01b815260020190565b9695505050505050565b60006020828403121561251657600080fd5b8151611e2981611f8d565b60006020828403121561253357600080fd5b8151611e2981611e30565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156106a5576106a56120da565b808201808211156106a5576106a56120da565b6000816125c7576125c76120da565b50600019019056fea26469706673582212208780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd235815164736f6c63430008110033000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000fb23c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636352211e11610118578063b67c25a3116100a0578063db065b1d1161006f578063db065b1d146105a9578063dd18964a146105be578063e8a3d485146105da578063e985e9c5146105ef578063f2fde38b1461062a57600080fd5b8063b67c25a314610534578063b88d4fde14610549578063c87b56dd14610569578063d12a4c981461058957600080fd5b80638da5cb5b116100e75780638da5cb5b146104b957806395d89b41146104d75780639d1b464a146104ec578063a22cb46514610501578063ae4229881461052157600080fd5b80636352211e146104515780636a6278421461047157806370a0823114610484578063715018a6146104a457600080fd5b80631d16d9a01161019b57806332cb6b0c1161016a57806332cb6b0c146103ce578063381679ae146103e457806341f43434146103f957806342842e0e1461041b57806352af43d11461043b57600080fd5b80631d16d9a01461033a5780631ee34fab1461034f57806323b872dd1461036f5780632a55205a1461038f57600080fd5b8063081812fc116101d7578063081812fc1461029f578063095ea7b3146102ed5780630c69a2741461030f57806318160ddd1461032457600080fd5b8063016f19a51461020957806301ffc9a71461023757806306fdde0314610267578063074a130d14610289575b600080fd5b34801561021557600080fd5b50610224662386f26fc1000081565b6040519081526020015b60405180910390f35b34801561024357600080fd5b50610257610252366004611e46565b61064a565b604051901515815260200161022e565b34801561027357600080fd5b5061027c6106ab565b60405161022e9190611e87565b34801561029557600080fd5b50610224600a5481565b3480156102ab57600080fd5b506102d56102ba366004611eba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022e565b3480156102f957600080fd5b5061030d610308366004611eea565b610739565b005b34801561031b57600080fd5b50610224610752565b34801561033057600080fd5b5061022460095481565b34801561034657600080fd5b5061030d61076c565b34801561035b57600080fd5b5061030d61036a366004611eba565b610817565b34801561037b57600080fd5b5061030d61038a366004611f14565b610869565b34801561039b57600080fd5b506103af6103aa366004611f50565b610894565b604080516001600160a01b03909316835260208301919091520161022e565b3480156103da57600080fd5b506102246108ae81565b3480156103f057600080fd5b50610257610940565b34801561040557600080fd5b506102d56daaeb6d7670e522a718067333cd4e81565b34801561042757600080fd5b5061030d610436366004611f14565b610a65565b34801561044757600080fd5b5061022461012c81565b34801561045d57600080fd5b506102d561046c366004611eba565b610a8a565b61022461047f366004611f72565b610ae1565b34801561049057600080fd5b5061022461049f366004611f72565b610aee565b3480156104b057600080fd5b5061030d610b51565b3480156104c557600080fd5b506008546001600160a01b03166102d5565b3480156104e357600080fd5b5061027c610b65565b3480156104f857600080fd5b50610224610b72565b34801561050d57600080fd5b5061030d61051c366004611f9b565b610b81565b61022461052f366004611f72565b610b95565b34801561054057600080fd5b50610257610ba8565b34801561055557600080fd5b5061030d610564366004611fd2565b610bc2565b34801561057557600080fd5b5061027c610584366004611eba565b610bf1565b34801561059557600080fd5b5061027c6105a4366004611eba565b610d84565b3480156105b557600080fd5b50610224606481565b3480156105ca57600080fd5b5061022467016345785d8a000081565b3480156105e657600080fd5b5061027c610df9565b3480156105fb57600080fd5b5061025761060a36600461206d565b600560209081526000928352604080842090915290825290205460ff1681565b34801561063657600080fd5b5061030d610645366004611f72565b610e88565b60006001600160e01b0319821663152a902d60e11b148061067b57506380ac58cd60e01b6001600160e01b03198316145b806106965750635b5e139f60e01b6001600160e01b03198316145b806106a557506106a582610f51565b92915050565b600080546106b8906120a0565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906120a0565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b8161074381610f86565b61074d838361103f565b505050565b6000610767600954610762610940565b611121565b905090565b60006107806008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146107ca576040519150601f19603f3d011682016040523d82523d6000602084013e6107cf565b606091505b50509050806108145760405162461bcd60e51b815260206004820152600c60248201526b31b0b636103330b4b632b21760a11b60448201526064015b60405180910390fd5b50565b61081f6111bb565b600a54156108645760405162461bcd60e51b815260206004820152601260248201527131b0b71037b7363c9039b2ba1037b731b29760711b604482015260640161080b565b600a55565b826001600160a01b03811633146108835761088333610f86565b61088e848484611215565b50505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109095750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610928906001600160601b0316876120f0565b610932919061211d565b915196919550909350505050565b60408051608081018252735078981549a1cc18673eb76fb47468f546aadc51815273ef1a89cbfabe59397ffda11fc5df293e9bc5db906020820152735af0d9827e0c53e4799bb226655a1de152a425a591810191909152735dce0bb0778694ef3ba79bb702b88cac1879cc7d6060820152600090815b6004811015610a605760008282600481106109d3576109d361213f565b60200201516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190612155565b1115610a505760019250505090565b610a598161216e565b90506109b6565b505090565b826001600160a01b0381163314610a7f57610a7f33610f86565b61088e8484846113dc565b6000818152600260205260409020546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161080b565b919050565b60006106a58260006114cf565b60006001600160a01b038216610b355760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161080b565b506001600160a01b031660009081526003602052604090205490565b610b596111bb565b610b63600061159f565b565b600180546106b8906120a0565b60006107676009546000611121565b81610b8b81610f86565b61074d83836115f1565b60006106a582610ba3610940565b6114cf565b600a546000908015801590610bbc57508042115b91505090565b846001600160a01b0381163314610bdc57610bdc33610f86565b610be9868686868661165d565b505050505050565b60606009548210610c335760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b546040516357e0286d60e11b8152600481018490526000916001600160a01b03169063afc050da90602401600060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca5919081019061219d565b905060018151038152610d5d610cba84611745565b600b54604051631a25499360e31b8152600481018790528491610d37916001600160a01b039091169063d12a4c98906024015b600060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d32919081019061219d565b6117d9565b604051602001610d499392919061224a565b6040516020818303038152906040526117d9565b604051602001610d6d9190612351565b604051602081830303815290604052915050919050565b60606009548210610dc65760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b54604051631a25499360e31b8152600481018490526106a5916001600160a01b03169063d12a4c9890602401610ced565b6060610e64610e2a610d327f00000000000000000000000028d2c3e75ecf20aeee222af60e91fddf0b01c1126117e7565b610e537f000000000000000000000000d64e3c25b0cc9afb535157cbb96eb601a47650fa611808565b604051602001610d49929190612396565b604051602001610e749190612351565b604051602081830303815290604052905090565b610e906111bb565b6001600160a01b038116610ef55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080b565b6108148161159f565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b038116610adc57604051632da4836960e21b815260040160405180910390fd5b60006001600160e01b0319821663152a902d60e11b14806106a557506301ffc9a760e01b6001600160e01b03198316146106a5565b6daaeb6d7670e522a718067333cd4e3b1561081457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110179190612504565b61081457604051633b79c77360e21b81526001600160a01b038216600482015260240161080b565b6000818152600260205260409020546001600160a01b03163381148061108857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6110c55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008082611130576001611133565b60025b60408051606081018252606480825261012c60208301526108ae9282019290925260ff92909216925085101561116e576000925050506106a5565b602081015185101561119a5781662386f26fc100008161119057611190612107565b04925050506106a5565b8167016345785d8a0000816111b1576111b1612107565b0495945050505050565b6008546001600160a01b03163314610b635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080b565b6000818152600260205260409020546001600160a01b0384811691161461126b5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161080b565b6001600160a01b0382166112b55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b336001600160a01b03841614806112ef57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061131057506000818152600460205260409020546001600160a01b031633145b61134d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e7838383610869565b6001600160a01b0382163b15806114905750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612521565b6001600160e01b031916145b61074d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b60006114d9610ba8565b806114ee57506008546001600160a01b031633145b61152f5760405162461bcd60e51b815260206004820152601260248201527110b83ab13634b1a6b4b73a20b1ba34bb329760711b604482015260640161080b565b600954600061153e8285611121565b90506000808211611550576001611561565b81348161155f5761155f612107565b045b905061156d818461181e565b60005b8181101561159057611588878580600101965061198c565b600101611570565b50505060098190559392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611668858585610869565b6001600160a01b0384163b15806116ff5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906116b09033908a9089908990899060040161253e565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190612521565b6001600160e01b031916145b61173e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b5050505050565b6060600061175283611a97565b600101905060008167ffffffffffffffff81111561177257611772612187565b6040519080825280601f01601f19166020018201604052801561179c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117a6575b509392505050565b60606106a582600080611b6f565b60606106a5826001611803816001600160a01b0384163b612592565b611c6a565b60606106a56001600160a01b0383166014611c8d565b6000821161187c5760405162461bcd60e51b815260206004820152602560248201527f6d73672e76616c7565206d757374206265206e202a2063757272656e7450726960448201526431b294149760d91b606482015260840161080b565b8181016108ae8111156118c65760405162461bcd60e51b815260206004820152601260248201527130b636103a37b5b2b7399036b4b73a32b21760711b604482015260640161080b565b826001036118d357505050565b604080516060810182526064815261012c60208201526108ae918101919091526000805b6003811015611949578281600381106119125761191261213f565b602002015184111583826003811061192c5761192c61213f565b60200201518610146119415760019150611949565b6001016118f7565b50801561173e5760405162461bcd60e51b815260206004820152601160248201527038ba3c9037baba1037b3103930b733b29760791b604482015260640161080b565b6001600160a01b0382166119d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b6000818152600260205260409020546001600160a01b031615611a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161080b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611ad65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b02576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b2057662386f26fc10000830492506010015b6305f5e1008310611b38576305f5e100830492506008015b6127108310611b4c57612710830492506004015b60648310611b5e576064830492506002015b600a83106106a55760010192915050565b6060835180156117d1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611bdf57601f01601f19166040526003830685611c5357603d811515830353603d6001821460011b830353505082526117d1565b600181148115150183038552505050509392505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b60606000611c9c8360026120f0565b611ca79060026125a5565b67ffffffffffffffff811115611cbf57611cbf612187565b6040519080825280601f01601f191660200182016040528015611ce9576020820181803683370190505b509050600360fc1b81600081518110611d0457611d0461213f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d3357611d3361213f565b60200101906001600160f81b031916908160001a9053506000611d578460026120f0565b611d629060016125a5565b90505b6001811115611dda576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d9657611d9661213f565b1a60f81b828281518110611dac57611dac61213f565b60200101906001600160f81b031916908160001a90535060049490941c93611dd3816125b8565b9050611d65565b508315611e295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080b565b9392505050565b6001600160e01b03198116811461081457600080fd5b600060208284031215611e5857600080fd5b8135611e2981611e30565b60005b83811015611e7e578181015183820152602001611e66565b50506000910152565b6020815260008251806020840152611ea6816040850160208701611e63565b601f01601f19169190910160400192915050565b600060208284031215611ecc57600080fd5b5035919050565b80356001600160a01b0381168114610adc57600080fd5b60008060408385031215611efd57600080fd5b611f0683611ed3565b946020939093013593505050565b600080600060608486031215611f2957600080fd5b611f3284611ed3565b9250611f4060208501611ed3565b9150604084013590509250925092565b60008060408385031215611f6357600080fd5b50508035926020909101359150565b600060208284031215611f8457600080fd5b611e2982611ed3565b801515811461081457600080fd5b60008060408385031215611fae57600080fd5b611fb783611ed3565b91506020830135611fc781611f8d565b809150509250929050565b600080600080600060808688031215611fea57600080fd5b611ff386611ed3565b945061200160208701611ed3565b935060408601359250606086013567ffffffffffffffff8082111561202557600080fd5b818801915088601f83011261203957600080fd5b81358181111561204857600080fd5b89602082850101111561205a57600080fd5b9699959850939650602001949392505050565b6000806040838503121561208057600080fd5b61208983611ed3565b915061209760208401611ed3565b90509250929050565b600181811c908216806120b457607f821691505b6020821081036120d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106a5576106a56120da565b634e487b7160e01b600052601260045260246000fd5b60008261213a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561216757600080fd5b5051919050565b600060018201612180576121806120da565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121af57600080fd5b815167ffffffffffffffff808211156121c757600080fd5b818401915084601f8301126121db57600080fd5b8151818111156121ed576121ed612187565b604051601f8201601f19908116603f0116810190838211818310171561221557612215612187565b8160405282815287602084870101111561222e57600080fd5b61223f836020830160208801611e63565b979650505050505050565b7203d913730b6b2911d1126b2b0ba25b4ba32b99606d1b81528351600090612279816013850160208901611e63565b7f222c20226465736372697074696f6e223a22746865206d6f73742065786f74696013918401918201526e6320696e2d636861696e207065747360881b603382015270222c202261747472696275746573223a5b60781b604282015284516122e8816053840160208901611e63565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b626053929091019182015265185cd94d8d0b60d21b60738201528351612335816079840160208801611e63565b61227d60f01b60799290910191820152607b0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161238981601d850160208701611e63565b91909101601d0192915050565b7f7b226e616d65223a20224d6561744b69746573222c202264657363726970746981527f6f6e223a2022546865206d6f73742065786f74696320706574732067656e657260208201527f6174656420656e746972656c792027696e2d636861696e272e206d6561746b6960408201527f7465732e78797a207c20747769747465722e636f6d2f6e6f5f7369646536363660608201526c1116101134b6b0b3b2911d101160991b60808201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608d8201526000835161247c8160a7850160208801611e63565b61088b60f21b60a7918401918201527f202273656c6c65725f6665655f62617369735f706f696e74733a223a2022353060a98201527518111610113332b2afb932b1b4b834b2b73a111d101160511b60c982015283516124e38160df840160208801611e63565b6124fa60df8284010161227d60f01b815260020190565b9695505050505050565b60006020828403121561251657600080fd5b8151611e2981611f8d565b60006020828403121561253357600080fd5b8151611e2981611e30565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156106a5576106a56120da565b808201808211156106a5576106a56120da565b6000816125c7576125c76120da565b50600019019056fea26469706673582212208780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd235815164736f6c63430008110033

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

000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000fb23c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000

-----Decoded View---------------
Arg [0] : renderer_ (address): 0xb7849A7C0793aE20026ACC1198d6532BBd5DAd7E
Arg [1] : bTokenImage (bytes): 0x3c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e

-----Encoded View---------------
129 Constructor Arguments found :
Arg [0] : 000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000fb2
Arg [3] : 3c7376672076657273696f6e3d22312e312220206261736550726f66696c653d
Arg [4] : 2266756c6c22202020202076696577426f783d22302030203130302031303022
Arg [5] : 2020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230
Arg [6] : 30302f7376672220202020203e3c7374796c653e202020202e7374616e646172
Arg [7] : 64416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475
Arg [8] : 726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d
Arg [9] : 696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e69
Arg [10] : 6d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e697465
Arg [11] : 3b202020207d20202020406b65796672616d65732073797374656d4d6f74696f
Arg [12] : 6e207b2020202020202020333325207b2020202020202020202020207472616e
Arg [13] : 73666f726d3a206d617472697828312c302c302c312c302c31293b2020202020
Arg [14] : 2020207d2020202020202020363625207b202020202020202020202020747261
Arg [15] : 6e73666f726d3a206d617472697828312c302c302c312c302c2d31293b202020
Arg [16] : 20202020207d202020207d20202020406b65796672616d657320636c6f756441
Arg [17] : 6e696d6174696f6e30207b202020202020202066726f6d207b20202020202020
Arg [18] : 20202020206f7061636974793a2030253b202020202020202020202020207472
Arg [19] : 616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20
Arg [20] : 202020202020207d2020202020202020203125207b2020202020202020202020
Arg [21] : 206f7061636974793a20313030253b202020202020202020202020207472616e
Arg [22] : 73666f726d3a206d617472697828312c302c302c312c39302c3130293b202020
Arg [23] : 20202020207d2020202020202020393925207b2020202020202020202020206f
Arg [24] : 7061636974793a20313030253b202020202020202020202020207472616e7366
Arg [25] : 6f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020
Arg [26] : 202020207d2020202020202020746f207b2020202020202020202020206f7061
Arg [27] : 636974793a2030253b202020202020202020202020207472616e73666f726d3a
Arg [28] : 206d617472697828312c302c302c312c2d39302c3130293b2020202020202020
Arg [29] : 7d202020207d20202020406b65796672616d657320636c6f7564416e696d6174
Arg [30] : 696f6e31207b202020202020202066726f6d207b202020202020202020202020
Arg [31] : 6f7061636974793a2030253b202020202020202020202020207472616e73666f
Arg [32] : 726d3a206d617472697828312c302c302c312c39302c2d3230293b2020202020
Arg [33] : 2020207d2020202020202020203125207b2020202020202020202020206f7061
Arg [34] : 636974793a20313030253b202020202020202020202020207472616e73666f72
Arg [35] : 6d3a206d617472697828312c302c302c312c39302c2d3230293b202020202020
Arg [36] : 20207d2020202020202020393925207b2020202020202020202020206f706163
Arg [37] : 6974793a20313030253b202020202020202020202020207472616e73666f726d
Arg [38] : 3a206d617472697828312c302c302c312c2d39302c2d3230293b202020202020
Arg [39] : 20207d2020202020202020746f207b2020202020202020202020206f70616369
Arg [40] : 74793a2030253b202020202020202020202020207472616e73666f726d3a206d
Arg [41] : 617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d
Arg [42] : 202020207d20202020406b65796672616d657320636c6f7564416e696d617469
Arg [43] : 6f6e32207b202020202020202066726f6d207b2020202020202020202020206f
Arg [44] : 7061636974793a2030253b202020202020202020202020207472616e73666f72
Arg [45] : 6d3a206d617472697828312c302c302c312c39302c3330293b20202020202020
Arg [46] : 207d2020202020202020203125207b2020202020202020202020206f70616369
Arg [47] : 74793a20313030253b202020202020202020202020207472616e73666f726d3a
Arg [48] : 206d617472697828312c302c302c312c39302c3330293b20202020202020207d
Arg [49] : 2020202020202020393925207b2020202020202020202020206f706163697479
Arg [50] : 3a20313030253b202020202020202020202020207472616e73666f726d3a206d
Arg [51] : 617472697828312c302c302c312c2d39302c3330293b20202020202020207d20
Arg [52] : 20202020202020746f207b2020202020202020202020206f7061636974793a20
Arg [53] : 30253b202020202020202020202020207472616e73666f726d3a206d61747269
Arg [54] : 7828312c302c302c312c2d39302c3330293b20202020202020207d202020207d
Arg [55] : 202020202e737461727473496e76697369626c65207b6f7061636974793a2030
Arg [56] : 253b20202020207d2020202020202020202e636c6f75644d617373207b202020
Arg [57] : 202020202066696c6c3a2077686974653b20202020207d202020202020202020
Arg [58] : 2e636c6f7564416363656e74207b202020202020202066696c6c3a2023383743
Arg [59] : 4546413b20202020207d2020202023636c6f756430207b202020202020202061
Arg [60] : 6e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f
Arg [61] : 6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e
Arg [62] : 616d653a20636c6f7564416e696d6174696f6e303b202020207d202020202363
Arg [63] : 6c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f
Arg [64] : 6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020
Arg [65] : 202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d61
Arg [66] : 74696f6e313b202020207d2020202023636c6f756432207b2020202020202020
Arg [67] : 616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d617469
Arg [68] : 6f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d
Arg [69] : 6e616d653a20636c6f7564416e696d6174696f6e323b202020207d2020202023
Arg [70] : 73797374656d207b2020202020202020616e696d6174696f6e2d647572617469
Arg [71] : 6f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073
Arg [72] : 797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069
Arg [73] : 643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d
Arg [74] : 22234646464646462220643d224d3020304831303056313030483056305a2220
Arg [75] : 2f3e3c706174682069643d22626c7565736b792220636c6173733d2222206669
Arg [76] : 6c6c3d22233837434546412220643d224d302030483130305631303048305630
Arg [77] : 5a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64
Arg [78] : 617264416e696d6174696f6e20737461727473496e76697369626c6522206669
Arg [79] : 6c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c61
Arg [80] : 73733d22636c6f75644d617373222066696c6c3d222220643d224d3136203530
Arg [81] : 5635354832365635364834305635354835325635364836345635344837385635
Arg [82] : 3548383756353448393356343448383956343048383256333548363456333648
Arg [83] : 3538563431483532563433483531563338483439563335483432563333483330
Arg [84] : 5633354832345634314832305635304831365a22202f3e3c706174682069643d
Arg [85] : 22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e
Arg [86] : 74222066696c6c3d222220643d224d3336203338563430483430563434483433
Arg [87] : 5633384833365a4d37312034305634324837355634344837375634304837315a
Arg [88] : 4d35362034395635314837315634394835365a4d323320343856353048333556
Arg [89] : 34384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c61
Arg [90] : 73733d227374616e64617264416e696d6174696f6e20737461727473496e7669
Arg [91] : 7369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d
Arg [92] : 617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220
Arg [93] : 643d224d34312033335633354832385633394831365634344831325635334831
Arg [94] : 3656353748323856363048343056363148353556363048363556353748373356
Arg [95] : 35344838315634354837335634314836355633384835355633334834315a2220
Arg [96] : 2f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d
Arg [97] : 22636c6f7564416363656e74222066696c6c3d222220643d224d343620353256
Arg [98] : 35354835395635314835375635324834365a22202f3e3c2f673e3c672069643d
Arg [99] : 22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f
Arg [100] : 6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174
Arg [101] : 682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d61
Arg [102] : 7373222066696c6c3d222220643d224d31362035305635354832365635364834
Arg [103] : 3056353548353256353648363456353448373856353548383756353448393356
Arg [104] : 3434483839563430483832563335483634563336483538563431483532563433
Arg [105] : 4835315633384834395633354834325633334833305633354832345634314832
Arg [106] : 305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e
Arg [107] : 74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220
Arg [108] : 643d224d33362033385634304834305634344834335633384833365a4d373120
Arg [109] : 34305634324837355634344837375634304837315a4d35362034395635314837
Arg [110] : 315634394835365a4d32332034385635304833355634384832335a22202f3e3c
Arg [111] : 2f673e3c672069643d2273797374656d2220636c6173733d227374616e646172
Arg [112] : 64416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d2274
Arg [113] : 69746c6554657874222066696c6c3d22626c61636b2220643d224d3131203337
Arg [114] : 5635304831325633384831335634304831345634324831365634304831375633
Arg [115] : 3848313856353048323156333748313756333848313656343048313456333848
Arg [116] : 31335633374831315a204d323320333748323956333848323456343348323956
Arg [117] : 34344832355634394832395635304832335633374d3333203337563434483331
Arg [118] : 5635304833345634344833385635304833395633374833345633384833385634
Arg [119] : 334833345633374833335a4d3431203337483439563338483437563530483434
Arg [120] : 5633384834315633375a4d353120333748353256343248353356343148353456
Arg [121] : 3430483535563339483536563338483537563337483630563338483538563339
Arg [122] : 4835375634304835365634314835355634334836305635304835375634344835
Arg [123] : 335635304835315633375a4d3633203337563434483631563530483634563337
Arg [124] : 4836335a4d363520333756333848363856353048373156333848373456333748
Arg [125] : 36355a4d37352033375635304838325634394837385634344838325634334837
Arg [126] : 375633384838325633374837355a4d3834203337563434483839563439483836
Arg [127] : 5634364838345635304839305634334838355633384838395634304839305633
Arg [128] : 374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000


Deployed Bytecode Sourcemap

62475:6017:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62764:49;;;;;;;;;;;;62803:10;62764:49;;;;;160:25:1;;;148:2;133:18;62764:49:0;;;;;;;;65759:398;;;;;;;;;;-1:-1:-1;65759:398:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;65759:398:0;582:187:1;49250:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;62877:29::-;;;;;;;;;;;;;;;;50223:46;;;;;;;;;;-1:-1:-1;50223:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;50223:46:0;;;;;;-1:-1:-1;;;;;1779:32:1;;;1761:51;;1749:2;1734:18;50223:46:0;1615:203:1;61530:157:0;;;;;;;;;;-1:-1:-1;61530:157:0;;;;;:::i;:::-;;:::i;:::-;;63799:208;;;;;;;;;;;;;:::i;62551:26::-;;;;;;;;;;;;;;;;48241:154;;;;;;;;;;;;;:::i;66195:191::-;;;;;;;;;;-1:-1:-1;66195:191:0;;;;;:::i;:::-;;:::i;61695:163::-;;;;;;;;;;-1:-1:-1;61695:163:0;;;;;:::i;:::-;;:::i;29525:442::-;;;;;;;;;;-1:-1:-1;29525:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3038:32:1;;;3020:51;;3102:2;3087:18;;3080:34;;;;2993:18;29525:442:0;2846:274:1;62699:41:0;;;;;;;;;;;;62736:4;62699:41;;64015:690;;;;;;;;;;;;;:::i;58663:143::-;;;;;;;;;;;;58763:42;58663:143;;61866:171;;;;;;;;;;-1:-1:-1;61866:171:0;;;;;:::i;:::-;;:::i;62644:48::-;;;;;;;;;;;;62689:3;62644:48;;49692:151;;;;;;;;;;-1:-1:-1;49692:151:0;;;;;:::i;:::-;;:::i;63138:134::-;;;;;;:::i;:::-;;:::i;49851:172::-;;;;;;;;;;-1:-1:-1;49851:172:0;;;;;:::i;:::-;;:::i;25408:103::-;;;;;;;;;;;;;:::i;24760:87::-;;;;;;;;;;-1:-1:-1;24833:6:0;;-1:-1:-1;;;;;24833:6:0;24760:87;;49277:20;;;;;;;;;;;;;:::i;63649:142::-;;;;;;;;;;;;;:::i;61346:176::-;;;;;;;;;;-1:-1:-1;61346:176:0;;;;;:::i;:::-;;:::i;63280:161::-;;;;;;:::i;:::-;;:::i;63449:192::-;;;;;;;;;;;;;:::i;62045:230::-;;;;;;;;;;-1:-1:-1;62045:230:0;;;;;:::i;:::-;;:::i;64719:802::-;;;;;;;;;;-1:-1:-1;64719:802:0;;;;;:::i;:::-;;:::i;65529:222::-;;;;;;;;;;-1:-1:-1;65529:222:0;;;;;:::i;:::-;;:::i;62598:39::-;;;;;;;;;;;;62634:3;62598:39;;62820:48;;;;;;;;;;;;62859:9;62820:48;;47491:742;;;;;;;;;;;;;:::i;50278:68::-;;;;;;;;;;-1:-1:-1;50278:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:201;;;;;;;;;;-1:-1:-1;25666:201:0;;;;;:::i;:::-;;:::i;65759:398::-;65861:4;-1:-1:-1;;;;;;65885:41:0;;-1:-1:-1;;;65885:41:0;;:87;;-1:-1:-1;;;;;;;;;;65947:25:0;;;65885:87;:166;;;-1:-1:-1;;;;;;;;;;66026:25:0;;;65885:166;:264;;;;66113:36;66137:11;66113:23;:36::i;:::-;65878:271;65759:398;-1:-1:-1;;65759:398:0:o;49250:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61530:157::-;61626:8;60184:30;60205:8;60184:20;:30::i;:::-;61647:32:::1;61661:8;61671:7;61647:13;:32::i;:::-;61530:157:::0;;;:::o;63799:208::-;63855:7;63882:117;63931:11;;63976:21;:19;:21::i;:::-;63882:13;:117::i;:::-;63875:124;;63799:208;:::o;48241:154::-;48281:12;48298:7;24833:6;;-1:-1:-1;;;;;24833:6:0;;24760:87;48298:7;-1:-1:-1;;;;;48298:12:0;48318:21;48298:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48280:64;;;48363:7;48355:32;;;;-1:-1:-1;;;48355:32:0;;5874:2:1;48355:32:0;;;5856:21:1;5913:2;5893:18;;;5886:30;-1:-1:-1;;;5932:18:1;;;5925:42;5984:18;;48355:32:0;;;;;;;;;48269:126;48241:154::o;66195:191::-;24646:13;:11;:13::i;:::-;66293:14:::1;::::0;:19;66285:50:::1;;;::::0;-1:-1:-1;;;66285:50:0;;6215:2:1;66285:50:0::1;::::0;::::1;6197:21:1::0;6254:2;6234:18;;;6227:30;-1:-1:-1;;;6273:18:1;;;6266:48;6331:18;;66285:50:0::1;6013:342:1::0;66285:50:0::1;66346:14;:32:::0;66195:191::o;61695:163::-;61796:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;61813:37:::1;61832:4;61838:2;61842:7;61813:18;:37::i;:::-;61695:163:::0;;;;:::o;29525:442::-;29622:7;29680:27;;;:17;:27;;;;;;;;29651:56;;;;;;;;;-1:-1:-1;;;;;29651:56:0;;;;;-1:-1:-1;;;29651:56:0;;;-1:-1:-1;;;;;29651:56:0;;;;;;;;29622:7;;29720:92;;-1:-1:-1;29771:29:0;;;;;;;;;29781:19;29771:29;-1:-1:-1;;;;;29771:29:0;;;;-1:-1:-1;;;29771:29:0;;-1:-1:-1;;;;;29771:29:0;;;;;29720:92;29862:23;;;;29824:21;;30333:5;;29849:36;;-1:-1:-1;;;;;29849:36:0;:10;:36;:::i;:::-;29848:58;;;;:::i;:::-;29927:16;;;;;-1:-1:-1;29525:442:0;;-1:-1:-1;;;;29525:442:0:o;64015:690::-;64095:379;;;;;;;;64155:42;64095:379;;64246:42;64095:379;;;;64337:42;64095:379;;;;;;;64429:42;64095:379;;;;64066:16;;;64499:191;64519:15;64515:1;:19;64499:191;;;64598:1;64561:8;64570:1;64561:11;;;;;;;:::i;:::-;;;;;64560:35;;-1:-1:-1;;;64560:35:0;;64584:10;64560:35;;;1761:51:1;-1:-1:-1;;;;;64560:23:0;;;;;;1734:18:1;;64560:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;64556:122;;;64634:4;64620:18;;64499:191;64084:621;64015:690;:::o;64556:122::-;64536:3;;;:::i;:::-;;;64499:191;;;;64084:621;64015:690;:::o;61866:171::-;61971:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;61988:41:::1;62011:4;62017:2;62021:7;61988:22;:41::i;49692:151::-:0;49750:13;49793:12;;;:8;:12;;;;;;-1:-1:-1;;;;;49793:12:0;;49776:59;;;;-1:-1:-1;;;49776:59:0;;7682:2:1;49776:59:0;;;7664:21:1;7721:2;7701:18;;;7694:30;-1:-1:-1;;;7740:18:1;;;7733:40;7790:18;;49776:59:0;7480:334:1;49776:59:0;49692:151;;;:::o;63138:134::-;63189:19;63228:36;63241:2;63257:5;63228:7;:36::i;49851:172::-;49914:7;-1:-1:-1;;;;;49942:19:0;;49934:44;;;;-1:-1:-1;;;49934:44:0;;8021:2:1;49934:44:0;;;8003:21:1;8060:2;8040:18;;;8033:30;-1:-1:-1;;;8079:18:1;;;8072:42;8131:18;;49934:44:0;7819:336:1;49934:44:0;-1:-1:-1;;;;;;49998:17:0;;;;;:10;:17;;;;;;;49851:172::o;25408:103::-;24646:13;:11;:13::i;:::-;25473:30:::1;25500:1;25473:18;:30::i;:::-;25408:103::o:0;49277:20::-;;;;;;;:::i;63649:142::-;63695:7;63722:61;63751:11;;63776:5;63722:13;:61::i;61346:176::-;61450:8;60184:30;60205:8;60184:20;:30::i;:::-;61471:43:::1;61495:8;61505;61471:23;:43::i;63280:161::-:0;63341:19;63380:52;63393:2;63409:21;:19;:21::i;:::-;63380:7;:52::i;63449:192::-;63540:14;;63497:4;;63573:20;;;;;63572:61;;;63617:15;63599;:33;63572:61;63565:68;;;63449:192;:::o;62045:230::-;62198:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;62220:47:::1;62243:4;62249:2;62253:7;62262:4;;62220:22;:47::i;:::-;62045:230:::0;;;;;;:::o;64719:802::-;64783:13;64829:11;;64819:7;:21;64811:46;;;;-1:-1:-1;;;64811:46:0;;8362:2:1;64811:46:0;;;8344:21:1;8401:2;8381:18;;;8374:30;-1:-1:-1;;;8420:18:1;;;8413:42;8472:18;;64811:46:0;8160:336:1;64811:46:0;64895:9;;:35;;-1:-1:-1;;;64895:35:0;;;;;160:25:1;;;64868:24:0;;-1:-1:-1;;;;;64895:9:0;;:26;;133:18:1;;64895:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64895:35:0;;;;;;;;;;;;:::i;:::-;64868:62;;65028:1;65015:10;65009:17;65005:25;64993:10;64986:45;65142:369;65213:25;65230:7;65213:16;:25::i;:::-;65449:9;;:28;;-1:-1:-1;;;65449:28:0;;;;;160:25:1;;;65345:10:0;;65429:50;;-1:-1:-1;;;;;65449:9:0;;;;:19;;133:18:1;;65449:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65449:28:0;;;;;;;;;;;;:::i;:::-;65429:13;:50::i;:::-;65156:354;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65142:13;:369::i;:::-;65068:444;;;;;;;;:::i;:::-;;;;;;;;;;;;;65054:459;;;64719:802;;;:::o;65529:222::-;65595:13;65639:11;;65629:7;:21;65621:46;;;;-1:-1:-1;;;65621:46:0;;8362:2:1;65621:46:0;;;8344:21:1;8401:2;8381:18;;;8374:30;-1:-1:-1;;;8420:18:1;;;8413:42;8472:18;;65621:46:0;8160:336:1;65621:46:0;65712:9;;:28;;-1:-1:-1;;;65712:28:0;;;;;160:25:1;;;65692:50:0;;-1:-1:-1;;;;;65712:9:0;;:19;;133:18:1;;65712:28:0;14:177:1;47491:742:0;47534:13;47664:559;47984:43;47998:28;48011:14;47998:12;:28::i;47984:43::-;48177:37;48197:16;48177:19;:37::i;:::-;47678:544;;;;;;;;;:::i;47664:559::-;47574:650;;;;;;;;:::i;:::-;;;;;;;;;;;;;47560:665;;47491:742;:::o;25666:201::-;24646:13;:11;:13::i;:::-;-1:-1:-1;;;;;25755:22:0;::::1;25747:73;;;::::0;-1:-1:-1;;;25747:73:0;;13785:2:1;25747:73:0::1;::::0;::::1;13767:21:1::0;13824:2;13804:18;;;13797:30;13863:34;13843:18;;;13836:62;-1:-1:-1;;;13914:18:1;;;13907:36;13960:19;;25747:73:0::1;13583:402:1::0;25747:73:0::1;25831:28;25850:8;25831:18;:28::i;18240:2436::-:0;18292:15;18447:4;18441:11;18589:1;18569:18;18565:26;20191:8;20187:2;20183:17;20136:24;20111:174;20088:4;20063:237;20438:2;20428:8;20424:17;20419:2;20413:4;20409:13;20406:1;20399:43;20526:32;;;-1:-1:-1;20388:54:0;-1:-1:-1;;;;;;20585:21:0;;20581:88;;20630:27;;-1:-1:-1;;;20630:27:0;;;;;;;;;;;29255:215;29357:4;-1:-1:-1;;;;;;29381:41:0;;-1:-1:-1;;;29381:41:0;;:81;;-1:-1:-1;;;;;;;;;;27986:40:0;;;29426:36;27877:157;60242:419;58763:42;60433:45;:49;60429:225;;60504:67;;-1:-1:-1;;;60504:67:0;;60555:4;60504:67;;;14202:34:1;-1:-1:-1;;;;;14272:15:1;;14252:18;;;14245:43;58763:42:0;;60504;;14137:18:1;;60504:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60499:144;;60599:28;;-1:-1:-1;;;60599:28:0;;-1:-1:-1;;;;;1779:32:1;;60599:28:0;;;1761:51:1;1734:18;;60599:28:0;1615:203:1;50849:290:0;50921:13;50937:12;;;:8;:12;;;;;;-1:-1:-1;;;;;50937:12:0;50970:10;:19;;;:58;;-1:-1:-1;;;;;;50993:23:0;;;;;;:16;:23;;;;;;;;51017:10;50993:35;;;;;;;;;;50970:58;50962:85;;;;-1:-1:-1;;;50962:85:0;;14751:2:1;50962:85:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:44;14863:18;;50962:85:0;14549:338:1;50962:85:0;51060:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;51060:25:0;-1:-1:-1;;;;;51060:25:0;;;;;;;;;51103:28;;51060:15;;51103:28;;;;;;;50910:229;50849:290;;:::o;67116:495::-;67199:7;67238:15;67257:10;67256:20;;67275:1;67256:20;;;67271:1;67256:20;67287:75;;;;;;;;62634:3;67287:75;;;62689:3;67287:75;;;;62736:4;67287:75;;;;;;;67238:38;;;;;;-1:-1:-1;67377:29:0;;67373:176;;;67430:1;67423:8;;;;;;67373:176;67477:14;;;;67462:29;;67458:91;;;67530:7;62803:10;67515:22;;;;;:::i;:::-;;67508:29;;;;;;67458:91;67581:7;62859:9;67566:22;;;;;:::i;:::-;;;67116:495;-1:-1:-1;;;;;67116:495:0:o;24925:132::-;24833:6;;-1:-1:-1;;;;;24833:6:0;23549:10;24989:23;24981:68;;;;-1:-1:-1;;;24981:68:0;;15094:2:1;24981:68:0;;;15076:21:1;;;15113:18;;;15106:30;15172:34;15152:18;;;15145:62;15224:18;;24981:68:0;14892:356:1;51362:768:0;51498:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;51490:20:0;;;51498:12;;51490:20;51482:43;;;;-1:-1:-1;;;51482:43:0;;15455:2:1;51482:43:0;;;15437:21:1;15494:2;15474:18;;;15467:30;-1:-1:-1;;;15513:18:1;;;15506:40;15563:18;;51482:43:0;15253:334:1;51482:43:0;-1:-1:-1;;;;;51546:16:0;;51538:46;;;;-1:-1:-1;;;51538:46:0;;15794:2:1;51538:46:0;;;15776:21:1;15833:2;15813:18;;;15806:30;-1:-1:-1;;;15852:18:1;;;15845:47;15909:18;;51538:46:0;15592:341:1;51538:46:0;51619:10;-1:-1:-1;;;;;51619:18:0;;;;:56;;-1:-1:-1;;;;;;51641:22:0;;;;;;:16;:22;;;;;;;;51664:10;51641:34;;;;;;;;;;51619:56;:89;;;-1:-1:-1;51693:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;51693:15:0;51679:10;:29;51619:89;51597:153;;;;-1:-1:-1;;;51597:153:0;;14751:2:1;51597:153:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:44;14863:18;;51597:153:0;14549:338:1;51597:153:0;-1:-1:-1;;;;;51955:16:0;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;51955:18:0;;;51990:14;;;;;;;;;:16;;51955:18;51990:16;;;52030:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;52030:17:0;;;;;;;;52067:11;:15;;;;;;52060:22;;;;;;;;52100;;52039:2;;51990:14;51955:16;52100:22;;;51362:768;;;:::o;52138:409::-;52262:26;52275:4;52281:2;52285;52262:12;:26::i;:::-;-1:-1:-1;;;;;52323:14:0;;;:19;;:172;;-1:-1:-1;52363:66:0;;-1:-1:-1;;;52363:66:0;;;52404:10;52363:66;;;16243:34:1;-1:-1:-1;;;;;16313:15:1;;;16293:18;;;16286:43;16345:18;;;16338:34;;;16408:3;16388:18;;;16381:31;-1:-1:-1;16428:19:1;;;16421:30;52450:45:0;;52363:40;;;;52450:45;;16468:19:1;;52363:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52363:132:0;;52323:172;52301:238;;;;-1:-1:-1;;;52301:238:0;;16954:2:1;52301:238:0;;;16936:21:1;16993:2;16973:18;;;16966:30;-1:-1:-1;;;17012:18:1;;;17005:46;17068:18;;52301:238:0;16752:340:1;66429:679:0;66491:19;66531:18;:16;:18::i;:::-;:43;;;-1:-1:-1;24833:6:0;;-1:-1:-1;;;;;24833:6:0;66553:10;:21;66531:43;66523:74;;;;-1:-1:-1;;;66523:74:0;;17299:2:1;66523:74:0;;;17281:21:1;17338:2;17318:18;;;17311:30;-1:-1:-1;;;17357:18:1;;;17350:48;17415:18;;66523:74:0;17097:342:1;66523:74:0;66626:11;;66608:15;66672:62;66626:11;66722:10;66672:13;:62::i;:::-;66648:86;;66765:11;66796:1;66780:13;:17;66779:51;;66829:1;66779:51;;;66813:13;66801:9;:25;;;;;:::i;:::-;;66779:51;66765:65;;66887:23;66897:3;66902:7;66887:9;:23::i;:::-;66926:9;66921:78;66941:3;66937:1;:7;66921:78;;;66966:20;66972:2;66976:9;;;;;;66966:5;:20::i;:::-;66946:3;;66921:78;;;-1:-1:-1;;;67041:11:0;:25;;;67023:7;66429:679;-1:-1:-1;;;66429:679:0:o;26027:191::-;26120:6;;;-1:-1:-1;;;;;26137:17:0;;;-1:-1:-1;;;;;;26137:17:0;;;;;;;26170:40;;26120:6;;;26137:17;26120:6;;26170:40;;26101:16;;26170:40;26090:128;26027:191;:::o;51147:207::-;51250:10;51233:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;51233:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;51233:49:0;;;;;;;;;;51300:46;;722:41:1;;;51233:38:0;;51250:10;51300:46;;695:18:1;51300:46:0;;;;;;;51147:207;;:::o;52555:441::-;52709:26;52722:4;52728:2;52732;52709:12;:26::i;:::-;-1:-1:-1;;;;;52770:14:0;;;:19;;:174;;-1:-1:-1;52810:68:0;;-1:-1:-1;;;52810:68:0;;;52899:45;-1:-1:-1;;;;;52810:40:0;;;52899:45;;52810:68;;52851:10;;52863:4;;52869:2;;52873:4;;;;52810:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52810:134:0;;52770:174;52748:240;;;;-1:-1:-1;;;52748:240:0;;16954:2:1;52748:240:0;;;16936:21:1;16993:2;16973:18;;;16966:30;-1:-1:-1;;;17012:18:1;;;17005:46;17068:18;;52748:240:0;16752:340:1;52748:240:0;52555:441;;;;;:::o;45157:716::-;45213:13;45264:14;45281:17;45292:5;45281:10;:17::i;:::-;45301:1;45281:21;45264:38;;45317:20;45351:6;45340:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45340:18:0;-1:-1:-1;45317:41:0;-1:-1:-1;45482:28:0;;;45498:2;45482:28;45539:288;-1:-1:-1;;45571:5:0;-1:-1:-1;;;45708:2:0;45697:14;;45692:30;45571:5;45679:44;45769:2;45760:11;;;-1:-1:-1;45790:21:0;45539:288;45790:21;45539:288;-1:-1:-1;45848:6:0;45157:716;-1:-1:-1;;;45157:716:0:o;7762:134::-;7820:20;7862:26;7869:4;7875:5;7882;7862:6;:26::i;20869:163::-;20923:12;20955:69;20968:7;18044:1;20990:33;18044:1;-1:-1:-1;;;;;20990:19:0;;;:33;:::i;:::-;20955:12;:69::i;46893:151::-;46951:13;46984:52;-1:-1:-1;;;;;46996:22:0;;45048:2;46984:11;:52::i;67619:870::-;67725:1;67712:10;:14;67704:64;;;;-1:-1:-1;;;67704:64:0;;18446:2:1;67704:64:0;;;18428:21:1;18485:2;18465:18;;;18458:30;18524:34;18504:18;;;18497:62;-1:-1:-1;;;18575:18:1;;;18568:35;18620:19;;67704:64:0;18244:401:1;67704:64:0;67872:25;;;62736:4;67972:17;;;67964:48;;;;-1:-1:-1;;;67964:48:0;;18852:2:1;67964:48:0;;;18834:21:1;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:48;18968:18;;67964:48:0;18650:342:1;67964:48:0;68027:10;68041:1;68027:15;68023:28;;68044:7;67619:870;;:::o;68023:28::-;68062:75;;;;;;;;62634:3;68062:75;;62689:3;68062:75;;;;62736:4;68062:75;;;;;;;:29;;68184:221;68204:18;68200:1;:22;68184:221;;;68291:11;68303:1;68291:14;;;;;;;:::i;:::-;;;;;68284:21;;;68264:11;68276:1;68264:14;;;;;;;:::i;:::-;;;;;68249:29;;68248:58;68244:150;;68350:4;68327:27;;68373:5;;68244:150;68224:3;;68184:221;;;;68424:20;68423:21;68415:51;;;;-1:-1:-1;;;68415:51:0;;19199:2:1;68415:51:0;;;19181:21:1;19238:2;19218:18;;;19211:30;-1:-1:-1;;;19257:18:1;;;19250:47;19314:18;;68415:51:0;18997:341:1;53730:384:0;-1:-1:-1;;;;;53805:16:0;;53797:46;;;;-1:-1:-1;;;53797:46:0;;15794:2:1;53797:46:0;;;15776:21:1;15833:2;15813:18;;;15806:30;-1:-1:-1;;;15852:18:1;;;15845:47;15909:18;;53797:46:0;15592:341:1;53797:46:0;53888:1;53864:12;;;:8;:12;;;;;;-1:-1:-1;;;;;53864:12:0;:26;53856:53;;;;-1:-1:-1;;;53856:53:0;;19545:2:1;53856:53:0;;;19527:21:1;19584:2;19564:18;;;19557:30;-1:-1:-1;;;19603:18:1;;;19596:44;19657:18;;53856:53:0;19343:338:1;53856:53:0;-1:-1:-1;;;;;54003:14:0;;;;;;:10;:14;;;;;;;;:16;;;;;;54043:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;54043:17:0;;;;;54078:28;54052:2;;54003:14;;54078:28;;54003:14;;54078:28;53730:384;;:::o;42179:922::-;42232:7;;-1:-1:-1;;;42310:15:0;;42306:102;;-1:-1:-1;;;42346:15:0;;;-1:-1:-1;42390:2:0;42380:12;42306:102;42435:6;42426:5;:15;42422:102;;42471:6;42462:15;;;-1:-1:-1;42506:2:0;42496:12;42422:102;42551:6;42542:5;:15;42538:102;;42587:6;42578:15;;;-1:-1:-1;42622:2:0;42612:12;42538:102;42667:5;42658;:14;42654:99;;42702:5;42693:14;;;-1:-1:-1;42736:1:0;42726:11;42654:99;42780:5;42771;:14;42767:99;;42815:5;42806:14;;;-1:-1:-1;42849:1:0;42839:11;42767:99;42893:5;42884;:14;42880:99;;42928:5;42919:14;;;-1:-1:-1;42962:1:0;42952:11;42880:99;43006:5;42997;:14;42993:66;;43042:1;43032:11;43087:6;42179:922;-1:-1:-1;;42179:922:0:o;4693:2930::-;4809:20;4945:4;4939:11;4953:10;4915:2690;;;5159:1;5155;5143:10;5139:18;5135:26;5132:1;5128:34;5273:4;5267:11;5257:21;;5652:34;5646:4;5639:48;5780:6;5769:8;5762:16;5758:29;5722:34;5718:70;5712:4;5705:84;5898:4;5890:6;5886:17;5941:13;5936:3;5932:23;6034:624;6087:1;6081:4;6077:12;6069:20;;6150:4;6144:11;6295:4;6287:5;6283:2;6279:14;6275:25;6269:32;6264:3;6256:46;6371:4;6363:5;6359:2;6355:14;6351:25;6345:32;6341:1;6336:3;6332:11;6324:54;6446:4;6438:5;6435:1;6431:13;6427:24;6421:31;6417:1;6412:3;6408:11;6400:53;6513:4;6506:5;6502:16;6496:23;6492:1;6487:3;6483:11;6475:45;;6560:1;6555:3;6551:11;6544:18;;6624:3;6619;6616:12;6034:624;6606:33;6901:2;6883:12;-1:-1:-1;;6879:26:0;6873:4;6866:40;6951:1;6935:18;;6983:9;6973:456;;7143:4;7137:1;7130:9;7123:17;7118:3;7114:27;7106:42;7238:4;7232:1;7229;7226:8;7223:1;7219:16;7214:3;7210:26;7202:41;-1:-1:-1;;7354:29:0;;7405:5;;6973:456;7562:1;7559;7556:8;7551:1;7544:9;7537:17;7533:32;7518:13;7514:52;7506:6;7499:68;;;;4919:33;4693:2930;;;;;:::o;21810:984::-;22053:4;22047:11;;22483:2;22473:13;;-1:-1:-1;;22469:27:0;22459:38;;22446:52;;;22600:18;;;22477:4;22764:5;22759:2;22749:13;;22740:7;22728:48;21810:984;;;;;:::o;46289:447::-;46364:13;46390:19;46422:10;46426:6;46422:1;:10;:::i;:::-;:14;;46435:1;46422:14;:::i;:::-;46412:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46412:25:0;;46390:47;;-1:-1:-1;;;46448:6:0;46455:1;46448:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;46448:15:0;;;;;;;;;-1:-1:-1;;;46474:6:0;46481:1;46474:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;46474:15:0;;;;;;;;-1:-1:-1;46505:9:0;46517:10;46521:6;46517:1;:10;:::i;:::-;:14;;46530:1;46517:14;:::i;:::-;46505:26;;46500:131;46537:1;46533;:5;46500:131;;;-1:-1:-1;;;46581:5:0;46589:3;46581:11;46572:21;;;;;;;:::i;:::-;;;;46560:6;46567:1;46560:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;46560:33:0;;;;;;;;-1:-1:-1;46618:1:0;46608:11;;;;;46540:3;;;:::i;:::-;;;46500:131;;;-1:-1:-1;46649:10:0;;46641:55;;;;-1:-1:-1;;;46641:55:0;;20159:2:1;46641:55:0;;;20141:21:1;;;20178:18;;;20171:30;20237:34;20217:18;;;20210:62;20289:18;;46641:55:0;19957:356:1;46641:55:0;46721:6;46289:447;-1:-1:-1;;;46289:447:0:o;196:131:1:-;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:1;998:16;;991:27;774:250::o;1029:396::-;1178:2;1167:9;1160:21;1141:4;1210:6;1204:13;1253:6;1248:2;1237:9;1233:18;1226:34;1269:79;1341:6;1336:2;1325:9;1321:18;1316:2;1308:6;1304:15;1269:79;:::i;:::-;1409:2;1388:15;-1:-1:-1;;1384:29:1;1369:45;;;;1416:2;1365:54;;1029:396;-1:-1:-1;;1029:396:1:o;1430:180::-;1489:6;1542:2;1530:9;1521:7;1517:23;1513:32;1510:52;;;1558:1;1555;1548:12;1510:52;-1:-1:-1;1581:23:1;;1430:180;-1:-1:-1;1430:180:1:o;1823:173::-;1891:20;;-1:-1:-1;;;;;1940:31:1;;1930:42;;1920:70;;1986:1;1983;1976:12;2001:254;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:52;;;2146:1;2143;2136:12;2098:52;2169:29;2188:9;2169:29;:::i;:::-;2159:39;2245:2;2230:18;;;;2217:32;;-1:-1:-1;;;2001:254:1:o;2260:328::-;2337:6;2345;2353;2406:2;2394:9;2385:7;2381:23;2377:32;2374:52;;;2422:1;2419;2412:12;2374:52;2445:29;2464:9;2445:29;:::i;:::-;2435:39;;2493:38;2527:2;2516:9;2512:18;2493:38;:::i;:::-;2483:48;;2578:2;2567:9;2563:18;2550:32;2540:42;;2260:328;;;;;:::o;2593:248::-;2661:6;2669;2722:2;2710:9;2701:7;2697:23;2693:32;2690:52;;;2738:1;2735;2728:12;2690:52;-1:-1:-1;;2761:23:1;;;2831:2;2816:18;;;2803:32;;-1:-1:-1;2593:248:1:o;3365:186::-;3424:6;3477:2;3465:9;3456:7;3452:23;3448:32;3445:52;;;3493:1;3490;3483:12;3445:52;3516:29;3535:9;3516:29;:::i;3556:118::-;3642:5;3635:13;3628:21;3621:5;3618:32;3608:60;;3664:1;3661;3654:12;3679:315;3744:6;3752;3805:2;3793:9;3784:7;3780:23;3776:32;3773:52;;;3821:1;3818;3811:12;3773:52;3844:29;3863:9;3844:29;:::i;:::-;3834:39;;3923:2;3912:9;3908:18;3895:32;3936:28;3958:5;3936:28;:::i;:::-;3983:5;3973:15;;;3679:315;;;;;:::o;3999:808::-;4096:6;4104;4112;4120;4128;4181:3;4169:9;4160:7;4156:23;4152:33;4149:53;;;4198:1;4195;4188:12;4149:53;4221:29;4240:9;4221:29;:::i;:::-;4211:39;;4269:38;4303:2;4292:9;4288:18;4269:38;:::i;:::-;4259:48;;4354:2;4343:9;4339:18;4326:32;4316:42;;4409:2;4398:9;4394:18;4381:32;4432:18;4473:2;4465:6;4462:14;4459:34;;;4489:1;4486;4479:12;4459:34;4527:6;4516:9;4512:22;4502:32;;4572:7;4565:4;4561:2;4557:13;4553:27;4543:55;;4594:1;4591;4584:12;4543:55;4634:2;4621:16;4660:2;4652:6;4649:14;4646:34;;;4676:1;4673;4666:12;4646:34;4721:7;4716:2;4707:6;4703:2;4699:15;4695:24;4692:37;4689:57;;;4742:1;4739;4732:12;4689:57;3999:808;;;;-1:-1:-1;3999:808:1;;-1:-1:-1;4773:2:1;4765:11;;4795:6;3999:808;-1:-1:-1;;;3999:808:1:o;4812:260::-;4880:6;4888;4941:2;4929:9;4920:7;4916:23;4912:32;4909:52;;;4957:1;4954;4947:12;4909:52;4980:29;4999:9;4980:29;:::i;:::-;4970:39;;5028:38;5062:2;5051:9;5047:18;5028:38;:::i;:::-;5018:48;;4812:260;;;;;:::o;5077:380::-;5156:1;5152:12;;;;5199;;;5220:61;;5274:4;5266:6;5262:17;5252:27;;5220:61;5327:2;5319:6;5316:14;5296:18;5293:38;5290:161;;5373:10;5368:3;5364:20;5361:1;5354:31;5408:4;5405:1;5398:15;5436:4;5433:1;5426:15;5290:161;;5077:380;;;:::o;6360:127::-;6421:10;6416:3;6412:20;6409:1;6402:31;6452:4;6449:1;6442:15;6476:4;6473:1;6466:15;6492:168;6565:9;;;6596;;6613:15;;;6607:22;;6593:37;6583:71;;6634:18;;:::i;6665:127::-;6726:10;6721:3;6717:20;6714:1;6707:31;6757:4;6754:1;6747:15;6781:4;6778:1;6771:15;6797:217;6837:1;6863;6853:132;;6907:10;6902:3;6898:20;6895:1;6888:31;6942:4;6939:1;6932:15;6970:4;6967:1;6960:15;6853:132;-1:-1:-1;6999:9:1;;6797:217::o;7019:127::-;7080:10;7075:3;7071:20;7068:1;7061:31;7111:4;7108:1;7101:15;7135:4;7132:1;7125:15;7151:184;7221:6;7274:2;7262:9;7253:7;7249:23;7245:32;7242:52;;;7290:1;7287;7280:12;7242:52;-1:-1:-1;7313:16:1;;7151:184;-1:-1:-1;7151:184:1:o;7340:135::-;7379:3;7400:17;;;7397:43;;7420:18;;:::i;:::-;-1:-1:-1;7467:1:1;7456:13;;7340:135::o;8501:127::-;8562:10;8557:3;8553:20;8550:1;8543:31;8593:4;8590:1;8583:15;8617:4;8614:1;8607:15;8633:897;8713:6;8766:2;8754:9;8745:7;8741:23;8737:32;8734:52;;;8782:1;8779;8772:12;8734:52;8815:9;8809:16;8844:18;8885:2;8877:6;8874:14;8871:34;;;8901:1;8898;8891:12;8871:34;8939:6;8928:9;8924:22;8914:32;;8984:7;8977:4;8973:2;8969:13;8965:27;8955:55;;9006:1;9003;8996:12;8955:55;9035:2;9029:9;9057:2;9053;9050:10;9047:36;;;9063:18;;:::i;:::-;9138:2;9132:9;9106:2;9192:13;;-1:-1:-1;;9188:22:1;;;9212:2;9184:31;9180:40;9168:53;;;9236:18;;;9256:22;;;9233:46;9230:72;;;9282:18;;:::i;:::-;9322:10;9318:2;9311:22;9357:2;9349:6;9342:18;9397:7;9392:2;9387;9383;9379:11;9375:20;9372:33;9369:53;;;9418:1;9415;9408:12;9369:53;9431:68;9496:2;9491;9483:6;9479:15;9474:2;9470;9466:11;9431:68;:::i;:::-;9518:6;8633:897;-1:-1:-1;;;;;;;8633:897:1:o;9665:1720::-;-1:-1:-1;;;10415:63:1;;10501:13;;10397:3;;10523:75;10501:13;10586:2;10577:12;;10570:4;10558:17;;10523:75;:::i;:::-;10662:66;10657:2;10617:16;;;10649:11;;;10642:87;-1:-1:-1;;;10753:2:1;10745:11;;10738:38;-1:-1:-1;;;10800:2:1;10792:11;;10785:67;10877:13;;10899:76;10877:13;10961:2;10953:11;;10946:4;10934:17;;10899:76;:::i;:::-;11040:66;11035:2;10994:17;;;;11027:11;;;11020:87;-1:-1:-1;;;11131:3:1;11123:12;;11116:30;11171:13;;11193:77;11171:13;11255:3;11247:12;;11240:4;11228:17;;11193:77;:::i;:::-;-1:-1:-1;;;11330:3:1;11289:17;;;;11322:12;;;11315:36;11375:3;11367:12;;9665:1720;-1:-1:-1;;;;;9665:1720:1:o;11390:461::-;11652:31;11647:3;11640:44;11622:3;11713:6;11707:13;11729:75;11797:6;11792:2;11787:3;11783:12;11776:4;11768:6;11764:17;11729:75;:::i;:::-;11824:16;;;;11842:2;11820:25;;11390:461;-1:-1:-1;;11390:461:1:o;11856:1722::-;12570:66;12565:3;12558:79;12667:66;12662:2;12657:3;12653:12;12646:88;12764:34;12759:2;12754:3;12750:12;12743:56;12829:34;12824:2;12819:3;12815:12;12808:56;12904:28;12899:3;12895:38;12889:3;12884;12880:13;12873:61;12965:28;12959:3;12954;12950:13;12943:51;12540:3;13023:6;13017:13;13039:74;13106:6;13100:3;13095;13091:13;13086:2;13078:6;13074:15;13039:74;:::i;:::-;-1:-1:-1;;;13172:3:1;13132:16;;;13164:12;;;13157:36;13223:66;13217:3;13209:12;;13202:88;-1:-1:-1;;;13314:3:1;13306:12;;13299:77;13401:13;;13423:75;13401:13;13483:3;13475:12;;13470:2;13458:15;;13423:75;:::i;:::-;13514:58;13567:3;13556:8;13552:2;13548:17;13544:27;-1:-1:-1;;;9600:27:1;;9652:1;9643:11;;9535:125;13514:58;13507:65;11856:1722;-1:-1:-1;;;;;;11856:1722:1:o;14299:245::-;14366:6;14419:2;14407:9;14398:7;14394:23;14390:32;14387:52;;;14435:1;14432;14425:12;14387:52;14467:9;14461:16;14486:28;14508:5;14486:28;:::i;16498:249::-;16567:6;16620:2;16608:9;16599:7;16595:23;16591:32;16588:52;;;16636:1;16633;16626:12;16588:52;16668:9;16662:16;16687:30;16711:5;16687:30;:::i;17444:662::-;-1:-1:-1;;;;;17723:15:1;;;17705:34;;17775:15;;17770:2;17755:18;;17748:43;17822:2;17807:18;;17800:34;;;17870:3;17865:2;17850:18;;17843:31;;;17890:19;;17883:35;;;17648:4;17911:6;17961;17685:3;17940:19;;17927:49;18026:1;18020:3;18011:6;18000:9;17996:22;17992:32;17985:43;18096:3;18089:2;18085:7;18080:2;18072:6;18068:15;18064:29;18053:9;18049:45;18045:55;18037:63;;17444:662;;;;;;;;:::o;18111:128::-;18178:9;;;18199:11;;;18196:37;;;18213:18;;:::i;19686:125::-;19751:9;;;19772:10;;;19769:36;;;19785:18;;:::i;19816:136::-;19855:3;19883:5;19873:39;;19892:18;;:::i;:::-;-1:-1:-1;;;19928:18:1;;19816:136::o

Swarm Source

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