ETH Price: $2,419.08 (+0.07%)

Token

RAM Collection 2 - RAM Cats (RAMc2)
 

Overview

Max Total Supply

0 RAMc2

Holders

90

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RAMc2
0xa6d9107e7c6394141806217dc207ebf3813b7443
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:
RiseAngleMembershipCollection2

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-13
*/

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @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://diligence.consensys.net/posts/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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: RiseAngleMembershipCollection2.sol

// SPDX-License-Identifier: MIT

/*
  _____  _                               _      
 |  __ \(_)            /\               | |     
 | |__) |_ ___  ___   /  \   _ __   __ _| | ___ 
 |  _  /| / __|/ _ \ / /\ \ | '_ \ / _` | |/ _ \
 | | \ \| \__ \  __// ____ \| | | | (_| | |  __/
 |_|  \_\_|___/\___/_/    \_\_| |_|\__, |_|\___|
                                    __/ |       
                                   |___/        
*/

pragma solidity ^0.8.15;



contract RiseAngleMembershipCollection2 is ERC721, Ownable {

    ERC721 RAM1 = ERC721(0xe0d28F01C730ecf1c4197c6DB2439AdFB7b9b96a);
    ERC721 RAM2 = ERC721(0x61436a70A74ab86B69edA00eCe616E72f709912F);

    bool public saleStatus;

    uint256 public constant MAX_RAM1 = 400;

    string private _baseTokenURI;

    modifier checkSaleStatus() {
        require(
            saleStatus,
            "RiseAngle: Sale has not started yet"
        );
        _;
    }

    constructor() Ownable() ERC721("RAM Collection 2 - RAM Cats", "RAMc2") {}

    /**
     * @notice This method is used to mint token
     * @param _tokenId token id to mint
     * @param _type token type to mint
     */
    function mintNFT(uint256 _tokenId, uint8 _type) external checkSaleStatus {
        if(_type == 1) {
            require(
                RAM1.ownerOf(_tokenId) == msg.sender,
                "RiseAngle: You are not owner of token in GEN1"
            );
        } else {
            require(
                RAM2.ownerOf(_tokenId) == msg.sender,
                "RiseAngle: You are not owner of token in GEN2"
            );
        }
        _safeMint(msg.sender, (_type == 1) ? _tokenId : MAX_RAM1 + _tokenId);
    }

    /**
     * @notice This method is used to set base URI
     * @param baseTokenURI_ base URI for nfts
     */
    function setBaseURI(string calldata baseTokenURI_) external onlyOwner {
        _baseTokenURI = baseTokenURI_;
    }

    /**
     * @notice This method is used to toggle sale status
     */
    function toggleSell() external onlyOwner {
        saleStatus = !saleStatus;
    }

    /**
     * @notice This method is used to check token is minted(exist) or not
     * @param _tokenId token id of nft
     */
    function tokenExist(uint256 _tokenId) public view returns (bool) {
        return _exists(_tokenId);
    }

    /**
     * @notice This method is used to get base URI
     */
    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_RAM1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"mintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI_","type":"string"}],"name":"setBaseURI","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":[],"name":"toggleSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600780546001600160a01b031990811673e0d28f01c730ecf1c4197c6db2439adfb7b9b96a17909155600880549091167361436a70a74ab86b69eda00ece616e72f709912f1790553480156200005957600080fd5b506040518060400160405280601b81526020017f52414d20436f6c6c656374696f6e2032202d2052414d20436174730000000000815250604051806040016040528060058152602001642920a6b19960d91b8152508160009081620000bf9190620001ec565b506001620000ce8282620001ec565b505050620000eb620000e5620000f160201b60201c565b620000f5565b620002b8565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200017257607f821691505b6020821081036200019357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001e757600081815260208120601f850160051c81016020861015620001c25750805b601f850160051c820191505b81811015620001e357828155600101620001ce565b5050505b505050565b81516001600160401b0381111562000208576200020862000147565b62000220816200021984546200015d565b8462000199565b602080601f8311600181146200025857600084156200023f5750858301515b600019600386901b1c1916600185901b178555620001e3565b600085815260208120601f198616915b82811015620002895788860151825594840194600190910190840162000268565b5085821015620002a85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61194580620002c86000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde14610289578063c87b56dd1461029c578063cc0c5236146102af578063e985e9c5146102c2578063f2fde38b146102d5578063f9020e33146102e857600080fd5b8063715018a61461024d57806381a81896146102555780638da5cb5b1461025d57806395d89b411461026e578063a22cb4651461027657600080fd5b806323b872dd1161010a57806323b872dd146101d757806342842e0e146101ea57806355f804b3146101fd5780636352211e146102105780636c2eb3351461022357806370a082311461023a57600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806314620e91146101c4575b600080fd5b61015a6101553660046112a0565b6102fc565b60405190151581526020015b60405180910390f35b61017761034e565b604051610166919061130d565b610197610192366004611320565b6103e0565b6040516001600160a01b039091168152602001610166565b6101c26101bd36600461134e565b610407565b005b6101c26101d236600461137a565b610521565b6101c26101e53660046113b0565b610772565b6101c26101f83660046113b0565b6107a3565b6101c261020b3660046113f1565b6107be565b61019761021e366004611320565b6107d3565b61022c61019081565b604051908152602001610166565b61022c610248366004611463565b610833565b6101c26108b9565b6101c26108cd565b6006546001600160a01b0316610197565b6101776108f6565b6101c2610284366004611480565b610905565b6101c26102973660046114c9565b610910565b6101776102aa366004611320565b610948565b61015a6102bd366004611320565b6109af565b61015a6102d03660046115a9565b6109ce565b6101c26102e3366004611463565b6109fc565b60085461015a90600160a01b900460ff1681565b60006001600160e01b031982166380ac58cd60e01b148061032d57506001600160e01b03198216635b5e139f60e01b145b8061034857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461035d906115d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610389906115d7565b80156103d65780601f106103ab576101008083540402835291602001916103d6565b820191906000526020600020905b8154815290600101906020018083116103b957829003601f168201915b5050505050905090565b60006103eb82610a75565b506000908152600460205260409020546001600160a01b031690565b6000610412826107d3565b9050806001600160a01b0316836001600160a01b0316036104845760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806104a057506104a081336109ce565b6105125760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161047b565b61051c8383610ad4565b505050565b600854600160a01b900460ff166105865760405162461bcd60e51b815260206004820152602360248201527f52697365416e676c653a2053616c6520686173206e6f742073746172746564206044820152621e595d60ea1b606482015260840161047b565b8060ff1660010361066f576007546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156105da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fe9190611611565b6001600160a01b03161461066a5760405162461bcd60e51b815260206004820152602d60248201527f52697365416e676c653a20596f7520617265206e6f74206f776e6572206f662060448201526c746f6b656e20696e2047454e3160981b606482015260840161047b565b610748565b6008546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156106b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106dc9190611611565b6001600160a01b0316146107485760405162461bcd60e51b815260206004820152602d60248201527f52697365416e676c653a20596f7520617265206e6f74206f776e6572206f662060448201526c3a37b5b2b71034b71023a2a71960991b606482015260840161047b565b61076e338260ff166001146107685761076384610190611644565b610b42565b83610b42565b5050565b61077c3382610b5c565b6107985760405162461bcd60e51b815260040161047b90611657565b61051c838383610bbb565b61051c83838360405180602001604052806000815250610910565b6107c6610d57565b600961051c8284836116f3565b6000818152600260205260408120546001600160a01b0316806103485760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161047b565b60006001600160a01b03821661089d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161047b565b506001600160a01b031660009081526003602052604090205490565b6108c1610d57565b6108cb6000610db1565b565b6108d5610d57565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60606001805461035d906115d7565b61076e338383610e03565b61091a3383610b5c565b6109365760405162461bcd60e51b815260040161047b90611657565b61094284848484610ed1565b50505050565b606061095382610a75565b600061095d610f04565b9050600081511161097d57604051806020016040528060008152506109a8565b8061098784610f13565b6040516020016109989291906117b4565b6040516020818303038152906040525b9392505050565b6000818152600260205260408120546001600160a01b03161515610348565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a04610d57565b6001600160a01b038116610a695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161047b565b610a7281610db1565b50565b6000818152600260205260409020546001600160a01b0316610a725760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161047b565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b09826107d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61076e828260405180602001604052806000815250611014565b600080610b68836107d3565b9050806001600160a01b0316846001600160a01b03161480610b8f5750610b8f81856109ce565b80610bb35750836001600160a01b0316610ba8846103e0565b6001600160a01b0316145b949350505050565b826001600160a01b0316610bce826107d3565b6001600160a01b031614610c325760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161047b565b6001600160a01b038216610c945760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161047b565b610c9f600082610ad4565b6001600160a01b0383166000908152600360205260408120805460019290610cc89084906117e3565b90915550506001600160a01b0382166000908152600360205260408120805460019290610cf6908490611644565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b031633146108cb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047b565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610e645760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161047b565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610edc848484610bbb565b610ee884848484611047565b6109425760405162461bcd60e51b815260040161047b906117f6565b60606009805461035d906115d7565b606081600003610f3a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f645780610f4e81611848565b9150610f5d9050600a83611877565b9150610f3e565b60008167ffffffffffffffff811115610f7f57610f7f6114b3565b6040519080825280601f01601f191660200182016040528015610fa9576020820181803683370190505b5090505b8415610bb357610fbe6001836117e3565b9150610fcb600a8661188b565b610fd6906030611644565b60f81b818381518110610feb57610feb61189f565b60200101906001600160f81b031916908160001a90535061100d600a86611877565b9450610fad565b61101e8383611148565b61102b6000848484611047565b61051c5760405162461bcd60e51b815260040161047b906117f6565b60006001600160a01b0384163b1561113d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061108b9033908990889088906004016118b5565b6020604051808303816000875af19250505080156110c6575060408051601f3d908101601f191682019092526110c3918101906118f2565b60015b611123573d8080156110f4576040519150601f19603f3d011682016040523d82523d6000602084013e6110f9565b606091505b50805160000361111b5760405162461bcd60e51b815260040161047b906117f6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bb3565b506001949350505050565b6001600160a01b03821661119e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161047b565b6000818152600260205260409020546001600160a01b0316156112035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161047b565b6001600160a01b038216600090815260036020526040812080546001929061122c908490611644565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610a7257600080fd5b6000602082840312156112b257600080fd5b81356109a88161128a565b60005b838110156112d85781810151838201526020016112c0565b50506000910152565b600081518084526112f98160208601602086016112bd565b601f01601f19169290920160200192915050565b6020815260006109a860208301846112e1565b60006020828403121561133257600080fd5b5035919050565b6001600160a01b0381168114610a7257600080fd5b6000806040838503121561136157600080fd5b823561136c81611339565b946020939093013593505050565b6000806040838503121561138d57600080fd5b82359150602083013560ff811681146113a557600080fd5b809150509250929050565b6000806000606084860312156113c557600080fd5b83356113d081611339565b925060208401356113e081611339565b929592945050506040919091013590565b6000806020838503121561140457600080fd5b823567ffffffffffffffff8082111561141c57600080fd5b818501915085601f83011261143057600080fd5b81358181111561143f57600080fd5b86602082850101111561145157600080fd5b60209290920196919550909350505050565b60006020828403121561147557600080fd5b81356109a881611339565b6000806040838503121561149357600080fd5b823561149e81611339565b9150602083013580151581146113a557600080fd5b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156114df57600080fd5b84356114ea81611339565b935060208501356114fa81611339565b925060408501359150606085013567ffffffffffffffff8082111561151e57600080fd5b818701915087601f83011261153257600080fd5b813581811115611544576115446114b3565b604051601f8201601f19908116603f0116810190838211818310171561156c5761156c6114b3565b816040528281528a602084870101111561158557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156115bc57600080fd5b82356115c781611339565b915060208301356113a581611339565b600181811c908216806115eb57607f821691505b60208210810361160b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561162357600080fd5b81516109a881611339565b634e487b7160e01b600052601160045260246000fd5b808201808211156103485761034861162e565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b601f82111561051c57600081815260208120601f850160051c810160208610156116cc5750805b601f850160051c820191505b818110156116eb578281556001016116d8565b505050505050565b67ffffffffffffffff83111561170b5761170b6114b3565b61171f8361171983546115d7565b836116a5565b6000601f841160018114611753576000851561173b5750838201355b600019600387901b1c1916600186901b1783556117ad565b600083815260209020601f19861690835b828110156117845786850135825560209485019460019092019101611764565b50868210156117a15760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b600083516117c68184602088016112bd565b8351908301906117da8183602088016112bd565b01949350505050565b818103818111156103485761034861162e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001820161185a5761185a61162e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261188657611886611861565b500490565b60008261189a5761189a611861565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118e8908301846112e1565b9695505050505050565b60006020828403121561190457600080fd5b81516109a88161128a56fea2646970667358221220aaeae2c9580e23f3e8eafea8936effddc2b80c3717a2eec2ecf7085c6e47732264736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde14610289578063c87b56dd1461029c578063cc0c5236146102af578063e985e9c5146102c2578063f2fde38b146102d5578063f9020e33146102e857600080fd5b8063715018a61461024d57806381a81896146102555780638da5cb5b1461025d57806395d89b411461026e578063a22cb4651461027657600080fd5b806323b872dd1161010a57806323b872dd146101d757806342842e0e146101ea57806355f804b3146101fd5780636352211e146102105780636c2eb3351461022357806370a082311461023a57600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806314620e91146101c4575b600080fd5b61015a6101553660046112a0565b6102fc565b60405190151581526020015b60405180910390f35b61017761034e565b604051610166919061130d565b610197610192366004611320565b6103e0565b6040516001600160a01b039091168152602001610166565b6101c26101bd36600461134e565b610407565b005b6101c26101d236600461137a565b610521565b6101c26101e53660046113b0565b610772565b6101c26101f83660046113b0565b6107a3565b6101c261020b3660046113f1565b6107be565b61019761021e366004611320565b6107d3565b61022c61019081565b604051908152602001610166565b61022c610248366004611463565b610833565b6101c26108b9565b6101c26108cd565b6006546001600160a01b0316610197565b6101776108f6565b6101c2610284366004611480565b610905565b6101c26102973660046114c9565b610910565b6101776102aa366004611320565b610948565b61015a6102bd366004611320565b6109af565b61015a6102d03660046115a9565b6109ce565b6101c26102e3366004611463565b6109fc565b60085461015a90600160a01b900460ff1681565b60006001600160e01b031982166380ac58cd60e01b148061032d57506001600160e01b03198216635b5e139f60e01b145b8061034857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461035d906115d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610389906115d7565b80156103d65780601f106103ab576101008083540402835291602001916103d6565b820191906000526020600020905b8154815290600101906020018083116103b957829003601f168201915b5050505050905090565b60006103eb82610a75565b506000908152600460205260409020546001600160a01b031690565b6000610412826107d3565b9050806001600160a01b0316836001600160a01b0316036104845760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806104a057506104a081336109ce565b6105125760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161047b565b61051c8383610ad4565b505050565b600854600160a01b900460ff166105865760405162461bcd60e51b815260206004820152602360248201527f52697365416e676c653a2053616c6520686173206e6f742073746172746564206044820152621e595d60ea1b606482015260840161047b565b8060ff1660010361066f576007546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156105da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fe9190611611565b6001600160a01b03161461066a5760405162461bcd60e51b815260206004820152602d60248201527f52697365416e676c653a20596f7520617265206e6f74206f776e6572206f662060448201526c746f6b656e20696e2047454e3160981b606482015260840161047b565b610748565b6008546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156106b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106dc9190611611565b6001600160a01b0316146107485760405162461bcd60e51b815260206004820152602d60248201527f52697365416e676c653a20596f7520617265206e6f74206f776e6572206f662060448201526c3a37b5b2b71034b71023a2a71960991b606482015260840161047b565b61076e338260ff166001146107685761076384610190611644565b610b42565b83610b42565b5050565b61077c3382610b5c565b6107985760405162461bcd60e51b815260040161047b90611657565b61051c838383610bbb565b61051c83838360405180602001604052806000815250610910565b6107c6610d57565b600961051c8284836116f3565b6000818152600260205260408120546001600160a01b0316806103485760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161047b565b60006001600160a01b03821661089d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161047b565b506001600160a01b031660009081526003602052604090205490565b6108c1610d57565b6108cb6000610db1565b565b6108d5610d57565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60606001805461035d906115d7565b61076e338383610e03565b61091a3383610b5c565b6109365760405162461bcd60e51b815260040161047b90611657565b61094284848484610ed1565b50505050565b606061095382610a75565b600061095d610f04565b9050600081511161097d57604051806020016040528060008152506109a8565b8061098784610f13565b6040516020016109989291906117b4565b6040516020818303038152906040525b9392505050565b6000818152600260205260408120546001600160a01b03161515610348565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610a04610d57565b6001600160a01b038116610a695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161047b565b610a7281610db1565b50565b6000818152600260205260409020546001600160a01b0316610a725760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161047b565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b09826107d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61076e828260405180602001604052806000815250611014565b600080610b68836107d3565b9050806001600160a01b0316846001600160a01b03161480610b8f5750610b8f81856109ce565b80610bb35750836001600160a01b0316610ba8846103e0565b6001600160a01b0316145b949350505050565b826001600160a01b0316610bce826107d3565b6001600160a01b031614610c325760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161047b565b6001600160a01b038216610c945760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161047b565b610c9f600082610ad4565b6001600160a01b0383166000908152600360205260408120805460019290610cc89084906117e3565b90915550506001600160a01b0382166000908152600360205260408120805460019290610cf6908490611644565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b031633146108cb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047b565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610e645760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161047b565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610edc848484610bbb565b610ee884848484611047565b6109425760405162461bcd60e51b815260040161047b906117f6565b60606009805461035d906115d7565b606081600003610f3a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f645780610f4e81611848565b9150610f5d9050600a83611877565b9150610f3e565b60008167ffffffffffffffff811115610f7f57610f7f6114b3565b6040519080825280601f01601f191660200182016040528015610fa9576020820181803683370190505b5090505b8415610bb357610fbe6001836117e3565b9150610fcb600a8661188b565b610fd6906030611644565b60f81b818381518110610feb57610feb61189f565b60200101906001600160f81b031916908160001a90535061100d600a86611877565b9450610fad565b61101e8383611148565b61102b6000848484611047565b61051c5760405162461bcd60e51b815260040161047b906117f6565b60006001600160a01b0384163b1561113d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061108b9033908990889088906004016118b5565b6020604051808303816000875af19250505080156110c6575060408051601f3d908101601f191682019092526110c3918101906118f2565b60015b611123573d8080156110f4576040519150601f19603f3d011682016040523d82523d6000602084013e6110f9565b606091505b50805160000361111b5760405162461bcd60e51b815260040161047b906117f6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bb3565b506001949350505050565b6001600160a01b03821661119e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161047b565b6000818152600260205260409020546001600160a01b0316156112035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161047b565b6001600160a01b038216600090815260036020526040812080546001929061122c908490611644565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610a7257600080fd5b6000602082840312156112b257600080fd5b81356109a88161128a565b60005b838110156112d85781810151838201526020016112c0565b50506000910152565b600081518084526112f98160208601602086016112bd565b601f01601f19169290920160200192915050565b6020815260006109a860208301846112e1565b60006020828403121561133257600080fd5b5035919050565b6001600160a01b0381168114610a7257600080fd5b6000806040838503121561136157600080fd5b823561136c81611339565b946020939093013593505050565b6000806040838503121561138d57600080fd5b82359150602083013560ff811681146113a557600080fd5b809150509250929050565b6000806000606084860312156113c557600080fd5b83356113d081611339565b925060208401356113e081611339565b929592945050506040919091013590565b6000806020838503121561140457600080fd5b823567ffffffffffffffff8082111561141c57600080fd5b818501915085601f83011261143057600080fd5b81358181111561143f57600080fd5b86602082850101111561145157600080fd5b60209290920196919550909350505050565b60006020828403121561147557600080fd5b81356109a881611339565b6000806040838503121561149357600080fd5b823561149e81611339565b9150602083013580151581146113a557600080fd5b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156114df57600080fd5b84356114ea81611339565b935060208501356114fa81611339565b925060408501359150606085013567ffffffffffffffff8082111561151e57600080fd5b818701915087601f83011261153257600080fd5b813581811115611544576115446114b3565b604051601f8201601f19908116603f0116810190838211818310171561156c5761156c6114b3565b816040528281528a602084870101111561158557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156115bc57600080fd5b82356115c781611339565b915060208301356113a581611339565b600181811c908216806115eb57607f821691505b60208210810361160b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561162357600080fd5b81516109a881611339565b634e487b7160e01b600052601160045260246000fd5b808201808211156103485761034861162e565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b601f82111561051c57600081815260208120601f850160051c810160208610156116cc5750805b601f850160051c820191505b818110156116eb578281556001016116d8565b505050505050565b67ffffffffffffffff83111561170b5761170b6114b3565b61171f8361171983546115d7565b836116a5565b6000601f841160018114611753576000851561173b5750838201355b600019600387901b1c1916600186901b1783556117ad565b600083815260209020601f19861690835b828110156117845786850135825560209485019460019092019101611764565b50868210156117a15760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b600083516117c68184602088016112bd565b8351908301906117da8183602088016112bd565b01949350505050565b818103818111156103485761034861162e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001820161185a5761185a61162e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261188657611886611861565b500490565b60008261189a5761189a611861565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118e8908301846112e1565b9695505050505050565b60006020828403121561190457600080fd5b81516109a88161128a56fea2646970667358221220aaeae2c9580e23f3e8eafea8936effddc2b80c3717a2eec2ecf7085c6e47732264736f6c63430008110033

Deployed Bytecode Sourcemap

38443:2096:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22037:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;22037:305:0;;;;;;;;22964:100;;;:::i;:::-;;;;;;;:::i;24477:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;24477:171:0;1533:203:1;23994:417:0;;;;;;:::i;:::-;;:::i;:::-;;39161:531;;;;;;:::i;:::-;;:::i;25177:336::-;;;;;;:::i;:::-;;:::i;25584:185::-;;;;;;:::i;:::-;;:::i;39817:118::-;;;;;;:::i;:::-;;:::i;22675:222::-;;;;;;:::i;:::-;;:::i;38686:38::-;;38721:3;38686:38;;;;;3743:25:1;;;3731:2;3716:18;38686:38:0;3597:177:1;22406:207:0;;;;;;:::i;:::-;;:::i;37102:103::-;;;:::i;40019:84::-;;;:::i;36454:87::-;36527:6;;-1:-1:-1;;;;;36527:6:0;36454:87;;23133:104;;;:::i;24720:155::-;;;;;;:::i;:::-;;:::i;25840:323::-;;;;;;:::i;:::-;;:::i;23308:281::-;;;;;;:::i;:::-;;:::i;40244:108::-;;;;;;:::i;:::-;;:::i;24946:164::-;;;;;;:::i;:::-;;:::i;37360:201::-;;;;;;:::i;:::-;;:::i;38655:22::-;;;;;-1:-1:-1;;;38655:22:0;;;;;;22037:305;22139:4;-1:-1:-1;;;;;;22176:40:0;;-1:-1:-1;;;22176:40:0;;:105;;-1:-1:-1;;;;;;;22233:48:0;;-1:-1:-1;;;22233:48:0;22176:105;:158;;;-1:-1:-1;;;;;;;;;;13995:40:0;;;22298:36;22156:178;22037:305;-1:-1:-1;;22037:305:0:o;22964:100::-;23018:13;23051:5;23044:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22964:100;:::o;24477:171::-;24553:7;24573:23;24588:7;24573:14;:23::i;:::-;-1:-1:-1;24616:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24616:24:0;;24477:171::o;23994:417::-;24075:13;24091:23;24106:7;24091:14;:23::i;:::-;24075:39;;24139:5;-1:-1:-1;;;;;24133:11:0;:2;-1:-1:-1;;;;;24133:11:0;;24125:57;;;;-1:-1:-1;;;24125:57:0;;6835:2:1;24125:57:0;;;6817:21:1;6874:2;6854:18;;;6847:30;6913:34;6893:18;;;6886:62;-1:-1:-1;;;6964:18:1;;;6957:31;7005:19;;24125:57:0;;;;;;;;;20496:10;-1:-1:-1;;;;;24217:21:0;;;;:62;;-1:-1:-1;24242:37:0;24259:5;20496:10;24946:164;:::i;24242:37::-;24195:174;;;;-1:-1:-1;;;24195:174:0;;7237:2:1;24195:174:0;;;7219:21:1;7276:2;7256:18;;;7249:30;7315:34;7295:18;;;7288:62;7386:32;7366:18;;;7359:60;7436:19;;24195:174:0;7035:426:1;24195:174:0;24382:21;24391:2;24395:7;24382:8;:21::i;:::-;24064:347;23994:417;;:::o;39161:531::-;38830:10;;-1:-1:-1;;;38830:10:0;;;;38808:95;;;;-1:-1:-1;;;38808:95:0;;7668:2:1;38808:95:0;;;7650:21:1;7707:2;7687:18;;;7680:30;7746:34;7726:18;;;7719:62;-1:-1:-1;;;7797:18:1;;;7790:33;7840:19;;38808:95:0;7466:399:1;38808:95:0;39248:5:::1;:10;;39257:1;39248:10:::0;39245:361:::1;;39301:4;::::0;:22:::1;::::0;-1:-1:-1;;;39301:22:0;;::::1;::::0;::::1;3743:25:1::0;;;39327:10:0::1;::::0;-1:-1:-1;;;;;39301:4:0::1;::::0;:12:::1;::::0;3716:18:1;;39301:22:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39301:36:0::1;;39275:143;;;::::0;-1:-1:-1;;;39275:143:0;;8328:2:1;39275:143:0::1;::::0;::::1;8310:21:1::0;8367:2;8347:18;;;8340:30;8406:34;8386:18;;;8379:62;-1:-1:-1;;;8457:18:1;;;8450:43;8510:19;;39275:143:0::1;8126:409:1::0;39275:143:0::1;39245:361;;;39477:4;::::0;:22:::1;::::0;-1:-1:-1;;;39477:22:0;;::::1;::::0;::::1;3743:25:1::0;;;39503:10:0::1;::::0;-1:-1:-1;;;;;39477:4:0::1;::::0;:12:::1;::::0;3716:18:1;;39477:22:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39477:36:0::1;;39451:143;;;::::0;-1:-1:-1;;;39451:143:0;;8742:2:1;39451:143:0::1;::::0;::::1;8724:21:1::0;8781:2;8761:18;;;8754:30;8820:34;8800:18;;;8793:62;-1:-1:-1;;;8871:18:1;;;8864:43;8924:19;;39451:143:0::1;8540:409:1::0;39451:143:0::1;39616:68;39626:10;39639:5;:10;;39648:1;39639:10;39638:45;;39664:19;39675:8:::0;38721:3:::1;39664:19;:::i;:::-;39616:9;:68::i;39638:45::-;39653:8;39616:9;:68::i;:::-;39161:531:::0;;:::o;25177:336::-;25372:41;20496:10;25405:7;25372:18;:41::i;:::-;25364:100;;;;-1:-1:-1;;;25364:100:0;;;;;;;:::i;:::-;25477:28;25487:4;25493:2;25497:7;25477:9;:28::i;25584:185::-;25722:39;25739:4;25745:2;25749:7;25722:39;;;;;;;;;;;;:16;:39::i;39817:118::-;36340:13;:11;:13::i;:::-;39898::::1;:29;39914:13:::0;;39898;:29:::1;:::i;22675:222::-:0;22747:7;22783:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22783:16:0;;22810:56;;;;-1:-1:-1;;;22810:56:0;;11891:2:1;22810:56:0;;;11873:21:1;11930:2;11910:18;;;11903:30;-1:-1:-1;;;11949:18:1;;;11942:54;12013:18;;22810:56:0;11689:348:1;22406:207:0;22478:7;-1:-1:-1;;;;;22506:19:0;;22498:73;;;;-1:-1:-1;;;22498:73:0;;12244:2:1;22498:73:0;;;12226:21:1;12283:2;12263:18;;;12256:30;12322:34;12302:18;;;12295:62;-1:-1:-1;;;12373:18:1;;;12366:39;12422:19;;22498:73:0;12042:405:1;22498:73:0;-1:-1:-1;;;;;;22589:16:0;;;;;:9;:16;;;;;;;22406:207::o;37102:103::-;36340:13;:11;:13::i;:::-;37167:30:::1;37194:1;37167:18;:30::i;:::-;37102:103::o:0;40019:84::-;36340:13;:11;:13::i;:::-;40085:10:::1;::::0;;-1:-1:-1;;;;40071:24:0;::::1;-1:-1:-1::0;;;40085:10:0;;;::::1;;;40084:11;40071:24:::0;;::::1;;::::0;;40019:84::o;23133:104::-;23189:13;23222:7;23215:14;;;;;:::i;24720:155::-;24815:52;20496:10;24848:8;24858;24815:18;:52::i;25840:323::-;26014:41;20496:10;26047:7;26014:18;:41::i;:::-;26006:100;;;;-1:-1:-1;;;26006:100:0;;;;;;;:::i;:::-;26117:38;26131:4;26137:2;26141:7;26150:4;26117:13;:38::i;:::-;25840:323;;;;:::o;23308:281::-;23381:13;23407:23;23422:7;23407:14;:23::i;:::-;23443:21;23467:10;:8;:10::i;:::-;23443:34;;23519:1;23501:7;23495:21;:25;:86;;;;;;;;;;;;;;;;;23547:7;23556:18;:7;:16;:18::i;:::-;23530:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23495:86;23488:93;23308:281;-1:-1:-1;;;23308:281:0:o;40244:108::-;40303:4;27759:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27759:16:0;:30;;40327:17;27670:127;24946:164;-1:-1:-1;;;;;25067:25:0;;;25043:4;25067:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24946:164::o;37360:201::-;36340:13;:11;:13::i;:::-;-1:-1:-1;;;;;37449:22:0;::::1;37441:73;;;::::0;-1:-1:-1;;;37441:73:0;;13155:2:1;37441:73:0::1;::::0;::::1;13137:21:1::0;13194:2;13174:18;;;13167:30;13233:34;13213:18;;;13206:62;-1:-1:-1;;;13284:18:1;;;13277:36;13330:19;;37441:73:0::1;12953:402:1::0;37441:73:0::1;37525:28;37544:8;37525:18;:28::i;:::-;37360:201:::0;:::o;32452:135::-;27735:4;27759:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27759:16:0;32526:53;;;;-1:-1:-1;;;32526:53:0;;11891:2:1;32526:53:0;;;11873:21:1;11930:2;11910:18;;;11903:30;-1:-1:-1;;;11949:18:1;;;11942:54;12013:18;;32526:53:0;11689:348:1;31731:174:0;31806:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31806:29:0;-1:-1:-1;;;;;31806:29:0;;;;;;;;:24;;31860:23;31806:24;31860:14;:23::i;:::-;-1:-1:-1;;;;;31851:46:0;;;;;;;;;;;31731:174;;:::o;28570:110::-;28646:26;28656:2;28660:7;28646:26;;;;;;;;;;;;:9;:26::i;27964:264::-;28057:4;28074:13;28090:23;28105:7;28090:14;:23::i;:::-;28074:39;;28143:5;-1:-1:-1;;;;;28132:16:0;:7;-1:-1:-1;;;;;28132:16:0;;:52;;;;28152:32;28169:5;28176:7;28152:16;:32::i;:::-;28132:87;;;;28212:7;-1:-1:-1;;;;;28188:31:0;:20;28200:7;28188:11;:20::i;:::-;-1:-1:-1;;;;;28188:31:0;;28132:87;28124:96;27964:264;-1:-1:-1;;;;27964:264:0:o;30987:625::-;31146:4;-1:-1:-1;;;;;31119:31:0;:23;31134:7;31119:14;:23::i;:::-;-1:-1:-1;;;;;31119:31:0;;31111:81;;;;-1:-1:-1;;;31111:81:0;;13562:2:1;31111:81:0;;;13544:21:1;13601:2;13581:18;;;13574:30;13640:34;13620:18;;;13613:62;-1:-1:-1;;;13691:18:1;;;13684:35;13736:19;;31111:81:0;13360:401:1;31111:81:0;-1:-1:-1;;;;;31211:16:0;;31203:65;;;;-1:-1:-1;;;31203:65:0;;13968:2:1;31203:65:0;;;13950:21:1;14007:2;13987:18;;;13980:30;14046:34;14026:18;;;14019:62;-1:-1:-1;;;14097:18:1;;;14090:34;14141:19;;31203:65:0;13766:400:1;31203:65:0;31385:29;31402:1;31406:7;31385:8;:29::i;:::-;-1:-1:-1;;;;;31427:15:0;;;;;;:9;:15;;;;;:20;;31446:1;;31427:15;:20;;31446:1;;31427:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31458:13:0;;;;;;:9;:13;;;;;:18;;31475:1;;31458:13;:18;;31475:1;;31458:18;:::i;:::-;;;;-1:-1:-1;;31487:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31487:21:0;-1:-1:-1;;;;;31487:21:0;;;;;;;;;31526:27;;31487:16;;31526:27;;;;;;;24064:347;23994:417;;:::o;36619:132::-;36527:6;;-1:-1:-1;;;;;36527:6:0;20496:10;36683:23;36675:68;;;;-1:-1:-1;;;36675:68:0;;14506:2:1;36675:68:0;;;14488:21:1;;;14525:18;;;14518:30;14584:34;14564:18;;;14557:62;14636:18;;36675:68:0;14304:356:1;37721:191:0;37814:6;;;-1:-1:-1;;;;;37831:17:0;;;-1:-1:-1;;;;;;37831:17:0;;;;;;;37864:40;;37814:6;;;37831:17;37814:6;;37864:40;;37795:16;;37864:40;37784:128;37721:191;:::o;32048:315::-;32203:8;-1:-1:-1;;;;;32194:17:0;:5;-1:-1:-1;;;;;32194:17:0;;32186:55;;;;-1:-1:-1;;;32186:55:0;;14867:2:1;32186:55:0;;;14849:21:1;14906:2;14886:18;;;14879:30;14945:27;14925:18;;;14918:55;14990:18;;32186:55:0;14665:349:1;32186:55:0;-1:-1:-1;;;;;32252:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32252:46:0;;;;;;;;;;32314:41;;540::1;;;32314::0;;513:18:1;32314:41:0;;;;;;;32048:315;;;:::o;27044:313::-;27200:28;27210:4;27216:2;27220:7;27200:9;:28::i;:::-;27247:47;27270:4;27276:2;27280:7;27289:4;27247:22;:47::i;:::-;27239:110;;;;-1:-1:-1;;;27239:110:0;;;;;;;:::i;40430:106::-;40482:13;40515;40508:20;;;;;:::i;430:723::-;486:13;707:5;716:1;707:10;703:53;;-1:-1:-1;;734:10:0;;;;;;;;;;;;-1:-1:-1;;;734:10:0;;;;;430:723::o;703:53::-;781:5;766:12;822:78;829:9;;822:78;;855:8;;;;:::i;:::-;;-1:-1:-1;878:10:0;;-1:-1:-1;886:2:0;878:10;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;932:17:0;;910:39;;960:154;967:10;;960:154;;994:11;1004:1;994:11;;:::i;:::-;;-1:-1:-1;1063:10:0;1071:2;1063:5;:10;:::i;:::-;1050:24;;:2;:24;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1020:56:0;;;;;;;;-1:-1:-1;1091:11:0;1100:2;1091:11;;:::i;:::-;;;960:154;;28907:319;29036:18;29042:2;29046:7;29036:5;:18::i;:::-;29087:53;29118:1;29122:2;29126:7;29135:4;29087:22;:53::i;:::-;29065:153;;;;-1:-1:-1;;;29065:153:0;;;;;;;:::i;33151:853::-;33305:4;-1:-1:-1;;;;;33326:13:0;;4025:19;:23;33322:675;;33362:71;;-1:-1:-1;;;33362:71:0;;-1:-1:-1;;;;;33362:36:0;;;;;:71;;20496:10;;33413:4;;33419:7;;33428:4;;33362:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33362:71:0;;;;;;;;-1:-1:-1;;33362:71:0;;;;;;;;;;;;:::i;:::-;;;33358:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33603:6;:13;33620:1;33603:18;33599:328;;33646:60;;-1:-1:-1;;;33646:60:0;;;;;;;:::i;33599:328::-;33877:6;33871:13;33862:6;33858:2;33854:15;33847:38;33358:584;-1:-1:-1;;;;;;33484:51:0;-1:-1:-1;;;33484:51:0;;-1:-1:-1;33477:58:0;;33322:675;-1:-1:-1;33981:4:0;33151:853;;;;;;:::o;29562:439::-;-1:-1:-1;;;;;29642:16:0;;29634:61;;;;-1:-1:-1;;;29634:61:0;;17034:2:1;29634:61:0;;;17016:21:1;;;17053:18;;;17046:30;17112:34;17092:18;;;17085:62;17164:18;;29634:61:0;16832:356:1;29634:61:0;27735:4;27759:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27759:16:0;:30;29706:58;;;;-1:-1:-1;;;29706:58:0;;17395:2:1;29706:58:0;;;17377:21:1;17434:2;17414:18;;;17407:30;17473;17453:18;;;17446:58;17521:18;;29706:58:0;17193:352:1;29706:58:0;-1:-1:-1;;;;;29835:13:0;;;;;;:9;:13;;;;;:18;;29852:1;;29835:13;:18;;29852:1;;29835:18;:::i;:::-;;;;-1:-1:-1;;29864:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29864:21:0;-1:-1:-1;;;;;29864:21:0;;;;;;;;29903:33;;29864:16;;;29903:33;;29864:16;;29903:33;39161:531;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:337::-;2263:6;2271;2324:2;2312:9;2303:7;2299:23;2295:32;2292:52;;;2340:1;2337;2330:12;2292:52;2376:9;2363:23;2353:33;;2436:2;2425:9;2421:18;2408:32;2480:4;2473:5;2469:16;2462:5;2459:27;2449:55;;2500:1;2497;2490:12;2449:55;2523:5;2513:15;;;2197:337;;;;;:::o;2539:456::-;2616:6;2624;2632;2685:2;2673:9;2664:7;2660:23;2656:32;2653:52;;;2701:1;2698;2691:12;2653:52;2740:9;2727:23;2759:31;2784:5;2759:31;:::i;:::-;2809:5;-1:-1:-1;2866:2:1;2851:18;;2838:32;2879:33;2838:32;2879:33;:::i;:::-;2539:456;;2931:7;;-1:-1:-1;;;2985:2:1;2970:18;;;;2957:32;;2539:456::o;3000:592::-;3071:6;3079;3132:2;3120:9;3111:7;3107:23;3103:32;3100:52;;;3148:1;3145;3138:12;3100:52;3188:9;3175:23;3217:18;3258:2;3250:6;3247:14;3244:34;;;3274:1;3271;3264:12;3244:34;3312:6;3301:9;3297:22;3287:32;;3357:7;3350:4;3346:2;3342:13;3338:27;3328:55;;3379:1;3376;3369:12;3328:55;3419:2;3406:16;3445:2;3437:6;3434:14;3431:34;;;3461:1;3458;3451:12;3431:34;3506:7;3501:2;3492:6;3488:2;3484:15;3480:24;3477:37;3474:57;;;3527:1;3524;3517:12;3474:57;3558:2;3550:11;;;;;3580:6;;-1:-1:-1;3000:592:1;;-1:-1:-1;;;;3000:592:1:o;3779:247::-;3838:6;3891:2;3879:9;3870:7;3866:23;3862:32;3859:52;;;3907:1;3904;3897:12;3859:52;3946:9;3933:23;3965:31;3990:5;3965:31;:::i;4031:416::-;4096:6;4104;4157:2;4145:9;4136:7;4132:23;4128:32;4125:52;;;4173:1;4170;4163:12;4125:52;4212:9;4199:23;4231:31;4256:5;4231:31;:::i;:::-;4281:5;-1:-1:-1;4338:2:1;4323:18;;4310:32;4380:15;;4373:23;4361:36;;4351:64;;4411:1;4408;4401:12;4452:127;4513:10;4508:3;4504:20;4501:1;4494:31;4544:4;4541:1;4534:15;4568:4;4565:1;4558:15;4584:1266;4679:6;4687;4695;4703;4756:3;4744:9;4735:7;4731:23;4727:33;4724:53;;;4773:1;4770;4763:12;4724:53;4812:9;4799:23;4831:31;4856:5;4831:31;:::i;:::-;4881:5;-1:-1:-1;4938:2:1;4923:18;;4910:32;4951:33;4910:32;4951:33;:::i;:::-;5003:7;-1:-1:-1;5057:2:1;5042:18;;5029:32;;-1:-1:-1;5112:2:1;5097:18;;5084:32;5135:18;5165:14;;;5162:34;;;5192:1;5189;5182:12;5162:34;5230:6;5219:9;5215:22;5205:32;;5275:7;5268:4;5264:2;5260:13;5256:27;5246:55;;5297:1;5294;5287:12;5246:55;5333:2;5320:16;5355:2;5351;5348:10;5345:36;;;5361:18;;:::i;:::-;5436:2;5430:9;5404:2;5490:13;;-1:-1:-1;;5486:22:1;;;5510:2;5482:31;5478:40;5466:53;;;5534:18;;;5554:22;;;5531:46;5528:72;;;5580:18;;:::i;:::-;5620:10;5616:2;5609:22;5655:2;5647:6;5640:18;5695:7;5690:2;5685;5681;5677:11;5673:20;5670:33;5667:53;;;5716:1;5713;5706:12;5667:53;5772:2;5767;5763;5759:11;5754:2;5746:6;5742:15;5729:46;5817:1;5812:2;5807;5799:6;5795:15;5791:24;5784:35;5838:6;5828:16;;;;;;;4584:1266;;;;;;;:::o;5855:388::-;5923:6;5931;5984:2;5972:9;5963:7;5959:23;5955:32;5952:52;;;6000:1;5997;5990:12;5952:52;6039:9;6026:23;6058:31;6083:5;6058:31;:::i;:::-;6108:5;-1:-1:-1;6165:2:1;6150:18;;6137:32;6178:33;6137:32;6178:33;:::i;6248:380::-;6327:1;6323:12;;;;6370;;;6391:61;;6445:4;6437:6;6433:17;6423:27;;6391:61;6498:2;6490:6;6487:14;6467:18;6464:38;6461:161;;6544:10;6539:3;6535:20;6532:1;6525:31;6579:4;6576:1;6569:15;6607:4;6604:1;6597:15;6461:161;;6248:380;;;:::o;7870:251::-;7940:6;7993:2;7981:9;7972:7;7968:23;7964:32;7961:52;;;8009:1;8006;7999:12;7961:52;8041:9;8035:16;8060:31;8085:5;8060:31;:::i;8954:127::-;9015:10;9010:3;9006:20;9003:1;8996:31;9046:4;9043:1;9036:15;9070:4;9067:1;9060:15;9086:125;9151:9;;;9172:10;;;9169:36;;;9185:18;;:::i;9216:410::-;9418:2;9400:21;;;9457:2;9437:18;;;9430:30;9496:34;9491:2;9476:18;;9469:62;-1:-1:-1;;;9562:2:1;9547:18;;9540:44;9616:3;9601:19;;9216:410::o;9757:545::-;9859:2;9854:3;9851:11;9848:448;;;9895:1;9920:5;9916:2;9909:17;9965:4;9961:2;9951:19;10035:2;10023:10;10019:19;10016:1;10012:27;10006:4;10002:38;10071:4;10059:10;10056:20;10053:47;;;-1:-1:-1;10094:4:1;10053:47;10149:2;10144:3;10140:12;10137:1;10133:20;10127:4;10123:31;10113:41;;10204:82;10222:2;10215:5;10212:13;10204:82;;;10267:17;;;10248:1;10237:13;10204:82;;;10208:3;;;9757:545;;;:::o;10478:1206::-;10602:18;10597:3;10594:27;10591:53;;;10624:18;;:::i;:::-;10653:94;10743:3;10703:38;10735:4;10729:11;10703:38;:::i;:::-;10697:4;10653:94;:::i;:::-;10773:1;10798:2;10793:3;10790:11;10815:1;10810:616;;;;11470:1;11487:3;11484:93;;;-1:-1:-1;11543:19:1;;;11530:33;11484:93;-1:-1:-1;;10435:1:1;10431:11;;;10427:24;10423:29;10413:40;10459:1;10455:11;;;10410:57;11590:78;;10783:895;;10810:616;9704:1;9697:14;;;9741:4;9728:18;;-1:-1:-1;;10846:17:1;;;10947:9;10969:229;10983:7;10980:1;10977:14;10969:229;;;11072:19;;;11059:33;11044:49;;11179:4;11164:20;;;;11132:1;11120:14;;;;10999:12;10969:229;;;10973:3;11226;11217:7;11214:16;11211:159;;;11350:1;11346:6;11340:3;11334;11331:1;11327:11;11323:21;11319:34;11315:39;11302:9;11297:3;11293:19;11280:33;11276:79;11268:6;11261:95;11211:159;;;11413:1;11407:3;11404:1;11400:11;11396:19;11390:4;11383:33;10783:895;;;10478:1206;;;:::o;12452:496::-;12631:3;12669:6;12663:13;12685:66;12744:6;12739:3;12732:4;12724:6;12720:17;12685:66;:::i;:::-;12814:13;;12773:16;;;;12836:70;12814:13;12773:16;12883:4;12871:17;;12836:70;:::i;:::-;12922:20;;12452:496;-1:-1:-1;;;;12452:496:1:o;14171:128::-;14238:9;;;14259:11;;;14256:37;;;14273:18;;:::i;15019:414::-;15221:2;15203:21;;;15260:2;15240:18;;;15233:30;15299:34;15294:2;15279:18;;15272:62;-1:-1:-1;;;15365:2:1;15350:18;;15343:48;15423:3;15408:19;;15019:414::o;15438:135::-;15477:3;15498:17;;;15495:43;;15518:18;;:::i;:::-;-1:-1:-1;15565:1:1;15554:13;;15438:135::o;15578:127::-;15639:10;15634:3;15630:20;15627:1;15620:31;15670:4;15667:1;15660:15;15694:4;15691:1;15684:15;15710:120;15750:1;15776;15766:35;;15781:18;;:::i;:::-;-1:-1:-1;15815:9:1;;15710:120::o;15835:112::-;15867:1;15893;15883:35;;15898:18;;:::i;:::-;-1:-1:-1;15932:9:1;;15835:112::o;15952:127::-;16013:10;16008:3;16004:20;16001:1;15994:31;16044:4;16041:1;16034:15;16068:4;16065:1;16058:15;16084:489;-1:-1:-1;;;;;16353:15:1;;;16335:34;;16405:15;;16400:2;16385:18;;16378:43;16452:2;16437:18;;16430:34;;;16500:3;16495:2;16480:18;;16473:31;;;16278:4;;16521:46;;16547:19;;16539:6;16521:46;:::i;:::-;16513:54;16084:489;-1:-1:-1;;;;;;16084:489:1:o;16578:249::-;16647:6;16700:2;16688:9;16679:7;16675:23;16671:32;16668:52;;;16716:1;16713;16706:12;16668:52;16748:9;16742:16;16767:30;16791:5;16767:30;:::i

Swarm Source

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