ETH Price: $2,590.52 (-3.53%)
Gas: 4 Gwei

Token

Maya (MAYA)
 

Overview

Max Total Supply

22 MAYA

Holders

22

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Earth Art - Psychedelic: Deployer
0x330607b513276D63440Ab4eED09342Ee01C7D3b7
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:
Maya

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-17
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

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

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

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

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

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

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

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

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

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

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

contract Maya is ERC1155, DefaultOperatorFilterer, Ownable {
    uint256 public numTokens = 0;
    string public name = "Maya";
    string public symbol = "MAYA";
    address public crossmintAddress =
        0xdAb1a1854214684acE522439684a145E62505233;

    event Crossmint(
        address indexed to,
        uint256 indexed tokenId,
        uint256 amount
    );
    event Mint(address indexed to, uint256 indexed tokenId, uint256 amount);
    event Lend(
        address indexed lender,
        uint256 indexed tokenId,
        uint256 duration,
        uint256 timestamp,
        bytes32 listingId
    );
    event Rent(
        address indexed renter,
        address indexed lender,
        uint256 indexed tokenId,
        uint256 duration,
        uint256 timestamp,
        bytes32 listingId
    );
    event Removed(
        address indexed lender,
        address indexed renter,
        uint256 indexed tokenId,
        bytes32 listingId
    );

    struct Token {
        uint256 publicPrice;
        uint256 allowlistPrice;
        uint256 totalSupply;
        uint256 minted;
        uint256 startTime;
        uint256 endTime;
        string uri;
        bytes32 merkleRoot;
    }

    struct Lending {
        address payable lender;
        uint256 duration;
        uint256 tokenId;
        uint256 price;
        uint256 timestamp;
    }

    struct Renting {
        address renter;
    }

    struct LendingRenting {
        Lending lending;
        Renting renting;
    }

    mapping(uint256 => Token) public tokens;
    mapping(bytes32 => LendingRenting) public listings;
    mapping(address => mapping(uint256 => uint256)) public lendingBalances;

    constructor() ERC1155("") {}

    function _leaf(string memory tokenId, string memory payload)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(payload, tokenId));
    }

    function setCrossmintAddress(address _crossmintAddress) public onlyOwner {
        crossmintAddress = _crossmintAddress;
    }

    function lend(
        uint256 tokenId,
        uint256 duration,
        uint256 price
    ) public {
        bytes32 listingId = keccak256(
            abi.encodePacked(msg.sender, tokenId, duration, block.timestamp)
        );
        require(
            block.timestamp >=
                block.timestamp + listings[listingId].lending.duration,
            "Maya: Lending period has not ended"
        );
        require(
            listings[listingId].lending.tokenId == tokenId,
            "Maya: Token ID does not match"
        );
        require(
            listings[listingId].lending.lender == address(0),
            "Maya: Lending period has not started"
        );
        require(
            lendingBalances[msg.sender][tokenId] <
                balanceOf(msg.sender, tokenId),
            "Maya: Cant lend more than you own"
        );

        listings[listingId].lending.lender = payable(msg.sender);
        listings[listingId].lending.duration = duration;
        listings[listingId].lending.price = price;
        listings[listingId].lending.timestamp = block.timestamp;

        lendingBalances[msg.sender][tokenId] += 1;

        emit Lend(msg.sender, tokenId, duration, block.timestamp, listingId);
    }

    function rent(bytes32 listingId) public payable {
        require(
            listings[listingId].lending.lender != address(0),
            "Maya: Invalid listing ID"
        );
        require(
            listings[listingId].lending.price == msg.value,
            "Maya: Price does not match"
        );
        require(
            listings[listingId].renting.renter == address(0),
            "Maya: Token is already rented"
        );

        listings[listingId].renting.renter = payable(msg.sender);
        listings[listingId].lending.lender.transfer(msg.value);

        emit Rent(
            msg.sender,
            listings[listingId].lending.lender,
            listings[listingId].lending.tokenId,
            listings[listingId].lending.duration,
            listings[listingId].lending.timestamp,
            listingId
        );
    }

    function removeListing(bytes32 listingId) public {
        require(
            listings[listingId].lending.lender == msg.sender,
            "Maya: Only lender can remove listing"
        );
        require(
            listings[listingId].renting.renter == address(0) ||
                block.timestamp >=
                listings[listingId].lending.timestamp +
                    listings[listingId].lending.duration,
            "Maya: Renting period has not ended"
        );

        if (
            lendingBalances[msg.sender][listings[listingId].lending.tokenId] > 0
        ) {
            lendingBalances[msg.sender][
                listings[listingId].lending.tokenId
            ] -= 1;
        }

        delete listings[listingId];

        emit Removed(
            msg.sender,
            listings[listingId].renting.renter,
            listings[listingId].lending.tokenId,
            listingId
        );
    }

    function getListingById(bytes32 listingId)
        public
        view
        returns (LendingRenting memory)
    {
        return listings[listingId];
    }

    function getListing(
        address lender,
        uint256 tokenId,
        uint256 duration,
        uint256 timestamp
    ) public view returns (LendingRenting memory) {
        bytes32 listingId = keccak256(
            abi.encodePacked(lender, tokenId, duration, timestamp)
        );
        return listings[listingId];
    }

    function mint(
        uint256 tokenId,
        uint256 count,
        bytes32[] calldata proof
    ) external payable {
        require(tokenId <= numTokens, "invalid token id");

        if (msg.sender != owner()) {
            string memory payload = string(abi.encodePacked(msg.sender));

            uint256 price = tokens[tokenId].allowlistPrice;

            if (proof.length == 0) {
                price = tokens[tokenId].publicPrice;
            } else {
                require(
                    MerkleProof.verify(
                        proof,
                        tokens[tokenId].merkleRoot,
                        _leaf(Strings.toString(tokenId), payload)
                    ),
                    "invalid proof"
                );
            }

            require(
                block.timestamp > tokens[tokenId].startTime &&
                    block.timestamp < tokens[tokenId].endTime,
                "token not active"
            );
            if (tokens[tokenId].totalSupply > 0) {
                require(
                    tokens[tokenId].minted + count <=
                        tokens[tokenId].totalSupply,
                    "exceeds total supply"
                );
            }
            require(count * price == msg.value, "invalid value");
        }

        tokens[tokenId].minted += count;
        _mint(msg.sender, tokenId, count, "");

        emit Mint(msg.sender, tokenId, count);
    }

    function crossmint(
        address to,
        uint256 tokenId,
        uint256 count
    ) public payable {
        require(tokenId <= numTokens, "invalid token id");
        require(
            msg.value >= tokens[tokenId].publicPrice * count,
            "invalid value"
        );
        require(
            tokens[tokenId].minted + count <= tokens[tokenId].totalSupply,
            "exceeds total supply"
        );
        require(
            msg.sender == crossmintAddress,
            "this function is for crossmint only"
        );
        require(
            block.timestamp > tokens[tokenId].startTime &&
                block.timestamp < tokens[tokenId].endTime,
            "token not active"
        );

        tokens[tokenId].minted += count;
        _mint(to, tokenId, count, "");

        emit Crossmint(to, tokenId, count);
    }

    function addToken(
        uint256 _publicPrice,
        uint256 _allowlistPrice,
        uint256 _totalSupply,
        uint256 _startTime,
        uint256 _endTime,
        string memory _uri,
        bytes32 _merkleRoot
    ) public onlyOwner {
        Token storage token = tokens[numTokens];
        token.publicPrice = _publicPrice;
        token.allowlistPrice = _allowlistPrice;
        token.totalSupply = _totalSupply;
        token.startTime = _startTime;
        token.endTime = _endTime;
        token.uri = _uri;
        token.merkleRoot = _merkleRoot;

        numTokens += 1;
    }

    function editToken(
        uint256 tokenId,
        uint256 _publicPrice,
        uint256 _allowlistPrice,
        uint256 _totalSupply,
        uint256 _startTime,
        uint256 _endTime,
        string memory _uri,
        bytes32 _merkleRoot
    ) public onlyOwner {
        Token storage token = tokens[tokenId];
        token.publicPrice = _publicPrice;
        token.allowlistPrice = _allowlistPrice;
        token.totalSupply = _totalSupply;
        token.startTime = _startTime;
        token.endTime = _endTime;
        token.uri = _uri;
        token.merkleRoot = _merkleRoot;
    }

    function editAllowlist(uint256 tokenId, bytes32 _merkleRoot)
        public
        onlyOwner
    {
        tokens[tokenId].merkleRoot = _merkleRoot;
    }

    function editPublicPrice(uint256 tokenId, uint256 _publicPrice)
        public
        onlyOwner
    {
        tokens[tokenId].publicPrice = _publicPrice;
    }

    function editAllowlistPrice(uint256 tokenId, uint256 _allowlistPrice)
        public
        onlyOwner
    {
        tokens[tokenId].allowlistPrice = _allowlistPrice;
    }

    function editTotalSupply(uint256 tokenId, uint256 _totalSupply)
        public
        onlyOwner
    {
        tokens[tokenId].totalSupply = _totalSupply;
    }

    function editStartTime(uint256 tokenId, uint256 _startTime)
        public
        onlyOwner
    {
        tokens[tokenId].startTime = _startTime;
    }

    function editEndTime(uint256 tokenId, uint256 _endTime) public onlyOwner {
        tokens[tokenId].endTime = _endTime;
    }

    function editUri(uint256 tokenId, string memory _uri) public onlyOwner {
        tokens[tokenId].uri = _uri;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = owner().call{value: address(this).balance}("");
        require(success, "failed to receive ether");
    }

    function uri(uint256 tokenId) public view override returns (string memory) {
        return tokens[tokenId].uri;
    }

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

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

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from != address(0)) {
            for (uint256 i = 0; i < ids.length; i++) {
                uint256 tokenId = ids[i];
                uint256 amount = amounts[i];
                uint256 fromBalance = balanceOf(from, tokenId);
                uint256 lendingBalance = lendingBalances[from][tokenId];
                require(
                    fromBalance >= lendingBalance,
                    "cannot transfer lending token"
                );
                require(
                    fromBalance - lendingBalance >= amount,
                    "cannot transfer lending token"
                );
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Crossmint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"listingId","type":"bytes32"}],"name":"Lend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","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":"lender","type":"address"},{"indexed":true,"internalType":"address","name":"renter","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"listingId","type":"bytes32"}],"name":"Removed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"renter","type":"address"},{"indexed":true,"internalType":"address","name":"lender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"listingId","type":"bytes32"}],"name":"Rent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"uint256","name":"_allowlistPrice","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crossmintAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"editAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_allowlistPrice","type":"uint256"}],"name":"editAllowlistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"editEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"editPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"editStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"uint256","name":"_allowlistPrice","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"editToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"}],"name":"editTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"editUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getListing","outputs":[{"components":[{"components":[{"internalType":"address payable","name":"lender","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Maya.Lending","name":"lending","type":"tuple"},{"components":[{"internalType":"address","name":"renter","type":"address"}],"internalType":"struct Maya.Renting","name":"renting","type":"tuple"}],"internalType":"struct Maya.LendingRenting","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"listingId","type":"bytes32"}],"name":"getListingById","outputs":[{"components":[{"components":[{"internalType":"address payable","name":"lender","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Maya.Lending","name":"lending","type":"tuple"},{"components":[{"internalType":"address","name":"renter","type":"address"}],"internalType":"struct Maya.Renting","name":"renting","type":"tuple"}],"internalType":"struct Maya.LendingRenting","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"lend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lendingBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"listings","outputs":[{"components":[{"internalType":"address payable","name":"lender","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Maya.Lending","name":"lending","type":"tuple"},{"components":[{"internalType":"address","name":"renter","type":"address"}],"internalType":"struct Maya.Renting","name":"renting","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"listingId","type":"bytes32"}],"name":"removeListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"listingId","type":"bytes32"}],"name":"rent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","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":"address","name":"_crossmintAddress","type":"address"}],"name":"setCrossmintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"uint256","name":"allowlistPrice","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000600490815560c06040526080908152634d61796160e01b60a0526005906200002a908262000325565b506040805180820190915260048152634d41594160e01b602082015260069062000055908262000325565b50600780546001600160a01b03191673dab1a1854214684ace522439684a145e625052331790553480156200008957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb6600160405180602001604052806000815250620000c2816200021c60201b60201c565b506daaeb6d7670e522a718067333cd4e3b15620002085780156200015657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200013757600080fd5b505af11580156200014c573d6000803e3d6000fd5b5050505062000208565b6001600160a01b03821615620001a75760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200011c565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001ee57600080fd5b505af115801562000203573d6000803e3d6000fd5b505050505b50620002169050336200022e565b620003f1565b60026200022a828262000325565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002ab57607f821691505b602082108103620002cc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032057600081815260208120601f850160051c81016020861015620002fb5750805b601f850160051c820191505b818110156200031c5782815560010162000307565b5050505b505050565b81516001600160401b0381111562000341576200034162000280565b620003598162000352845462000296565b84620002d2565b602080601f831160018114620003915760008415620003785750858301515b600019600386901b1c1916600185901b1785556200031c565b600085815260208120601f198616915b82811015620003c257888601518255948401946001909101908401620003a1565b5085821015620003e15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b613f7180620004016000396000f3fe60806040526004361061024e5760003560e01c806365f7d09211610138578063a22cb465116100b0578063e985e9c51161007f578063f242432a11610064578063f242432a1461078b578063f2fde38b146107ab578063f62284ac146107cb57600080fd5b8063e985e9c514610722578063e9daf0de1461076b57600080fd5b8063a22cb4651461064e578063a6d480e11461066e578063c18b8db414610681578063e6d37b881461070f57600080fd5b80638e499bcf1161010757806393b30653116100ec57806393b306531461059c57806395d89b4114610619578063997556241461062e57600080fd5b80638e499bcf1461056657806390a1ad901461057c57600080fd5b806365f7d092146104f3578063715018a614610513578063763d788e146105285780638da5cb5b1461054857600080fd5b80633ce6a706116101cb5780634f64b2be1161019a578063549b41341161017f578063549b41341461047b578063550ee1331461049b5780635b2a55e4146104bb57600080fd5b80634f64b2be1461040f578063515390d01461044357600080fd5b80633ce6a706146103825780633d4d65ec146103a25780634bcc7d7d146103c25780634e1273f4146103e257600080fd5b80630e89341c116102225780632bed89e5116102075780632bed89e51461032d5780632eb2c2d61461034d5780633ccfd60b1461036d57600080fd5b80630e89341c146102fa5780631d6f24e31461031a57600080fd5b8062fdd58e1461025357806301ffc9a71461028657806306fdde03146102b65780630c0e0688146102d8575b600080fd5b34801561025f57600080fd5b5061027361026e3660046132ad565b6107eb565b6040519081526020015b60405180910390f35b34801561029257600080fd5b506102a66102a1366004613305565b610897565b604051901515815260200161027d565b3480156102c257600080fd5b506102cb61097a565b60405161027d9190613372565b3480156102e457600080fd5b506102f86102f3366004613385565b610a08565b005b34801561030657600080fd5b506102cb6103153660046133a7565b610a22565b6102f86103283660046133c0565b610ac7565b34801561033957600080fd5b506102f86103483660046133f3565b610d7c565b34801561035957600080fd5b506102f8610368366004613584565b6110b6565b34801561037957600080fd5b506102f86111c7565b34801561038e57600080fd5b506102f861039d366004613385565b611286565b3480156103ae57600080fd5b506102f86103bd36600461362e565b6112a3565b3480156103ce57600080fd5b506102f86103dd3660046136a5565b611315565b3480156103ee57600080fd5b506104026103fd3660046136ec565b61133d565b60405161027d91906137e8565b34801561041b57600080fd5b5061042f61042a3660046133a7565b61147b565b60405161027d9897969594939291906137fb565b34801561044f57600080fd5b5061027361045e3660046132ad565b600a60209081526000928352604080842090915290825290205481565b34801561048757600080fd5b506102f8610496366004613385565b61154b565b3480156104a757600080fd5b506102f86104b63660046133a7565b611568565b3480156104c757600080fd5b506007546104db906001600160a01b031681565b6040516001600160a01b03909116815260200161027d565b3480156104ff57600080fd5b506102f861050e366004613385565b6117b1565b34801561051f57600080fd5b506102f86117ce565b34801561053457600080fd5b506102f8610543366004613385565b6117e2565b34801561055457600080fd5b506003546001600160a01b03166104db565b34801561057257600080fd5b5061027360045481565b34801561058857600080fd5b506102f8610597366004613385565b6117ff565b3480156105a857600080fd5b506105bc6105b73660046133a7565b61181c565b60405161027d9190815180516001600160a01b031682526020808201519083015260408082015190830152606080820151908301526080908101519082015260c081016001600160a01b036020840151511660a083015292915050565b34801561062557600080fd5b506102cb611899565b34801561063a57600080fd5b506102f8610649366004613849565b6118a6565b34801561065a57600080fd5b506102f8610669366004613872565b6118e8565b6102f861067c3660046133a7565b6119de565b34801561068d57600080fd5b5061070161069c3660046133a7565b600960209081526000918252604091829020825160a08101845281546001600160a01b03908116825260018301548285015260028301548286015260038301546060830152600483015460808301528451938401909452600590910154909216815282565b60405161027d9291906138a9565b6102f861071d366004613902565b611beb565b34801561072e57600080fd5b506102a661073d366004613985565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561077757600080fd5b506105bc6107863660046139b8565b611f45565b34801561079757600080fd5b506102f86107a63660046139f1565b61201c565b3480156107b757600080fd5b506102f86107c6366004613849565b612120565b3480156107d757600080fd5b506102f86107e6366004613a56565b6121ad565b60006001600160a01b03831661086e5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061092a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061089157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610891565b6005805461098790613ad7565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390613ad7565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b505050505081565b610a106121fe565b60009182526008602052604090912055565b6000818152600860205260409020600601805460609190610a4290613ad7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90613ad7565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b50505050509050919050565b600454821115610b195760405162461bcd60e51b815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606401610865565b600082815260086020526040902054610b33908290613b59565b341015610b825760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642076616c7565000000000000000000000000000000000000006044820152606401610865565b60008281526008602052604090206002810154600390910154610ba6908390613b70565b1115610bf45760405162461bcd60e51b815260206004820152601460248201527f6578636565647320746f74616c20737570706c790000000000000000000000006044820152606401610865565b6007546001600160a01b03163314610c745760405162461bcd60e51b815260206004820152602360248201527f746869732066756e6374696f6e20697320666f722063726f73736d696e74206f60448201527f6e6c7900000000000000000000000000000000000000000000000000000000006064820152608401610865565b60008281526008602052604090206004015442118015610ca4575060008281526008602052604090206005015442105b610cf05760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f7420616374697665000000000000000000000000000000006044820152606401610865565b60008281526008602052604081206003018054839290610d11908490613b70565b92505081905550610d3383838360405180602001604052806000815250612258565b81836001600160a01b03167fbb4e705ab024d593d85132abfc80ec7f77e853ee64d9c327e347c4fa7bbda10f83604051610d6f91815260200190565b60405180910390a3505050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018490526054810183905242607482015260009060940160408051601f19818403018152918152815160209283012060008181526009909352912060010154909150610df99042613b70565b421015610e6e5760405162461bcd60e51b815260206004820152602260248201527f4d6179613a204c656e64696e6720706572696f6420686173206e6f7420656e6460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610865565b6000818152600960205260409020600201548414610ece5760405162461bcd60e51b815260206004820152601d60248201527f4d6179613a20546f6b656e20494420646f6573206e6f74206d617463680000006044820152606401610865565b6000818152600960205260409020546001600160a01b031615610f585760405162461bcd60e51b8152602060048201526024808201527f4d6179613a204c656e64696e6720706572696f6420686173206e6f742073746160448201527f72746564000000000000000000000000000000000000000000000000000000006064820152608401610865565b610f6233856107eb565b336000908152600a6020908152604080832088845290915290205410610ff05760405162461bcd60e51b815260206004820152602160248201527f4d6179613a2043616e74206c656e64206d6f7265207468616e20796f75206f7760448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610865565b600081815260096020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016339081178255600180830189905560038301889055426004909301929092558452600a83528184208885529092528220805491929091611066908490613b70565b909155505060408051848152426020820152908101829052849033907f5fc8819348a4c59f841c896836637ce1e5c73561a915da5e34fcf65ea8ca2290906060015b60405180910390a350505050565b846daaeb6d7670e522a718067333cd4e3b156111b257336001600160a01b038216036110ee576110e98686868686612397565b6111bf565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190613b83565b6111b2576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610865565b6111bf8686868686612397565b505050505050565b6111cf6121fe565b60006111e36003546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d806000811461122d576040519150601f19603f3d011682016040523d82523d6000602084013e611232565b606091505b50509050806112835760405162461bcd60e51b815260206004820152601760248201527f6661696c656420746f20726563656976652065746865720000000000000000006044820152606401610865565b50565b61128e6121fe565b60009182526008602052604090912060070155565b6112ab6121fe565b600480546000908152600860205260409020888155600181018890556002810187905590810185905560058101849055600681016112e98482613be6565b508181600701819055506001600460008282546113069190613b70565b90915550505050505050505050565b61131d6121fe565b60008281526008602052604090206006016113388282613be6565b505050565b606081518351146113b65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610865565b6000835167ffffffffffffffff8111156113d2576113d261341f565b6040519080825280602002602001820160405280156113fb578160200160208202803683370190505b50905060005b84518110156114735761144685828151811061141f5761141f613ce2565b602002602001015185838151811061143957611439613ce2565b60200260200101516107eb565b82828151811061145857611458613ce2565b602090810291909101015261146c81613d11565b9050611401565b509392505050565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060180546114c290613ad7565b80601f01602080910402602001604051908101604052809291908181526020018280546114ee90613ad7565b801561153b5780601f106115105761010080835404028352916020019161153b565b820191906000526020600020905b81548152906001019060200180831161151e57829003601f168201915b5050505050908060070154905088565b6115536121fe565b60009182526008602052604090912060020155565b6000818152600960205260409020546001600160a01b031633146115f35760405162461bcd60e51b8152602060048201526024808201527f4d6179613a204f6e6c79206c656e6465722063616e2072656d6f7665206c697360448201527f74696e67000000000000000000000000000000000000000000000000000000006064820152608401610865565b6000818152600960205260409020600501546001600160a01b0316158061163c5750600081815260096020526040902060018101546004909101546116389190613b70565b4210155b6116ae5760405162461bcd60e51b815260206004820152602260248201527f4d6179613a2052656e74696e6720706572696f6420686173206e6f7420656e6460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610865565b336000908152600a60209081526040808320848452600983528184206002015484529091529020541561171957336000908152600a60209081526040808320848452600983528184206002015484529091528120805460019290611713908490613d49565b90915550505b600081815260096020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811682556001820185905560028201859055600382018590556004820185905560059091018054909116905551838152829133917f9eb92e1008875cd8eb817d371499331359932d4be7d1279d3c46f23d2a4f153b91015b60405180910390a450565b6117b96121fe565b60009182526008602052604090912060040155565b6117d66121fe565b6117e06000612439565b565b6117ea6121fe565b60009182526008602052604090912060050155565b6118076121fe565b60009182526008602052604090912060010155565b611824613233565b50600090815260096020908152604091829020825160e08101845281546001600160a01b039081168286019081526001840154606084015260028401546080840152600384015460a0840152600484015460c08401528252845180850190955260059092015490911683529081019190915290565b6006805461098790613ad7565b6118ae6121fe565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b816daaeb6d7670e522a718067333cd4e3b156119d4576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561196f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119939190613b83565b6119d4576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610865565b61133883836124a3565b6000818152600960205260409020546001600160a01b0316611a425760405162461bcd60e51b815260206004820152601860248201527f4d6179613a20496e76616c6964206c697374696e6720494400000000000000006044820152606401610865565b6000818152600960205260409020600301543414611aa25760405162461bcd60e51b815260206004820152601a60248201527f4d6179613a20507269636520646f6573206e6f74206d617463680000000000006044820152606401610865565b6000818152600960205260409020600501546001600160a01b031615611b0a5760405162461bcd60e51b815260206004820152601d60248201527f4d6179613a20546f6b656e20697320616c72656164792072656e7465640000006044820152606401610865565b6000818152600960205260408082206005810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555490516001600160a01b0391909116913480156108fc02929091818181858888f19350505050158015611b7c573d6000803e3d6000fd5b506000818152600960209081526040918290206002810154815460018301546004909301548551938452938301939093529281018490526001600160a01b039091169033907f8d48b7678d39fd1d972124d85219d6e515b06d01a86548cb6094a55512c3d746906060016117a6565b600454841115611c3d5760405162461bcd60e51b815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606401610865565b6003546001600160a01b03163314611ece576040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260009060340160408051601f198184030181529181526000878152600860205290812060010154919250839003611cc35750600085815260086020526040902054611d6e565b611d2284848080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508b8152600860205260409020600701549250611d1d9150611d1790508a6124b2565b86612570565b6125a3565b611d6e5760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642070726f6f66000000000000000000000000000000000000006044820152606401610865565b60008681526008602052604090206004015442118015611d9e575060008681526008602052604090206005015442105b611dea5760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f7420616374697665000000000000000000000000000000006044820152606401610865565b60008681526008602052604090206002015415611e735760008681526008602052604090206002810154600390910154611e25908790613b70565b1115611e735760405162461bcd60e51b815260206004820152601460248201527f6578636565647320746f74616c20737570706c790000000000000000000000006044820152606401610865565b34611e7e8287613b59565b14611ecb5760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642076616c7565000000000000000000000000000000000000006044820152606401610865565b50505b60008481526008602052604081206003018054859290611eef908490613b70565b92505081905550611f1133858560405180602001604052806000815250612258565b604051838152849033907f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f906020016110a8565b611f4d613233565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b16602082015260348101859052605481018490526074810183905260009060940160408051808303601f19018152828252805160209182012060009081526009825282902060e08401835280546001600160a01b039081168585019081526001830154606087015260028301546080870152600383015460a0870152600483015460c0870152855283518084019094526005909101541682528201529695505050505050565b846daaeb6d7670e522a718067333cd4e3b1561211357336001600160a01b0382160361204f576110e986868686866125b9565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190613b83565b612113576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610865565b6111bf86868686866125b9565b6121286121fe565b6001600160a01b0381166121a45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610865565b61128381612439565b6121b56121fe565b600088815260086020526040902087815560018101879055600281018690556004810185905560058101849055600681016121f08482613be6565b506007015550505050505050565b6003546001600160a01b031633146117e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610865565b6001600160a01b0384166122d45760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610865565b3360006122e085612654565b905060006122ed85612654565b90506122fe8360008985858961269f565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061232e908490613b70565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461238e836000898989896127e9565b50505050505050565b6001600160a01b0385163314806123b357506123b3853361073d565b6124255760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610865565b61243285858585856129ed565b5050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124ae338383612c91565b5050565b606060006124bf83612d9b565b600101905060008167ffffffffffffffff8111156124df576124df61341f565b6040519080825280601f01601f191660200182016040528015612509576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461251357509392505050565b60008183604051602001612585929190613d5c565b60405160208183030381529060405280519060200120905092915050565b6000826125b08584612e7d565b14949350505050565b6001600160a01b0385163314806125d557506125d5853361073d565b6126475760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610865565b6124328585858585612ec2565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061268e5761268e613ce2565b602090810291909101015292915050565b6001600160a01b038516156111bf5760005b835181101561238e5760008482815181106126ce576126ce613ce2565b6020026020010151905060008483815181106126ec576126ec613ce2565b60200260200101519050600061270289846107eb565b6001600160a01b038a166000908152600a60209081526040808320878452909152902054909150808210156127795760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e73666572206c656e64696e6720746f6b656e0000006044820152606401610865565b826127848284613d49565b10156127d25760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e73666572206c656e64696e6720746f6b656e0000006044820152606401610865565b5050505080806127e190613d11565b9150506126b1565b6001600160a01b0384163b156111bf576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e61906128469089908990889088908890600401613d8b565b6020604051808303816000875af1925050508015612881575060408051601f3d908101601f1916820190925261287e91810190613dce565b60015b6129365761288d613deb565b806308c379a0036128c657506128a1613e07565b806128ac57506128c8565b8060405162461bcd60e51b81526004016108659190613372565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610865565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461238e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610865565b8151835114612a645760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610865565b6001600160a01b038416612ae05760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610865565b33612aef81878787878761269f565b60005b8451811015612c2b576000858281518110612b0f57612b0f613ce2565b602002602001015190506000858381518110612b2d57612b2d613ce2565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015612bd35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610865565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612c10908490613b70565b9250508190555050505080612c2490613d11565b9050612af2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c7b929190613eaf565b60405180910390a46111bf8187878787876130a6565b816001600160a01b0316836001600160a01b031603612d185760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610865565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610d6f565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612de4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612e10576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612e2e57662386f26fc10000830492506010015b6305f5e1008310612e46576305f5e100830492506008015b6127108310612e5a57612710830492506004015b60648310612e6c576064830492506002015b600a83106108915760010192915050565b600081815b845181101561147357612eae82868381518110612ea157612ea1613ce2565b6020026020010151613201565b915080612eba81613d11565b915050612e82565b6001600160a01b038416612f3e5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610865565b336000612f4a85612654565b90506000612f5785612654565b9050612f6783898985858961269f565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612ffe5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610865565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061303b908490613b70565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461309b848a8a8a8a8a6127e9565b505050505050505050565b6001600160a01b0384163b156111bf576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c81906131039089908990889088908890600401613edd565b6020604051808303816000875af192505050801561313e575060408051601f3d908101601f1916820190925261313b91810190613dce565b60015b61314a5761288d613deb565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461238e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610865565b600081831061321d57600082815260208490526040902061322c565b60008381526020839052604090205b9392505050565b60405180604001604052806132796040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b81526040805160208181019092526000815291015290565b80356001600160a01b03811681146132a857600080fd5b919050565b600080604083850312156132c057600080fd5b6132c983613291565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461128357600080fd5b60006020828403121561331757600080fd5b813561322c816132d7565b60005b8381101561333d578181015183820152602001613325565b50506000910152565b6000815180845261335e816020860160208601613322565b601f01601f19169290920160200192915050565b60208152600061322c6020830184613346565b6000806040838503121561339857600080fd5b50508035926020909101359150565b6000602082840312156133b957600080fd5b5035919050565b6000806000606084860312156133d557600080fd5b6133de84613291565b95602085013595506040909401359392505050565b60008060006060848603121561340857600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156134745761347461341f565b6040525050565b600067ffffffffffffffff8211156134955761349561341f565b5060051b60200190565b600082601f8301126134b057600080fd5b813560206134bd8261347b565b6040516134ca828261344e565b83815260059390931b85018201928281019150868411156134ea57600080fd5b8286015b8481101561350557803583529183019183016134ee565b509695505050505050565b600082601f83011261352157600080fd5b813567ffffffffffffffff81111561353b5761353b61341f565b6040516135526020601f19601f850116018261344e565b81815284602083860101111561356757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561359c57600080fd5b6135a586613291565b94506135b360208701613291565b9350604086013567ffffffffffffffff808211156135d057600080fd5b6135dc89838a0161349f565b945060608801359150808211156135f257600080fd5b6135fe89838a0161349f565b9350608088013591508082111561361457600080fd5b5061362188828901613510565b9150509295509295909350565b600080600080600080600060e0888a03121561364957600080fd5b873596506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561368357600080fd5b61368f8a828b01613510565b92505060c0880135905092959891949750929550565b600080604083850312156136b857600080fd5b82359150602083013567ffffffffffffffff8111156136d657600080fd5b6136e285828601613510565b9150509250929050565b600080604083850312156136ff57600080fd5b823567ffffffffffffffff8082111561371757600080fd5b818501915085601f83011261372b57600080fd5b813560206137388261347b565b604051613745828261344e565b83815260059390931b850182019282810191508984111561376557600080fd5b948201945b8386101561378a5761377b86613291565b8252948201949082019061376a565b965050860135925050808211156137a057600080fd5b506136e28582860161349f565b600081518084526020808501945080840160005b838110156137dd578151875295820195908201906001016137c1565b509495945050505050565b60208152600061322c60208301846137ad565b60006101008a83528960208401528860408401528760608401528660808401528560a08401528060c084015261383381840186613346565b9150508260e08301529998505050505050505050565b60006020828403121561385b57600080fd5b61322c82613291565b801515811461128357600080fd5b6000806040838503121561388557600080fd5b61388e83613291565b9150602083013561389e81613864565b809150509250929050565b60c081016138eb82856001600160a01b038151168252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b6001600160a01b0383511660a08301529392505050565b6000806000806060858703121561391857600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561393e57600080fd5b818701915087601f83011261395257600080fd5b81358181111561396157600080fd5b8860208260051b850101111561397657600080fd5b95989497505060200194505050565b6000806040838503121561399857600080fd5b6139a183613291565b91506139af60208401613291565b90509250929050565b600080600080608085870312156139ce57600080fd5b6139d785613291565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613a0957600080fd5b613a1286613291565b9450613a2060208701613291565b93506040860135925060608601359150608086013567ffffffffffffffff811115613a4a57600080fd5b61362188828901613510565b600080600080600080600080610100898b031215613a7357600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c089013567ffffffffffffffff811115613ab457600080fd5b613ac08b828c01613510565b92505060e089013590509295985092959890939650565b600181811c90821680613aeb57607f821691505b602082108103613b24577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761089157610891613b2a565b8082018082111561089157610891613b2a565b600060208284031215613b9557600080fd5b815161322c81613864565b601f82111561133857600081815260208120601f850160051c81016020861015613bc75750805b601f850160051c820191505b818110156111bf57828155600101613bd3565b815167ffffffffffffffff811115613c0057613c0061341f565b613c1481613c0e8454613ad7565b84613ba0565b602080601f831160018114613c675760008415613c315750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111bf565b600085815260208120601f198616915b82811015613c9657888601518255948401946001909101908401613c77565b5085821015613cd257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4257613d42613b2a565b5060010190565b8181038181111561089157610891613b2a565b60008351613d6e818460208801613322565b835190830190613d82818360208801613322565b01949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152613dc360a0830184613346565b979650505050505050565b600060208284031215613de057600080fd5b815161322c816132d7565b600060033d1115613e045760046000803e5060005160e01c5b90565b600060443d1015613e155790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715613e6357505050505090565b8285019150815181811115613e7b5750505050505090565b843d8701016020828501011115613e955750505050505090565b613ea46020828601018761344e565b509095945050505050565b604081526000613ec260408301856137ad565b8281036020840152613ed481856137ad565b95945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152613f0960a08301866137ad565b8281036060840152613f1b81866137ad565b90508281036080840152613f2f8185613346565b9897505050505050505056fea26469706673582212208fbea91db1dfc73037b7330906df2b5a7b212d985f84dae097badcdd140aafd964736f6c63430008110033

Deployed Bytecode

0x60806040526004361061024e5760003560e01c806365f7d09211610138578063a22cb465116100b0578063e985e9c51161007f578063f242432a11610064578063f242432a1461078b578063f2fde38b146107ab578063f62284ac146107cb57600080fd5b8063e985e9c514610722578063e9daf0de1461076b57600080fd5b8063a22cb4651461064e578063a6d480e11461066e578063c18b8db414610681578063e6d37b881461070f57600080fd5b80638e499bcf1161010757806393b30653116100ec57806393b306531461059c57806395d89b4114610619578063997556241461062e57600080fd5b80638e499bcf1461056657806390a1ad901461057c57600080fd5b806365f7d092146104f3578063715018a614610513578063763d788e146105285780638da5cb5b1461054857600080fd5b80633ce6a706116101cb5780634f64b2be1161019a578063549b41341161017f578063549b41341461047b578063550ee1331461049b5780635b2a55e4146104bb57600080fd5b80634f64b2be1461040f578063515390d01461044357600080fd5b80633ce6a706146103825780633d4d65ec146103a25780634bcc7d7d146103c25780634e1273f4146103e257600080fd5b80630e89341c116102225780632bed89e5116102075780632bed89e51461032d5780632eb2c2d61461034d5780633ccfd60b1461036d57600080fd5b80630e89341c146102fa5780631d6f24e31461031a57600080fd5b8062fdd58e1461025357806301ffc9a71461028657806306fdde03146102b65780630c0e0688146102d8575b600080fd5b34801561025f57600080fd5b5061027361026e3660046132ad565b6107eb565b6040519081526020015b60405180910390f35b34801561029257600080fd5b506102a66102a1366004613305565b610897565b604051901515815260200161027d565b3480156102c257600080fd5b506102cb61097a565b60405161027d9190613372565b3480156102e457600080fd5b506102f86102f3366004613385565b610a08565b005b34801561030657600080fd5b506102cb6103153660046133a7565b610a22565b6102f86103283660046133c0565b610ac7565b34801561033957600080fd5b506102f86103483660046133f3565b610d7c565b34801561035957600080fd5b506102f8610368366004613584565b6110b6565b34801561037957600080fd5b506102f86111c7565b34801561038e57600080fd5b506102f861039d366004613385565b611286565b3480156103ae57600080fd5b506102f86103bd36600461362e565b6112a3565b3480156103ce57600080fd5b506102f86103dd3660046136a5565b611315565b3480156103ee57600080fd5b506104026103fd3660046136ec565b61133d565b60405161027d91906137e8565b34801561041b57600080fd5b5061042f61042a3660046133a7565b61147b565b60405161027d9897969594939291906137fb565b34801561044f57600080fd5b5061027361045e3660046132ad565b600a60209081526000928352604080842090915290825290205481565b34801561048757600080fd5b506102f8610496366004613385565b61154b565b3480156104a757600080fd5b506102f86104b63660046133a7565b611568565b3480156104c757600080fd5b506007546104db906001600160a01b031681565b6040516001600160a01b03909116815260200161027d565b3480156104ff57600080fd5b506102f861050e366004613385565b6117b1565b34801561051f57600080fd5b506102f86117ce565b34801561053457600080fd5b506102f8610543366004613385565b6117e2565b34801561055457600080fd5b506003546001600160a01b03166104db565b34801561057257600080fd5b5061027360045481565b34801561058857600080fd5b506102f8610597366004613385565b6117ff565b3480156105a857600080fd5b506105bc6105b73660046133a7565b61181c565b60405161027d9190815180516001600160a01b031682526020808201519083015260408082015190830152606080820151908301526080908101519082015260c081016001600160a01b036020840151511660a083015292915050565b34801561062557600080fd5b506102cb611899565b34801561063a57600080fd5b506102f8610649366004613849565b6118a6565b34801561065a57600080fd5b506102f8610669366004613872565b6118e8565b6102f861067c3660046133a7565b6119de565b34801561068d57600080fd5b5061070161069c3660046133a7565b600960209081526000918252604091829020825160a08101845281546001600160a01b03908116825260018301548285015260028301548286015260038301546060830152600483015460808301528451938401909452600590910154909216815282565b60405161027d9291906138a9565b6102f861071d366004613902565b611beb565b34801561072e57600080fd5b506102a661073d366004613985565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561077757600080fd5b506105bc6107863660046139b8565b611f45565b34801561079757600080fd5b506102f86107a63660046139f1565b61201c565b3480156107b757600080fd5b506102f86107c6366004613849565b612120565b3480156107d757600080fd5b506102f86107e6366004613a56565b6121ad565b60006001600160a01b03831661086e5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061092a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061089157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610891565b6005805461098790613ad7565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390613ad7565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b505050505081565b610a106121fe565b60009182526008602052604090912055565b6000818152600860205260409020600601805460609190610a4290613ad7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90613ad7565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b50505050509050919050565b600454821115610b195760405162461bcd60e51b815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606401610865565b600082815260086020526040902054610b33908290613b59565b341015610b825760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642076616c7565000000000000000000000000000000000000006044820152606401610865565b60008281526008602052604090206002810154600390910154610ba6908390613b70565b1115610bf45760405162461bcd60e51b815260206004820152601460248201527f6578636565647320746f74616c20737570706c790000000000000000000000006044820152606401610865565b6007546001600160a01b03163314610c745760405162461bcd60e51b815260206004820152602360248201527f746869732066756e6374696f6e20697320666f722063726f73736d696e74206f60448201527f6e6c7900000000000000000000000000000000000000000000000000000000006064820152608401610865565b60008281526008602052604090206004015442118015610ca4575060008281526008602052604090206005015442105b610cf05760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f7420616374697665000000000000000000000000000000006044820152606401610865565b60008281526008602052604081206003018054839290610d11908490613b70565b92505081905550610d3383838360405180602001604052806000815250612258565b81836001600160a01b03167fbb4e705ab024d593d85132abfc80ec7f77e853ee64d9c327e347c4fa7bbda10f83604051610d6f91815260200190565b60405180910390a3505050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018490526054810183905242607482015260009060940160408051601f19818403018152918152815160209283012060008181526009909352912060010154909150610df99042613b70565b421015610e6e5760405162461bcd60e51b815260206004820152602260248201527f4d6179613a204c656e64696e6720706572696f6420686173206e6f7420656e6460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610865565b6000818152600960205260409020600201548414610ece5760405162461bcd60e51b815260206004820152601d60248201527f4d6179613a20546f6b656e20494420646f6573206e6f74206d617463680000006044820152606401610865565b6000818152600960205260409020546001600160a01b031615610f585760405162461bcd60e51b8152602060048201526024808201527f4d6179613a204c656e64696e6720706572696f6420686173206e6f742073746160448201527f72746564000000000000000000000000000000000000000000000000000000006064820152608401610865565b610f6233856107eb565b336000908152600a6020908152604080832088845290915290205410610ff05760405162461bcd60e51b815260206004820152602160248201527f4d6179613a2043616e74206c656e64206d6f7265207468616e20796f75206f7760448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610865565b600081815260096020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016339081178255600180830189905560038301889055426004909301929092558452600a83528184208885529092528220805491929091611066908490613b70565b909155505060408051848152426020820152908101829052849033907f5fc8819348a4c59f841c896836637ce1e5c73561a915da5e34fcf65ea8ca2290906060015b60405180910390a350505050565b846daaeb6d7670e522a718067333cd4e3b156111b257336001600160a01b038216036110ee576110e98686868686612397565b6111bf565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190613b83565b6111b2576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610865565b6111bf8686868686612397565b505050505050565b6111cf6121fe565b60006111e36003546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d806000811461122d576040519150601f19603f3d011682016040523d82523d6000602084013e611232565b606091505b50509050806112835760405162461bcd60e51b815260206004820152601760248201527f6661696c656420746f20726563656976652065746865720000000000000000006044820152606401610865565b50565b61128e6121fe565b60009182526008602052604090912060070155565b6112ab6121fe565b600480546000908152600860205260409020888155600181018890556002810187905590810185905560058101849055600681016112e98482613be6565b508181600701819055506001600460008282546113069190613b70565b90915550505050505050505050565b61131d6121fe565b60008281526008602052604090206006016113388282613be6565b505050565b606081518351146113b65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610865565b6000835167ffffffffffffffff8111156113d2576113d261341f565b6040519080825280602002602001820160405280156113fb578160200160208202803683370190505b50905060005b84518110156114735761144685828151811061141f5761141f613ce2565b602002602001015185838151811061143957611439613ce2565b60200260200101516107eb565b82828151811061145857611458613ce2565b602090810291909101015261146c81613d11565b9050611401565b509392505050565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060180546114c290613ad7565b80601f01602080910402602001604051908101604052809291908181526020018280546114ee90613ad7565b801561153b5780601f106115105761010080835404028352916020019161153b565b820191906000526020600020905b81548152906001019060200180831161151e57829003601f168201915b5050505050908060070154905088565b6115536121fe565b60009182526008602052604090912060020155565b6000818152600960205260409020546001600160a01b031633146115f35760405162461bcd60e51b8152602060048201526024808201527f4d6179613a204f6e6c79206c656e6465722063616e2072656d6f7665206c697360448201527f74696e67000000000000000000000000000000000000000000000000000000006064820152608401610865565b6000818152600960205260409020600501546001600160a01b0316158061163c5750600081815260096020526040902060018101546004909101546116389190613b70565b4210155b6116ae5760405162461bcd60e51b815260206004820152602260248201527f4d6179613a2052656e74696e6720706572696f6420686173206e6f7420656e6460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610865565b336000908152600a60209081526040808320848452600983528184206002015484529091529020541561171957336000908152600a60209081526040808320848452600983528184206002015484529091528120805460019290611713908490613d49565b90915550505b600081815260096020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811682556001820185905560028201859055600382018590556004820185905560059091018054909116905551838152829133917f9eb92e1008875cd8eb817d371499331359932d4be7d1279d3c46f23d2a4f153b91015b60405180910390a450565b6117b96121fe565b60009182526008602052604090912060040155565b6117d66121fe565b6117e06000612439565b565b6117ea6121fe565b60009182526008602052604090912060050155565b6118076121fe565b60009182526008602052604090912060010155565b611824613233565b50600090815260096020908152604091829020825160e08101845281546001600160a01b039081168286019081526001840154606084015260028401546080840152600384015460a0840152600484015460c08401528252845180850190955260059092015490911683529081019190915290565b6006805461098790613ad7565b6118ae6121fe565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b816daaeb6d7670e522a718067333cd4e3b156119d4576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561196f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119939190613b83565b6119d4576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610865565b61133883836124a3565b6000818152600960205260409020546001600160a01b0316611a425760405162461bcd60e51b815260206004820152601860248201527f4d6179613a20496e76616c6964206c697374696e6720494400000000000000006044820152606401610865565b6000818152600960205260409020600301543414611aa25760405162461bcd60e51b815260206004820152601a60248201527f4d6179613a20507269636520646f6573206e6f74206d617463680000000000006044820152606401610865565b6000818152600960205260409020600501546001600160a01b031615611b0a5760405162461bcd60e51b815260206004820152601d60248201527f4d6179613a20546f6b656e20697320616c72656164792072656e7465640000006044820152606401610865565b6000818152600960205260408082206005810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555490516001600160a01b0391909116913480156108fc02929091818181858888f19350505050158015611b7c573d6000803e3d6000fd5b506000818152600960209081526040918290206002810154815460018301546004909301548551938452938301939093529281018490526001600160a01b039091169033907f8d48b7678d39fd1d972124d85219d6e515b06d01a86548cb6094a55512c3d746906060016117a6565b600454841115611c3d5760405162461bcd60e51b815260206004820152601060248201527f696e76616c696420746f6b656e206964000000000000000000000000000000006044820152606401610865565b6003546001600160a01b03163314611ece576040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260009060340160408051601f198184030181529181526000878152600860205290812060010154919250839003611cc35750600085815260086020526040902054611d6e565b611d2284848080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508b8152600860205260409020600701549250611d1d9150611d1790508a6124b2565b86612570565b6125a3565b611d6e5760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642070726f6f66000000000000000000000000000000000000006044820152606401610865565b60008681526008602052604090206004015442118015611d9e575060008681526008602052604090206005015442105b611dea5760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f7420616374697665000000000000000000000000000000006044820152606401610865565b60008681526008602052604090206002015415611e735760008681526008602052604090206002810154600390910154611e25908790613b70565b1115611e735760405162461bcd60e51b815260206004820152601460248201527f6578636565647320746f74616c20737570706c790000000000000000000000006044820152606401610865565b34611e7e8287613b59565b14611ecb5760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642076616c7565000000000000000000000000000000000000006044820152606401610865565b50505b60008481526008602052604081206003018054859290611eef908490613b70565b92505081905550611f1133858560405180602001604052806000815250612258565b604051838152849033907f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f906020016110a8565b611f4d613233565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b16602082015260348101859052605481018490526074810183905260009060940160408051808303601f19018152828252805160209182012060009081526009825282902060e08401835280546001600160a01b039081168585019081526001830154606087015260028301546080870152600383015460a0870152600483015460c0870152855283518084019094526005909101541682528201529695505050505050565b846daaeb6d7670e522a718067333cd4e3b1561211357336001600160a01b0382160361204f576110e986868686866125b9565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190613b83565b612113576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610865565b6111bf86868686866125b9565b6121286121fe565b6001600160a01b0381166121a45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610865565b61128381612439565b6121b56121fe565b600088815260086020526040902087815560018101879055600281018690556004810185905560058101849055600681016121f08482613be6565b506007015550505050505050565b6003546001600160a01b031633146117e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610865565b6001600160a01b0384166122d45760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610865565b3360006122e085612654565b905060006122ed85612654565b90506122fe8360008985858961269f565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061232e908490613b70565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461238e836000898989896127e9565b50505050505050565b6001600160a01b0385163314806123b357506123b3853361073d565b6124255760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610865565b61243285858585856129ed565b5050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124ae338383612c91565b5050565b606060006124bf83612d9b565b600101905060008167ffffffffffffffff8111156124df576124df61341f565b6040519080825280601f01601f191660200182016040528015612509576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461251357509392505050565b60008183604051602001612585929190613d5c565b60405160208183030381529060405280519060200120905092915050565b6000826125b08584612e7d565b14949350505050565b6001600160a01b0385163314806125d557506125d5853361073d565b6126475760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610865565b6124328585858585612ec2565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061268e5761268e613ce2565b602090810291909101015292915050565b6001600160a01b038516156111bf5760005b835181101561238e5760008482815181106126ce576126ce613ce2565b6020026020010151905060008483815181106126ec576126ec613ce2565b60200260200101519050600061270289846107eb565b6001600160a01b038a166000908152600a60209081526040808320878452909152902054909150808210156127795760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e73666572206c656e64696e6720746f6b656e0000006044820152606401610865565b826127848284613d49565b10156127d25760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e73666572206c656e64696e6720746f6b656e0000006044820152606401610865565b5050505080806127e190613d11565b9150506126b1565b6001600160a01b0384163b156111bf576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e61906128469089908990889088908890600401613d8b565b6020604051808303816000875af1925050508015612881575060408051601f3d908101601f1916820190925261287e91810190613dce565b60015b6129365761288d613deb565b806308c379a0036128c657506128a1613e07565b806128ac57506128c8565b8060405162461bcd60e51b81526004016108659190613372565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610865565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461238e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610865565b8151835114612a645760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610865565b6001600160a01b038416612ae05760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610865565b33612aef81878787878761269f565b60005b8451811015612c2b576000858281518110612b0f57612b0f613ce2565b602002602001015190506000858381518110612b2d57612b2d613ce2565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015612bd35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610865565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612c10908490613b70565b9250508190555050505080612c2490613d11565b9050612af2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c7b929190613eaf565b60405180910390a46111bf8187878787876130a6565b816001600160a01b0316836001600160a01b031603612d185760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610865565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610d6f565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612de4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612e10576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612e2e57662386f26fc10000830492506010015b6305f5e1008310612e46576305f5e100830492506008015b6127108310612e5a57612710830492506004015b60648310612e6c576064830492506002015b600a83106108915760010192915050565b600081815b845181101561147357612eae82868381518110612ea157612ea1613ce2565b6020026020010151613201565b915080612eba81613d11565b915050612e82565b6001600160a01b038416612f3e5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610865565b336000612f4a85612654565b90506000612f5785612654565b9050612f6783898985858961269f565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612ffe5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610865565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061303b908490613b70565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461309b848a8a8a8a8a6127e9565b505050505050505050565b6001600160a01b0384163b156111bf576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c81906131039089908990889088908890600401613edd565b6020604051808303816000875af192505050801561313e575060408051601f3d908101601f1916820190925261313b91810190613dce565b60015b61314a5761288d613deb565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461238e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610865565b600081831061321d57600082815260208490526040902061322c565b60008381526020839052604090205b9392505050565b60405180604001604052806132796040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b81526040805160208181019092526000815291015290565b80356001600160a01b03811681146132a857600080fd5b919050565b600080604083850312156132c057600080fd5b6132c983613291565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461128357600080fd5b60006020828403121561331757600080fd5b813561322c816132d7565b60005b8381101561333d578181015183820152602001613325565b50506000910152565b6000815180845261335e816020860160208601613322565b601f01601f19169290920160200192915050565b60208152600061322c6020830184613346565b6000806040838503121561339857600080fd5b50508035926020909101359150565b6000602082840312156133b957600080fd5b5035919050565b6000806000606084860312156133d557600080fd5b6133de84613291565b95602085013595506040909401359392505050565b60008060006060848603121561340857600080fd5b505081359360208301359350604090920135919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156134745761347461341f565b6040525050565b600067ffffffffffffffff8211156134955761349561341f565b5060051b60200190565b600082601f8301126134b057600080fd5b813560206134bd8261347b565b6040516134ca828261344e565b83815260059390931b85018201928281019150868411156134ea57600080fd5b8286015b8481101561350557803583529183019183016134ee565b509695505050505050565b600082601f83011261352157600080fd5b813567ffffffffffffffff81111561353b5761353b61341f565b6040516135526020601f19601f850116018261344e565b81815284602083860101111561356757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561359c57600080fd5b6135a586613291565b94506135b360208701613291565b9350604086013567ffffffffffffffff808211156135d057600080fd5b6135dc89838a0161349f565b945060608801359150808211156135f257600080fd5b6135fe89838a0161349f565b9350608088013591508082111561361457600080fd5b5061362188828901613510565b9150509295509295909350565b600080600080600080600060e0888a03121561364957600080fd5b873596506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561368357600080fd5b61368f8a828b01613510565b92505060c0880135905092959891949750929550565b600080604083850312156136b857600080fd5b82359150602083013567ffffffffffffffff8111156136d657600080fd5b6136e285828601613510565b9150509250929050565b600080604083850312156136ff57600080fd5b823567ffffffffffffffff8082111561371757600080fd5b818501915085601f83011261372b57600080fd5b813560206137388261347b565b604051613745828261344e565b83815260059390931b850182019282810191508984111561376557600080fd5b948201945b8386101561378a5761377b86613291565b8252948201949082019061376a565b965050860135925050808211156137a057600080fd5b506136e28582860161349f565b600081518084526020808501945080840160005b838110156137dd578151875295820195908201906001016137c1565b509495945050505050565b60208152600061322c60208301846137ad565b60006101008a83528960208401528860408401528760608401528660808401528560a08401528060c084015261383381840186613346565b9150508260e08301529998505050505050505050565b60006020828403121561385b57600080fd5b61322c82613291565b801515811461128357600080fd5b6000806040838503121561388557600080fd5b61388e83613291565b9150602083013561389e81613864565b809150509250929050565b60c081016138eb82856001600160a01b038151168252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b6001600160a01b0383511660a08301529392505050565b6000806000806060858703121561391857600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561393e57600080fd5b818701915087601f83011261395257600080fd5b81358181111561396157600080fd5b8860208260051b850101111561397657600080fd5b95989497505060200194505050565b6000806040838503121561399857600080fd5b6139a183613291565b91506139af60208401613291565b90509250929050565b600080600080608085870312156139ce57600080fd5b6139d785613291565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613a0957600080fd5b613a1286613291565b9450613a2060208701613291565b93506040860135925060608601359150608086013567ffffffffffffffff811115613a4a57600080fd5b61362188828901613510565b600080600080600080600080610100898b031215613a7357600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c089013567ffffffffffffffff811115613ab457600080fd5b613ac08b828c01613510565b92505060e089013590509295985092959890939650565b600181811c90821680613aeb57607f821691505b602082108103613b24577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761089157610891613b2a565b8082018082111561089157610891613b2a565b600060208284031215613b9557600080fd5b815161322c81613864565b601f82111561133857600081815260208120601f850160051c81016020861015613bc75750805b601f850160051c820191505b818110156111bf57828155600101613bd3565b815167ffffffffffffffff811115613c0057613c0061341f565b613c1481613c0e8454613ad7565b84613ba0565b602080601f831160018114613c675760008415613c315750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111bf565b600085815260208120601f198616915b82811015613c9657888601518255948401946001909101908401613c77565b5085821015613cd257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4257613d42613b2a565b5060010190565b8181038181111561089157610891613b2a565b60008351613d6e818460208801613322565b835190830190613d82818360208801613322565b01949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152613dc360a0830184613346565b979650505050505050565b600060208284031215613de057600080fd5b815161322c816132d7565b600060033d1115613e045760046000803e5060005160e01c5b90565b600060443d1015613e155790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715613e6357505050505090565b8285019150815181811115613e7b5750505050505090565b843d8701016020828501011115613e955750505050505090565b613ea46020828601018761344e565b509095945050505050565b604081526000613ec260408301856137ad565b8281036020840152613ed481856137ad565b95945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152613f0960a08301866137ad565b8281036060840152613f1b81866137ad565b90508281036080840152613f2f8185613346565b9897505050505050505056fea26469706673582212208fbea91db1dfc73037b7330906df2b5a7b212d985f84dae097badcdd140aafd964736f6c63430008110033

Deployed Bytecode Sourcemap

68770:12624:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48188:230;;;;;;;;;;-1:-1:-1;48188:230:0;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;48188:230:0;;;;;;;;47211:310;;;;;;;;;;-1:-1:-1;47211:310:0;;;;;:::i;:::-;;:::i;:::-;;;1253:14:1;;1246:22;1228:41;;1216:2;1201:18;47211:310:0;1088:187:1;68871:27:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;78346:165::-;;;;;;;;;;-1:-1:-1;78346:165:0;;;;;:::i;:::-;;:::i;:::-;;79485:120;;;;;;;;;;-1:-1:-1;79485:120:0;;;;;:::i;:::-;;:::i;76043:883::-;;;;;;:::i;:::-;;:::i;70892:1269::-;;;;;;;;;;-1:-1:-1;70892:1269:0;;;;;:::i;:::-;;:::i;80109:302::-;;;;;;;;;;-1:-1:-1;80109:302:0;;;;;:::i;:::-;;:::i;79300:177::-;;;;;;;;;;;;;:::i;78178:160::-;;;;;;;;;;-1:-1:-1;78178:160:0;;;;;:::i;:::-;;:::i;76934:615::-;;;;;;;;;;-1:-1:-1;76934:615:0;;;;;:::i;:::-;;:::i;79176:116::-;;;;;;;;;;-1:-1:-1;79176:116:0;;;;;:::i;:::-;;:::i;48584:524::-;;;;;;;;;;-1:-1:-1;48584:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70334:39::-;;;;;;;;;;-1:-1:-1;70334:39:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;70437:70::-;;;;;;;;;;-1:-1:-1;70437:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;78704:165;;;;;;;;;;-1:-1:-1;78704:165:0;;;;;:::i;:::-;;:::i;73055:960::-;;;;;;;;;;-1:-1:-1;73055:960:0;;;;;:::i;:::-;;:::i;68941:85::-;;;;;;;;;;-1:-1:-1;68941:85:0;;;;-1:-1:-1;;;;;68941:85:0;;;;;;-1:-1:-1;;;;;10568:55:1;;;10550:74;;10538:2;10523:18;68941:85:0;10404:226:1;78877:157:0;;;;;;;;;;-1:-1:-1;78877:157:0;;;;;:::i;:::-;;:::i;2668:103::-;;;;;;;;;;;;;:::i;79042:126::-;;;;;;;;;;-1:-1:-1;79042:126:0;;;;;:::i;:::-;;:::i;2020:87::-;;;;;;;;;;-1:-1:-1;2093:6:0;;-1:-1:-1;;;;;2093:6:0;2020:87;;68836:28;;;;;;;;;;;;;;;;78519:177;;;;;;;;;;-1:-1:-1;78519:177:0;;;;;:::i;:::-;;:::i;74023:164::-;;;;;;;;;;-1:-1:-1;74023:164:0;;;;;:::i;:::-;;:::i;:::-;;;;;;11242:13:1;;10712:12;;-1:-1:-1;;;;;10708:61:1;10696:74;;10819:4;10808:16;;;10802:23;10786:14;;;10779:47;10875:4;10864:16;;;10858:23;10842:14;;;10835:47;10931:4;10920:16;;;10914:23;10898:14;;;10891:47;10987:4;10976:16;;;10970:23;10954:14;;;10947:47;11203:3;11188:19;;-1:-1:-1;;;;;11333:4:1;11325:6;11321:17;11315:24;11309:31;11305:80;11298:4;11287:9;11283:20;11276:110;11005:387;;;;;68905:29:0;;;;;;;;;;;;;:::i;70756:128::-;;;;;;;;;;-1:-1:-1;70756:128:0;;;;;:::i;:::-;;:::i;79613:208::-;;;;;;;;;;-1:-1:-1;79613:208:0;;;;;:::i;:::-;;:::i;72169:878::-;;;;;;:::i;:::-;;:::i;70380:50::-;;;;;;;;;;-1:-1:-1;70380:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70380:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;74545:1490::-;;;;;;:::i;:::-;;:::i;49408:168::-;;;;;;;;;;-1:-1:-1;49408:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;49531:27:0;;;49507:4;49531:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;49408:168;74195:342;;;;;;;;;;-1:-1:-1;74195:342:0;;;;;:::i;:::-;;:::i;79829:272::-;;;;;;;;;;-1:-1:-1;79829:272:0;;;;;:::i;:::-;;:::i;2926:201::-;;;;;;;;;;-1:-1:-1;2926:201:0;;;;;:::i;:::-;;:::i;77557:613::-;;;;;;;;;;-1:-1:-1;77557:613:0;;;;;:::i;:::-;;:::i;48188:230::-;48274:7;-1:-1:-1;;;;;48302:21:0;;48294:76;;;;-1:-1:-1;;;48294:76:0;;15498:2:1;48294:76:0;;;15480:21:1;15537:2;15517:18;;;15510:30;15576:34;15556:18;;;15549:62;15647:12;15627:18;;;15620:40;15677:19;;48294:76:0;;;;;;;;;-1:-1:-1;48388:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;48388:22:0;;;;;;;;;;48188:230;;;;;:::o;47211:310::-;47313:4;47350:41;;;47365:26;47350:41;;:110;;-1:-1:-1;47408:52:0;;;47423:37;47408:52;47350:110;:163;;;-1:-1:-1;46261:25:0;46246:40;;;;47477:36;46137:157;68871:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78346:165::-;1906:13;:11;:13::i;:::-;78461:15:::1;::::0;;;:6:::1;:15;::::0;;;;;:42;78346:165::o;79485:120::-;79578:15;;;;:6;:15;;;;;:19;;79571:26;;79545:13;;79578:19;79571:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79485:120;;;:::o;76043:883::-;76185:9;;76174:7;:20;;76166:49;;;;-1:-1:-1;;;76166:49:0;;16351:2:1;76166:49:0;;;16333:21:1;16390:2;16370:18;;;16363:30;16429:18;16409;;;16402:46;16465:18;;76166:49:0;16149:340:1;76166:49:0;76261:15;;;;:6;:15;;;;;:27;:35;;76291:5;;76261:35;:::i;:::-;76248:9;:48;;76226:111;;;;-1:-1:-1;;;76226:111:0;;17058:2:1;76226:111:0;;;17040:21:1;17097:2;17077:18;;;17070:30;17136:15;17116:18;;;17109:43;17169:18;;76226:111:0;16856:337:1;76226:111:0;76404:15;;;;:6;:15;;;;;:27;;;;76370:22;;;;;:30;;76395:5;;76370:30;:::i;:::-;:61;;76348:131;;;;-1:-1:-1;;;76348:131:0;;17530:2:1;76348:131:0;;;17512:21:1;17569:2;17549:18;;;17542:30;17608:22;17588:18;;;17581:50;17648:18;;76348:131:0;17328:344:1;76348:131:0;76526:16;;-1:-1:-1;;;;;76526:16:0;76512:10;:30;76490:115;;;;-1:-1:-1;;;76490:115:0;;17879:2:1;76490:115:0;;;17861:21:1;17918:2;17898:18;;;17891:30;17957:34;17937:18;;;17930:62;18028:5;18008:18;;;18001:33;18051:19;;76490:115:0;17677:399:1;76490:115:0;76656:15;;;;:6;:15;;;;;:25;;;76638:15;:43;:105;;;;-1:-1:-1;76720:15:0;;;;:6;:15;;;;;:23;;;76702:15;:41;76638:105;76616:171;;;;-1:-1:-1;;;76616:171:0;;18283:2:1;76616:171:0;;;18265:21:1;18322:2;18302:18;;;18295:30;18361:18;18341;;;18334:46;18397:18;;76616:171:0;18081:340:1;76616:171:0;76800:15;;;;:6;:15;;;;;:22;;:31;;76826:5;;76800:15;:31;;76826:5;;76800:31;:::i;:::-;;;;;;;;76842:29;76848:2;76852:7;76861:5;76842:29;;;;;;;;;;;;:5;:29::i;:::-;76903:7;76899:2;-1:-1:-1;;;;;76889:29:0;;76912:5;76889:29;;;;620:25:1;;608:2;593:18;;474:177;76889:29:0;;;;;;;;76043:883;;;:::o;70892:1269::-;71052:64;;18672:66:1;71069:10:0;18659:2:1;18655:15;18651:88;71052:64:0;;;18639:101:1;18756:12;;;18749:28;;;18793:12;;;18786:28;;;71100:15:0;18830:12:1;;;18823:28;71008:17:0;;18867:13:1;;71052:64:0;;;-1:-1:-1;;71052:64:0;;;;;;;;;71028:99;;71052:64;71028:99;;;;71214:19;;;;:8;:19;;;;;:36;;;71028:99;;-1:-1:-1;71196:54:0;;:15;:54;:::i;:::-;71160:15;:90;;71138:174;;;;-1:-1:-1;;;71138:174:0;;19093:2:1;71138:174:0;;;19075:21:1;19132:2;19112:18;;;19105:30;19171:34;19151:18;;;19144:62;19242:4;19222:18;;;19215:32;19264:19;;71138:174:0;18891:398:1;71138:174:0;71345:19;;;;:8;:19;;;;;:35;;;:46;;71323:125;;;;-1:-1:-1;;;71323:125:0;;19496:2:1;71323:125:0;;;19478:21:1;19535:2;19515:18;;;19508:30;19574:31;19554:18;;;19547:59;19623:18;;71323:125:0;19294:353:1;71323:125:0;71527:1;71481:19;;;:8;:19;;;;;:34;-1:-1:-1;;;;;71481:34:0;:48;71459:134;;;;-1:-1:-1;;;71459:134:0;;19854:2:1;71459:134:0;;;19836:21:1;19893:2;19873:18;;;19866:30;19932:34;19912:18;;;19905:62;20003:6;19983:18;;;19976:34;20027:19;;71459:134:0;19652:400:1;71459:134:0;71682:30;71692:10;71704:7;71682:9;:30::i;:::-;71642:10;71626:27;;;;:15;:27;;;;;;;;:36;;;;;;;;;:86;71604:169;;;;-1:-1:-1;;;71604:169:0;;20259:2:1;71604:169:0;;;20241:21:1;20298:2;20278:18;;;20271:30;20337:34;20317:18;;;20310:62;20408:3;20388:18;;;20381:31;20429:19;;71604:169:0;20057:397:1;71604:169:0;71786:19;;;;:8;:19;;;;;;;;:56;;;;71831:10;71786:56;;;;;;71853:36;;;:47;;;71911:33;;;:41;;;72003:15;71963:37;;;;:55;;;;72031:27;;:15;:27;;;;;:36;;;;;;;;:41;;71786:56;;72031:36;;:41;;71786:56;;72031:41;:::i;:::-;;;;-1:-1:-1;;72090:63:0;;;20661:25:1;;;72126:15:0;20717:2:1;20702:18;;20695:34;20745:18;;;20738:34;;;72107:7:0;;72095:10;;72090:63;;20649:2:1;20634:18;72090:63:0;;;;;;;;70997:1164;70892:1269;;;:::o;80109:302::-;80329:4;66237:42;67385:45;:49;67381:539;;67674:10;-1:-1:-1;;;;;67666:18:0;;;67662:85;;80346:57:::1;80374:4;80380:2;80384:3;80389:7;80398:4;80346:27;:57::i;:::-;67725:7:::0;;67662:85;67766:69;;;;;67817:4;67766:69;;;21018:34:1;67824:10:0;21068:18:1;;;21061:43;66237:42:0;;67766;;20930:18:1;;67766:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67761:148;;67863:30;;;;;67882:10;67863:30;;;10550:74:1;10523:18;;67863:30:0;10404:226:1;67761:148:0;80346:57:::1;80374:4;80380:2;80384:3;80389:7;80398:4;80346:27;:57::i;:::-;80109:302:::0;;;;;;:::o;79300:177::-;1906:13;:11;:13::i;:::-;79351:12:::1;79369:7;2093:6:::0;;-1:-1:-1;;;;;2093:6:0;;2020:87;79369:7:::1;-1:-1:-1::0;;;;;79369:12:0::1;79389:21;79369:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79350:65;;;79434:7;79426:43;;;::::0;-1:-1:-1;;;79426:43:0;;21777:2:1;79426:43:0::1;::::0;::::1;21759:21:1::0;21816:2;21796:18;;;21789:30;21855:25;21835:18;;;21828:53;21898:18;;79426:43:0::1;21575:347:1::0;79426:43:0::1;79339:138;79300:177::o:0;78178:160::-;1906:13;:11;:13::i;:::-;78290:15:::1;::::0;;;:6:::1;:15;::::0;;;;;:26:::1;;:40:::0;78178:160::o;76934:615::-;1906:13;:11;:13::i;:::-;77227:9:::1;::::0;;77198:19:::1;77220:17:::0;;;:6:::1;:17;::::0;;;;77248:32;;;77291:20:::1;::::0;::::1;:38:::0;;;77340:17:::1;::::0;::::1;:32:::0;;;77383:15;;::::1;:28:::0;;;77422:13:::1;::::0;::::1;:24:::0;;;77457:9:::1;::::0;::::1;:16;77469:4:::0;77457:9;:16:::1;:::i;:::-;;77503:11;77484:5;:16;;:30;;;;77540:1;77527:9;;:14;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;76934:615:0:o;79176:116::-;1906:13;:11;:13::i;:::-;79258:15:::1;::::0;;;:6:::1;:15;::::0;;;;:19:::1;;:26;79280:4:::0;79258:19;:26:::1;:::i;:::-;;79176:116:::0;;:::o;48584:524::-;48740:16;48801:3;:10;48782:8;:15;:29;48774:83;;;;-1:-1:-1;;;48774:83:0;;24512:2:1;48774:83:0;;;24494:21:1;24551:2;24531:18;;;24524:30;24590:34;24570:18;;;24563:62;24661:11;24641:18;;;24634:39;24690:19;;48774:83:0;24310:405:1;48774:83:0;48870:30;48917:8;:15;48903:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48903:30:0;;48870:63;;48951:9;48946:122;48970:8;:15;48966:1;:19;48946:122;;;49026:30;49036:8;49045:1;49036:11;;;;;;;;:::i;:::-;;;;;;;49049:3;49053:1;49049:6;;;;;;;;:::i;:::-;;;;;;;49026:9;:30::i;:::-;49007:13;49021:1;49007:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;48987:3;;;:::i;:::-;;;48946:122;;;-1:-1:-1;49087:13:0;48584:524;-1:-1:-1;;;48584:524:0:o;70334:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78704:165::-;1906:13;:11;:13::i;:::-;78819:15:::1;::::0;;;:6:::1;:15;::::0;;;;;:27:::1;;:42:::0;78704:165::o;73055:960::-;73137:19;;;;:8;:19;;;;;:34;-1:-1:-1;;;;;73137:34:0;73175:10;73137:48;73115:134;;;;-1:-1:-1;;;73115:134:0;;25311:2:1;73115:134:0;;;25293:21:1;25350:2;25330:18;;;25323:30;25389:34;25369:18;;;25362:62;25460:6;25440:18;;;25433:34;25484:19;;73115:134:0;25109:400:1;73115:134:0;73328:1;73282:19;;;:8;:19;;;;;:27;;:34;-1:-1:-1;;;;;73282:34:0;:48;;:202;;-1:-1:-1;73448:19:0;;;;:8;:19;;;;;:36;;;;73387:37;;;;;:97;;73448:36;73387:97;:::i;:::-;73351:15;:133;;73282:202;73260:286;;;;-1:-1:-1;;;73260:286:0;;25716:2:1;73260:286:0;;;25698:21:1;25755:2;25735:18;;;25728:30;25794:34;25774:18;;;25767:62;25865:4;25845:18;;;25838:32;25887:19;;73260:286:0;25514:398:1;73260:286:0;73593:10;73644:1;73577:27;;;:15;:27;;;;;;;;73605:19;;;:8;:19;;;;;:35;;;73577:64;;;;;;;;:68;73559:226;;73688:10;73672:27;;;;:15;:27;;;;;;;;73718:19;;;:8;:19;;;;;:35;;;73672:96;;;;;;;:101;;73772:1;;73672:27;:101;;73772:1;;73672:101;:::i;:::-;;;;-1:-1:-1;;73559:226:0;73804:19;;;;:8;:19;;;;;;;;73797:26;;;;;;;;-1:-1:-1;73797:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73841:166;620:25:1;;;73804:19:0;;73863:10;;73841:166;;593:18:1;73841:166:0;;;;;;;;73055:960;:::o;78877:157::-;1906:13;:11;:13::i;:::-;78988:15:::1;::::0;;;:6:::1;:15;::::0;;;;;:25:::1;;:38:::0;78877:157::o;2668:103::-;1906:13;:11;:13::i;:::-;2733:30:::1;2760:1;2733:18;:30::i;:::-;2668:103::o:0;79042:126::-;1906:13;:11;:13::i;:::-;79126:15:::1;::::0;;;:6:::1;:15;::::0;;;;;:23:::1;;:34:::0;79042:126::o;78519:177::-;1906:13;:11;:13::i;:::-;78640:15:::1;::::0;;;:6:::1;:15;::::0;;;;;:30:::1;;:48:::0;78519:177::o;74023:164::-;74114:21;;:::i;:::-;-1:-1:-1;74160:19:0;;;;:8;:19;;;;;;;;;74153:26;;;;;;;;;-1:-1:-1;;;;;74153:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74023:164::o;68905:29::-;;;;;;;:::i;70756:128::-;1906:13;:11;:13::i;:::-;70840:16:::1;:36:::0;;;::::1;-1:-1:-1::0;;;;;70840:36:0;;;::::1;::::0;;;::::1;::::0;;70756:128::o;79613:208::-;79744:8;66237:42;68131:45;:49;68127:225;;68202:67;;;;;68253:4;68202:67;;;21018:34:1;-1:-1:-1;;;;;21088:15:1;;21068:18;;;21061:43;66237:42:0;;68202;;20930:18:1;;68202:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68197:144;;68297:28;;;;;-1:-1:-1;;;;;10568:55:1;;68297:28:0;;;10550:74:1;10523:18;;68297:28:0;10404:226:1;68197:144:0;79770:43:::1;79794:8;79804;79770:23;:43::i;72169:878::-:0;72296:1;72250:19;;;:8;:19;;;;;:34;-1:-1:-1;;;;;72250:34:0;72228:122;;;;-1:-1:-1;;;72228:122:0;;26434:2:1;72228:122:0;;;26416:21:1;26473:2;26453:18;;;26446:30;26512:26;26492:18;;;26485:54;26556:18;;72228:122:0;26232:348:1;72228:122:0;72383:19;;;;:8;:19;;;;;:33;;;72420:9;72383:46;72361:122;;;;-1:-1:-1;;;72361:122:0;;26787:2:1;72361:122:0;;;26769:21:1;26826:2;26806:18;;;26799:30;26865:28;26845:18;;;26838:56;26911:18;;72361:122:0;26585:350:1;72361:122:0;72562:1;72516:19;;;:8;:19;;;;;:27;;:34;-1:-1:-1;;;;;72516:34:0;:48;72494:127;;;;-1:-1:-1;;;72494:127:0;;27142:2:1;72494:127:0;;;27124:21:1;27181:2;27161:18;;;27154:30;27220:31;27200:18;;;27193:59;27269:18;;72494:127:0;26940:353:1;72494:127:0;72634:19;;;;:8;:19;;;;;;:27;;;:56;;;;72679:10;72634:56;;;72701:34;:54;;-1:-1:-1;;;;;72701:34:0;;;;;72745:9;72701:54;;;;;72745:9;;72701:54;72634:19;72701:54;72745:9;72701:34;:54;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72866:19:0;;;;:8;:19;;;;;;;;;:35;;;;72817:34;;;72916:36;;;72967:37;;;;;72773:266;;20661:25:1;;;20702:18;;;20695:34;;;;20745:18;;;20738:34;;;-1:-1:-1;;;;;72817:34:0;;;;72792:10;;72773:266;;20649:2:1;20634:18;72773:266:0;20459:319:1;74545:1490:0;74698:9;;74687:7;:20;;74679:49;;;;-1:-1:-1;;;74679:49:0;;16351:2:1;74679:49:0;;;16333:21:1;16390:2;16370:18;;;16363:30;16429:18;16409;;;16402:46;16465:18;;74679:49:0;16149:340:1;74679:49:0;2093:6;;-1:-1:-1;;;;;2093:6:0;74745:10;:21;74741:1145;;74814:28;;27460:66:1;74831:10:0;27447:2:1;27443:15;27439:88;74814:28:0;;;27427:101:1;74783:21:0;;27544:12:1;;74814:28:0;;;-1:-1:-1;;74814:28:0;;;;;;;;;74860:13;74876:15;;;:6;74814:28;74876:15;;;;:30;;;74814:28;;-1:-1:-1;74927:17:0;;;74923:415;;-1:-1:-1;74973:15:0;;;;:6;:15;;;;;:27;74923:415;;;75071:194;75116:5;;75071:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75148:15:0;;;:6;:15;;;;;:26;;;;-1:-1:-1;75201:41:0;;-1:-1:-1;75207:25:0;;-1:-1:-1;75155:7:0;75207:16;:25::i;:::-;75234:7;75201:5;:41::i;:::-;75071:18;:194::i;:::-;75041:281;;;;-1:-1:-1;;;75041:281:0;;27769:2:1;75041:281:0;;;27751:21:1;27808:2;27788:18;;;27781:30;27847:15;27827:18;;;27820:43;27880:18;;75041:281:0;27567:337:1;75041:281:0;75398:15;;;;:6;:15;;;;;:25;;;75380:15;:43;:109;;;;-1:-1:-1;75466:15:0;;;;:6;:15;;;;;:23;;;75448:15;:41;75380:109;75354:187;;;;-1:-1:-1;;;75354:187:0;;18283:2:1;75354:187:0;;;18265:21:1;18322:2;18302:18;;;18295:30;18361:18;18341;;;18334:46;18397:18;;75354:187:0;18081:340:1;75354:187:0;75590:1;75560:15;;;:6;:15;;;;;:27;;;:31;75556:252;;75701:15;;;;:6;:15;;;;;:27;;;;75642:22;;;;;:30;;75667:5;;75642:30;:::i;:::-;:86;;75612:180;;;;-1:-1:-1;;;75612:180:0;;17530:2:1;75612:180:0;;;17512:21:1;17569:2;17549:18;;;17542:30;17608:22;17588:18;;;17581:50;17648:18;;75612:180:0;17328:344:1;75612:180:0;75847:9;75830:13;75838:5;75830;:13;:::i;:::-;:26;75822:52;;;;-1:-1:-1;;;75822:52:0;;17058:2:1;75822:52:0;;;17040:21:1;17097:2;17077:18;;;17070:30;17136:15;17116:18;;;17109:43;17169:18;;75822:52:0;16856:337:1;75822:52:0;74768:1118;;74741:1145;75898:15;;;;:6;:15;;;;;:22;;:31;;75924:5;;75898:15;:31;;75924:5;;75898:31;:::i;:::-;;;;;;;;75940:37;75946:10;75958:7;75967:5;75940:37;;;;;;;;;;;;:5;:37::i;:::-;75995:32;;620:25:1;;;76012:7:0;;76000:10;;75995:32;;608:2:1;593:18;75995:32:0;474:177:1;74195:342:0;74349:21;;:::i;:::-;74427:54;;18672:66:1;18659:2;18655:15;;;18651:88;74427:54:0;;;18639:101:1;18756:12;;;18749:28;;;18793:12;;;18786:28;;;18830:12;;;18823:28;;;74383:17:0;;18867:13:1;;74427:54:0;;;;;;-1:-1:-1;;74427:54:0;;;;;;74403:89;;74427:54;74403:89;;;;74510:19;;;;:8;:19;;;;;74503:26;;;;;;;-1:-1:-1;;;;;74503:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74503:26:0;74427:54;74195:342;-1:-1:-1;;;;;;74195:342:0:o;79829:272::-;80021:4;66237:42;67385:45;:49;67381:539;;67674:10;-1:-1:-1;;;;;67666:18:0;;;67662:85;;80038:55:::1;80061:4;80067:2;80071:7;80080:6;80088:4;80038:22;:55::i;67662:85::-:0;67766:69;;;;;67817:4;67766:69;;;21018:34:1;67824:10:0;21068:18:1;;;21061:43;66237:42:0;;67766;;20930:18:1;;67766:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67761:148;;67863:30;;;;;67882:10;67863:30;;;10550:74:1;10523:18;;67863:30:0;10404:226:1;67761:148:0;80038:55:::1;80061:4;80067:2;80071:7;80080:6;80088:4;80038:22;:55::i;2926:201::-:0;1906:13;:11;:13::i;:::-;-1:-1:-1;;;;;3015:22:0;::::1;3007:73;;;::::0;-1:-1:-1;;;3007:73:0;;28111:2:1;3007:73:0::1;::::0;::::1;28093:21:1::0;28150:2;28130:18;;;28123:30;28189:34;28169:18;;;28162:62;28260:8;28240:18;;;28233:36;28286:19;;3007:73:0::1;27909:402:1::0;3007:73:0::1;3091:28;3110:8;3091:18;:28::i;77557:613::-:0;1906:13;:11;:13::i;:::-;77848:19:::1;77870:15:::0;;;:6:::1;:15;::::0;;;;77896:32;;;77939:20:::1;::::0;::::1;:38:::0;;;77988:17:::1;::::0;::::1;:32:::0;;;78031:15:::1;::::0;::::1;:28:::0;;;78070:13:::1;::::0;::::1;:24:::0;;;78105:9:::1;::::0;::::1;:16;78117:4:::0;78105:9;:16:::1;:::i;:::-;-1:-1:-1::0;78132:16:0::1;;:30:::0;-1:-1:-1;;;;;;;77557:613:0:o;2185:132::-;2093:6;;-1:-1:-1;;;;;2093:6:0;809:10;2249:23;2241:68;;;;-1:-1:-1;;;2241:68:0;;28518:2:1;2241:68:0;;;28500:21:1;;;28537:18;;;28530:30;28596:34;28576:18;;;28569:62;28648:18;;2241:68:0;28316:356:1;54829:729:0;-1:-1:-1;;;;;54982:16:0;;54974:62;;;;-1:-1:-1;;;54974:62:0;;28879:2:1;54974:62:0;;;28861:21:1;28918:2;28898:18;;;28891:30;28957:34;28937:18;;;28930:62;29028:3;29008:18;;;29001:31;29049:19;;54974:62:0;28677:397:1;54974:62:0;809:10;55049:16;55114:21;55132:2;55114:17;:21::i;:::-;55091:44;;55146:24;55173:25;55191:6;55173:17;:25::i;:::-;55146:52;;55211:66;55232:8;55250:1;55254:2;55258:3;55263:7;55272:4;55211:20;:66::i;:::-;55290:9;:13;;;;;;;;;;;-1:-1:-1;;;;;55290:17:0;;;;;;;;;:27;;55311:6;;55290:9;:27;;55311:6;;55290:27;:::i;:::-;;;;-1:-1:-1;;55333:52:0;;;29253:25:1;;;29309:2;29294:18;;29287:34;;;-1:-1:-1;;;;;55333:52:0;;;;55366:1;;55333:52;;;;;;29226:18:1;55333:52:0;;;;;;;55476:74;55507:8;55525:1;55529:2;55533;55537:6;55545:4;55476:30;:74::i;:::-;54963:595;;;54829:729;;;;:::o;50131:438::-;-1:-1:-1;;;;;50364:20:0;;809:10;50364:20;;:60;;-1:-1:-1;50388:36:0;50405:4;809:10;49408:168;:::i;50388:36::-;50342:156;;;;-1:-1:-1;;;50342:156:0;;29534:2:1;50342:156:0;;;29516:21:1;29573:2;29553:18;;;29546:30;29612:34;29592:18;;;29585:62;29683:16;29663:18;;;29656:44;29717:19;;50342:156:0;29332:410:1;50342:156:0;50509:52;50532:4;50538:2;50542:3;50547:7;50556:4;50509:22;:52::i;:::-;50131:438;;;;;:::o;3287:191::-;3380:6;;;-1:-1:-1;;;;;3397:17:0;;;;;;;;;;;3430:40;;3380:6;;;3397:17;3380:6;;3430:40;;3361:16;;3430:40;3350:128;3287:191;:::o;49181:155::-;49276:52;809:10;49309:8;49319;49276:18;:52::i;:::-;49181:155;;:::o;26082:716::-;26138:13;26189:14;26206:17;26217:5;26206:10;:17::i;:::-;26226:1;26206:21;26189:38;;26242:20;26276:6;26265:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26265:18:0;-1:-1:-1;26242:41:0;-1:-1:-1;26407:28:0;;;26423:2;26407:28;26464:288;26496:5;;26638:8;26633:2;26622:14;;26617:30;26496:5;26604:44;26694:2;26685:11;;;-1:-1:-1;26715:21:0;26464:288;26715:21;-1:-1:-1;26773:6:0;26082:716;-1:-1:-1;;;26082:716:0:o;70552:196::-;70663:7;70722;70731;70705:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70695:45;;;;;;70688:52;;70552:196;;;;:::o;4607:190::-;4732:4;4785;4756:25;4769:5;4776:4;4756:12;:25::i;:::-;:33;;4607:190;-1:-1:-1;;;;4607:190:0:o;49648:406::-;-1:-1:-1;;;;;49856:20:0;;809:10;49856:20;;:60;;-1:-1:-1;49880:36:0;49897:4;809:10;49408:168;:::i;49880:36::-;49834:156;;;;-1:-1:-1;;;49834:156:0;;29534:2:1;49834:156:0;;;29516:21:1;29573:2;29553:18;;;29546:30;29612:34;29592:18;;;29585:62;29683:16;29663:18;;;29656:44;29717:19;;49834:156:0;29332:410:1;49834:156:0;50001:45;50019:4;50025:2;50029;50033:6;50041:4;50001:17;:45::i;63508:198::-;63628:16;;;63642:1;63628:16;;;;;;;;;63574;;63603:22;;63628:16;;;;;;;;;;;;-1:-1:-1;63628:16:0;63603:41;;63666:7;63655:5;63661:1;63655:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;63693:5;63508:198;-1:-1:-1;;63508:198:0:o;80419:972::-;-1:-1:-1;;;;;80742:18:0;;;80738:646;;80782:9;80777:596;80801:3;:10;80797:1;:14;80777:596;;;80837:15;80855:3;80859:1;80855:6;;;;;;;;:::i;:::-;;;;;;;80837:24;;80880:14;80897:7;80905:1;80897:10;;;;;;;;:::i;:::-;;;;;;;80880:27;;80926:19;80948:24;80958:4;80964:7;80948:9;:24::i;:::-;-1:-1:-1;;;;;81016:21:0;;80991:22;81016:21;;;:15;:21;;;;;;;;:30;;;;;;;;;80926:46;;-1:-1:-1;81095:29:0;;;;81065:132;;;;-1:-1:-1;;;81065:132:0;;30639:2:1;81065:132:0;;;30621:21:1;30678:2;30658:18;;;30651:30;30717:31;30697:18;;;30690:59;30766:18;;81065:132:0;30437:353:1;81065:132:0;81278:6;81246:28;81260:14;81246:11;:28;:::i;:::-;:38;;81216:141;;;;-1:-1:-1;;;81216:141:0;;30639:2:1;81216:141:0;;;30621:21:1;30678:2;30658:18;;;30651:30;30717:31;30697:18;;;30690:59;30766:18;;81216:141:0;30437:353:1;81216:141:0;80818:555;;;;80813:3;;;;;:::i;:::-;;;;80777:596;;61935:744;-1:-1:-1;;;;;62150:13:0;;37471:19;:23;62146:526;;62186:72;;;;;-1:-1:-1;;;;;62186:38:0;;;;;:72;;62225:8;;62235:4;;62241:2;;62245:6;;62253:4;;62186:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62186:72:0;;;;;;;;-1:-1:-1;;62186:72:0;;;;;;;;;;;;:::i;:::-;;;62182:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;62534:6;62527:14;;-1:-1:-1;;;62527:14:0;;;;;;;;:::i;62182:479::-;;;62583:62;;-1:-1:-1;;;62583:62:0;;32760:2:1;62583:62:0;;;32742:21:1;32799:2;32779:18;;;32772:30;32838:34;32818:18;;;32811:62;32909:22;32889:18;;;32882:50;32949:19;;62583:62:0;32558:416:1;62182:479:0;62308:55;;;62320:43;62308:55;62304:154;;62388:50;;-1:-1:-1;;;62388:50:0;;33181:2:1;62388:50:0;;;33163:21:1;33220:2;33200:18;;;33193:30;33259:34;33239:18;;;33232:62;33330:10;33310:18;;;33303:38;33358:19;;62388:50:0;32979:404:1;52365:1146:0;52592:7;:14;52578:3;:10;:28;52570:81;;;;-1:-1:-1;;;52570:81:0;;33590:2:1;52570:81:0;;;33572:21:1;33629:2;33609:18;;;33602:30;33668:34;33648:18;;;33641:62;33739:10;33719:18;;;33712:38;33767:19;;52570:81:0;33388:404:1;52570:81:0;-1:-1:-1;;;;;52670:16:0;;52662:66;;;;-1:-1:-1;;;52662:66:0;;33999:2:1;52662:66:0;;;33981:21:1;34038:2;34018:18;;;34011:30;34077:34;34057:18;;;34050:62;34148:7;34128:18;;;34121:35;34173:19;;52662:66:0;33797:401:1;52662:66:0;809:10;52785:60;809:10;52816:4;52822:2;52826:3;52831:7;52840:4;52785:20;:60::i;:::-;52863:9;52858:421;52882:3;:10;52878:1;:14;52858:421;;;52914:10;52927:3;52931:1;52927:6;;;;;;;;:::i;:::-;;;;;;;52914:19;;52948:14;52965:7;52973:1;52965:10;;;;;;;;:::i;:::-;;;;;;;;;;;;52992:19;53014:13;;;;;;;;;;-1:-1:-1;;;;;53014:19:0;;;;;;;;;;;;52965:10;;-1:-1:-1;53056:21:0;;;;53048:76;;;;-1:-1:-1;;;53048:76:0;;34405:2:1;53048:76:0;;;34387:21:1;34444:2;34424:18;;;34417:30;34483:34;34463:18;;;34456:62;34554:12;34534:18;;;34527:40;34584:19;;53048:76:0;34203:406:1;53048:76:0;53168:9;:13;;;;;;;;;;;-1:-1:-1;;;;;53168:19:0;;;;;;;;;;53190:20;;;53168:42;;53240:17;;;;;;;:27;;53190:20;;53168:9;53240:27;;53190:20;;53240:27;:::i;:::-;;;;;;;;52899:380;;;52894:3;;;;:::i;:::-;;;52858:421;;;;53326:2;-1:-1:-1;;;;;53296:47:0;53320:4;-1:-1:-1;;;;;53296:47:0;53310:8;-1:-1:-1;;;;;53296:47:0;;53330:3;53335:7;53296:47;;;;;;;:::i;:::-;;;;;;;;53428:75;53464:8;53474:4;53480:2;53484:3;53489:7;53498:4;53428:35;:75::i;59242:331::-;59397:8;-1:-1:-1;;;;;59388:17:0;:5;-1:-1:-1;;;;;59388:17:0;;59380:71;;;;-1:-1:-1;;;59380:71:0;;35286:2:1;59380:71:0;;;35268:21:1;35325:2;35305:18;;;35298:30;35364:34;35344:18;;;35337:62;35435:11;35415:18;;;35408:39;35464:19;;59380:71:0;35084:405:1;59380:71:0;-1:-1:-1;;;;;59462:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;59524:41;;1228::1;;;59524::0;;1201:18:1;59524:41:0;1088:187:1;23103:922:0;23156:7;;23243:6;23234:15;;23230:102;;23279:6;23270:15;;;-1:-1:-1;23314:2:0;23304:12;23230:102;23359:6;23350:5;:15;23346:102;;23395:6;23386:15;;;-1:-1:-1;23430:2:0;23420:12;23346:102;23475:6;23466:5;:15;23462:102;;23511:6;23502:15;;;-1:-1:-1;23546:2:0;23536:12;23462:102;23591:5;23582;:14;23578:99;;23626:5;23617:14;;;-1:-1:-1;23660:1:0;23650:11;23578:99;23704:5;23695;:14;23691:99;;23739:5;23730:14;;;-1:-1:-1;23773:1:0;23763:11;23691:99;23817:5;23808;:14;23804:99;;23852:5;23843:14;;;-1:-1:-1;23886:1:0;23876:11;23804:99;23930:5;23921;:14;23917:66;;23966:1;23956:11;24011:6;23103:922;-1:-1:-1;;23103:922:0:o;5474:296::-;5557:7;5600:4;5557:7;5615:118;5639:5;:12;5635:1;:16;5615:118;;;5688:33;5698:12;5712:5;5718:1;5712:8;;;;;;;;:::i;:::-;;;;;;;5688:9;:33::i;:::-;5673:48;-1:-1:-1;5653:3:0;;;;:::i;:::-;;;;5615:118;;51033:974;-1:-1:-1;;;;;51221:16:0;;51213:66;;;;-1:-1:-1;;;51213:66:0;;33999:2:1;51213:66:0;;;33981:21:1;34038:2;34018:18;;;34011:30;34077:34;34057:18;;;34050:62;34148:7;34128:18;;;34121:35;34173:19;;51213:66:0;33797:401:1;51213:66:0;809:10;51292:16;51357:21;51375:2;51357:17;:21::i;:::-;51334:44;;51389:24;51416:25;51434:6;51416:17;:25::i;:::-;51389:52;;51454:60;51475:8;51485:4;51491:2;51495:3;51500:7;51509:4;51454:20;:60::i;:::-;51527:19;51549:13;;;;;;;;;;;-1:-1:-1;;;;;51549:19:0;;;;;;;;;;51587:21;;;;51579:76;;;;-1:-1:-1;;;51579:76:0;;34405:2:1;51579:76:0;;;34387:21:1;34444:2;34424:18;;;34417:30;34483:34;34463:18;;;34456:62;34554:12;34534:18;;;34527:40;34584:19;;51579:76:0;34203:406:1;51579:76:0;51691:9;:13;;;;;;;;;;;-1:-1:-1;;;;;51691:19:0;;;;;;;;;;51713:20;;;51691:42;;51755:17;;;;;;;:27;;51713:20;;51691:9;51755:27;;51713:20;;51755:27;:::i;:::-;;;;-1:-1:-1;;51800:46:0;;;29253:25:1;;;29309:2;29294:18;;29287:34;;;-1:-1:-1;;;;;51800:46:0;;;;;;;;;;;;;;29226:18:1;51800:46:0;;;;;;;51931:68;51962:8;51972:4;51978:2;51982;51986:6;51994:4;51931:30;:68::i;:::-;51202:805;;;;51033:974;;;;;:::o;62687:813::-;-1:-1:-1;;;;;62927:13:0;;37471:19;:23;62923:570;;62963:79;;;;;-1:-1:-1;;;;;62963:43:0;;;;;:79;;63007:8;;63017:4;;63023:3;;63028:7;;63037:4;;62963:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62963:79:0;;;;;;;;-1:-1:-1;;62963:79:0;;;;;;;;;;;;:::i;:::-;;;62959:523;;;;:::i;:::-;63124:60;;;63136:48;63124:60;63120:159;;63209:50;;-1:-1:-1;;;63209:50:0;;33181:2:1;63209:50:0;;;33163:21:1;33220:2;33200:18;;;33193:30;33259:34;33239:18;;;33232:62;33330:10;33310:18;;;33303:38;33358:19;;63209:50:0;32979:404:1;12514:149:0;12577:7;12608:1;12604;:5;:51;;12739:13;12833:15;;;12869:4;12862:15;;;12916:4;12900:21;;12604:51;;;12739:13;12833:15;;;12869:4;12862:15;;;12916:4;12900:21;;12612:20;12597:58;12514:149;-1:-1:-1;;;12514:149:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:196:1:-;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:177::-;741:66;734:5;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;1280:250::-;1365:1;1375:113;1389:6;1386:1;1383:13;1375:113;;;1465:11;;;1459:18;1446:11;;;1439:39;1411:2;1404:10;1375:113;;;-1:-1:-1;;1522:1:1;1504:16;;1497:27;1280:250::o;1535:330::-;1577:3;1615:5;1609:12;1642:6;1637:3;1630:19;1658:76;1727:6;1720:4;1715:3;1711:14;1704:4;1697:5;1693:16;1658:76;:::i;:::-;1779:2;1767:15;-1:-1:-1;;1763:88:1;1754:98;;;;1854:4;1750:109;;1535:330;-1:-1:-1;;1535:330:1:o;1870:220::-;2019:2;2008:9;2001:21;1982:4;2039:45;2080:2;2069:9;2065:18;2057:6;2039:45;:::i;2095:248::-;2163:6;2171;2224:2;2212:9;2203:7;2199:23;2195:32;2192:52;;;2240:1;2237;2230:12;2192:52;-1:-1:-1;;2263:23:1;;;2333:2;2318:18;;;2305:32;;-1:-1:-1;2095:248:1:o;2348:180::-;2407:6;2460:2;2448:9;2439:7;2435:23;2431:32;2428:52;;;2476:1;2473;2466:12;2428:52;-1:-1:-1;2499:23:1;;2348:180;-1:-1:-1;2348:180:1:o;2533:322::-;2610:6;2618;2626;2679:2;2667:9;2658:7;2654:23;2650:32;2647:52;;;2695:1;2692;2685:12;2647:52;2718:29;2737:9;2718:29;:::i;:::-;2708:39;2794:2;2779:18;;2766:32;;-1:-1:-1;2845:2:1;2830:18;;;2817:32;;2533:322;-1:-1:-1;;;2533:322:1:o;2860:316::-;2937:6;2945;2953;3006:2;2994:9;2985:7;2981:23;2977:32;2974:52;;;3022:1;3019;3012:12;2974:52;-1:-1:-1;;3045:23:1;;;3115:2;3100:18;;3087:32;;-1:-1:-1;3166:2:1;3151:18;;;3138:32;;2860:316;-1:-1:-1;2860:316:1:o;3181:184::-;3233:77;3230:1;3223:88;3330:4;3327:1;3320:15;3354:4;3351:1;3344:15;3370:308;-1:-1:-1;;3471:2:1;3465:4;3461:13;3457:86;3449:6;3445:99;3610:6;3598:10;3595:22;3574:18;3562:10;3559:34;3556:62;3553:88;;;3621:18;;:::i;:::-;3657:2;3650:22;-1:-1:-1;;3370:308:1:o;3683:183::-;3743:4;3776:18;3768:6;3765:30;3762:56;;;3798:18;;:::i;:::-;-1:-1:-1;3843:1:1;3839:14;3855:4;3835:25;;3683:183::o;3871:724::-;3925:5;3978:3;3971:4;3963:6;3959:17;3955:27;3945:55;;3996:1;3993;3986:12;3945:55;4032:6;4019:20;4058:4;4081:43;4121:2;4081:43;:::i;:::-;4153:2;4147:9;4165:31;4193:2;4185:6;4165:31;:::i;:::-;4231:18;;;4323:1;4319:10;;;;4307:23;;4303:32;;;4265:15;;;;-1:-1:-1;4347:15:1;;;4344:35;;;4375:1;4372;4365:12;4344:35;4411:2;4403:6;4399:15;4423:142;4439:6;4434:3;4431:15;4423:142;;;4505:17;;4493:30;;4543:12;;;;4456;;4423:142;;;-1:-1:-1;4583:6:1;3871:724;-1:-1:-1;;;;;;3871:724:1:o;4600:614::-;4642:5;4695:3;4688:4;4680:6;4676:17;4672:27;4662:55;;4713:1;4710;4703:12;4662:55;4749:6;4736:20;4775:18;4771:2;4768:26;4765:52;;;4797:18;;:::i;:::-;4846:2;4840:9;4858:126;4978:4;-1:-1:-1;;4902:4:1;4898:2;4894:13;4890:86;4886:97;4878:6;4858:126;:::i;:::-;5008:2;5000:6;4993:18;5054:3;5047:4;5042:2;5034:6;5030:15;5026:26;5023:35;5020:55;;;5071:1;5068;5061:12;5020:55;5135:2;5128:4;5120:6;5116:17;5109:4;5101:6;5097:17;5084:54;5182:1;5158:15;;;5175:4;5154:26;5147:37;;;;5162:6;4600:614;-1:-1:-1;;;4600:614:1:o;5219:943::-;5373:6;5381;5389;5397;5405;5458:3;5446:9;5437:7;5433:23;5429:33;5426:53;;;5475:1;5472;5465:12;5426:53;5498:29;5517:9;5498:29;:::i;:::-;5488:39;;5546:38;5580:2;5569:9;5565:18;5546:38;:::i;:::-;5536:48;;5635:2;5624:9;5620:18;5607:32;5658:18;5699:2;5691:6;5688:14;5685:34;;;5715:1;5712;5705:12;5685:34;5738:61;5791:7;5782:6;5771:9;5767:22;5738:61;:::i;:::-;5728:71;;5852:2;5841:9;5837:18;5824:32;5808:48;;5881:2;5871:8;5868:16;5865:36;;;5897:1;5894;5887:12;5865:36;5920:63;5975:7;5964:8;5953:9;5949:24;5920:63;:::i;:::-;5910:73;;6036:3;6025:9;6021:19;6008:33;5992:49;;6066:2;6056:8;6053:16;6050:36;;;6082:1;6079;6072:12;6050:36;;6105:51;6148:7;6137:8;6126:9;6122:24;6105:51;:::i;:::-;6095:61;;;5219:943;;;;;;;;:::o;6420:733::-;6543:6;6551;6559;6567;6575;6583;6591;6644:3;6632:9;6623:7;6619:23;6615:33;6612:53;;;6661:1;6658;6651:12;6612:53;6697:9;6684:23;6674:33;;6754:2;6743:9;6739:18;6726:32;6716:42;;6805:2;6794:9;6790:18;6777:32;6767:42;;6856:2;6845:9;6841:18;6828:32;6818:42;;6907:3;6896:9;6892:19;6879:33;6869:43;;6963:3;6952:9;6948:19;6935:33;6991:18;6983:6;6980:30;6977:50;;;7023:1;7020;7013:12;6977:50;7046:49;7087:7;7078:6;7067:9;7063:22;7046:49;:::i;:::-;7036:59;;;7142:3;7131:9;7127:19;7114:33;7104:43;;6420:733;;;;;;;;;;:::o;7158:389::-;7236:6;7244;7297:2;7285:9;7276:7;7272:23;7268:32;7265:52;;;7313:1;7310;7303:12;7265:52;7349:9;7336:23;7326:33;;7410:2;7399:9;7395:18;7382:32;7437:18;7429:6;7426:30;7423:50;;;7469:1;7466;7459:12;7423:50;7492:49;7533:7;7524:6;7513:9;7509:22;7492:49;:::i;:::-;7482:59;;;7158:389;;;;;:::o;7552:1208::-;7670:6;7678;7731:2;7719:9;7710:7;7706:23;7702:32;7699:52;;;7747:1;7744;7737:12;7699:52;7787:9;7774:23;7816:18;7857:2;7849:6;7846:14;7843:34;;;7873:1;7870;7863:12;7843:34;7911:6;7900:9;7896:22;7886:32;;7956:7;7949:4;7945:2;7941:13;7937:27;7927:55;;7978:1;7975;7968:12;7927:55;8014:2;8001:16;8036:4;8059:43;8099:2;8059:43;:::i;:::-;8131:2;8125:9;8143:31;8171:2;8163:6;8143:31;:::i;:::-;8209:18;;;8297:1;8293:10;;;;8285:19;;8281:28;;;8243:15;;;;-1:-1:-1;8321:19:1;;;8318:39;;;8353:1;8350;8343:12;8318:39;8377:11;;;;8397:148;8413:6;8408:3;8405:15;8397:148;;;8479:23;8498:3;8479:23;:::i;:::-;8467:36;;8430:12;;;;8523;;;;8397:148;;;8564:6;-1:-1:-1;;8608:18:1;;8595:32;;-1:-1:-1;;8639:16:1;;;8636:36;;;8668:1;8665;8658:12;8636:36;;8691:63;8746:7;8735:8;8724:9;8720:24;8691:63;:::i;8765:435::-;8818:3;8856:5;8850:12;8883:6;8878:3;8871:19;8909:4;8938:2;8933:3;8929:12;8922:19;;8975:2;8968:5;8964:14;8996:1;9006:169;9020:6;9017:1;9014:13;9006:169;;;9081:13;;9069:26;;9115:12;;;;9150:15;;;;9042:1;9035:9;9006:169;;;-1:-1:-1;9191:3:1;;8765:435;-1:-1:-1;;;;;8765:435:1:o;9205:261::-;9384:2;9373:9;9366:21;9347:4;9404:56;9456:2;9445:9;9441:18;9433:6;9404:56;:::i;9471:743::-;9779:4;9808:3;9838:6;9827:9;9820:25;9881:6;9876:2;9865:9;9861:18;9854:34;9924:6;9919:2;9908:9;9904:18;9897:34;9967:6;9962:2;9951:9;9947:18;9940:34;10011:6;10005:3;9994:9;9990:19;9983:35;10055:6;10049:3;10038:9;10034:19;10027:35;10099:2;10093:3;10082:9;10078:19;10071:31;10119:45;10160:2;10149:9;10145:18;10137:6;10119:45;:::i;:::-;10111:53;;;10201:6;10195:3;10184:9;10180:19;10173:35;9471:743;;;;;;;;;;;:::o;11397:186::-;11456:6;11509:2;11497:9;11488:7;11484:23;11480:32;11477:52;;;11525:1;11522;11515:12;11477:52;11548:29;11567:9;11548:29;:::i;11588:118::-;11674:5;11667:13;11660:21;11653:5;11650:32;11640:60;;11696:1;11693;11686:12;11711:315;11776:6;11784;11837:2;11825:9;11816:7;11812:23;11808:32;11805:52;;;11853:1;11850;11843:12;11805:52;11876:29;11895:9;11876:29;:::i;:::-;11866:39;;11955:2;11944:9;11940:18;11927:32;11968:28;11990:5;11968:28;:::i;:::-;12015:5;12005:15;;;11711:315;;;;;:::o;12031:425::-;12293:3;12278:19;;12306:44;12282:9;12332:6;-1:-1:-1;;;;;10718:5:1;10712:12;10708:61;10703:3;10696:74;10819:4;10812:5;10808:16;10802:23;10795:4;10790:3;10786:14;10779:47;10875:4;10868:5;10864:16;10858:23;10851:4;10846:3;10842:14;10835:47;10931:4;10924:5;10920:16;10914:23;10907:4;10902:3;10898:14;10891:47;10987:4;10980:5;10976:16;10970:23;10963:4;10958:3;10954:14;10947:47;;;10635:365;12306:44;-1:-1:-1;;;;;12397:6:1;12391:13;12387:62;12381:3;12370:9;12366:19;12359:91;12031:425;;;;;:::o;12461:751::-;12565:6;12573;12581;12589;12642:2;12630:9;12621:7;12617:23;12613:32;12610:52;;;12658:1;12655;12648:12;12610:52;12694:9;12681:23;12671:33;;12751:2;12740:9;12736:18;12723:32;12713:42;;12806:2;12795:9;12791:18;12778:32;12829:18;12870:2;12862:6;12859:14;12856:34;;;12886:1;12883;12876:12;12856:34;12924:6;12913:9;12909:22;12899:32;;12969:7;12962:4;12958:2;12954:13;12950:27;12940:55;;12991:1;12988;12981:12;12940:55;13031:2;13018:16;13057:2;13049:6;13046:14;13043:34;;;13073:1;13070;13063:12;13043:34;13126:7;13121:2;13111:6;13108:1;13104:14;13100:2;13096:23;13092:32;13089:45;13086:65;;;13147:1;13144;13137:12;13086:65;12461:751;;;;-1:-1:-1;;13178:2:1;13170:11;;-1:-1:-1;;;12461:751:1:o;13217:260::-;13285:6;13293;13346:2;13334:9;13325:7;13321:23;13317:32;13314:52;;;13362:1;13359;13352:12;13314:52;13385:29;13404:9;13385:29;:::i;:::-;13375:39;;13433:38;13467:2;13456:9;13452:18;13433:38;:::i;:::-;13423:48;;13217:260;;;;;:::o;13482:391::-;13568:6;13576;13584;13592;13645:3;13633:9;13624:7;13620:23;13616:33;13613:53;;;13662:1;13659;13652:12;13613:53;13685:29;13704:9;13685:29;:::i;:::-;13675:39;13761:2;13746:18;;13733:32;;-1:-1:-1;13812:2:1;13797:18;;13784:32;;13863:2;13848:18;13835:32;;-1:-1:-1;13482:391:1;-1:-1:-1;;;13482:391:1:o;13878:606::-;13982:6;13990;13998;14006;14014;14067:3;14055:9;14046:7;14042:23;14038:33;14035:53;;;14084:1;14081;14074:12;14035:53;14107:29;14126:9;14107:29;:::i;:::-;14097:39;;14155:38;14189:2;14178:9;14174:18;14155:38;:::i;:::-;14145:48;;14240:2;14229:9;14225:18;14212:32;14202:42;;14291:2;14280:9;14276:18;14263:32;14253:42;;14346:3;14335:9;14331:19;14318:33;14374:18;14366:6;14363:30;14360:50;;;14406:1;14403;14396:12;14360:50;14429:49;14470:7;14461:6;14450:9;14446:22;14429:49;:::i;14489:802::-;14621:6;14629;14637;14645;14653;14661;14669;14677;14730:3;14718:9;14709:7;14705:23;14701:33;14698:53;;;14747:1;14744;14737:12;14698:53;14783:9;14770:23;14760:33;;14840:2;14829:9;14825:18;14812:32;14802:42;;14891:2;14880:9;14876:18;14863:32;14853:42;;14942:2;14931:9;14927:18;14914:32;14904:42;;14993:3;14982:9;14978:19;14965:33;14955:43;;15045:3;15034:9;15030:19;15017:33;15007:43;;15101:3;15090:9;15086:19;15073:33;15129:18;15121:6;15118:30;15115:50;;;15161:1;15158;15151:12;15115:50;15184:49;15225:7;15216:6;15205:9;15201:22;15184:49;:::i;:::-;15174:59;;;15280:3;15269:9;15265:19;15252:33;15242:43;;14489:802;;;;;;;;;;;:::o;15707:437::-;15786:1;15782:12;;;;15829;;;15850:61;;15904:4;15896:6;15892:17;15882:27;;15850:61;15957:2;15949:6;15946:14;15926:18;15923:38;15920:218;;15994:77;15991:1;15984:88;16095:4;16092:1;16085:15;16123:4;16120:1;16113:15;15920:218;;15707:437;;;:::o;16494:184::-;16546:77;16543:1;16536:88;16643:4;16640:1;16633:15;16667:4;16664:1;16657:15;16683:168;16756:9;;;16787;;16804:15;;;16798:22;;16784:37;16774:71;;16825:18;;:::i;17198:125::-;17263:9;;;17284:10;;;17281:36;;;17297:18;;:::i;21115:245::-;21182:6;21235:2;21223:9;21214:7;21210:23;21206:32;21203:52;;;21251:1;21248;21241:12;21203:52;21283:9;21277:16;21302:28;21324:5;21302:28;:::i;22053:545::-;22155:2;22150:3;22147:11;22144:448;;;22191:1;22216:5;22212:2;22205:17;22261:4;22257:2;22247:19;22331:2;22319:10;22315:19;22312:1;22308:27;22302:4;22298:38;22367:4;22355:10;22352:20;22349:47;;;-1:-1:-1;22390:4:1;22349:47;22445:2;22440:3;22436:12;22433:1;22429:20;22423:4;22419:31;22409:41;;22500:82;22518:2;22511:5;22508:13;22500:82;;;22563:17;;;22544:1;22533:13;22500:82;;22834:1471;22960:3;22954:10;22987:18;22979:6;22976:30;22973:56;;;23009:18;;:::i;:::-;23038:97;23128:6;23088:38;23120:4;23114:11;23088:38;:::i;:::-;23082:4;23038:97;:::i;:::-;23190:4;;23254:2;23243:14;;23271:1;23266:782;;;;24092:1;24109:6;24106:89;;;-1:-1:-1;24161:19:1;;;24155:26;24106:89;22740:66;22731:1;22727:11;;;22723:84;22719:89;22709:100;22815:1;22811:11;;;22706:117;24208:81;;23236:1063;;23266:782;22000:1;21993:14;;;22037:4;22024:18;;-1:-1:-1;;23302:79:1;;;23479:236;23493:7;23490:1;23487:14;23479:236;;;23582:19;;;23576:26;23561:42;;23674:27;;;;23642:1;23630:14;;;;23509:19;;23479:236;;;23483:3;23743:6;23734:7;23731:19;23728:261;;;23804:19;;;23798:26;23905:66;23887:1;23883:14;;;23899:3;23879:24;23875:97;23871:102;23856:118;23841:134;;23728:261;-1:-1:-1;;;;;24035:1:1;24019:14;;;24015:22;24002:36;;-1:-1:-1;22834:1471:1:o;24720:184::-;24772:77;24769:1;24762:88;24869:4;24866:1;24859:15;24893:4;24890:1;24883:15;24909:195;24948:3;24979:66;24972:5;24969:77;24966:103;;25049:18;;:::i;:::-;-1:-1:-1;25096:1:1;25085:13;;24909:195::o;25917:128::-;25984:9;;;26005:11;;;26002:37;;;26019:18;;:::i;29936:496::-;30115:3;30153:6;30147:13;30169:66;30228:6;30223:3;30216:4;30208:6;30204:17;30169:66;:::i;:::-;30298:13;;30257:16;;;;30320:70;30298:13;30257:16;30367:4;30355:17;;30320:70;:::i;:::-;30406:20;;29936:496;-1:-1:-1;;;;29936:496:1:o;30795:584::-;31017:4;-1:-1:-1;;;;;31127:2:1;31119:6;31115:15;31104:9;31097:34;31179:2;31171:6;31167:15;31162:2;31151:9;31147:18;31140:43;;31219:6;31214:2;31203:9;31199:18;31192:34;31262:6;31257:2;31246:9;31242:18;31235:34;31306:3;31300;31289:9;31285:19;31278:32;31327:46;31368:3;31357:9;31353:19;31345:6;31327:46;:::i;:::-;31319:54;30795:584;-1:-1:-1;;;;;;;30795:584:1:o;31384:249::-;31453:6;31506:2;31494:9;31485:7;31481:23;31477:32;31474:52;;;31522:1;31519;31512:12;31474:52;31554:9;31548:16;31573:30;31597:5;31573:30;:::i;31638:179::-;31673:3;31715:1;31697:16;31694:23;31691:120;;;31761:1;31758;31755;31740:23;-1:-1:-1;31798:1:1;31792:8;31787:3;31783:18;31691:120;31638:179;:::o;31822:731::-;31861:3;31903:4;31885:16;31882:26;31879:39;;;31822:731;:::o;31879:39::-;31945:2;31939:9;31967:66;32088:2;32070:16;32066:25;32063:1;32057:4;32042:50;32121:4;32115:11;32145:16;32180:18;32251:2;32244:4;32236:6;32232:17;32229:25;32224:2;32216:6;32213:14;32210:45;32207:58;;;32258:5;;;;;31822:731;:::o;32207:58::-;32295:6;32289:4;32285:17;32274:28;;32331:3;32325:10;32358:2;32350:6;32347:14;32344:27;;;32364:5;;;;;;31822:731;:::o;32344:27::-;32448:2;32429:16;32423:4;32419:27;32415:36;32408:4;32399:6;32394:3;32390:16;32386:27;32383:69;32380:82;;;32455:5;;;;;;31822:731;:::o;32380:82::-;32471:57;32522:4;32513:6;32505;32501:19;32497:30;32491:4;32471:57;:::i;:::-;-1:-1:-1;32544:3:1;;31822:731;-1:-1:-1;;;;;31822:731:1:o;34614:465::-;34871:2;34860:9;34853:21;34834:4;34897:56;34949:2;34938:9;34934:18;34926:6;34897:56;:::i;:::-;35001:9;34993:6;34989:22;34984:2;34973:9;34969:18;34962:50;35029:44;35066:6;35058;35029:44;:::i;:::-;35021:52;34614:465;-1:-1:-1;;;;;34614:465:1:o;35494:850::-;35816:4;-1:-1:-1;;;;;35926:2:1;35918:6;35914:15;35903:9;35896:34;35978:2;35970:6;35966:15;35961:2;35950:9;35946:18;35939:43;;36018:3;36013:2;36002:9;35998:18;35991:31;36045:57;36097:3;36086:9;36082:19;36074:6;36045:57;:::i;:::-;36150:9;36142:6;36138:22;36133:2;36122:9;36118:18;36111:50;36184:44;36221:6;36213;36184:44;:::i;:::-;36170:58;;36277:9;36269:6;36265:22;36259:3;36248:9;36244:19;36237:51;36305:33;36331:6;36323;36305:33;:::i;:::-;36297:41;35494:850;-1:-1:-1;;;;;;;;35494:850:1:o

Swarm Source

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