ETH Price: $3,238.92 (-3.65%)
 

Overview

Max Total Supply

0 msg4u

Holders

4

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 msg4u
0xfe0774044c27d0a352c9f8aca2c0721fb0158ca0
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:
msg4u

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.10;

/*//////////////////////////////////////////////////////////////
                           IMPORTS
//////////////////////////////////////////////////////////////*/

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/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/Rari-Capital/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;
    }
}

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

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

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

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

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

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol)

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

library console {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _sendLogPayload(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        }
    }

    function log() internal view {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
    }

    function logUint(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function logString(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function log(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    }

    function log(uint p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
    }

    function log(uint p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    }

    function log(uint p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
    }

    function log(string memory p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    }

    function log(bool p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
    }

    function log(address p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
    }

    function log(uint p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
    }

    function log(uint p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
    }

    function log(uint p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
    }

    function log(uint p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
    }

    function log(uint p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
    }

    function log(uint p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
    }

    function log(uint p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
    }

    function log(uint p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
    }

    function log(uint p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
    }

    function log(uint p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
    }

    function log(uint p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
    }

    function log(bool p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
    }

    function log(bool p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
    }

    function log(bool p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
    }

    function log(address p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
    }

    function log(address p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
    }

    function log(address p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

contract msg4u is ERC721, Ownable {

/*//////////////////////////////////////////////////////////////
                             VARS
//////////////////////////////////////////////////////////////*/

// Libraries
	using Counters for Counters.Counter;
	using Strings for uint256;

// Private fields
	Counters.Counter private tokenCount;

// Public constants and state
	string public baseURI;
	string public url;

// Structs
//-- Whitelist
	mapping(address => bool) public whitelist;
	event WhitelistedAddressAdded(address addr);
	event WhitelistedAddressRemoved(address addr);

//-- Message
	mapping(uint256 => string[]) public message;

/*//////////////////////////////////////////////////////////////
                          MODIFIERS
//////////////////////////////////////////////////////////////*/

// Whitelist (FROM: https://github.com/jaycenhorton/zeppelin-solidity/blob/master/contracts/ownership/Whitelist.sol)
	/**
	* @dev Throws if called by any account that's not whitelisted.
	*/
	modifier onlyWhitelisted() {
		require(whitelist[msg.sender], "Your address isn't allowed to send messages.");
		_;
	}

/*//////////////////////////////////////////////////////////////
                          THE TOKENS
//////////////////////////////////////////////////////////////*/

// Contract
	constructor(
		string memory _name,
		string memory _symbol,
		string memory _baseURI
	) ERC721(_name, _symbol) {
		baseURI = _baseURI;
	}

// Mint
	function mint(address dropToAddress, string[2] memory _message) onlyWhitelisted public {
	// Mint it
		_mint(dropToAddress, tokenCount.current());

	// Assign _lines
		// tokenCount.current();
		message[tokenCount.current()] = _message;

	// Increment for next token id
		tokenCount.increment();
	}

// Token URI
	function tokenURI(uint256 tokenId)
		public
		view
		virtual
		override
		returns (string memory)
	{
	// Compose svg
		string[7] memory parts;
		parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.t{font-family:monospace;font-size:1.5em;color:#ffe501;}.t2{color:#ffffff;}.t3{font-size:0.5em;color:#cccccc}</style><rect height="350" width="350" fill="#080619"/><foreignObject x="10" y="10" width="330" height="275"><p class="t" xmlns="http://www.w3.org/1999/xhtml">';

		parts[1] = message[tokenId][0];
		
		parts[2] = '</p><p class="t t2" xmlns="http://www.w3.org/1999/xhtml">';

		parts[3] = message[tokenId][1];
		
		parts[4] = '</p><p class="t t3" xmlns="http://www.w3.org/1999/xhtml">';

		parts[5] = url;
		
		parts[6] = '</p></foreignObject></svg>';

		string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]));
		string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "a msg4u", "description": "This is a msg4u. You should read it.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
		output = string(abi.encodePacked('data:application/json;base64,', json));

		return output;
	}

/*//////////////////////////////////////////////////////////////
                       ADMIN FUNCTIONS
//////////////////////////////////////////////////////////////*/

	function addAddressToWhitelist(address addr) onlyOwner public returns(bool success) {
		if (!whitelist[addr]) {
			whitelist[addr] = true;
			emit WhitelistedAddressAdded(addr);
			success = true; 
		}
	}

	function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) {
		if (whitelist[addr]) {
			whitelist[addr] = false;
			emit WhitelistedAddressRemoved(addr);
			success = true;
		}
	}

	function setURL(string calldata url) onlyOwner public returns(bool success) {
		url = url;
		success = true;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"message","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dropToAddress","type":"address"},{"internalType":"string[2]","name":"_message","type":"string[2]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setURL","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"url","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200221638038062002216833981016040819052620000349162000268565b8251839083906200004d906000906020850190620000f5565b50805162000063906001906020840190620000f5565b505050620000806200007a6200009f60201b60201c565b620000a3565b805162000095906008906020840190620000f5565b5050505062000336565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010390620002f9565b90600052602060002090601f01602090048101928262000127576000855562000172565b82601f106200014257805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017257825182559160200191906001019062000155565b506200018092915062000184565b5090565b5b8082111562000180576000815560010162000185565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001c357600080fd5b81516001600160401b0380821115620001e057620001e06200019b565b604051601f8301601f19908116603f011681019082821181831017156200020b576200020b6200019b565b816040528381526020925086838588010111156200022857600080fd5b600091505b838210156200024c57858201830151818301840152908201906200022d565b838211156200025e5760008385830101525b9695505050505050565b6000806000606084860312156200027e57600080fd5b83516001600160401b03808211156200029657600080fd5b620002a487838801620001b1565b94506020860151915080821115620002bb57600080fd5b620002c987838801620001b1565b93506040860151915080821115620002e057600080fd5b50620002ef86828701620001b1565b9150509250925092565b600181811c908216806200030e57607f821691505b602082108114156200033057634e487b7160e01b600052602260045260246000fd5b50919050565b611ed080620003466000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c35780639b19251a1161007c5780639b19251a146102da578063a22cb465146102fd578063b88d4fde14610310578063c87b56dd14610323578063e985e9c514610336578063f2fde38b1461036457600080fd5b8063715018a61461028057806377343408146102885780637b9417c81461029b5780638da5cb5b146102ae57806391fdccfd146102bf57806395d89b41146102d257600080fd5b8063286dd3f511610115578063286dd3f51461021657806342842e0e146102295780635600f04f1461023c5780636352211e146102445780636c0360eb1461025757806370a082311461025f57600080fd5b806301ffc9a71461015d57806306fdde0314610185578063081812fc1461019a578063095ea7b3146101db5780631387464f146101f057806323b872dd14610203575b600080fd5b61017061016b366004611550565b610377565b60405190151581526020015b60405180910390f35b61018d6103c9565b60405161017c91906115a4565b6101c36101a83660046115d7565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161017c565b6101ee6101e9366004611607565b610457565b005b6101ee6101fe3660046116a1565b61053e565b6101ee61021136600461179f565b610600565b6101706102243660046117db565b6107c7565b6101ee61023736600461179f565b610873565b61018d61096b565b6101c36102523660046115d7565b610978565b61018d6109ca565b61027261026d3660046117db565b6109d7565b60405190815260200161017c565b6101ee610a3a565b61017061029636600461183f565b610a70565b6101706102a93660046117db565b610aa6565b6006546001600160a01b03166101c3565b61018d6102cd366004611881565b610b47565b61018d610b7f565b6101706102e83660046117db565b600a6020526000908152604090205460ff1681565b6101ee61030b3660046118a3565b610b8c565b6101ee61031e3660046118df565b610bf8565b61018d6103313660046115d7565b610ce0565b61017061034436600461194e565b600560209081526000928352604080842090915290825290205460ff1681565b6101ee6103723660046117db565b61107e565b60006301ffc9a760e01b6001600160e01b0319831614806103a857506380ac58cd60e01b6001600160e01b03198316145b806103c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b600080546103d690611981565b80601f016020809104026020016040519081016040528092919081815260200182805461040290611981565b801561044f5780601f106104245761010080835404028352916020019161044f565b820191906000526020600020905b81548152906001019060200180831161043257829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806104a057506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6104e25760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b336000908152600a602052604090205460ff166105b25760405162461bcd60e51b815260206004820152602c60248201527f596f757220616464726573732069736e277420616c6c6f77656420746f20736560448201526b37321036b2b9b9b0b3b2b99760a11b60648201526084016104d9565b6105c4826105bf60075490565b611119565b80600b60006105d260075490565b815260208101919091526040016000206105ed9160026113ca565b506105fc600780546001019055565b5050565b6000818152600260205260409020546001600160a01b038481169116146106565760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016104d9565b6001600160a01b0382166106a05760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016104d9565b336001600160a01b03841614806106da57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806106fb57506000818152600460205260409020546001600160a01b031633145b6107385760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016104d9565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546000906001600160a01b031633146107f45760405162461bcd60e51b81526004016104d9906119bc565b6001600160a01b0382166000908152600a602052604090205460ff161561086e576001600160a01b0382166000818152600a6020908152604091829020805460ff1916905590519182527ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a91015b60405180910390a15060015b919050565b61087e838383610600565b6001600160a01b0382163b15806109275750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156108f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091b91906119f1565b6001600160e01b031916145b6109665760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016104d9565b505050565b600980546103d690611981565b6000818152600260205260409020546001600160a01b03168061086e5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016104d9565b600880546103d690611981565b60006001600160a01b038216610a1e5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016104d9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a645760405162461bcd60e51b81526004016104d9906119bc565b610a6e6000611224565b565b6006546000906001600160a01b03163314610a9d5760405162461bcd60e51b81526004016104d9906119bc565b50600192915050565b6006546000906001600160a01b03163314610ad35760405162461bcd60e51b81526004016104d9906119bc565b6001600160a01b0382166000908152600a602052604090205460ff1661086e576001600160a01b0382166000818152600a6020908152604091829020805460ff1916600117905590519182527fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f9101610862565b600b6020528160005260406000208181548110610b6357600080fd5b906000526020600020016000915091505080546103d690611981565b600180546103d690611981565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610c03858585610600565b6001600160a01b0384163b1580610c9a5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610c4b9033908a90899089908990600401611a0e565b6020604051808303816000875af1158015610c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8e91906119f1565b6001600160e01b031916145b610cd95760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016104d9565b5050505050565b6060610cea611427565b604051806101a001604052806101758152602001611c74610175913981526000838152600b602052604081208054909190610d2757610d27611a62565b906000526020600020018054610d3c90611981565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6890611981565b8015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b505050505081600160078110610dcd57610dcd611a62565b6020020181905250604051806060016040528060398152602001611e62603991396040808301919091526000848152600b6020522080546001908110610e1557610e15611a62565b906000526020600020018054610e2a90611981565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5690611981565b8015610ea35780601f10610e7857610100808354040283529160200191610ea3565b820191906000526020600020905b815481529060010190602001808311610e8657829003601f168201915b505050505081600360078110610ebb57610ebb611a62565b6020020181905250604051806060016040528060398152602001611de960399139608082015260098054610eee90611981565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1a90611981565b8015610f675780601f10610f3c57610100808354040283529160200191610f67565b820191906000526020600020905b815481529060010190602001808311610f4a57829003601f168201915b505050505081600560078110610f7f57610f7f611a62565b60200201819052506040518060400160405280601a81526020017f3c2f703e3c2f666f726569676e4f626a6563743e3c2f7376673e00000000000081525081600660078110610fd057610fd0611a62565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c0890151945160009861100f9897969101611a78565b6040516020818303038152906040529050600061105261102e83611276565b60405160200161103e9190611b0a565b604051602081830303815290604052611276565b9050806040516020016110659190611bbf565b60408051601f1981840301815291905295945050505050565b6006546001600160a01b031633146110a85760405162461bcd60e51b81526004016104d9906119bc565b6001600160a01b03811661110d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104d9565b61111681611224565b50565b6001600160a01b0382166111635760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016104d9565b6000818152600260205260409020546001600160a01b0316156111b95760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016104d9565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606081516000141561129657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611e2260409139905060006003845160026112c59190611c1a565b6112cf9190611c32565b6112da906004611c54565b67ffffffffffffffff8111156112f2576112f2611631565b6040519080825280601f01601f19166020018201604052801561131c576020820181803683370190505b509050600182016020820185865187015b80821015611388576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061132d565b50506003865106600181146113a457600281146113b7576113bf565b603d6001830353603d60028303536113bf565b603d60018303535b509195945050505050565b828054828255906000526020600020908101928215611417579160200282015b82811115611417578251805161140791849160209091019061144e565b50916020019190600101906113ea565b506114239291506114ce565b5090565b6040518060e001604052806007905b60608152602001906001900390816114365790505090565b82805461145a90611981565b90600052602060002090601f01602090048101928261147c57600085556114c2565b82601f1061149557805160ff19168380011785556114c2565b828001600101855582156114c2579182015b828111156114c25782518255916020019190600101906114a7565b506114239291506114eb565b808211156114235760006114e28282611500565b506001016114ce565b5b8082111561142357600081556001016114ec565b50805461150c90611981565b6000825580601f1061151c575050565b601f01602090049060005260206000209081019061111691906114eb565b6001600160e01b03198116811461111657600080fd5b60006020828403121561156257600080fd5b813561156d8161153a565b9392505050565b60005b8381101561158f578181015183820152602001611577565b8381111561159e576000848401525b50505050565b60208152600082518060208401526115c3816040850160208701611574565b601f01601f19169190910160400192915050565b6000602082840312156115e957600080fd5b5035919050565b80356001600160a01b038116811461086e57600080fd5b6000806040838503121561161a57600080fd5b611623836115f0565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561166a5761166a611631565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561169957611699611631565b604052919050565b600080604083850312156116b457600080fd5b6116bd836115f0565b915060208084013567ffffffffffffffff808211156116db57600080fd5b8186019150601f87818401126116f057600080fd5b6116f8611647565b80604085018a81111561170a57600080fd5b855b8181101561178e578035868111156117245760008081fd5b87018581018d136117355760008081fd5b80358781111561174757611747611631565b611758818801601f19168b01611670565b8181528e8b83850101111561176d5760008081fd5b818b84018c83013760009181018b019190915285525092870192870161170c565b50979a909950975050505050505050565b6000806000606084860312156117b457600080fd5b6117bd846115f0565b92506117cb602085016115f0565b9150604084013590509250925092565b6000602082840312156117ed57600080fd5b61156d826115f0565b60008083601f84011261180857600080fd5b50813567ffffffffffffffff81111561182057600080fd5b60208301915083602082850101111561183857600080fd5b9250929050565b6000806020838503121561185257600080fd5b823567ffffffffffffffff81111561186957600080fd5b611875858286016117f6565b90969095509350505050565b6000806040838503121561189457600080fd5b50508035926020909101359150565b600080604083850312156118b657600080fd5b6118bf836115f0565b9150602083013580151581146118d457600080fd5b809150509250929050565b6000806000806000608086880312156118f757600080fd5b611900866115f0565b945061190e602087016115f0565b935060408601359250606086013567ffffffffffffffff81111561193157600080fd5b61193d888289016117f6565b969995985093965092949392505050565b6000806040838503121561196157600080fd5b61196a836115f0565b9150611978602084016115f0565b90509250929050565b600181811c9082168061199557607f821691505b602082108114156119b657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611a0357600080fd5b815161156d8161153a565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052603260045260246000fd5b600088516020611a8b8285838e01611574565b895191840191611a9e8184848e01611574565b8951920191611ab08184848d01611574565b8851920191611ac28184848c01611574565b8751920191611ad48184848b01611574565b8651920191611ae68184848a01611574565b8551920191611af88184848901611574565b919091019a9950505050505050505050565b7f7b226e616d65223a202261206d73673475222c20226465736372697074696f6e81527f223a2022546869732069732061206d736734752e20596f752073686f756c642060208201527f726561642069742e222c2022696d616765223a2022646174613a696d6167652f60408201526e1cdd99cade1b5b0ed8985cd94d8d0b608a1b606082015260008251611ba681606f850160208701611574565b61227d60f01b606f939091019283015250607101919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611bf781601d850160208701611574565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611c2d57611c2d611c04565b500190565b600082611c4f57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611c6e57611c6e611c04565b50029056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e747b666f6e742d66616d696c793a6d6f6e6f73706163653b666f6e742d73697a653a312e35656d3b636f6c6f723a236666653530313b7d2e74327b636f6c6f723a236666666666663b7d2e74337b666f6e742d73697a653a302e35656d3b636f6c6f723a236363636363637d3c2f7374796c653e3c72656374206865696768743d22333530222077696474683d22333530222066696c6c3d2223303830363139222f3e3c666f726569676e4f626a65637420783d2231302220793d223130222077696474683d2233333022206865696768743d22323735223e3c7020636c6173733d22742220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313939392f7868746d6c223e3c2f703e3c7020636c6173733d22742074332220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313939392f7868746d6c223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f703e3c7020636c6173733d22742074322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313939392f7868746d6c223ea2646970667358221220a0f766679b35abcf59d43481214ca55c43fbfde560c15e5fc1f20c44d5b8508564736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000056d7367347500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056d736734750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010525553545f4241434b54524143453d3100000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c35780639b19251a1161007c5780639b19251a146102da578063a22cb465146102fd578063b88d4fde14610310578063c87b56dd14610323578063e985e9c514610336578063f2fde38b1461036457600080fd5b8063715018a61461028057806377343408146102885780637b9417c81461029b5780638da5cb5b146102ae57806391fdccfd146102bf57806395d89b41146102d257600080fd5b8063286dd3f511610115578063286dd3f51461021657806342842e0e146102295780635600f04f1461023c5780636352211e146102445780636c0360eb1461025757806370a082311461025f57600080fd5b806301ffc9a71461015d57806306fdde0314610185578063081812fc1461019a578063095ea7b3146101db5780631387464f146101f057806323b872dd14610203575b600080fd5b61017061016b366004611550565b610377565b60405190151581526020015b60405180910390f35b61018d6103c9565b60405161017c91906115a4565b6101c36101a83660046115d7565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161017c565b6101ee6101e9366004611607565b610457565b005b6101ee6101fe3660046116a1565b61053e565b6101ee61021136600461179f565b610600565b6101706102243660046117db565b6107c7565b6101ee61023736600461179f565b610873565b61018d61096b565b6101c36102523660046115d7565b610978565b61018d6109ca565b61027261026d3660046117db565b6109d7565b60405190815260200161017c565b6101ee610a3a565b61017061029636600461183f565b610a70565b6101706102a93660046117db565b610aa6565b6006546001600160a01b03166101c3565b61018d6102cd366004611881565b610b47565b61018d610b7f565b6101706102e83660046117db565b600a6020526000908152604090205460ff1681565b6101ee61030b3660046118a3565b610b8c565b6101ee61031e3660046118df565b610bf8565b61018d6103313660046115d7565b610ce0565b61017061034436600461194e565b600560209081526000928352604080842090915290825290205460ff1681565b6101ee6103723660046117db565b61107e565b60006301ffc9a760e01b6001600160e01b0319831614806103a857506380ac58cd60e01b6001600160e01b03198316145b806103c35750635b5e139f60e01b6001600160e01b03198316145b92915050565b600080546103d690611981565b80601f016020809104026020016040519081016040528092919081815260200182805461040290611981565b801561044f5780601f106104245761010080835404028352916020019161044f565b820191906000526020600020905b81548152906001019060200180831161043257829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806104a057506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6104e25760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b336000908152600a602052604090205460ff166105b25760405162461bcd60e51b815260206004820152602c60248201527f596f757220616464726573732069736e277420616c6c6f77656420746f20736560448201526b37321036b2b9b9b0b3b2b99760a11b60648201526084016104d9565b6105c4826105bf60075490565b611119565b80600b60006105d260075490565b815260208101919091526040016000206105ed9160026113ca565b506105fc600780546001019055565b5050565b6000818152600260205260409020546001600160a01b038481169116146106565760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016104d9565b6001600160a01b0382166106a05760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016104d9565b336001600160a01b03841614806106da57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806106fb57506000818152600460205260409020546001600160a01b031633145b6107385760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016104d9565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546000906001600160a01b031633146107f45760405162461bcd60e51b81526004016104d9906119bc565b6001600160a01b0382166000908152600a602052604090205460ff161561086e576001600160a01b0382166000818152600a6020908152604091829020805460ff1916905590519182527ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a91015b60405180910390a15060015b919050565b61087e838383610600565b6001600160a01b0382163b15806109275750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156108f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091b91906119f1565b6001600160e01b031916145b6109665760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016104d9565b505050565b600980546103d690611981565b6000818152600260205260409020546001600160a01b03168061086e5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016104d9565b600880546103d690611981565b60006001600160a01b038216610a1e5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016104d9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a645760405162461bcd60e51b81526004016104d9906119bc565b610a6e6000611224565b565b6006546000906001600160a01b03163314610a9d5760405162461bcd60e51b81526004016104d9906119bc565b50600192915050565b6006546000906001600160a01b03163314610ad35760405162461bcd60e51b81526004016104d9906119bc565b6001600160a01b0382166000908152600a602052604090205460ff1661086e576001600160a01b0382166000818152600a6020908152604091829020805460ff1916600117905590519182527fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f9101610862565b600b6020528160005260406000208181548110610b6357600080fd5b906000526020600020016000915091505080546103d690611981565b600180546103d690611981565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610c03858585610600565b6001600160a01b0384163b1580610c9a5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610c4b9033908a90899089908990600401611a0e565b6020604051808303816000875af1158015610c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8e91906119f1565b6001600160e01b031916145b610cd95760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016104d9565b5050505050565b6060610cea611427565b604051806101a001604052806101758152602001611c74610175913981526000838152600b602052604081208054909190610d2757610d27611a62565b906000526020600020018054610d3c90611981565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6890611981565b8015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b505050505081600160078110610dcd57610dcd611a62565b6020020181905250604051806060016040528060398152602001611e62603991396040808301919091526000848152600b6020522080546001908110610e1557610e15611a62565b906000526020600020018054610e2a90611981565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5690611981565b8015610ea35780601f10610e7857610100808354040283529160200191610ea3565b820191906000526020600020905b815481529060010190602001808311610e8657829003601f168201915b505050505081600360078110610ebb57610ebb611a62565b6020020181905250604051806060016040528060398152602001611de960399139608082015260098054610eee90611981565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1a90611981565b8015610f675780601f10610f3c57610100808354040283529160200191610f67565b820191906000526020600020905b815481529060010190602001808311610f4a57829003601f168201915b505050505081600560078110610f7f57610f7f611a62565b60200201819052506040518060400160405280601a81526020017f3c2f703e3c2f666f726569676e4f626a6563743e3c2f7376673e00000000000081525081600660078110610fd057610fd0611a62565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c0890151945160009861100f9897969101611a78565b6040516020818303038152906040529050600061105261102e83611276565b60405160200161103e9190611b0a565b604051602081830303815290604052611276565b9050806040516020016110659190611bbf565b60408051601f1981840301815291905295945050505050565b6006546001600160a01b031633146110a85760405162461bcd60e51b81526004016104d9906119bc565b6001600160a01b03811661110d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104d9565b61111681611224565b50565b6001600160a01b0382166111635760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016104d9565b6000818152600260205260409020546001600160a01b0316156111b95760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016104d9565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606081516000141561129657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611e2260409139905060006003845160026112c59190611c1a565b6112cf9190611c32565b6112da906004611c54565b67ffffffffffffffff8111156112f2576112f2611631565b6040519080825280601f01601f19166020018201604052801561131c576020820181803683370190505b509050600182016020820185865187015b80821015611388576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061132d565b50506003865106600181146113a457600281146113b7576113bf565b603d6001830353603d60028303536113bf565b603d60018303535b509195945050505050565b828054828255906000526020600020908101928215611417579160200282015b82811115611417578251805161140791849160209091019061144e565b50916020019190600101906113ea565b506114239291506114ce565b5090565b6040518060e001604052806007905b60608152602001906001900390816114365790505090565b82805461145a90611981565b90600052602060002090601f01602090048101928261147c57600085556114c2565b82601f1061149557805160ff19168380011785556114c2565b828001600101855582156114c2579182015b828111156114c25782518255916020019190600101906114a7565b506114239291506114eb565b808211156114235760006114e28282611500565b506001016114ce565b5b8082111561142357600081556001016114ec565b50805461150c90611981565b6000825580601f1061151c575050565b601f01602090049060005260206000209081019061111691906114eb565b6001600160e01b03198116811461111657600080fd5b60006020828403121561156257600080fd5b813561156d8161153a565b9392505050565b60005b8381101561158f578181015183820152602001611577565b8381111561159e576000848401525b50505050565b60208152600082518060208401526115c3816040850160208701611574565b601f01601f19169190910160400192915050565b6000602082840312156115e957600080fd5b5035919050565b80356001600160a01b038116811461086e57600080fd5b6000806040838503121561161a57600080fd5b611623836115f0565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561166a5761166a611631565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561169957611699611631565b604052919050565b600080604083850312156116b457600080fd5b6116bd836115f0565b915060208084013567ffffffffffffffff808211156116db57600080fd5b8186019150601f87818401126116f057600080fd5b6116f8611647565b80604085018a81111561170a57600080fd5b855b8181101561178e578035868111156117245760008081fd5b87018581018d136117355760008081fd5b80358781111561174757611747611631565b611758818801601f19168b01611670565b8181528e8b83850101111561176d5760008081fd5b818b84018c83013760009181018b019190915285525092870192870161170c565b50979a909950975050505050505050565b6000806000606084860312156117b457600080fd5b6117bd846115f0565b92506117cb602085016115f0565b9150604084013590509250925092565b6000602082840312156117ed57600080fd5b61156d826115f0565b60008083601f84011261180857600080fd5b50813567ffffffffffffffff81111561182057600080fd5b60208301915083602082850101111561183857600080fd5b9250929050565b6000806020838503121561185257600080fd5b823567ffffffffffffffff81111561186957600080fd5b611875858286016117f6565b90969095509350505050565b6000806040838503121561189457600080fd5b50508035926020909101359150565b600080604083850312156118b657600080fd5b6118bf836115f0565b9150602083013580151581146118d457600080fd5b809150509250929050565b6000806000806000608086880312156118f757600080fd5b611900866115f0565b945061190e602087016115f0565b935060408601359250606086013567ffffffffffffffff81111561193157600080fd5b61193d888289016117f6565b969995985093965092949392505050565b6000806040838503121561196157600080fd5b61196a836115f0565b9150611978602084016115f0565b90509250929050565b600181811c9082168061199557607f821691505b602082108114156119b657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611a0357600080fd5b815161156d8161153a565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052603260045260246000fd5b600088516020611a8b8285838e01611574565b895191840191611a9e8184848e01611574565b8951920191611ab08184848d01611574565b8851920191611ac28184848c01611574565b8751920191611ad48184848b01611574565b8651920191611ae68184848a01611574565b8551920191611af88184848901611574565b919091019a9950505050505050505050565b7f7b226e616d65223a202261206d73673475222c20226465736372697074696f6e81527f223a2022546869732069732061206d736734752e20596f752073686f756c642060208201527f726561642069742e222c2022696d616765223a2022646174613a696d6167652f60408201526e1cdd99cade1b5b0ed8985cd94d8d0b608a1b606082015260008251611ba681606f850160208701611574565b61227d60f01b606f939091019283015250607101919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611bf781601d850160208701611574565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611c2d57611c2d611c04565b500190565b600082611c4f57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611c6e57611c6e611c04565b50029056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e747b666f6e742d66616d696c793a6d6f6e6f73706163653b666f6e742d73697a653a312e35656d3b636f6c6f723a236666653530313b7d2e74327b636f6c6f723a236666666666663b7d2e74337b666f6e742d73697a653a302e35656d3b636f6c6f723a236363636363637d3c2f7374796c653e3c72656374206865696768743d22333530222077696474683d22333530222066696c6c3d2223303830363139222f3e3c666f726569676e4f626a65637420783d2231302220793d223130222077696474683d2233333022206865696768743d22323735223e3c7020636c6173733d22742220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313939392f7868746d6c223e3c2f703e3c7020636c6173733d22742074332220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313939392f7868746d6c223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f703e3c7020636c6173733d22742074322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f313939392f7868746d6c223ea2646970667358221220a0f766679b35abcf59d43481214ca55c43fbfde560c15e5fc1f20c44d5b8508564736f6c634300080a0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000056d7367347500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056d736734750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010525553545f4241434b54524143453d3100000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): msg4u
Arg [1] : _symbol (string): msg4u
Arg [2] : _baseURI (string): RUST_BACKTRACE=1

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 6d73673475000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 6d73673475000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [8] : 525553545f4241434b54524143453d3100000000000000000000000000000000


Deployed Bytecode Sourcemap

99252:3849:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5024:340;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;5024:340:0;;;;;;;;1084:18;;;:::i;:::-;;;;;;;:::i;2057:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2057:46:0;;;;;;-1:-1:-1;;;;;1592:32:1;;;1574:51;;1562:2;1547:18;2057:46:0;1428:203:1;2683:290:0;;;;;;:::i;:::-;;:::i;:::-;;100752:308;;;;;;:::i;:::-;;:::i;3196:768::-;;;;;;:::i;:::-;;:::i;102763:216::-;;;;;;:::i;:::-;;:::i;3972:409::-;;;;;;:::i;:::-;;:::i;99661:17::-;;;:::i;1526:151::-;;;;;;:::i;:::-;;:::i;99636:21::-;;;:::i;1685:172::-;;;;;;:::i;:::-;;:::i;:::-;;;5054:25:1;;;5042:2;5027:18;1685:172:0;4908:177:1;26712:103:0;;;:::i;102984:114::-;;;;;;:::i;:::-;;:::i;102548:210::-;;;;;;:::i;:::-;;:::i;26061:87::-;26134:6;;-1:-1:-1;;;;;26134:6:0;26061:87;;99869:43;;;;;;:::i;:::-;;:::i;1111:20::-;;;:::i;99712:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2981:207;;;;;;:::i;:::-;;:::i;4389:441::-;;;;;;:::i;:::-;;:::i;101079:1290::-;;;;;;:::i;:::-;;:::i;2112:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26970:201;;;;;;:::i;:::-;;:::i;5024:340::-;5100:4;-1:-1:-1;;;;;;;;;5137:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;5213:25:0;;;5137:101;:177;;;-1:-1:-1;;;;;;;;;;5289:25:0;;;5137:177;5117:197;5024:340;-1:-1:-1;;5024:340:0:o;1084:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2683:290::-;2755:13;2771:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2771:12:0;2804:10;:19;;;:58;;-1:-1:-1;;;;;;2827:23:0;;;;;;:16;:23;;;;;;;;2851:10;2827:35;;;;;;;;;;2804:58;2796:85;;;;-1:-1:-1;;;2796:85:0;;7948:2:1;2796:85:0;;;7930:21:1;7987:2;7967:18;;;7960:30;-1:-1:-1;;;8006:18:1;;;7999:44;8060:18;;2796:85:0;;;;;;;;;2894:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;2894:25:0;-1:-1:-1;;;;;2894:25:0;;;;;;;;;2937:28;;2894:15;;2937:28;;;;;;;2744:229;2683:290;;:::o;100752:308::-;100333:10;100323:21;;;;:9;:21;;;;;;;;100315:78;;;;-1:-1:-1;;;100315:78:0;;8291:2:1;100315:78:0;;;8273:21:1;8330:2;8310:18;;;8303:30;8369:34;8349:18;;;8342:62;-1:-1:-1;;;8420:18:1;;;8413:42;8472:19;;100315:78:0;8089:408:1;100315:78:0;100857:42:::1;100863:13;100878:20;:10;23774:14:::0;;23682:114;100878:20:::1;100857:5;:42::i;:::-;100985:8;100953:7;:29;100961:20;:10;23774:14:::0;;23682:114;100961:20:::1;100953:29:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;100953:29:0;:40:::1;::::0;::::1;;:::i;:::-;;101033:22;:10;23893:19:::0;;23911:1;23893:19;;;23804:127;101033:22:::1;100752:308:::0;;:::o;3196:768::-;3332:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3324:20:0;;;3332:12;;3324:20;3316:43;;;;-1:-1:-1;;;3316:43:0;;8704:2:1;3316:43:0;;;8686:21:1;8743:2;8723:18;;;8716:30;-1:-1:-1;;;8762:18:1;;;8755:40;8812:18;;3316:43:0;8502:334:1;3316:43:0;-1:-1:-1;;;;;3380:16:0;;3372:46;;;;-1:-1:-1;;;3372:46:0;;9043:2:1;3372:46:0;;;9025:21:1;9082:2;9062:18;;;9055:30;-1:-1:-1;;;9101:18:1;;;9094:47;9158:18;;3372:46:0;8841:341:1;3372:46:0;3453:10;-1:-1:-1;;;;;3453:18:0;;;;:56;;-1:-1:-1;;;;;;3475:22:0;;;;;;:16;:22;;;;;;;;3498:10;3475:34;;;;;;;;;;3453:56;:89;;;-1:-1:-1;3527:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;3527:15:0;3513:10;:29;3453:89;3431:153;;;;-1:-1:-1;;;3431:153:0;;7948:2:1;3431:153:0;;;7930:21:1;7987:2;7967:18;;;7960:30;-1:-1:-1;;;8006:18:1;;;7999:44;8060:18;;3431:153:0;7746:338:1;3431:153:0;-1:-1:-1;;;;;3789:16:0;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;3789:18:0;;;3824:14;;;;;;;;;:16;;3789:18;3824:16;;;3864:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;3864:17:0;;;;;;;;3901:11;:15;;;;;;3894:22;;;;;;;;3934;;3873:2;;3824:14;3789:16;3934:22;;;3196:768;;;:::o;102763:216::-;26134:6;;102838:12;;-1:-1:-1;;;;;26134:6:0;25008:10;26281:23;26273:68;;;;-1:-1:-1;;;26273:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;102861:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;102857:118;;;-1:-1:-1::0;;;;;102884:15:0;::::1;102902:5;102884:15:::0;;;:9:::1;:15;::::0;;;;;;;;:23;;-1:-1:-1;;102884:23:0::1;::::0;;102918:31;;1574:51:1;;;102918:31:0::1;::::0;1547:18:1;102918:31:0::1;;;;;;;;-1:-1:-1::0;102965:4:0::1;102857:118;102763:216:::0;;;:::o;3972:409::-;4096:26;4109:4;4115:2;4119;4096:12;:26::i;:::-;-1:-1:-1;;;;;4157:14:0;;;:19;;:172;;-1:-1:-1;4197:66:0;;-1:-1:-1;;;4197:66:0;;;4238:10;4197:66;;;9853:34:1;-1:-1:-1;;;;;9923:15:1;;;9903:18;;;9896:43;9955:18;;;9948:34;;;10018:3;9998:18;;;9991:31;-1:-1:-1;10038:19:1;;;10031:30;4284:45:0;;4197:40;;;;4284:45;;10078:19:1;;4197:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4197:132:0;;4157:172;4135:238;;;;-1:-1:-1;;;4135:238:0;;10564:2:1;4135:238:0;;;10546:21:1;10603:2;10583:18;;;10576:30;-1:-1:-1;;;10622:18:1;;;10615:46;10678:18;;4135:238:0;10362:340:1;4135:238:0;3972:409;;;:::o;99661:17::-;;;;;;;:::i;1526:151::-;1584:13;1627:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1627:12:0;1618:36;1610:59;;;;-1:-1:-1;;;1610:59:0;;10909:2:1;1610:59:0;;;10891:21:1;10948:2;10928:18;;;10921:30;-1:-1:-1;;;10967:18:1;;;10960:40;11017:18;;1610:59:0;10707:334:1;99636:21:0;;;;;;;:::i;1685:172::-;1748:7;-1:-1:-1;;;;;1776:19:0;;1768:44;;;;-1:-1:-1;;;1768:44:0;;11248:2:1;1768:44:0;;;11230:21:1;11287:2;11267:18;;;11260:30;-1:-1:-1;;;11306:18:1;;;11299:42;11358:18;;1768:44:0;11046:336:1;1768:44:0;-1:-1:-1;;;;;;1832:17:0;;;;;:10;:17;;;;;;;1685:172::o;26712:103::-;26134:6;;-1:-1:-1;;;;;26134:6:0;25008:10;26281:23;26273:68;;;;-1:-1:-1;;;26273:68:0;;;;;;;:::i;:::-;26777:30:::1;26804:1;26777:18;:30::i;:::-;26712:103::o:0;102984:114::-;26134:6;;103046:12;;-1:-1:-1;;;;;26134:6:0;25008:10;26281:23;26273:68;;;;-1:-1:-1;;;26273:68:0;;;;;;;:::i;:::-;-1:-1:-1;103089:4:0::1;::::0;102984:114;-1:-1:-1;;102984:114:0:o;102548:210::-;26134:6;;102618:12;;-1:-1:-1;;;;;26134:6:0;25008:10;26281:23;26273:68;;;;-1:-1:-1;;;26273:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;102642:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;::::1;;102637:117;;-1:-1:-1::0;;;;;102665:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:22;;-1:-1:-1;;102665:22:0::1;102683:4;102665:22;::::0;;102698:29;;1574:51:1;;;102698:29:0::1;::::0;1547:18:1;102698:29:0::1;1428:203:1::0;99869:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1111:20::-;;;;;;;:::i;2981:207::-;3084:10;3067:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;3067:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;3067:49:0;;;;;;;;;;3134:46;;540:41:1;;;3067:38:0;;3084:10;3134:46;;513:18:1;3134:46:0;;;;;;;2981:207;;:::o;4389:441::-;4543:26;4556:4;4562:2;4566;4543:12;:26::i;:::-;-1:-1:-1;;;;;4604:14:0;;;:19;;:174;;-1:-1:-1;4644:68:0;;-1:-1:-1;;;4644:68:0;;;4733:45;-1:-1:-1;;;;;4644:40:0;;;4733:45;;4644:68;;4685:10;;4697:4;;4703:2;;4707:4;;;;4644:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4644:134:0;;4604:174;4582:240;;;;-1:-1:-1;;;4582:240:0;;10564:2:1;4582:240:0;;;10546:21:1;10603:2;10583:18;;;10576:30;-1:-1:-1;;;10622:18:1;;;10615:46;10678:18;;4582:240:0;10362:340:1;4582:240:0;4389:441;;;;;:::o;101079:1290::-;101167:13;101206:22;;:::i;:::-;101233:386;;;;;;;;;;;;;;;;;;;101239:1;101637:16;;;:7;101233:8;101637:16;;;;:19;;:16;;101239:1;101637:19;;;;:::i;:::-;;;;;;;;101626:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;101632:1;101626:8;;;;;;;:::i;:::-;;;;:30;;;;101665:70;;;;;;;;;;;;;;;;;:8;;;;:70;;;;101753:16;;;;:7;101665:8;101753:16;;:19;;101770:1;;101753:19;;;;;;:::i;:::-;;;;;;;;101742:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;101748:1;101742:8;;;;;;;:::i;:::-;;;;:30;;;;101781:70;;;;;;;;;;;;;;;;;:8;;;:70;101869:3;101858:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;101864:1;101858:8;;;;;;;:::i;:::-;;;;:14;;;;101881:39;;;;;;;;;;;;;;;;;:5;101887:1;101881:8;;;;;;;:::i;:::-;;;;;;;;;:39;;;;101974:8;;101984;;;;101994;;;;;102004;;;;102014;;;;102024;;;;102034;;;;101957:86;;101927:20;;101957:86;;101974:8;101984;102034;101957:86;;:::i;:::-;;;;;;;;;;;;;101927:117;;102049:18;102070:197;102229:28;102249:6;102229:13;:28::i;:::-;102097:167;;;;;;;;:::i;:::-;;;;;;;;;;;;;102070:13;:197::i;:::-;102049:218;;102338:4;102288:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;102288:55:0;;;;;;;;;;101079:1290;-1:-1:-1;;;;;101079:1290:0:o;26970:201::-;26134:6;;-1:-1:-1;;;;;26134:6:0;25008:10;26281:23;26273:68;;;;-1:-1:-1;;;26273:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27059:22:0;::::1;27051:73;;;::::0;-1:-1:-1;;;27051:73:0;;15192:2:1;27051:73:0::1;::::0;::::1;15174:21:1::0;15231:2;15211:18;;;15204:30;15270:34;15250:18;;;15243:62;-1:-1:-1;;;15321:18:1;;;15314:36;15367:19;;27051:73:0::1;14990:402:1::0;27051:73:0::1;27135:28;27154:8;27135:18;:28::i;:::-;26970:201:::0;:::o;5564:384::-;-1:-1:-1;;;;;5639:16:0;;5631:46;;;;-1:-1:-1;;;5631:46:0;;9043:2:1;5631:46:0;;;9025:21:1;9082:2;9062:18;;;9055:30;-1:-1:-1;;;9101:18:1;;;9094:47;9158:18;;5631:46:0;8841:341:1;5631:46:0;5722:1;5698:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5698:12:0;:26;5690:53;;;;-1:-1:-1;;;5690:53:0;;15599:2:1;5690:53:0;;;15581:21:1;15638:2;15618:18;;;15611:30;-1:-1:-1;;;15657:18:1;;;15650:44;15711:18;;5690:53:0;15397:338:1;5690:53:0;-1:-1:-1;;;;;5837:14:0;;;;;;:10;:14;;;;;;;;:16;;;;;;5877:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;5877:17:0;;;;;5912:28;5886:2;;5837:14;;5912:28;;5837:14;;5912:28;5564:384;;:::o;27331:191::-;27424:6;;;-1:-1:-1;;;;;27441:17:0;;;-1:-1:-1;;;;;;27441:17:0;;;;;;;27474:40;;27424:6;;;27441:17;27424:6;;27474:40;;27405:16;;27474:40;27394:128;27331:191;:::o;27993:3097::-;28051:13;28288:4;:11;28303:1;28288:16;28284:31;;;-1:-1:-1;;28306:9:0;;;;;;;;;-1:-1:-1;28306:9:0;;;27993:3097::o;28284:31::-;28368:19;28390:6;;;;;;;;;;;;;;;;;28368:28;;28807:20;28866:1;28847:4;:11;28861:1;28847:15;;;;:::i;:::-;28846:21;;;;:::i;:::-;28841:27;;:1;:27;:::i;:::-;28830:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28830:39:0;;28807:62;;29049:1;29042:5;29038:13;29153:2;29145:6;29141:15;29264:4;29316;29310:11;29304:4;29300:22;29226:1432;29350:6;29341:7;29338:19;29226:1432;;;29456:1;29447:7;29443:15;29432:26;;29495:7;29489:14;30148:4;30140:5;30136:2;30132:14;30128:25;30118:8;30114:40;30108:47;30097:9;30089:67;30202:1;30191:9;30187:17;30174:30;;30294:4;30286:5;30282:2;30278:14;30274:25;30264:8;30260:40;30254:47;30243:9;30235:67;30348:1;30337:9;30333:17;30320:30;;30439:4;30431:5;30428:1;30424:13;30420:24;30410:8;30406:39;30400:46;30389:9;30381:66;30493:1;30482:9;30478:17;30465:30;;30576:4;30569:5;30565:16;30555:8;30551:31;30545:38;30534:9;30526:58;;30630:1;30619:9;30615:17;30602:30;;29226:1432;;;29230:107;;30820:1;30813:4;30807:11;30803:19;30841:1;30836:123;;;;30978:1;30973:73;;;;30796:250;;30836:123;30889:4;30885:1;30874:9;30870:17;30862:32;30939:4;30935:1;30924:9;30920:17;30912:32;30836:123;;30973:73;31026:4;31022:1;31011:9;31007:17;30999:32;30796:250;-1:-1:-1;31076:6:0;;27993:3097;-1:-1:-1;;;;;27993:3097:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;840:1;831:6;826:3;822:16;815:27;796:48;;592:258;;;:::o;855:383::-;1004:2;993:9;986:21;967:4;1036:6;1030:13;1079:6;1074:2;1063:9;1059:18;1052:34;1095:66;1154:6;1149:2;1138:9;1134:18;1129:2;1121:6;1117:15;1095:66;:::i;:::-;1222:2;1201:15;-1:-1:-1;;1197:29:1;1182:45;;;;1229:2;1178:54;;855:383;-1:-1:-1;;855:383:1:o;1243:180::-;1302:6;1355:2;1343:9;1334:7;1330:23;1326:32;1323:52;;;1371:1;1368;1361:12;1323:52;-1:-1:-1;1394:23:1;;1243:180;-1:-1:-1;1243:180:1:o;1636:173::-;1704:20;;-1:-1:-1;;;;;1753:31:1;;1743:42;;1733:70;;1799:1;1796;1789:12;1814:254;1882:6;1890;1943:2;1931:9;1922:7;1918:23;1914:32;1911:52;;;1959:1;1956;1949:12;1911:52;1982:29;2001:9;1982:29;:::i;:::-;1972:39;2058:2;2043:18;;;;2030:32;;-1:-1:-1;;;1814:254:1:o;2073:127::-;2134:10;2129:3;2125:20;2122:1;2115:31;2165:4;2162:1;2155:15;2189:4;2186:1;2179:15;2205:251;2277:2;2271:9;;;2307:15;;2352:18;2337:34;;2373:22;;;2334:62;2331:88;;;2399:18;;:::i;:::-;2435:2;2428:22;2205:251;:::o;2461:275::-;2532:2;2526:9;2597:2;2578:13;;-1:-1:-1;;2574:27:1;2562:40;;2632:18;2617:34;;2653:22;;;2614:62;2611:88;;;2679:18;;:::i;:::-;2715:2;2708:22;2461:275;;-1:-1:-1;2461:275:1:o;2741:1638::-;2842:6;2850;2903:2;2891:9;2882:7;2878:23;2874:32;2871:52;;;2919:1;2916;2909:12;2871:52;2942:29;2961:9;2942:29;:::i;:::-;2932:39;;2990:2;3043;3032:9;3028:18;3015:32;3066:18;3107:2;3099:6;3096:14;3093:34;;;3123:1;3120;3113:12;3093:34;3161:6;3150:9;3146:22;3136:32;;3187:4;3227:7;3222:2;3218;3214:11;3210:25;3200:53;;3249:1;3246;3239:12;3200:53;3273:22;;:::i;:::-;3317:3;3351:2;3347;3343:11;3377:7;3369:6;3366:19;3363:39;;;3398:1;3395;3388:12;3363:39;3422:2;3433:916;3449:6;3444:3;3441:15;3433:916;;;3535:3;3522:17;3571:2;3558:11;3555:19;3552:109;;;3615:1;3644:2;3640;3633:14;3552:109;3684:20;;3731:11;;;3727:25;-1:-1:-1;3717:123:1;;3794:1;3823:2;3819;3812:14;3717:123;3876:2;3863:16;3902:2;3898;3895:10;3892:36;;;3908:18;;:::i;:::-;3954:51;3978:11;;;-1:-1:-1;;3974:25:1;3970:34;;3954:51;:::i;:::-;4032:2;4025:5;4018:17;4076:7;4071:2;4066;4062;4058:11;4054:20;4051:33;4048:123;;;4125:1;4154:2;4150;4143:14;4048:123;4226:2;4221;4217;4213:11;4208:2;4201:5;4197:14;4184:45;4274:1;4253:14;;;4249:23;;4242:34;;;;4289:18;;-1:-1:-1;4327:12:1;;;;3466;;3433:916;;;-1:-1:-1;2741:1638:1;;4368:5;;-1:-1:-1;2741:1638:1;-1:-1:-1;;;;;;;;2741:1638:1:o;4384:328::-;4461:6;4469;4477;4530:2;4518:9;4509:7;4505:23;4501:32;4498:52;;;4546:1;4543;4536:12;4498:52;4569:29;4588:9;4569:29;:::i;:::-;4559:39;;4617:38;4651:2;4640:9;4636:18;4617:38;:::i;:::-;4607:48;;4702:2;4691:9;4687:18;4674:32;4664:42;;4384:328;;;;;:::o;4717:186::-;4776:6;4829:2;4817:9;4808:7;4804:23;4800:32;4797:52;;;4845:1;4842;4835:12;4797:52;4868:29;4887:9;4868:29;:::i;5090:348::-;5142:8;5152:6;5206:3;5199:4;5191:6;5187:17;5183:27;5173:55;;5224:1;5221;5214:12;5173:55;-1:-1:-1;5247:20:1;;5290:18;5279:30;;5276:50;;;5322:1;5319;5312:12;5276:50;5359:4;5351:6;5347:17;5335:29;;5411:3;5404:4;5395:6;5387;5383:19;5379:30;5376:39;5373:59;;;5428:1;5425;5418:12;5373:59;5090:348;;;;;:::o;5443:411::-;5514:6;5522;5575:2;5563:9;5554:7;5550:23;5546:32;5543:52;;;5591:1;5588;5581:12;5543:52;5631:9;5618:23;5664:18;5656:6;5653:30;5650:50;;;5696:1;5693;5686:12;5650:50;5735:59;5786:7;5777:6;5766:9;5762:22;5735:59;:::i;:::-;5813:8;;5709:85;;-1:-1:-1;5443:411:1;-1:-1:-1;;;;5443:411:1:o;5859:248::-;5927:6;5935;5988:2;5976:9;5967:7;5963:23;5959:32;5956:52;;;6004:1;6001;5994:12;5956:52;-1:-1:-1;;6027:23:1;;;6097:2;6082:18;;;6069:32;;-1:-1:-1;5859:248:1:o;6112:347::-;6177:6;6185;6238:2;6226:9;6217:7;6213:23;6209:32;6206:52;;;6254:1;6251;6244:12;6206:52;6277:29;6296:9;6277:29;:::i;:::-;6267:39;;6356:2;6345:9;6341:18;6328:32;6403:5;6396:13;6389:21;6382:5;6379:32;6369:60;;6425:1;6422;6415:12;6369:60;6448:5;6438:15;;;6112:347;;;;;:::o;6464:627::-;6561:6;6569;6577;6585;6593;6646:3;6634:9;6625:7;6621:23;6617:33;6614:53;;;6663:1;6660;6653:12;6614:53;6686:29;6705:9;6686:29;:::i;:::-;6676:39;;6734:38;6768:2;6757:9;6753:18;6734:38;:::i;:::-;6724:48;;6819:2;6808:9;6804:18;6791:32;6781:42;;6874:2;6863:9;6859:18;6846:32;6901:18;6893:6;6890:30;6887:50;;;6933:1;6930;6923:12;6887:50;6972:59;7023:7;7014:6;7003:9;6999:22;6972:59;:::i;:::-;6464:627;;;;-1:-1:-1;6464:627:1;;-1:-1:-1;7050:8:1;;6946:85;6464:627;-1:-1:-1;;;6464:627:1:o;7096:260::-;7164:6;7172;7225:2;7213:9;7204:7;7200:23;7196:32;7193:52;;;7241:1;7238;7231:12;7193:52;7264:29;7283:9;7264:29;:::i;:::-;7254:39;;7312:38;7346:2;7335:9;7331:18;7312:38;:::i;:::-;7302:48;;7096:260;;;;;:::o;7361:380::-;7440:1;7436:12;;;;7483;;;7504:61;;7558:4;7550:6;7546:17;7536:27;;7504:61;7611:2;7603:6;7600:14;7580:18;7577:38;7574:161;;;7657:10;7652:3;7648:20;7645:1;7638:31;7692:4;7689:1;7682:15;7720:4;7717:1;7710:15;7574:161;;7361:380;;;:::o;9187:356::-;9389:2;9371:21;;;9408:18;;;9401:30;9467:34;9462:2;9447:18;;9440:62;9534:2;9519:18;;9187:356::o;10108:249::-;10177:6;10230:2;10218:9;10209:7;10205:23;10201:32;10198:52;;;10246:1;10243;10236:12;10198:52;10278:9;10272:16;10297:30;10321:5;10297:30;:::i;11387:662::-;-1:-1:-1;;;;;11666:15:1;;;11648:34;;11718:15;;11713:2;11698:18;;11691:43;11765:2;11750:18;;11743:34;;;11813:3;11808:2;11793:18;;11786:31;;;11833:19;;11826:35;;;11591:4;11854:6;11904;11628:3;11883:19;;11870:49;11969:1;11963:3;11954:6;11943:9;11939:22;11935:32;11928:43;12039:3;12032:2;12028:7;12023:2;12015:6;12011:15;12007:29;11996:9;11992:45;11988:55;11980:63;;11387:662;;;;;;;;:::o;12054:127::-;12115:10;12110:3;12106:20;12103:1;12096:31;12146:4;12143:1;12136:15;12170:4;12167:1;12160:15;12186:1449;12605:3;12643:6;12637:13;12669:4;12682:51;12726:6;12721:3;12716:2;12708:6;12704:15;12682:51;:::i;:::-;12796:13;;12755:16;;;;12818:55;12796:13;12755:16;12840:15;;;12818:55;:::i;:::-;12940:13;;12895:20;;;12962:55;12940:13;12895:20;12984:15;;;12962:55;:::i;:::-;13084:13;;13039:20;;;13106:55;13084:13;13039:20;13128:15;;;13106:55;:::i;:::-;13228:13;;13183:20;;;13250:55;13228:13;13183:20;13272:15;;;13250:55;:::i;:::-;13372:13;;13327:20;;;13394:55;13372:13;13327:20;13416:15;;;13394:55;:::i;:::-;13516:13;;13471:20;;;13538:55;13516:13;13471:20;13560:15;;;13538:55;:::i;:::-;13609:20;;;;;12186:1449;-1:-1:-1;;;;;;;;;;12186:1449:1:o;13640:892::-;14003:66;13998:3;13991:79;14100:66;14095:2;14090:3;14086:12;14079:88;14197:66;14192:2;14187:3;14183:12;14176:88;-1:-1:-1;;;14289:2:1;14284:3;14280:12;14273:39;13973:3;14341:6;14335:13;14357:61;14411:6;14405:3;14400;14396:13;14391:2;14383:6;14379:15;14357:61;:::i;:::-;-1:-1:-1;;;14477:3:1;14437:16;;;;14469:12;;;14462:36;-1:-1:-1;14522:3:1;14514:12;;13640:892;-1:-1:-1;13640:892:1:o;14537:448::-;14799:31;14794:3;14787:44;14769:3;14860:6;14854:13;14876:62;14931:6;14926:2;14921:3;14917:12;14910:4;14902:6;14898:17;14876:62;:::i;:::-;14958:16;;;;14976:2;14954:25;;14537:448;-1:-1:-1;;14537:448:1:o;15740:127::-;15801:10;15796:3;15792:20;15789:1;15782:31;15832:4;15829:1;15822:15;15856:4;15853:1;15846:15;15872:128;15912:3;15943:1;15939:6;15936:1;15933:13;15930:39;;;15949:18;;:::i;:::-;-1:-1:-1;15985:9:1;;15872:128::o;16005:217::-;16045:1;16071;16061:132;;16115:10;16110:3;16106:20;16103:1;16096:31;16150:4;16147:1;16140:15;16178:4;16175:1;16168:15;16061:132;-1:-1:-1;16207:9:1;;16005:217::o;16227:168::-;16267:7;16333:1;16329;16325:6;16321:14;16318:1;16315:21;16310:1;16303:9;16296:17;16292:45;16289:71;;;16340:18;;:::i;:::-;-1:-1:-1;16380:9:1;;16227:168::o

Swarm Source

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