ETH Price: $3,480.96 (+0.93%)

Token

CyberBrokes (CB)
 

Overview

Max Total Supply

555 CB

Holders

326

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
impaper.eth
Balance
1 CB
0x314EFdC75B58E1E09c187AC3cEe9E75A42d4590d
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:
CyberBrokes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// https://cyberbrokes.pages.dev/

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


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



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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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



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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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



/**
 * @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/token/ERC721/extensions/[email protected]


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



/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


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


// File contracts/ERC721A.sol


// Creator: Chiru Labs


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

    /**
     * @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) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

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

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


// File contracts/cyberbrokes.sol


contract CyberBrokes is ERC721A, Ownable {

    string public baseURI = "ipfs://QmaUhqTFxS6uBdaFUShQQfAvzK5VQhL9ZQ8T6q7JLseyaa/";
    string public contractURI = "ipfs://QmTwF62ZbhLK6rHLuqvhjnaUTuN7TvpGR1e11m88GKEGoY";
    string public constant baseExtension = ".json";
    address public constant proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

    uint256 public constant MAX_PER_TX = 3;
    uint256 public constant MAX_SUPPLY = 555;

    bool public paused = true;

    constructor() ERC721A("CyberBrokes", "CB") {}

    function mint(uint256 _amount) external payable {
        address _caller = _msgSender();
        require(!paused, "Paused");
        require(MAX_SUPPLY >= totalSupply() + _amount, "Exceeds max supply");
        require(_amount > 0, "No 0 mints");
        require(tx.origin == _caller, "No contracts");
        require(MAX_PER_TX >= _amount , "Excess max per paid tx");

        _safeMint(_caller, _amount);
    }

    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = _msgSender().call{value: balance}("");
        require(success, "Failed to send");
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = _contractURI;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              baseExtension
            )
        ) : "";
    }
}

contract OwnableDelegateProxy { }
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

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_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000805560e060405260366080818152906200252a60a03980516200002d9160089160209091019062000156565b50604051806060016040528060358152602001620024f56035913980516200005e9160099160209091019062000156565b50600a805460ff191660011790553480156200007957600080fd5b50604080518082018252600b81526a437962657242726f6b657360a81b60208083019182528351808501909452600284526121a160f11b908401528151919291620000c79160019162000156565b508051620000dd90600290602084019062000156565b505050620000fa620000f46200010060201b60201c565b62000104565b62000239565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016490620001fc565b90600052602060002090601f016020900481019282620001885760008555620001d3565b82601f10620001a357805160ff1916838001178555620001d3565b82800160010185558215620001d3579182015b82811115620001d3578251825591602001919060010190620001b6565b50620001e1929150620001e5565b5090565b5b80821115620001e15760008155600101620001e6565b600181811c908216806200021157607f821691505b602082108114156200023357634e487b7160e01b600052602260045260246000fd5b50919050565b6122ac80620002496000396000f3fe6080604052600436106101d85760003560e01c80636c0360eb11610102578063b88d4fde11610095578063e8a3d48511610064578063e8a3d4851461053b578063e985e9c514610550578063f2fde38b14610570578063f43a22dc1461059057600080fd5b8063b88d4fde146104a2578063c6682862146104c2578063c87b56dd146104f3578063cd7c03261461051357600080fd5b8063938e3d7b116100d1578063938e3d7b1461043a57806395d89b411461045a578063a0712d681461046f578063a22cb4651461048257600080fd5b80636c0360eb146103d257806370a08231146103e7578063715018a6146104075780638da5cb5b1461041c57600080fd5b80632f745c591161017a5780634f6ccce7116101495780634f6ccce71461035857806355f804b3146103785780635c975abb146103985780636352211e146103b257600080fd5b80632f745c59146102ed57806332cb6b0c1461030d5780633ccfd60b1461032357806342842e0e1461033857600080fd5b8063081812fc116101b6578063081812fc14610256578063095ea7b31461028e57806318160ddd146102ae57806323b872dd146102cd57600080fd5b806301ffc9a7146101dd57806302329a291461021257806306fdde0314610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611e58565b6105a5565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611e3d565b610612565b005b34801561024057600080fd5b50610249610658565b604051610209919061203d565b34801561026257600080fd5b50610276610271366004611ef8565b6106ea565b6040516001600160a01b039091168152602001610209565b34801561029a57600080fd5b506102326102a9366004611e11565b610775565b3480156102ba57600080fd5b506000545b604051908152602001610209565b3480156102d957600080fd5b506102326102e8366004611d1b565b61088d565b3480156102f957600080fd5b506102bf610308366004611e11565b610898565b34801561031957600080fd5b506102bf61022b81565b34801561032f57600080fd5b50610232610a06565b34801561034457600080fd5b50610232610353366004611d1b565b610abf565b34801561036457600080fd5b506102bf610373366004611ef8565b610ada565b34801561038457600080fd5b50610232610393366004611eaf565b610b3c565b3480156103a457600080fd5b50600a546101fd9060ff1681565b3480156103be57600080fd5b506102766103cd366004611ef8565b610b79565b3480156103de57600080fd5b50610249610b8b565b3480156103f357600080fd5b506102bf610402366004611cbe565b610c19565b34801561041357600080fd5b50610232610caa565b34801561042857600080fd5b506007546001600160a01b0316610276565b34801561044657600080fd5b50610232610455366004611eaf565b610ce0565b34801561046657600080fd5b50610249610d1d565b61023261047d366004611ef8565b610d2c565b34801561048e57600080fd5b5061023261049d366004611ddc565b610e9c565b3480156104ae57600080fd5b506102326104bd366004611d5c565b610f61565b3480156104ce57600080fd5b5061024960405180604001604052806005815260200164173539b7b760d91b81525081565b3480156104ff57600080fd5b5061024961050e366004611ef8565b610f9a565b34801561051f57600080fd5b5061027673a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561054757600080fd5b50610249611066565b34801561055c57600080fd5b506101fd61056b366004611ce2565b611073565b34801561057c57600080fd5b5061023261058b366004611cbe565b611152565b34801561059c57600080fd5b506102bf600381565b60006001600160e01b031982166380ac58cd60e01b14806105d657506001600160e01b03198216635b5e139f60e01b145b806105f157506001600160e01b0319821663780e9d6360e01b145b8061060c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146106455760405162461bcd60e51b815260040161063c90612050565b60405180910390fd5b600a805460ff1916911515919091179055565b60606001805461066790612189565b80601f016020809104026020016040519081016040528092919081815260200182805461069390612189565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b60006106f7826000541190565b6107595760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b606482015260840161063c565b506000908152600560205260409020546001600160a01b031690565b600061078082610b79565b9050806001600160a01b0316836001600160a01b031614156107ef5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161063c565b336001600160a01b038216148061080b575061080b8133611073565b61087d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161063c565b6108888383836111ed565b505050565b610888838383611249565b60006108a383610c19565b82106108fc5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161063c565b600080549080805b838110156109a6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561095757805192505b876001600160a01b0316836001600160a01b0316141561099357868414156109855750935061060c92505050565b8361098f816121c4565b9450505b508061099e816121c4565b915050610904565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161063c565b6007546001600160a01b03163314610a305760405162461bcd60e51b815260040161063c90612050565b6040514790600090339083908381818185875af1925050503d8060008114610a74576040519150601f19603f3d011682016040523d82523d6000602084013e610a79565b606091505b5050905080610abb5760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b604482015260640161063c565b5050565b61088883838360405180602001604052806000815250610f61565b600080548210610b385760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161063c565b5090565b6007546001600160a01b03163314610b665760405162461bcd60e51b815260040161063c90612050565b8051610abb906008906020840190611ba3565b6000610b8482611590565b5192915050565b60088054610b9890612189565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc490612189565b8015610c115780601f10610be657610100808354040283529160200191610c11565b820191906000526020600020905b815481529060010190602001808311610bf457829003601f168201915b505050505081565b60006001600160a01b038216610c855760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161063c565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610cd45760405162461bcd60e51b815260040161063c90612050565b610cde6000611670565b565b6007546001600160a01b03163314610d0a5760405162461bcd60e51b815260040161063c90612050565b8051610abb906009906020840190611ba3565b60606002805461066790612189565b600a54339060ff1615610d6a5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015260640161063c565b81610d7460005490565b610d7e9190612103565b61022b1015610dc45760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b604482015260640161063c565b60008211610e015760405162461bcd60e51b815260206004820152600a6024820152694e6f2030206d696e747360b01b604482015260640161063c565b326001600160a01b03821614610e485760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b604482015260640161063c565b8160031015610e925760405162461bcd60e51b815260206004820152601660248201527508af0c6cae6e640dac2f040e0cae440e0c2d2c840e8f60531b604482015260640161063c565b610abb81836116c2565b6001600160a01b038216331415610ef55760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161063c565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f6c848484611249565b610f78848484846116dc565b610f945760405162461bcd60e51b815260040161063c90612085565b50505050565b6060610fa7826000541190565b610feb5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161063c565b600060088054610ffa90612189565b905011611016576040518060200160405280600081525061060c565b6008611021836117e9565b60405180604001604052806005815260200164173539b7b760d91b81525060405160200161105193929190611f59565b60405160208183030381529060405292915050565b60098054610b9890612189565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b1580156110cf57600080fd5b505afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190611e92565b6001600160a01b0316141561112057600191505061060c565b6001600160a01b0380851660009081526006602090815260408083209387168352929052205460ff165b949350505050565b6007546001600160a01b0316331461117c5760405162461bcd60e51b815260040161063c90612050565b6001600160a01b0381166111e15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161063c565b6111ea81611670565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061125482611590565b80519091506000906001600160a01b0316336001600160a01b0316148061128b575033611280846106ea565b6001600160a01b0316145b8061129d5750815161129d9033611073565b9050806113075760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161063c565b846001600160a01b031682600001516001600160a01b03161461137b5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161063c565b6001600160a01b0384166113df5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161063c565b6113ef60008484600001516111ed565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b959092169490940217909255906114b4908590612103565b6000818152600360205260409020549091506001600160a01b0316611546576114de816000541190565b156115465760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60408051808201909152600080825260208201526115af826000541190565b61160e5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161063c565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561165d579392505050565b508061166881612172565b915050611610565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610abb8282604051806020016040528060008152506118e7565b60006001600160a01b0384163b156117de57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061172090339089908890889060040161200a565b602060405180830381600087803b15801561173a57600080fd5b505af192505050801561176a575060408051601f3d908101601f1916820190925261176791810190611e75565b60015b6117c4573d808015611798576040519150601f19603f3d011682016040523d82523d6000602084013e61179d565b606091505b5080516117bc5760405162461bcd60e51b815260040161063c90612085565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061114a565b506001949350505050565b60608161180d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118375780611821816121c4565b91506118309050600a8361211b565b9150611811565b60008167ffffffffffffffff81111561185257611852612235565b6040519080825280601f01601f19166020018201604052801561187c576020820181803683370190505b5090505b841561114a5761189160018361212f565b915061189e600a866121df565b6118a9906030612103565b60f81b8183815181106118be576118be61221f565b60200101906001600160f81b031916908160001a9053506118e0600a8661211b565b9450611880565b6000546001600160a01b03841661194a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161063c565b611955816000541190565b156119a25760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161063c565b600083116119fe5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b606482015260840161063c565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611a5a9087906120d8565b6001600160801b03168152602001858360200151611a7891906120d8565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015611b985760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611b5c60008884886116dc565b611b785760405162461bcd60e51b815260040161063c90612085565b81611b82816121c4565b9250508080611b90906121c4565b915050611b0f565b506000819055611588565b828054611baf90612189565b90600052602060002090601f016020900481019282611bd15760008555611c17565b82601f10611bea57805160ff1916838001178555611c17565b82800160010185558215611c17579182015b82811115611c17578251825591602001919060010190611bfc565b50610b389291505b80821115610b385760008155600101611c1f565b600067ffffffffffffffff80841115611c4e57611c4e612235565b604051601f8501601f19908116603f01168101908282118183101715611c7657611c76612235565b81604052809350858152868686011115611c8f57600080fd5b858560208301376000602087830101525050509392505050565b80358015158114611cb957600080fd5b919050565b600060208284031215611cd057600080fd5b8135611cdb8161224b565b9392505050565b60008060408385031215611cf557600080fd5b8235611d008161224b565b91506020830135611d108161224b565b809150509250929050565b600080600060608486031215611d3057600080fd5b8335611d3b8161224b565b92506020840135611d4b8161224b565b929592945050506040919091013590565b60008060008060808587031215611d7257600080fd5b8435611d7d8161224b565b93506020850135611d8d8161224b565b925060408501359150606085013567ffffffffffffffff811115611db057600080fd5b8501601f81018713611dc157600080fd5b611dd087823560208401611c33565b91505092959194509250565b60008060408385031215611def57600080fd5b8235611dfa8161224b565b9150611e0860208401611ca9565b90509250929050565b60008060408385031215611e2457600080fd5b8235611e2f8161224b565b946020939093013593505050565b600060208284031215611e4f57600080fd5b611cdb82611ca9565b600060208284031215611e6a57600080fd5b8135611cdb81612260565b600060208284031215611e8757600080fd5b8151611cdb81612260565b600060208284031215611ea457600080fd5b8151611cdb8161224b565b600060208284031215611ec157600080fd5b813567ffffffffffffffff811115611ed857600080fd5b8201601f81018413611ee957600080fd5b61114a84823560208401611c33565b600060208284031215611f0a57600080fd5b5035919050565b60008151808452611f29816020860160208601612146565b601f01601f19169290920160200192915050565b60008151611f4f818560208601612146565b9290920192915050565b600080855481600182811c915080831680611f7557607f831692505b6020808410821415611f9557634e487b7160e01b86526022600452602486fd5b818015611fa95760018114611fba57611fe7565b60ff19861689528489019650611fe7565b60008c81526020902060005b86811015611fdf5781548b820152908501908301611fc6565b505084890196505b505050505050612000611ffa8287611f3d565b85611f3d565b9695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061200090830184611f11565b602081526000611cdb6020830184611f11565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b038083168185168083038211156120fa576120fa6121f3565b01949350505050565b60008219821115612116576121166121f3565b500190565b60008261212a5761212a612209565b500490565b600082821015612141576121416121f3565b500390565b60005b83811015612161578181015183820152602001612149565b83811115610f945750506000910152565b600081612181576121816121f3565b506000190190565b600181811c9082168061219d57607f821691505b602082108114156121be57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121d8576121d86121f3565b5060010190565b6000826121ee576121ee612209565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111ea57600080fd5b6001600160e01b0319811681146111ea57600080fdfea26469706673582212205022c8c456652ccc5c9097c751797f2dc066c85360759c9f7c073496b1c53ab464736f6c63430008070033697066733a2f2f516d54774636325a62684c4b3672484c757176686a6e615554754e375476704752316531316d3838474b45476f59697066733a2f2f516d615568715446785336754264614655536851516641767a4b355651684c395a5138543671374a4c73657961612f

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636c0360eb11610102578063b88d4fde11610095578063e8a3d48511610064578063e8a3d4851461053b578063e985e9c514610550578063f2fde38b14610570578063f43a22dc1461059057600080fd5b8063b88d4fde146104a2578063c6682862146104c2578063c87b56dd146104f3578063cd7c03261461051357600080fd5b8063938e3d7b116100d1578063938e3d7b1461043a57806395d89b411461045a578063a0712d681461046f578063a22cb4651461048257600080fd5b80636c0360eb146103d257806370a08231146103e7578063715018a6146104075780638da5cb5b1461041c57600080fd5b80632f745c591161017a5780634f6ccce7116101495780634f6ccce71461035857806355f804b3146103785780635c975abb146103985780636352211e146103b257600080fd5b80632f745c59146102ed57806332cb6b0c1461030d5780633ccfd60b1461032357806342842e0e1461033857600080fd5b8063081812fc116101b6578063081812fc14610256578063095ea7b31461028e57806318160ddd146102ae57806323b872dd146102cd57600080fd5b806301ffc9a7146101dd57806302329a291461021257806306fdde0314610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611e58565b6105a5565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611e3d565b610612565b005b34801561024057600080fd5b50610249610658565b604051610209919061203d565b34801561026257600080fd5b50610276610271366004611ef8565b6106ea565b6040516001600160a01b039091168152602001610209565b34801561029a57600080fd5b506102326102a9366004611e11565b610775565b3480156102ba57600080fd5b506000545b604051908152602001610209565b3480156102d957600080fd5b506102326102e8366004611d1b565b61088d565b3480156102f957600080fd5b506102bf610308366004611e11565b610898565b34801561031957600080fd5b506102bf61022b81565b34801561032f57600080fd5b50610232610a06565b34801561034457600080fd5b50610232610353366004611d1b565b610abf565b34801561036457600080fd5b506102bf610373366004611ef8565b610ada565b34801561038457600080fd5b50610232610393366004611eaf565b610b3c565b3480156103a457600080fd5b50600a546101fd9060ff1681565b3480156103be57600080fd5b506102766103cd366004611ef8565b610b79565b3480156103de57600080fd5b50610249610b8b565b3480156103f357600080fd5b506102bf610402366004611cbe565b610c19565b34801561041357600080fd5b50610232610caa565b34801561042857600080fd5b506007546001600160a01b0316610276565b34801561044657600080fd5b50610232610455366004611eaf565b610ce0565b34801561046657600080fd5b50610249610d1d565b61023261047d366004611ef8565b610d2c565b34801561048e57600080fd5b5061023261049d366004611ddc565b610e9c565b3480156104ae57600080fd5b506102326104bd366004611d5c565b610f61565b3480156104ce57600080fd5b5061024960405180604001604052806005815260200164173539b7b760d91b81525081565b3480156104ff57600080fd5b5061024961050e366004611ef8565b610f9a565b34801561051f57600080fd5b5061027673a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561054757600080fd5b50610249611066565b34801561055c57600080fd5b506101fd61056b366004611ce2565b611073565b34801561057c57600080fd5b5061023261058b366004611cbe565b611152565b34801561059c57600080fd5b506102bf600381565b60006001600160e01b031982166380ac58cd60e01b14806105d657506001600160e01b03198216635b5e139f60e01b145b806105f157506001600160e01b0319821663780e9d6360e01b145b8061060c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146106455760405162461bcd60e51b815260040161063c90612050565b60405180910390fd5b600a805460ff1916911515919091179055565b60606001805461066790612189565b80601f016020809104026020016040519081016040528092919081815260200182805461069390612189565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b60006106f7826000541190565b6107595760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b606482015260840161063c565b506000908152600560205260409020546001600160a01b031690565b600061078082610b79565b9050806001600160a01b0316836001600160a01b031614156107ef5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161063c565b336001600160a01b038216148061080b575061080b8133611073565b61087d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161063c565b6108888383836111ed565b505050565b610888838383611249565b60006108a383610c19565b82106108fc5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161063c565b600080549080805b838110156109a6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561095757805192505b876001600160a01b0316836001600160a01b0316141561099357868414156109855750935061060c92505050565b8361098f816121c4565b9450505b508061099e816121c4565b915050610904565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161063c565b6007546001600160a01b03163314610a305760405162461bcd60e51b815260040161063c90612050565b6040514790600090339083908381818185875af1925050503d8060008114610a74576040519150601f19603f3d011682016040523d82523d6000602084013e610a79565b606091505b5050905080610abb5760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b604482015260640161063c565b5050565b61088883838360405180602001604052806000815250610f61565b600080548210610b385760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161063c565b5090565b6007546001600160a01b03163314610b665760405162461bcd60e51b815260040161063c90612050565b8051610abb906008906020840190611ba3565b6000610b8482611590565b5192915050565b60088054610b9890612189565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc490612189565b8015610c115780601f10610be657610100808354040283529160200191610c11565b820191906000526020600020905b815481529060010190602001808311610bf457829003601f168201915b505050505081565b60006001600160a01b038216610c855760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161063c565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610cd45760405162461bcd60e51b815260040161063c90612050565b610cde6000611670565b565b6007546001600160a01b03163314610d0a5760405162461bcd60e51b815260040161063c90612050565b8051610abb906009906020840190611ba3565b60606002805461066790612189565b600a54339060ff1615610d6a5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015260640161063c565b81610d7460005490565b610d7e9190612103565b61022b1015610dc45760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b604482015260640161063c565b60008211610e015760405162461bcd60e51b815260206004820152600a6024820152694e6f2030206d696e747360b01b604482015260640161063c565b326001600160a01b03821614610e485760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b604482015260640161063c565b8160031015610e925760405162461bcd60e51b815260206004820152601660248201527508af0c6cae6e640dac2f040e0cae440e0c2d2c840e8f60531b604482015260640161063c565b610abb81836116c2565b6001600160a01b038216331415610ef55760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161063c565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f6c848484611249565b610f78848484846116dc565b610f945760405162461bcd60e51b815260040161063c90612085565b50505050565b6060610fa7826000541190565b610feb5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161063c565b600060088054610ffa90612189565b905011611016576040518060200160405280600081525061060c565b6008611021836117e9565b60405180604001604052806005815260200164173539b7b760d91b81525060405160200161105193929190611f59565b60405160208183030381529060405292915050565b60098054610b9890612189565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b1580156110cf57600080fd5b505afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190611e92565b6001600160a01b0316141561112057600191505061060c565b6001600160a01b0380851660009081526006602090815260408083209387168352929052205460ff165b949350505050565b6007546001600160a01b0316331461117c5760405162461bcd60e51b815260040161063c90612050565b6001600160a01b0381166111e15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161063c565b6111ea81611670565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061125482611590565b80519091506000906001600160a01b0316336001600160a01b0316148061128b575033611280846106ea565b6001600160a01b0316145b8061129d5750815161129d9033611073565b9050806113075760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161063c565b846001600160a01b031682600001516001600160a01b03161461137b5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161063c565b6001600160a01b0384166113df5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161063c565b6113ef60008484600001516111ed565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b959092169490940217909255906114b4908590612103565b6000818152600360205260409020549091506001600160a01b0316611546576114de816000541190565b156115465760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60408051808201909152600080825260208201526115af826000541190565b61160e5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161063c565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561165d579392505050565b508061166881612172565b915050611610565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610abb8282604051806020016040528060008152506118e7565b60006001600160a01b0384163b156117de57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061172090339089908890889060040161200a565b602060405180830381600087803b15801561173a57600080fd5b505af192505050801561176a575060408051601f3d908101601f1916820190925261176791810190611e75565b60015b6117c4573d808015611798576040519150601f19603f3d011682016040523d82523d6000602084013e61179d565b606091505b5080516117bc5760405162461bcd60e51b815260040161063c90612085565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061114a565b506001949350505050565b60608161180d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118375780611821816121c4565b91506118309050600a8361211b565b9150611811565b60008167ffffffffffffffff81111561185257611852612235565b6040519080825280601f01601f19166020018201604052801561187c576020820181803683370190505b5090505b841561114a5761189160018361212f565b915061189e600a866121df565b6118a9906030612103565b60f81b8183815181106118be576118be61221f565b60200101906001600160f81b031916908160001a9053506118e0600a8661211b565b9450611880565b6000546001600160a01b03841661194a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161063c565b611955816000541190565b156119a25760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161063c565b600083116119fe5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b606482015260840161063c565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611a5a9087906120d8565b6001600160801b03168152602001858360200151611a7891906120d8565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015611b985760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611b5c60008884886116dc565b611b785760405162461bcd60e51b815260040161063c90612085565b81611b82816121c4565b9250508080611b90906121c4565b915050611b0f565b506000819055611588565b828054611baf90612189565b90600052602060002090601f016020900481019282611bd15760008555611c17565b82601f10611bea57805160ff1916838001178555611c17565b82800160010185558215611c17579182015b82811115611c17578251825591602001919060010190611bfc565b50610b389291505b80821115610b385760008155600101611c1f565b600067ffffffffffffffff80841115611c4e57611c4e612235565b604051601f8501601f19908116603f01168101908282118183101715611c7657611c76612235565b81604052809350858152868686011115611c8f57600080fd5b858560208301376000602087830101525050509392505050565b80358015158114611cb957600080fd5b919050565b600060208284031215611cd057600080fd5b8135611cdb8161224b565b9392505050565b60008060408385031215611cf557600080fd5b8235611d008161224b565b91506020830135611d108161224b565b809150509250929050565b600080600060608486031215611d3057600080fd5b8335611d3b8161224b565b92506020840135611d4b8161224b565b929592945050506040919091013590565b60008060008060808587031215611d7257600080fd5b8435611d7d8161224b565b93506020850135611d8d8161224b565b925060408501359150606085013567ffffffffffffffff811115611db057600080fd5b8501601f81018713611dc157600080fd5b611dd087823560208401611c33565b91505092959194509250565b60008060408385031215611def57600080fd5b8235611dfa8161224b565b9150611e0860208401611ca9565b90509250929050565b60008060408385031215611e2457600080fd5b8235611e2f8161224b565b946020939093013593505050565b600060208284031215611e4f57600080fd5b611cdb82611ca9565b600060208284031215611e6a57600080fd5b8135611cdb81612260565b600060208284031215611e8757600080fd5b8151611cdb81612260565b600060208284031215611ea457600080fd5b8151611cdb8161224b565b600060208284031215611ec157600080fd5b813567ffffffffffffffff811115611ed857600080fd5b8201601f81018413611ee957600080fd5b61114a84823560208401611c33565b600060208284031215611f0a57600080fd5b5035919050565b60008151808452611f29816020860160208601612146565b601f01601f19169290920160200192915050565b60008151611f4f818560208601612146565b9290920192915050565b600080855481600182811c915080831680611f7557607f831692505b6020808410821415611f9557634e487b7160e01b86526022600452602486fd5b818015611fa95760018114611fba57611fe7565b60ff19861689528489019650611fe7565b60008c81526020902060005b86811015611fdf5781548b820152908501908301611fc6565b505084890196505b505050505050612000611ffa8287611f3d565b85611f3d565b9695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061200090830184611f11565b602081526000611cdb6020830184611f11565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b038083168185168083038211156120fa576120fa6121f3565b01949350505050565b60008219821115612116576121166121f3565b500190565b60008261212a5761212a612209565b500490565b600082821015612141576121416121f3565b500390565b60005b83811015612161578181015183820152602001612149565b83811115610f945750506000910152565b600081612181576121816121f3565b506000190190565b600181811c9082168061219d57607f821691505b602082108114156121be57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121d8576121d86121f3565b5060010190565b6000826121ee576121ee612209565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111ea57600080fd5b6001600160e01b0319811681146111ea57600080fdfea26469706673582212205022c8c456652ccc5c9097c751797f2dc066c85360759c9f7c073496b1c53ab464736f6c63430008070033

Deployed Bytecode Sourcemap

38713:2345:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26684:372;;;;;;;;;;-1:-1:-1;26684:372:0;;;;;:::i;:::-;;:::i;:::-;;;7756:14:1;;7749:22;7731:41;;7719:2;7704:18;26684:372:0;;;;;;;;40372:81;;;;;;;;;;-1:-1:-1;40372:81:0;;;;;:::i;:::-;;:::i;:::-;;28311:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29872:214::-;;;;;;;;;;-1:-1:-1;29872:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7054:32:1;;;7036:51;;7024:2;7009:18;29872:214:0;6890:203:1;29393:413:0;;;;;;;;;;-1:-1:-1;29393:413:0;;;;;:::i;:::-;;:::i;25125:100::-;;;;;;;;;;-1:-1:-1;25178:7:0;25205:12;25125:100;;;18201:25:1;;;18189:2;18174:18;25125:100:0;18055:177:1;30748:162:0;;;;;;;;;;-1:-1:-1;30748:162:0;;;;;:::i;:::-;;:::i;25789:823::-;;;;;;;;;;-1:-1:-1;25789:823:0;;;;;:::i;:::-;;:::i;39136:40::-;;;;;;;;;;;;39173:3;39136:40;;40155:209;;;;;;;;;;;;;:::i;30981:177::-;;;;;;;;;;-1:-1:-1;30981:177:0;;;;;:::i;:::-;;:::i;25302:187::-;;;;;;;;;;-1:-1:-1;25302:187:0;;;;;:::i;:::-;;:::i;40461:100::-;;;;;;;;;;-1:-1:-1;40461:100:0;;;;;:::i;:::-;;:::i;39185:25::-;;;;;;;;;;-1:-1:-1;39185:25:0;;;;;;;;28120:124;;;;;;;;;;-1:-1:-1;28120:124:0;;;;;:::i;:::-;;:::i;38763:80::-;;;;;;;;;;;;;:::i;27120:221::-;;;;;;;;;;-1:-1:-1;27120:221:0;;;;;:::i;:::-;;:::i;2663:103::-;;;;;;;;;;;;;:::i;2012:87::-;;;;;;;;;;-1:-1:-1;2085:6:0;;-1:-1:-1;;;;;2085:6:0;2012:87;;40569:116;;;;;;;;;;-1:-1:-1;40569:116:0;;;;;:::i;:::-;;:::i;28480:104::-;;;;;;;;;;;;;:::i;39272:422::-;;;;;;:::i;:::-;;:::i;30158:288::-;;;;;;;;;;-1:-1:-1;30158:288:0;;;;;:::i;:::-;;:::i;31229:355::-;;;;;;;;;;-1:-1:-1;31229:355:0;;;;;:::i;:::-;;:::i;38940:46::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38940:46:0;;;;;40693:362;;;;;;;;;;-1:-1:-1;40693:362:0;;;;;:::i;:::-;;:::i;38993:89::-;;;;;;;;;;;;39040:42;38993:89;;38850:83;;;;;;;;;;;;;:::i;39702:445::-;;;;;;;;;;-1:-1:-1;39702:445:0;;;;;:::i;:::-;;:::i;2921:201::-;;;;;;;;;;-1:-1:-1;2921:201:0;;;;;:::i;:::-;;:::i;39091:38::-;;;;;;;;;;;;39128:1;39091:38;;26684:372;26786:4;-1:-1:-1;;;;;;26823:40:0;;-1:-1:-1;;;26823:40:0;;:105;;-1:-1:-1;;;;;;;26880:48:0;;-1:-1:-1;;;26880:48:0;26823:105;:172;;;-1:-1:-1;;;;;;;26945:50:0;;-1:-1:-1;;;26945:50:0;26823:172;:225;;;-1:-1:-1;;;;;;;;;;23297:40:0;;;27012:36;26803:245;26684:372;-1:-1:-1;;26684:372:0:o;40372:81::-;2085:6;;-1:-1:-1;;;;;2085:6:0;833:10;2232:23;2224:68;;;;-1:-1:-1;;;2224:68:0;;;;;;;:::i;:::-;;;;;;;;;40430:6:::1;:15:::0;;-1:-1:-1;;40430:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40372:81::o;28311:100::-;28365:13;28398:5;28391:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28311:100;:::o;29872:214::-;29940:7;29968:16;29976:7;31896:4;31930:12;-1:-1:-1;31920:22:0;31839:111;29968:16;29960:74;;;;-1:-1:-1;;;29960:74:0;;17502:2:1;29960:74:0;;;17484:21:1;17541:2;17521:18;;;17514:30;17580:34;17560:18;;;17553:62;-1:-1:-1;;;17631:18:1;;;17624:43;17684:19;;29960:74:0;17300:409:1;29960:74:0;-1:-1:-1;30054:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30054:24:0;;29872:214::o;29393:413::-;29466:13;29482:24;29498:7;29482:15;:24::i;:::-;29466:40;;29531:5;-1:-1:-1;;;;;29525:11:0;:2;-1:-1:-1;;;;;29525:11:0;;;29517:58;;;;-1:-1:-1;;;29517:58:0;;14341:2:1;29517:58:0;;;14323:21:1;14380:2;14360:18;;;14353:30;14419:34;14399:18;;;14392:62;-1:-1:-1;;;14470:18:1;;;14463:32;14512:19;;29517:58:0;14139:398:1;29517:58:0;833:10;-1:-1:-1;;;;;29610:21:0;;;;:62;;-1:-1:-1;29635:37:0;29652:5;833:10;39702:445;:::i;29635:37::-;29588:169;;;;-1:-1:-1;;;29588:169:0;;11264:2:1;29588:169:0;;;11246:21:1;11303:2;11283:18;;;11276:30;11342:34;11322:18;;;11315:62;11413:27;11393:18;;;11386:55;11458:19;;29588:169:0;11062:421:1;29588:169:0;29770:28;29779:2;29783:7;29792:5;29770:8;:28::i;:::-;29455:351;29393:413;;:::o;30748:162::-;30874:28;30884:4;30890:2;30894:7;30874:9;:28::i;25789:823::-;25878:7;25914:16;25924:5;25914:9;:16::i;:::-;25906:5;:24;25898:71;;;;-1:-1:-1;;;25898:71:0;;8209:2:1;25898:71:0;;;8191:21:1;8248:2;8228:18;;;8221:30;8287:34;8267:18;;;8260:62;-1:-1:-1;;;8338:18:1;;;8331:32;8380:19;;25898:71:0;8007:398:1;25898:71:0;25980:22;25205:12;;;25980:22;;26112:426;26136:14;26132:1;:18;26112:426;;;26172:31;26206:14;;;:11;:14;;;;;;;;;26172:48;;;;;;;;;-1:-1:-1;;;;;26172:48:0;;;;;-1:-1:-1;;;26172:48:0;;;;;;;;;;;;26239:28;26235:103;;26308:14;;;-1:-1:-1;26235:103:0;26377:5;-1:-1:-1;;;;;26356:26:0;:17;-1:-1:-1;;;;;26356:26:0;;26352:175;;;26422:5;26407:11;:20;26403:77;;;-1:-1:-1;26459:1:0;-1:-1:-1;26452:8:0;;-1:-1:-1;;;26452:8:0;26403:77;26498:13;;;;:::i;:::-;;;;26352:175;-1:-1:-1;26152:3:0;;;;:::i;:::-;;;;26112:426;;;-1:-1:-1;26548:56:0;;-1:-1:-1;;;26548:56:0;;16671:2:1;26548:56:0;;;16653:21:1;16710:2;16690:18;;;16683:30;16749:34;16729:18;;;16722:62;-1:-1:-1;;;16800:18:1;;;16793:44;16854:19;;26548:56:0;16469:410:1;40155:209:0;2085:6;;-1:-1:-1;;;;;2085:6:0;833:10;2232:23;2224:68;;;;-1:-1:-1;;;2224:68:0;;;;;;;:::i;:::-;40274:37:::1;::::0;40223:21:::1;::::0;40205:15:::1;::::0;833:10;;40223:21;;40205:15;40274:37;40205:15;40274:37;40223:21;833:10;40274:37:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40255:56;;;40330:7;40322:34;;;::::0;-1:-1:-1;;;40322:34:0;;16328:2:1;40322:34:0::1;::::0;::::1;16310:21:1::0;16367:2;16347:18;;;16340:30;-1:-1:-1;;;16386:18:1;;;16379:44;16440:18;;40322:34:0::1;16126:338:1::0;40322:34:0::1;40194:170;;40155:209::o:0;30981:177::-;31111:39;31128:4;31134:2;31138:7;31111:39;;;;;;;;;;;;:16;:39::i;25302:187::-;25369:7;25205:12;;25397:5;:21;25389:69;;;;-1:-1:-1;;;25389:69:0;;10454:2:1;25389:69:0;;;10436:21:1;10493:2;10473:18;;;10466:30;10532:34;10512:18;;;10505:62;-1:-1:-1;;;10583:18:1;;;10576:33;10626:19;;25389:69:0;10252:399:1;25389:69:0;-1:-1:-1;25476:5:0;25302:187::o;40461:100::-;2085:6;;-1:-1:-1;;;;;2085:6:0;833:10;2232:23;2224:68;;;;-1:-1:-1;;;2224:68:0;;;;;;;:::i;:::-;40535:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;28120:124::-:0;28184:7;28211:20;28223:7;28211:11;:20::i;:::-;:25;;28120:124;-1:-1:-1;;28120:124:0:o;38763:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27120:221::-;27184:7;-1:-1:-1;;;;;27212:19:0;;27204:75;;;;-1:-1:-1;;;27204:75:0;;12037:2:1;27204:75:0;;;12019:21:1;12076:2;12056:18;;;12049:30;12115:34;12095:18;;;12088:62;-1:-1:-1;;;12166:18:1;;;12159:41;12217:19;;27204:75:0;11835:407:1;27204:75:0;-1:-1:-1;;;;;;27305:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27305:27:0;;27120:221::o;2663:103::-;2085:6;;-1:-1:-1;;;;;2085:6:0;833:10;2232:23;2224:68;;;;-1:-1:-1;;;2224:68:0;;;;;;;:::i;:::-;2728:30:::1;2755:1;2728:18;:30::i;:::-;2663:103::o:0;40569:116::-;2085:6;;-1:-1:-1;;;;;2085:6:0;833:10;2232:23;2224:68;;;;-1:-1:-1;;;2224:68:0;;;;;;;:::i;:::-;40651:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;28480:104::-:0;28536:13;28569:7;28562:14;;;;;:::i;39272:422::-;39381:6;;833:10;;39381:6;;39380:7;39372:26;;;;-1:-1:-1;;;39372:26:0;;8612:2:1;39372:26:0;;;8594:21:1;8651:1;8631:18;;;8624:29;-1:-1:-1;;;8669:18:1;;;8662:36;8715:18;;39372:26:0;8410:329:1;39372:26:0;39447:7;39431:13;25178:7;25205:12;;25125:100;39431:13;:23;;;;:::i;:::-;39173:3;39417:37;;39409:68;;;;-1:-1:-1;;;39409:68:0;;11690:2:1;39409:68:0;;;11672:21:1;11729:2;11709:18;;;11702:30;-1:-1:-1;;;11748:18:1;;;11741:48;11806:18;;39409:68:0;11488:342:1;39409:68:0;39506:1;39496:7;:11;39488:34;;;;-1:-1:-1;;;39488:34:0;;9764:2:1;39488:34:0;;;9746:21:1;9803:2;9783:18;;;9776:30;-1:-1:-1;;;9822:18:1;;;9815:40;9872:18;;39488:34:0;9562:334:1;39488:34:0;39541:9;-1:-1:-1;;;;;39541:20:0;;;39533:45;;;;-1:-1:-1;;;39533:45:0;;17916:2:1;39533:45:0;;;17898:21:1;17955:2;17935:18;;;17928:30;-1:-1:-1;;;17974:18:1;;;17967:42;18026:18;;39533:45:0;17714:336:1;39533:45:0;39611:7;39128:1;39597:21;;39589:57;;;;-1:-1:-1;;;39589:57:0;;10103:2:1;39589:57:0;;;10085:21:1;10142:2;10122:18;;;10115:30;-1:-1:-1;;;10161:18:1;;;10154:52;10223:18;;39589:57:0;9901:346:1;39589:57:0;39659:27;39669:7;39678;39659:9;:27::i;30158:288::-;-1:-1:-1;;;;;30253:24:0;;833:10;30253:24;;30245:63;;;;-1:-1:-1;;;30245:63:0;;13567:2:1;30245:63:0;;;13549:21:1;13606:2;13586:18;;;13579:30;13645:28;13625:18;;;13618:56;13691:18;;30245:63:0;13365:350:1;30245:63:0;833:10;30321:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30321:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30321:53:0;;;;;;;;;;30390:48;;7731:41:1;;;30321:42:0;;833:10;30390:48;;7704:18:1;30390:48:0;;;;;;;30158:288;;:::o;31229:355::-;31388:28;31398:4;31404:2;31408:7;31388:9;:28::i;:::-;31449:48;31472:4;31478:2;31482:7;31491:5;31449:22;:48::i;:::-;31427:149;;;;-1:-1:-1;;;31427:149:0;;;;;;;:::i;:::-;31229:355;;;;:::o;40693:362::-;40759:13;40793:17;40801:8;31896:4;31930:12;-1:-1:-1;31920:22:0;31839:111;40793:17;40785:51;;;;-1:-1:-1;;;40785:51:0;;12449:2:1;40785:51:0;;;12431:21:1;12488:2;12468:18;;;12461:30;-1:-1:-1;;;12507:18:1;;;12500:51;12568:18;;40785:51:0;12247:345:1;40785:51:0;40878:1;40860:7;40854:21;;;;;:::i;:::-;;;:25;:193;;;;;;;;;;;;;;;;;40936:7;40960:26;40977:8;40960:16;:26::i;:::-;41003:13;;;;;;;;;;;;;-1:-1:-1;;;41003:13:0;;;40903:128;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40847:200;40693:362;-1:-1:-1;;40693:362:0:o;38850:83::-;;;;;;;:::i;39702:445::-;40000:28;;-1:-1:-1;;;40000:28:0;;-1:-1:-1;;;;;7054:32:1;;;40000:28:0;;;7036:51:1;39827:4:0;;39040:42;;39992:49;;;39040:42;;40000:21;;7009:18:1;;40000:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39992:49:0;;39988:93;;;40065:4;40058:11;;;;;39988:93;-1:-1:-1;;;;;30638:25:0;;;30614:4;30638:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;40100:39;40093:46;39702:445;-1:-1:-1;;;;39702:445:0:o;2921:201::-;2085:6;;-1:-1:-1;;;;;2085:6:0;833:10;2232:23;2224:68;;;;-1:-1:-1;;;2224:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3010:22:0;::::1;3002:73;;;::::0;-1:-1:-1;;;3002:73:0;;8946:2:1;3002:73:0::1;::::0;::::1;8928:21:1::0;8985:2;8965:18;;;8958:30;9024:34;9004:18;;;8997:62;-1:-1:-1;;;9075:18:1;;;9068:36;9121:19;;3002:73:0::1;8744:402:1::0;3002:73:0::1;3086:28;3105:8;3086:18;:28::i;:::-;2921:201:::0;:::o;35883:196::-;35998:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35998:29:0;-1:-1:-1;;;;;35998:29:0;;;;;;;;;36043:28;;35998:24;;36043:28;;;;;;;35883:196;;;:::o;33982:1783::-;34097:35;34135:20;34147:7;34135:11;:20::i;:::-;34210:18;;34097:58;;-1:-1:-1;34168:22:0;;-1:-1:-1;;;;;34194:34:0;833:10;-1:-1:-1;;;;;34194:34:0;;:87;;;-1:-1:-1;833:10:0;34245:20;34257:7;34245:11;:20::i;:::-;-1:-1:-1;;;;;34245:36:0;;34194:87;:154;;;-1:-1:-1;34315:18:0;;34298:50;;833:10;39702:445;:::i;34298:50::-;34168:181;;34370:17;34362:80;;;;-1:-1:-1;;;34362:80:0;;13922:2:1;34362:80:0;;;13904:21:1;13961:2;13941:18;;;13934:30;14000:34;13980:18;;;13973:62;-1:-1:-1;;;14051:18:1;;;14044:48;14109:19;;34362:80:0;13720:414:1;34362:80:0;34485:4;-1:-1:-1;;;;;34463:26:0;:13;:18;;;-1:-1:-1;;;;;34463:26:0;;34455:77;;;;-1:-1:-1;;;34455:77:0;;12799:2:1;34455:77:0;;;12781:21:1;12838:2;12818:18;;;12811:30;12877:34;12857:18;;;12850:62;-1:-1:-1;;;12928:18:1;;;12921:36;12974:19;;34455:77:0;12597:402:1;34455:77:0;-1:-1:-1;;;;;34551:16:0;;34543:66;;;;-1:-1:-1;;;34543:66:0;;10858:2:1;34543:66:0;;;10840:21:1;10897:2;10877:18;;;10870:30;10936:34;10916:18;;;10909:62;-1:-1:-1;;;10987:18:1;;;10980:35;11032:19;;34543:66:0;10656:401:1;34543:66:0;34730:49;34747:1;34751:7;34760:13;:18;;;34730:8;:49::i;:::-;-1:-1:-1;;;;;34984:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;34984:31:0;;;-1:-1:-1;;;;;34984:31:0;;;-1:-1:-1;;34984:31:0;;;;;;;35030:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;35030:29:0;;;;;;;;;;;;;35106:43;;;;;;;;;;35132:15;35106:43;;;;;;;;;;35083:20;;;:11;:20;;;;;;:66;;;;;;;;-1:-1:-1;;;;;;35083:66:0;;;;;;;-1:-1:-1;;;35083:66:0;;;;;;;;;;;;34984:18;35411:11;;35083:20;;35411:11;:::i;:::-;35478:1;35437:24;;;:11;:24;;;;;:29;35389:33;;-1:-1:-1;;;;;;35437:29:0;35433:227;;35501:20;35509:11;31896:4;31930:12;-1:-1:-1;31920:22:0;31839:111;35501:20;35497:152;;;35569:64;;;;;;;;35584:18;;-1:-1:-1;;;;;35569:64:0;;;;;;35604:28;;;;35569:64;;;;;;;;;;-1:-1:-1;35542:24:0;;;:11;:24;;;;;;;:91;;;;;;;;;-1:-1:-1;;;35542:91:0;-1:-1:-1;;;;;;35542:91:0;;;;;;;;;;;;35497:152;35696:7;35692:2;-1:-1:-1;;;;;35677:27:0;35686:4;-1:-1:-1;;;;;35677:27:0;;;;;;;;;;;35715:42;34086:1679;;;33982:1783;;;:::o;27586:472::-;-1:-1:-1;;;;;;;;;;;;;;;;;27689:16:0;27697:7;31896:4;31930:12;-1:-1:-1;31920:22:0;31839:111;27689:16;27681:71;;;;-1:-1:-1;;;27681:71:0;;9353:2:1;27681:71:0;;;9335:21:1;9392:2;9372:18;;;9365:30;9431:34;9411:18;;;9404:62;-1:-1:-1;;;9482:18:1;;;9475:40;9532:19;;27681:71:0;9151:406:1;27681:71:0;27785:7;27765:216;27819:31;27853:17;;;:11;:17;;;;;;;;;27819:51;;;;;;;;;-1:-1:-1;;;;;27819:51:0;;;;;-1:-1:-1;;;27819:51:0;;;;;;;;;;;;27889:28;27885:85;;27945:9;27586:472;-1:-1:-1;;;27586:472:0:o;27885:85::-;-1:-1:-1;27796:6:0;;;;:::i;:::-;;;;27765:216;;3282:191;3375:6;;;-1:-1:-1;;;;;3392:17:0;;;-1:-1:-1;;;;;;3392:17:0;;;;;;;3425:40;;3375:6;;;3392:17;3375:6;;3425:40;;3356:16;;3425:40;3345:128;3282:191;:::o;31958:104::-;32027:27;32037:2;32041:8;32027:27;;;;;;;;;;;;:9;:27::i;36644:804::-;36799:4;-1:-1:-1;;;;;36820:13:0;;15332:20;15380:8;36816:625;;36856:72;;-1:-1:-1;;;36856:72:0;;-1:-1:-1;;;;;36856:36:0;;;;;:72;;833:10;;36907:4;;36913:7;;36922:5;;36856:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36856:72:0;;;;;;;;-1:-1:-1;;36856:72:0;;;;;;;;;;;;:::i;:::-;;;36852:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37102:13:0;;37098:273;;37145:61;;-1:-1:-1;;;37145:61:0;;;;;;;:::i;37098:273::-;37321:6;37315:13;37306:6;37302:2;37298:15;37291:38;36852:534;-1:-1:-1;;;;;;36979:55:0;-1:-1:-1;;;36979:55:0;;-1:-1:-1;36972:62:0;;36816:625;-1:-1:-1;37425:4:0;36644:804;;;;;;:::o;3830:723::-;3886:13;4107:10;4103:53;;-1:-1:-1;;4134:10:0;;;;;;;;;;;;-1:-1:-1;;;4134:10:0;;;;;3830:723::o;4103:53::-;4181:5;4166:12;4222:78;4229:9;;4222:78;;4255:8;;;;:::i;:::-;;-1:-1:-1;4278:10:0;;-1:-1:-1;4286:2:0;4278:10;;:::i;:::-;;;4222:78;;;4310:19;4342:6;4332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4332:17:0;;4310:39;;4360:154;4367:10;;4360:154;;4394:11;4404:1;4394:11;;:::i;:::-;;-1:-1:-1;4463:10:0;4471:2;4463:5;:10;:::i;:::-;4450:24;;:2;:24;:::i;:::-;4437:39;;4420:6;4427;4420:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4420:56:0;;;;;;;;-1:-1:-1;4491:11:0;4500:2;4491:11;;:::i;:::-;;;4360:154;;32339:1389;32462:20;32485:12;-1:-1:-1;;;;;32516:16:0;;32508:62;;;;-1:-1:-1;;;32508:62:0;;15926:2:1;32508:62:0;;;15908:21:1;15965:2;15945:18;;;15938:30;16004:34;15984:18;;;15977:62;-1:-1:-1;;;16055:18:1;;;16048:31;16096:19;;32508:62:0;15724:397:1;32508:62:0;32715:21;32723:12;31896:4;31930:12;-1:-1:-1;31920:22:0;31839:111;32715:21;32714:22;32706:64;;;;-1:-1:-1;;;32706:64:0;;15568:2:1;32706:64:0;;;15550:21:1;15607:2;15587:18;;;15580:30;15646:31;15626:18;;;15619:59;15695:18;;32706:64:0;15366:353:1;32706:64:0;32800:1;32789:8;:12;32781:60;;;;-1:-1:-1;;;32781:60:0;;14744:2:1;32781:60:0;;;14726:21:1;14783:2;14763:18;;;14756:30;14822:34;14802:18;;;14795:62;-1:-1:-1;;;14873:18:1;;;14866:33;14916:19;;32781:60:0;14542:399:1;32781:60:0;-1:-1:-1;;;;;32961:16:0;;32928:30;32961:16;;;:12;:16;;;;;;;;;32928:49;;;;;;;;;-1:-1:-1;;;;;32928:49:0;;;;;-1:-1:-1;;;32928:49:0;;;;;;;;;;;33007:135;;;;;;;;33033:19;;32928:49;;33007:135;;;33033:39;;33063:8;;33033:39;:::i;:::-;-1:-1:-1;;;;;33007:135:0;;;;;33122:8;33087:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;33007:135:0;;;;;;-1:-1:-1;;;;;32988:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;32988:154:0;;;;;;;;;;;;33181:43;;;;;;;;;;;33207:15;33181:43;;;;;;;;33153:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;33153:71:0;-1:-1:-1;;;;;;33153:71:0;;;;;;;;;;;;;;;;;;33165:12;;33285:325;33309:8;33305:1;:12;33285:325;;;33344:38;;33369:12;;-1:-1:-1;;;;;33344:38:0;;;33361:1;;33344:38;;33361:1;;33344:38;33423:59;33454:1;33458:2;33462:12;33476:5;33423:22;:59::i;:::-;33397:172;;;;-1:-1:-1;;;33397:172:0;;;;;;;:::i;:::-;33584:14;;;;:::i;:::-;;;;33319:3;;;;;:::i;:::-;;;;33285:325;;;-1:-1:-1;33622:12:0;:27;;;33660:60;31229:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:247::-;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;:::-;1051:5;815:247;-1:-1:-1;;;815:247:1:o;1067:388::-;1135:6;1143;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;1251:9;1238:23;1270:31;1295:5;1270:31;:::i;:::-;1320:5;-1:-1:-1;1377:2:1;1362:18;;1349:32;1390:33;1349:32;1390:33;:::i;:::-;1442:7;1432:17;;;1067:388;;;;;:::o;1460:456::-;1537:6;1545;1553;1606:2;1594:9;1585:7;1581:23;1577:32;1574:52;;;1622:1;1619;1612:12;1574:52;1661:9;1648:23;1680:31;1705:5;1680:31;:::i;:::-;1730:5;-1:-1:-1;1787:2:1;1772:18;;1759:32;1800:33;1759:32;1800:33;:::i;:::-;1460:456;;1852:7;;-1:-1:-1;;;1906:2:1;1891:18;;;;1878:32;;1460:456::o;1921:794::-;2016:6;2024;2032;2040;2093:3;2081:9;2072:7;2068:23;2064:33;2061:53;;;2110:1;2107;2100:12;2061:53;2149:9;2136:23;2168:31;2193:5;2168:31;:::i;:::-;2218:5;-1:-1:-1;2275:2:1;2260:18;;2247:32;2288:33;2247:32;2288:33;:::i;:::-;2340:7;-1:-1:-1;2394:2:1;2379:18;;2366:32;;-1:-1:-1;2449:2:1;2434:18;;2421:32;2476:18;2465:30;;2462:50;;;2508:1;2505;2498:12;2462:50;2531:22;;2584:4;2576:13;;2572:27;-1:-1:-1;2562:55:1;;2613:1;2610;2603:12;2562:55;2636:73;2701:7;2696:2;2683:16;2678:2;2674;2670:11;2636:73;:::i;:::-;2626:83;;;1921:794;;;;;;;:::o;2720:315::-;2785:6;2793;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:31;2945:5;2920:31;:::i;:::-;2970:5;-1:-1:-1;2994:35:1;3025:2;3010:18;;2994:35;:::i;:::-;2984:45;;2720:315;;;;;:::o;3040:::-;3108:6;3116;3169:2;3157:9;3148:7;3144:23;3140:32;3137:52;;;3185:1;3182;3175:12;3137:52;3224:9;3211:23;3243:31;3268:5;3243:31;:::i;:::-;3293:5;3345:2;3330:18;;;;3317:32;;-1:-1:-1;;;3040:315:1:o;3360:180::-;3416:6;3469:2;3457:9;3448:7;3444:23;3440:32;3437:52;;;3485:1;3482;3475:12;3437:52;3508:26;3524:9;3508:26;:::i;3545:245::-;3603:6;3656:2;3644:9;3635:7;3631:23;3627:32;3624:52;;;3672:1;3669;3662:12;3624:52;3711:9;3698:23;3730:30;3754:5;3730:30;:::i;3795:249::-;3864:6;3917:2;3905:9;3896:7;3892:23;3888:32;3885:52;;;3933:1;3930;3923:12;3885:52;3965:9;3959:16;3984:30;4008:5;3984:30;:::i;4049:280::-;4148:6;4201:2;4189:9;4180:7;4176:23;4172:32;4169:52;;;4217:1;4214;4207:12;4169:52;4249:9;4243:16;4268:31;4293:5;4268:31;:::i;4334:450::-;4403:6;4456:2;4444:9;4435:7;4431:23;4427:32;4424:52;;;4472:1;4469;4462:12;4424:52;4512:9;4499:23;4545:18;4537:6;4534:30;4531:50;;;4577:1;4574;4567:12;4531:50;4600:22;;4653:4;4645:13;;4641:27;-1:-1:-1;4631:55:1;;4682:1;4679;4672:12;4631:55;4705:73;4770:7;4765:2;4752:16;4747:2;4743;4739:11;4705:73;:::i;4789:180::-;4848:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:52;;;4917:1;4914;4907:12;4869:52;-1:-1:-1;4940:23:1;;4789:180;-1:-1:-1;4789:180:1:o;4974:257::-;5015:3;5053:5;5047:12;5080:6;5075:3;5068:19;5096:63;5152:6;5145:4;5140:3;5136:14;5129:4;5122:5;5118:16;5096:63;:::i;:::-;5213:2;5192:15;-1:-1:-1;;5188:29:1;5179:39;;;;5220:4;5175:50;;4974:257;-1:-1:-1;;4974:257:1:o;5236:185::-;5278:3;5316:5;5310:12;5331:52;5376:6;5371:3;5364:4;5357:5;5353:16;5331:52;:::i;:::-;5399:16;;;;;5236:185;-1:-1:-1;;5236:185:1:o;5426:1249::-;5650:3;5679:1;5712:6;5706:13;5742:3;5764:1;5792:9;5788:2;5784:18;5774:28;;5852:2;5841:9;5837:18;5874;5864:61;;5918:4;5910:6;5906:17;5896:27;;5864:61;5944:2;5992;5984:6;5981:14;5961:18;5958:38;5955:165;;;-1:-1:-1;;;6019:33:1;;6075:4;6072:1;6065:15;6105:4;6026:3;6093:17;5955:165;6136:18;6163:104;;;;6281:1;6276:320;;;;6129:467;;6163:104;-1:-1:-1;;6196:24:1;;6184:37;;6241:16;;;;-1:-1:-1;6163:104:1;;6276:320;18310:1;18303:14;;;18347:4;18334:18;;6371:1;6385:165;6399:6;6396:1;6393:13;6385:165;;;6477:14;;6464:11;;;6457:35;6520:16;;;;6414:10;;6385:165;;;6389:3;;6579:6;6574:3;6570:16;6563:23;;6129:467;;;;;;;6612:57;6638:30;6664:3;6656:6;6638:30;:::i;:::-;6630:6;6612:57;:::i;:::-;6605:64;5426:1249;-1:-1:-1;;;;;;5426:1249:1:o;7098:488::-;-1:-1:-1;;;;;7367:15:1;;;7349:34;;7419:15;;7414:2;7399:18;;7392:43;7466:2;7451:18;;7444:34;;;7514:3;7509:2;7494:18;;7487:31;;;7292:4;;7535:45;;7560:19;;7552:6;7535:45;:::i;7783:219::-;7932:2;7921:9;7914:21;7895:4;7952:44;7992:2;7981:9;7977:18;7969:6;7952:44;:::i;13004:356::-;13206:2;13188:21;;;13225:18;;;13218:30;13284:34;13279:2;13264:18;;13257:62;13351:2;13336:18;;13004:356::o;14946:415::-;15148:2;15130:21;;;15187:2;15167:18;;;15160:30;15226:34;15221:2;15206:18;;15199:62;-1:-1:-1;;;15292:2:1;15277:18;;15270:49;15351:3;15336:19;;14946:415::o;18363:253::-;18403:3;-1:-1:-1;;;;;18492:2:1;18489:1;18485:10;18522:2;18519:1;18515:10;18553:3;18549:2;18545:12;18540:3;18537:21;18534:47;;;18561:18;;:::i;:::-;18597:13;;18363:253;-1:-1:-1;;;;18363:253:1:o;18621:128::-;18661:3;18692:1;18688:6;18685:1;18682:13;18679:39;;;18698:18;;:::i;:::-;-1:-1:-1;18734:9:1;;18621:128::o;18754:120::-;18794:1;18820;18810:35;;18825:18;;:::i;:::-;-1:-1:-1;18859:9:1;;18754:120::o;18879:125::-;18919:4;18947:1;18944;18941:8;18938:34;;;18952:18;;:::i;:::-;-1:-1:-1;18989:9:1;;18879:125::o;19009:258::-;19081:1;19091:113;19105:6;19102:1;19099:13;19091:113;;;19181:11;;;19175:18;19162:11;;;19155:39;19127:2;19120:10;19091:113;;;19222:6;19219:1;19216:13;19213:48;;;-1:-1:-1;;19257:1:1;19239:16;;19232:27;19009:258::o;19272:136::-;19311:3;19339:5;19329:39;;19348:18;;:::i;:::-;-1:-1:-1;;;19384:18:1;;19272:136::o;19413:380::-;19492:1;19488:12;;;;19535;;;19556:61;;19610:4;19602:6;19598:17;19588:27;;19556:61;19663:2;19655:6;19652:14;19632:18;19629:38;19626:161;;;19709:10;19704:3;19700:20;19697:1;19690:31;19744:4;19741:1;19734:15;19772:4;19769:1;19762:15;19626:161;;19413:380;;;:::o;19798:135::-;19837:3;-1:-1:-1;;19858:17:1;;19855:43;;;19878:18;;:::i;:::-;-1:-1:-1;19925:1:1;19914:13;;19798:135::o;19938:112::-;19970:1;19996;19986:35;;20001:18;;:::i;:::-;-1:-1:-1;20035:9:1;;19938:112::o;20055:127::-;20116:10;20111:3;20107:20;20104:1;20097:31;20147:4;20144:1;20137:15;20171:4;20168:1;20161:15;20187:127;20248:10;20243:3;20239:20;20236:1;20229:31;20279:4;20276:1;20269:15;20303:4;20300:1;20293:15;20319:127;20380:10;20375:3;20371:20;20368:1;20361:31;20411:4;20408:1;20401:15;20435:4;20432:1;20425:15;20451:127;20512:10;20507:3;20503:20;20500:1;20493:31;20543:4;20540:1;20533:15;20567:4;20564:1;20557:15;20583:131;-1:-1:-1;;;;;20658:31:1;;20648:42;;20638:70;;20704:1;20701;20694:12;20719:131;-1:-1:-1;;;;;;20793:32:1;;20783:43;;20773:71;;20840:1;20837;20830:12

Swarm Source

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