ETH Price: $3,403.70 (+2.07%)

Token

Rekted Diamond Hands (RDH)
 

Overview

Max Total Supply

5,555 RDH

Holders

311

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
888bayc.eth
Balance
10 RDH
0x773178d08de7b21c591b2dc247e4b233fc10fc6d
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:
RDH

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//  /$$$$$$$  /$$$$$$$  /$$   /$$
// | $$__  $$| $$__  $$| $$  | $$
// | $$  \ $$| $$  \ $$| $$  | $$
// | $$$$$$$/| $$  | $$| $$$$$$$$
// | $$__  $$| $$  | $$| $$__  $$
// | $$  \ $$| $$  | $$| $$  | $$
// | $$  | $$| $$$$$$$/| $$  | $$
// |__/  |__/|_______/ |__/  |__/


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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: 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: Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: Address.sol



pragma solidity ^0.8.0;

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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


// File: IERC165.sol



pragma solidity ^0.8.0;

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


// File: ERC165.sol



pragma solidity ^0.8.0;


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


// File: IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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: IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**128 - 1 (max value of uint128) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToNonERC721ReceiverImplementerFunction();
error MintToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, ReentrancyGuard {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint128 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint128 numberMinted;
    }

    // The tokenId of the next regular token to be minted.
    uint256 internal _currentIndexGold = 1;
    uint256 internal _currentIndexDiamond = 56;
    uint256 internal _currentIndex = 499;

    // 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 Returns _currentIndex.
     */
    function totalSupply() public view returns (uint256) {
        return (_currentIndex-499 + _currentIndexDiamond-56 + _currentIndexGold-1);
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if ( (1 <= curr && curr < _currentIndexGold) || (56 <= curr && curr < _currentIndexDiamond) || (499 <= curr && curr < _currentIndex) ) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
                // think about it... won't underflow ;)
                while (true) {
                    curr--;
                    ownership = _ownerships[curr];
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                }
            }
        } // unchecked
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Base URI for {tokenURI}. 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);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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) {
        if (tokenId < 56) {
            return tokenId < _currentIndexGold;
        } else if (tokenId < 499) {
            return tokenId < _currentIndexDiamond;
        } else {
            return tokenId < _currentIndex;
        }
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        uint256 special
    ) internal {
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        uint256 startTokenId;
        if (special == 1) { // gold
            startTokenId = _currentIndexGold;
        } else if (special == 2) { // diamond
            startTokenId = _currentIndexDiamond;
        } else {
            startTokenId = _currentIndex;
        }

        // Overflows are incredibly unrealistic
        // balance or numberMinted overflow if current value of either + quantity > (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i = 0; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (!_checkOnERC721Received(address(0), to, updatedIndex, '')) {
                    revert MintToNonERC721ReceiverImplementer();
                }
                updatedIndex++;

            }

            if (special == 1) { // gold
                _currentIndexGold = updatedIndex;
            } else if (special == 2) { // diamond
                _currentIndexDiamond = updatedIndex;
            } else {
                _currentIndex = updatedIndex;
            }
        } // unchecked
    }

    /**
     * @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 nonReentrant {
        if (to == address(0)) revert TransferToZeroAddress();

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        //      Me: meh, I'm not convinced the underflow is safe from re-entrancy attacks 
        // (comes down to a race condition); to still save gas I modified this 
        // to be nonReentrant to be safe
        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
                    );
                }
            }
        } // unchecked

        emit Transfer(from, to, tokenId);
    }

    /**
     * @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 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 TransferToNonERC721ReceiverImplementerFunction();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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

pragma solidity >=0.8.4 <0.9.0;

error MintFromContract();
error MintNonpositive();
error MerkleProofInvalid();
error SaleNotActive();
error WithdrawFailed();

contract RDH is ERC721A, Ownable {  
    using Strings for uint256;

    uint256 public max_supply = 5555;
    uint256 public wl_start     = 1661972400; // Wed Aug 31 2022 16:37:25 GMT+0000
    uint256 public public_start = 1661983200; // 3 hours later

    uint256 public cost_wl = 0.05 ether;
    uint256 public cost_public = 0.05 ether;

    bool public revealed = false;

    uint256 public mint_limit_gold   = 1;  // per wallet
    uint256 public mint_limit_team   = 10; // per wallet
    uint256 public mint_limit_og     = 2;  // per wallet
    uint256 public mint_limit_fr     = 1;  // per wallet
    uint256 public mint_limit_wl     = 1;  // per wallet
    uint256 public mint_limit_public = 1;  // per wallet

    bytes32 public merkle_root_gold;
    bytes32 public merkle_root_team;
    bytes32 public merkle_root_og;
    bytes32 public merkle_root_fr;
    bytes32 public merkle_root_wl;

    string private _myBaseURI;
    string private _myHiddenURI;

	constructor() ERC721A("Rekted Diamond Hands", "RDH") {}

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
         max_supply = _maxSupply;
    }

    function setWLStart(uint256 _wlStart) external onlyOwner {
        wl_start = _wlStart;
    }
    function setPublicStart(uint256 _publicStart) external onlyOwner {
        public_start = _publicStart;
    }

    function setCostWL(uint256 _costWL) external onlyOwner {
        cost_wl = _costWL;
    }
    function setCostPublic(uint256 _costPublic) external onlyOwner {
        cost_public = _costPublic;
    }
    function setRevealed(bool _revealed) external onlyOwner {
        revealed = _revealed;
    }

    function setMintLimitGold(uint256 _mintLimit) external onlyOwner {
        mint_limit_gold = _mintLimit;
    }
    function setMintLimitTeam(uint256 _mintLimit) external onlyOwner {
        mint_limit_team = _mintLimit;
    }
    function setMintLimitOG(uint256 _mintLimit) external onlyOwner {
        mint_limit_og = _mintLimit;
    }
    function setMintLimitFR(uint256 _mintLimit) external onlyOwner {
        mint_limit_fr = _mintLimit;
    }
    function setMintLimitWL(uint256 _mintLimit) external onlyOwner {
        mint_limit_wl = _mintLimit;
    }
    function setMintLimitPublic(uint256 _mintLimit) external onlyOwner {
        mint_limit_public = _mintLimit;
    }

    function setMerkleRootGold(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_gold = _merkleRoot;
    }
    function setMerkleRootTeam(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_team = _merkleRoot;
    }
    function setMerkleRootOG(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_og = _merkleRoot;
    }
    function setMerkleRootWL(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_wl = _merkleRoot;
    }
    function setMerkleRootFR(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_fr = _merkleRoot;
    }


    // note v0.8.0 checks safe math by default :)
    function mint(uint256 mintAmount, bytes32[] calldata _merkleProof) payable external nonReentrant {
        require(tx.origin == msg.sender, "tried to mint from contract");
        require(block.timestamp >= wl_start, "wl sale not active");
        require(totalSupply() + mintAmount <= max_supply, "tried to mint more than max supply");

        uint256 state = 0;
        if (MerkleProof.verify(_merkleProof, merkle_root_gold, keccak256(abi.encodePacked(_msgSender())))) {
            require(_numberMinted(_msgSender()) + mintAmount <= mint_limit_gold, "tried to mint too many gold");
            state = 1; // gold
        } else if (MerkleProof.verify(_merkleProof, merkle_root_team, keccak256(abi.encodePacked(_msgSender())))) {
            require(_numberMinted(_msgSender()) + mintAmount <= mint_limit_team, "tried to mint too many investor/team");
            mintAmount = mint_limit_team;
        } else if (MerkleProof.verify(_merkleProof, merkle_root_og, keccak256(abi.encodePacked(_msgSender())))) {
            require(_numberMinted(_msgSender()) + mintAmount <= mint_limit_og, "tried to mint too many og");
            state = 2;
        } else if (MerkleProof.verify(_merkleProof, merkle_root_fr, keccak256(abi.encodePacked(_msgSender())))) {
            require(_numberMinted(_msgSender()) + mintAmount <= mint_limit_fr, "tried to mint too many fr");
        } else if (MerkleProof.verify(_merkleProof, merkle_root_wl, keccak256(abi.encodePacked(_msgSender())))) {
            require(_numberMinted(_msgSender()) + mintAmount <= mint_limit_wl, "tried to mint too many wl");
            require(msg.value >= cost_wl*mint_limit_wl, "wl didn't pay enough");

            if (_currentIndexDiamond < 499) {
                state = 2;
                require(mintAmount + _currentIndexDiamond <= 499, "error, tried to mint too many diamond pre");
            }
        } else {
            require(false, "invalid merkle proof");
        }
        _safeMint(_msgSender(), mintAmount, state);
    }

    function publicMint(uint256 mintAmount) payable external nonReentrant {
        require(tx.origin == msg.sender, "tried to mint from contract");
        require(block.timestamp >= public_start, "public sale not active");
        require(totalSupply() + mintAmount <= max_supply, "tried to mint more than max supply jic");

        uint256 state = 0;
        if (_currentIndexDiamond < 499) {
                state = 2;
                require(mintAmount + _currentIndexDiamond <= 499, "error, tried to mint too many diamond public");
        }
        require(msg.value >= cost_public*mint_limit_public, "public didn't pay enough");
        _safeMint(_msgSender(), mintAmount, state);
    }

    function teamMint(uint256 mintAmount, uint256 choice) external onlyOwner {
        require(totalSupply() + mintAmount <= max_supply, "tried to mint more than max supply tm");
        if (choice == 1) { // gold
            _safeMint(_msgSender(), mintAmount, choice);
        } else if (choice == 2) { // diamond
            _safeMint(_msgSender(), mintAmount, choice);
        } else {
            _safeMint(_msgSender(), mintAmount, 0);
        }
    }

    function setMyBaseURI(string memory _myNewBaseURI) external onlyOwner {
        _myBaseURI = _myNewBaseURI;
    }
    function setMyHiddenURI(string memory _myNewHiddenURI) external onlyOwner {
        _myHiddenURI = _myNewHiddenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override(ERC721A) returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
       
        if (revealed) {
            return bytes(_myBaseURI).length != 0 ? string(abi.encodePacked(_myBaseURI, tokenId.toString(), ".json")) : "";
        } else {
            return bytes(_myHiddenURI).length != 0 ? _myHiddenURI : "";
        }
    }

    event DonationReceived(address sender, uint256 amount);
    receive() external payable {
        emit DonationReceived(msg.sender, msg.value);
    }

    function withdraw() external payable nonReentrant {
        uint256 balance0 = address(this).balance;

        (bool LU, ) = payable(0x01656D41e041b50fc7c1eb270f7d891021937436).call{value: balance0 * 1000 / 10000}("");
        (bool ED, ) = payable(0x97cc51cD15ba17B79046004d34341fCE028d9505).call{value: balance0 * 1000 / 10000}("");
        (bool NB, ) = payable(0x13eeDD1582fC3738C67c3AfeE997D394802c2C6b).call{value: balance0 * 1000 / 10000}(""); 
        (bool RM, ) = payable(0x681bc14ad38069705197506Bd7f1DE40B49A8E44).call{value: balance0 *  881 / 10000}("");
        (bool OK, ) = payable(0x2a97e97c5BEa2dE2a3C79482bA850E91683a01d0).call{value: balance0 * 3000 / 10000}("");
        (bool IV, ) = payable(0xC042B012998C94fCcf5BA78685f3a7eFC9228D6B).call{value: balance0 * 1200 / 10000}("");
        (bool TM, ) = payable(0xfC78AC48ee9E375D1BB63b983f4929279656dF1B).call{value: balance0 *  900 / 10000}("");
        (bool TS, ) = payable(0xC05207E2936141134dD92E731c15c4b0A1032e43).call{value: balance0 * 1019 / 10000}("");

        if (!(LU && ED && NB && RM && OK && IV && TM && TS)) revert WithdrawFailed();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementerFunction","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DonationReceived","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":[{"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":"cost_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost_wl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_fr","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_gold","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_og","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_team","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_wl","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_limit_fr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_gold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_og","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_team","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_wl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"public_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_costPublic","type":"uint256"}],"name":"setCostPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_costWL","type":"uint256"}],"name":"setCostWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootFR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootGold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitFR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitGold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_myNewBaseURI","type":"string"}],"name":"setMyBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_myNewHiddenURI","type":"string"}],"name":"setMyHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicStart","type":"uint256"}],"name":"setPublicStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlStart","type":"uint256"}],"name":"setWLStart","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":"mintAmount","type":"uint256"},{"internalType":"uint256","name":"choice","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"},{"inputs":[],"name":"wl_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001808055603860029081556101f36003556115b3600b5563630fafb0600c5563630fd9e0600d5566b1a2bc2ec50000600e819055600f556010805460ff191690556011829055600a601255601355601481905560158190556016553480156200006d57600080fd5b50604080518082018252601481527f52656b746564204469616d6f6e642048616e6473000000000000000000000000602080830191909152825180840190935260038352620a488960eb1b908301526001600055906004620000d08382620001fd565b506005620000df8282620001fd565b505050620000fc620000f66200010260201b60201c565b62000106565b620002c9565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018357607f821691505b602082108103620001a457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001f857600081815260208120601f850160051c81016020861015620001d35750805b601f850160051c820191505b81811015620001f457828155600101620001df565b5050505b505050565b81516001600160401b0381111562000219576200021962000158565b62000231816200022a84546200016e565b84620001aa565b602080601f831160018114620002695760008415620002505750858301515b600019600386901b1c1916600185901b178555620001f4565b600085815260208120601f198616915b828110156200029a5788860151825594840194600190910190840162000279565b5085821015620002b95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61312a80620002d96000396000f3fe60806040526004361061037a5760003560e01c80638a333b50116101d1578063aeb5a90811610102578063d683251f116100a0578063f2fde38b1161006f578063f2fde38b146109b6578063f48b8989146109d6578063f7097e57146109ec578063fa702b7d14610a0257600080fd5b8063d683251f14610936578063e0a8085314610956578063e985e9c514610976578063ed08fa261461099657600080fd5b8063c87b56dd116100dc578063c87b56dd146108b6578063ced2053b146108d6578063d3c2dfc1146108f6578063d5e73dfd1461091657600080fd5b8063aeb5a9081461086d578063b88d4fde14610883578063ba41b0c6146108a357600080fd5b8063a22cb4651161016f578063a5ed2d3c11610149578063a5ed2d3c146107f7578063a8027a5d1461080d578063a8297ffd1461082d578063ad3e31b71461084d57600080fd5b8063a22cb465146107a1578063a264df9d146107c1578063a58fdc11146107d757600080fd5b806394e86b20116101ab57806394e86b201461074057806395d89b41146107565780639a7885131461076b5780639ebbefad1461078b57600080fd5b80638a333b50146106f65780638d3dbaed1461070c5780638da5cb5b1461072257600080fd5b80633ba0ea2f116102ab5780636352211e116102495780636f8b44b0116102235780636f8b44b01461068157806370a08231146106a1578063715018a6146106c157806379b21a96146106d657600080fd5b80636352211e1461062b578063685e51bc1461064b57806369b5b29c1461066157600080fd5b8063518302271161028557806351830227146105bb57806356171417146105d557806356ce2f52146105f55780635dcce2341461060b57600080fd5b80633ba0ea2f1461057d5780633ccfd60b1461059357806342842e0e1461059b57600080fd5b8063151f45c3116103185780632920bbb2116102f25780632920bbb21461050a5780632b18f2ea1461052a5780632db115441461054a5780632f9a7c581461055d57600080fd5b8063151f45c3146104bf57806318160ddd146104d557806323b872dd146104ea57600080fd5b8063081812fc11610354578063081812fc14610439578063095ea7b3146104715780630f5604061461049357806310f61905146104a957600080fd5b8063016005da146103be57806301ffc9a7146103e757806306fdde031461041757600080fd5b366103b957604080513381523460208201527f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c52910160405180910390a1005b600080fd5b3480156103ca57600080fd5b506103d460185481565b6040519081526020015b60405180910390f35b3480156103f357600080fd5b506104076104023660046129dc565b610a22565b60405190151581526020016103de565b34801561042357600080fd5b5061042c610a74565b6040516103de9190612a49565b34801561044557600080fd5b50610459610454366004612a5c565b610b06565b6040516001600160a01b0390911681526020016103de565b34801561047d57600080fd5b5061049161048c366004612a8c565b610b4a565b005b34801561049f57600080fd5b506103d460155481565b3480156104b557600080fd5b506103d460135481565b3480156104cb57600080fd5b506103d460175481565b3480156104e157600080fd5b506103d4610bd0565b3480156104f657600080fd5b50610491610505366004612ab6565b610c18565b34801561051657600080fd5b50610491610525366004612a5c565b610c23565b34801561053657600080fd5b50610491610545366004612b7e565b610c5b565b610491610558366004612a5c565b610c95565b34801561056957600080fd5b50610491610578366004612a5c565b610ec1565b34801561058957600080fd5b506103d460195481565b610491610ef0565b3480156105a757600080fd5b506104916105b6366004612ab6565b61133c565b3480156105c757600080fd5b506010546104079060ff1681565b3480156105e157600080fd5b506104916105f0366004612a5c565b611357565b34801561060157600080fd5b506103d460115481565b34801561061757600080fd5b50610491610626366004612b7e565b611386565b34801561063757600080fd5b50610459610646366004612a5c565b6113bc565b34801561065757600080fd5b506103d4600c5481565b34801561066d57600080fd5b5061049161067c366004612bc7565b6113ce565b34801561068d57600080fd5b5061049161069c366004612a5c565b611498565b3480156106ad57600080fd5b506103d46106bc366004612be9565b6114c7565b3480156106cd57600080fd5b50610491611515565b3480156106e257600080fd5b506104916106f1366004612a5c565b61154b565b34801561070257600080fd5b506103d4600b5481565b34801561071857600080fd5b506103d4600e5481565b34801561072e57600080fd5b50600a546001600160a01b0316610459565b34801561074c57600080fd5b506103d460165481565b34801561076257600080fd5b5061042c61157a565b34801561077757600080fd5b50610491610786366004612a5c565b611589565b34801561079757600080fd5b506103d4601b5481565b3480156107ad57600080fd5b506104916107bc366004612c14565b6115b8565b3480156107cd57600080fd5b506103d4601a5481565b3480156107e357600080fd5b506104916107f2366004612a5c565b61164d565b34801561080357600080fd5b506103d460125481565b34801561081957600080fd5b50610491610828366004612a5c565b61167c565b34801561083957600080fd5b50610491610848366004612a5c565b6116ab565b34801561085957600080fd5b50610491610868366004612a5c565b6116da565b34801561087957600080fd5b506103d460145481565b34801561088f57600080fd5b5061049161089e366004612c47565b611709565b6104916108b1366004612cc3565b611743565b3480156108c257600080fd5b5061042c6108d1366004612a5c565b611d5c565b3480156108e257600080fd5b506104916108f1366004612a5c565b611eac565b34801561090257600080fd5b50610491610911366004612a5c565b611edb565b34801561092257600080fd5b50610491610931366004612a5c565b611f0a565b34801561094257600080fd5b50610491610951366004612a5c565b611f39565b34801561096257600080fd5b50610491610971366004612d42565b611f68565b34801561098257600080fd5b50610407610991366004612d5d565b611fa5565b3480156109a257600080fd5b506104916109b1366004612a5c565b611fd3565b3480156109c257600080fd5b506104916109d1366004612be9565b612002565b3480156109e257600080fd5b506103d4600f5481565b3480156109f857600080fd5b506103d4600d5481565b348015610a0e57600080fd5b50610491610a1d366004612a5c565b61209d565b60006001600160e01b031982166380ac58cd60e01b1480610a5357506001600160e01b03198216635b5e139f60e01b145b80610a6e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610a8390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90612d87565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b5050505050905090565b6000610b11826120cc565b610b2e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610b55826113bc565b9050806001600160a01b0316836001600160a01b031603610b895760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610bc057610ba38133611fa5565b610bc0576040516367d9dca160e11b815260040160405180910390fd5b610bcb8383836120f9565b505050565b60006001805460386002546101f3600354610beb9190612dd7565b610bf59190612dea565b610bff9190612dd7565b610c099190612dea565b610c139190612dd7565b905090565b610bcb838383612155565b600a546001600160a01b03163314610c565760405162461bcd60e51b8152600401610c4d90612dfd565b60405180910390fd5b601855565b600a546001600160a01b03163314610c855760405162461bcd60e51b8152600401610c4d90612dfd565b601d610c918282612e80565b5050565b600260005403610cb75760405162461bcd60e51b8152600401610c4d90612f40565b6002600055323314610d0b5760405162461bcd60e51b815260206004820152601b60248201527f747269656420746f206d696e742066726f6d20636f6e747261637400000000006044820152606401610c4d565b600d54421015610d565760405162461bcd60e51b81526020600482015260166024820152757075626c69632073616c65206e6f742061637469766560501b6044820152606401610c4d565b600b5481610d62610bd0565b610d6c9190612dea565b1115610dc95760405162461bcd60e51b815260206004820152602660248201527f747269656420746f206d696e74206d6f7265207468616e206d617820737570706044820152656c79206a696360d01b6064820152608401610c4d565b60006101f36002541015610e4d5750600280546101f390610dea9084612dea565b1115610e4d5760405162461bcd60e51b815260206004820152602c60248201527f6572726f722c20747269656420746f206d696e7420746f6f206d616e7920646960448201526b616d6f6e64207075626c696360a01b6064820152608401610c4d565b601654600f54610e5d9190612f77565b341015610eac5760405162461bcd60e51b815260206004820152601860248201527f7075626c6963206469646e27742070617920656e6f75676800000000000000006044820152606401610c4d565b610eb8335b83836123c7565b50506001600055565b600a546001600160a01b03163314610eeb5760405162461bcd60e51b8152600401610c4d90612dfd565b600f55565b600260005403610f125760405162461bcd60e51b8152600401610c4d90612f40565b6002600090815547907301656d41e041b50fc7c1eb270f7d891021937436612710610f3f846103e8612f77565b610f499190612fac565b604051600081818185875af1925050503d8060008114610f85576040519150601f19603f3d011682016040523d82523d6000602084013e610f8a565b606091505b50909150600090507397cc51cd15ba17b79046004d34341fce028d9505612710610fb6856103e8612f77565b610fc09190612fac565b604051600081818185875af1925050503d8060008114610ffc576040519150601f19603f3d011682016040523d82523d6000602084013e611001565b606091505b50909150600090507313eedd1582fc3738c67c3afee997d394802c2c6b61271061102d866103e8612f77565b6110379190612fac565b604051600081818185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b509091506000905073681bc14ad38069705197506bd7f1de40b49a8e446127106110a487610371612f77565b6110ae9190612fac565b604051600081818185875af1925050503d80600081146110ea576040519150601f19603f3d011682016040523d82523d6000602084013e6110ef565b606091505b5090915060009050732a97e97c5bea2de2a3c79482ba850e91683a01d061271061111b88610bb8612f77565b6111259190612fac565b604051600081818185875af1925050503d8060008114611161576040519150601f19603f3d011682016040523d82523d6000602084013e611166565b606091505b509091506000905073c042b012998c94fccf5ba78685f3a7efc9228d6b612710611192896104b0612f77565b61119c9190612fac565b604051600081818185875af1925050503d80600081146111d8576040519150601f19603f3d011682016040523d82523d6000602084013e6111dd565b606091505b509091506000905073fc78ac48ee9e375d1bb63b983f4929279656df1b6127106112098a610384612f77565b6112139190612fac565b604051600081818185875af1925050503d806000811461124f576040519150601f19603f3d011682016040523d82523d6000602084013e611254565b606091505b509091506000905073c05207e2936141134dd92e731c15c4b0a1032e436127106112808b6103fb612f77565b61128a9190612fac565b604051600081818185875af1925050503d80600081146112c6576040519150601f19603f3d011682016040523d82523d6000602084013e6112cb565b606091505b505090508780156112d95750865b80156112e25750855b80156112eb5750845b80156112f45750835b80156112fd5750825b80156113065750815b801561130f5750805b61132c57604051631d42c86760e21b815260040160405180910390fd5b5050600160005550505050505050565b610bcb83838360405180602001604052806000815250611709565b600a546001600160a01b031633146113815760405162461bcd60e51b8152600401610c4d90612dfd565b600d55565b600a546001600160a01b031633146113b05760405162461bcd60e51b8152600401610c4d90612dfd565b601c610c918282612e80565b60006113c78261256c565b5192915050565b600a546001600160a01b031633146113f85760405162461bcd60e51b8152600401610c4d90612dfd565b600b5482611404610bd0565b61140e9190612dea565b111561146a5760405162461bcd60e51b815260206004820152602560248201527f747269656420746f206d696e74206d6f7265207468616e206d617820737570706044820152646c7920746d60d81b6064820152608401610c4d565b8060010361147b57610c9133610eb1565b8060020361148c57610c9133610eb1565b610c91338360006123c7565b600a546001600160a01b031633146114c25760405162461bcd60e51b8152600401610c4d90612dfd565b600b55565b60006001600160a01b0382166114f0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160801b031690565b600a546001600160a01b0316331461153f5760405162461bcd60e51b8152600401610c4d90612dfd565b6115496000612686565b565b600a546001600160a01b031633146115755760405162461bcd60e51b8152600401610c4d90612dfd565b601455565b606060058054610a8390612d87565b600a546001600160a01b031633146115b35760405162461bcd60e51b8152600401610c4d90612dfd565b601255565b336001600160a01b038316036115e15760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146116775760405162461bcd60e51b8152600401610c4d90612dfd565b601955565b600a546001600160a01b031633146116a65760405162461bcd60e51b8152600401610c4d90612dfd565b601655565b600a546001600160a01b031633146116d55760405162461bcd60e51b8152600401610c4d90612dfd565b601355565b600a546001600160a01b031633146117045760405162461bcd60e51b8152600401610c4d90612dfd565b601b55565b611714848484612155565b611720848484846126d8565b61173d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6002600054036117655760405162461bcd60e51b8152600401610c4d90612f40565b60026000553233146117b95760405162461bcd60e51b815260206004820152601b60248201527f747269656420746f206d696e742066726f6d20636f6e747261637400000000006044820152606401610c4d565b600c544210156118005760405162461bcd60e51b8152602060048201526012602482015271776c2073616c65206e6f742061637469766560701b6044820152606401610c4d565b600b548361180c610bd0565b6118169190612dea565b111561186f5760405162461bcd60e51b815260206004820152602260248201527f747269656420746f206d696e74206d6f7265207468616e206d617820737570706044820152616c7960f01b6064820152608401610c4d565b60006118f18383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060175491503390505b6040516020016118d6919060609190911b6bffffffffffffffffffffffff1916815260140190565b604051602081830303815290604052805190602001206127db565b156119635760115484611903336127f1565b61190d9190612dea565b111561195b5760405162461bcd60e51b815260206004820152601b60248201527f747269656420746f206d696e7420746f6f206d616e7920676f6c6400000000006044820152606401610c4d565b506001611d46565b6119a48383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060185491503390506118ae565b15611a2457601254846119b6336127f1565b6119c09190612dea565b1115611a1a5760405162461bcd60e51b8152602060048201526024808201527f747269656420746f206d696e7420746f6f206d616e7920696e766573746f722f6044820152637465616d60e01b6064820152608401610c4d565b6012549350611d46565b611a658383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060195491503390506118ae565b15611ad75760135484611a77336127f1565b611a819190612dea565b1115611acf5760405162461bcd60e51b815260206004820152601960248201527f747269656420746f206d696e7420746f6f206d616e79206f67000000000000006044820152606401610c4d565b506002611d46565b611b1883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a5491503390506118ae565b15611b875760145484611b2a336127f1565b611b349190612dea565b1115611b825760405162461bcd60e51b815260206004820152601960248201527f747269656420746f206d696e7420746f6f206d616e79206672000000000000006044820152606401610c4d565b611d46565b611bc883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601b5491503390506118ae565b15611d075760155484611bda336127f1565b611be49190612dea565b1115611c325760405162461bcd60e51b815260206004820152601960248201527f747269656420746f206d696e7420746f6f206d616e7920776c000000000000006044820152606401610c4d565b601554600e54611c429190612f77565b341015611c885760405162461bcd60e51b81526020600482015260146024820152730eed840c8d2c8dc4ee840e0c2f240cadcdeeaced60631b6044820152606401610c4d565b6101f36002541015611b825750600280546101f390611ca79086612dea565b1115611b825760405162461bcd60e51b815260206004820152602960248201527f6572726f722c20747269656420746f206d696e7420746f6f206d616e79206469604482015268616d6f6e642070726560b81b6064820152608401610c4d565b60405162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610c4d565b611d513385836123c7565b505060016000555050565b6060611d67826120cc565b611d8457604051630a14c4b560e41b815260040160405180910390fd5b60105460ff1615611deb57601c8054611d9c90612d87565b9050600003611dba5760405180602001604052806000815250610a6e565b601c611dc583612846565b604051602001611dd6929190612fc0565b60405160208183030381529060405292915050565b601d8054611df890612d87565b9050600003611e165760405180602001604052806000815250610a6e565b601d8054611e2390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4f90612d87565b8015611e9c5780601f10611e7157610100808354040283529160200191611e9c565b820191906000526020600020905b815481529060010190602001808311611e7f57829003601f168201915b505050505092915050565b919050565b600a546001600160a01b03163314611ed65760405162461bcd60e51b8152600401610c4d90612dfd565b600e55565b600a546001600160a01b03163314611f055760405162461bcd60e51b8152600401610c4d90612dfd565b601755565b600a546001600160a01b03163314611f345760405162461bcd60e51b8152600401610c4d90612dfd565b601a55565b600a546001600160a01b03163314611f635760405162461bcd60e51b8152600401610c4d90612dfd565b601155565b600a546001600160a01b03163314611f925760405162461bcd60e51b8152600401610c4d90612dfd565b6010805460ff1916911515919091179055565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314611ffd5760405162461bcd60e51b8152600401610c4d90612dfd565b600c55565b600a546001600160a01b0316331461202c5760405162461bcd60e51b8152600401610c4d90612dfd565b6001600160a01b0381166120915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c4d565b61209a81612686565b50565b600a546001600160a01b031633146120c75760405162461bcd60e51b8152600401610c4d90612dfd565b601555565b600060388210156120df57506001541190565b6101f38210156120f157506002541190565b506003541190565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6002600054036121775760405162461bcd60e51b8152600401610c4d90612f40565b60026000556001600160a01b0382166121a357604051633a954ecd60e21b815260040160405180910390fd5b60006121ae8261256c565b9050836001600160a01b031681600001516001600160a01b0316146121e55760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061220357506122038533611fa5565b8061221e57503361221384610b06565b6001600160a01b0316145b90508061223e57604051632ce44b5f60e11b815260040160405180910390fd5b61224a600084876120f9565b6001600160a01b03808616600090815260076020908152604080832080546000196001600160801b038083169190910181166001600160801b031992831617909255898616808652838620805480851660019081019095169316929092179091558251808401845290815267ffffffffffffffff4281168286019081528a87526006909552838620915182549551909116600160a01b026001600160e01b0319909516908716179390931790925590860180835291205490911661237957612311816120cc565b156123795760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600690935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450506001600055505050565b6001600160a01b0383166123ed57604051622e076360e81b815260040160405180910390fd5b8160000361240e5760405163b562e8dd60e01b815260040160405180910390fd5b6000816001036124215750600154612437565b816002036124325750600254612437565b506003545b6001600160a01b03841660008181526007602090815260408083208054600160801b6001600160801b031982166001600160801b039283168b01831690811782900483168b01909216021790558483526006909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b8481101561253a5760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461251160008784604051806020016040528060008152506126d8565b61252e5760405163d099061d60e01b815260040160405180910390fd5b600191820191016124b5565b508260010361254d576001819055612565565b8260020361255f576002819055612565565b60038190555b5050505050565b60408051808201909152600080825260208201528160018110801590612593575060015481105b806125ab5750806038111580156125ab575060025481105b806125c45750806101f3111580156125c4575060035481105b1561266d576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612616579392505050565b50600019016000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612668579392505050565b612616565b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156127cf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061271c903390899088908890600401613057565b6020604051808303816000875af1925050508015612757575060408051601f3d908101601f1916820190925261275491810190613094565b60015b6127b5573d808015612785576040519150601f19603f3d011682016040523d82523d6000602084013e61278a565b606091505b5080516000036127ad57604051638f11c40160e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127d3565b5060015b949350505050565b6000826127e88584612947565b14949350505050565b60006001600160a01b03821661281a576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260076020526040902054600160801b90046001600160801b031690565b60608160000361286d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128975780612881816130b1565b91506128909050600a83612fac565b9150612871565b60008167ffffffffffffffff8111156128b2576128b2612af2565b6040519080825280601f01601f1916602001820160405280156128dc576020820181803683370190505b5090505b84156127d3576128f1600183612dd7565b91506128fe600a866130ca565b612909906030612dea565b60f81b81838151811061291e5761291e6130de565b60200101906001600160f81b031916908160001a905350612940600a86612fac565b94506128e0565b600081815b845181101561298c576129788286838151811061296b5761296b6130de565b6020026020010151612994565b915080612984816130b1565b91505061294c565b509392505050565b60008183106129b05760008281526020849052604090206129bf565b60008381526020839052604090205b9392505050565b6001600160e01b03198116811461209a57600080fd5b6000602082840312156129ee57600080fd5b81356129bf816129c6565b60005b83811015612a145781810151838201526020016129fc565b50506000910152565b60008151808452612a358160208601602086016129f9565b601f01601f19169290920160200192915050565b6020815260006129bf6020830184612a1d565b600060208284031215612a6e57600080fd5b5035919050565b80356001600160a01b0381168114611ea757600080fd5b60008060408385031215612a9f57600080fd5b612aa883612a75565b946020939093013593505050565b600080600060608486031215612acb57600080fd5b612ad484612a75565b9250612ae260208501612a75565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612b2357612b23612af2565b604051601f8501601f19908116603f01168101908282118183101715612b4b57612b4b612af2565b81604052809350858152868686011115612b6457600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612b9057600080fd5b813567ffffffffffffffff811115612ba757600080fd5b8201601f81018413612bb857600080fd5b6127d384823560208401612b08565b60008060408385031215612bda57600080fd5b50508035926020909101359150565b600060208284031215612bfb57600080fd5b6129bf82612a75565b80358015158114611ea757600080fd5b60008060408385031215612c2757600080fd5b612c3083612a75565b9150612c3e60208401612c04565b90509250929050565b60008060008060808587031215612c5d57600080fd5b612c6685612a75565b9350612c7460208601612a75565b925060408501359150606085013567ffffffffffffffff811115612c9757600080fd5b8501601f81018713612ca857600080fd5b612cb787823560208401612b08565b91505092959194509250565b600080600060408486031215612cd857600080fd5b83359250602084013567ffffffffffffffff80821115612cf757600080fd5b818601915086601f830112612d0b57600080fd5b813581811115612d1a57600080fd5b8760208260051b8501011115612d2f57600080fd5b6020830194508093505050509250925092565b600060208284031215612d5457600080fd5b6129bf82612c04565b60008060408385031215612d7057600080fd5b612d7983612a75565b9150612c3e60208401612a75565b600181811c90821680612d9b57607f821691505b602082108103612dbb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a6e57610a6e612dc1565b80820180821115610a6e57610a6e612dc1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610bcb57600081815260208120601f850160051c81016020861015612e595750805b601f850160051c820191505b81811015612e7857828155600101612e65565b505050505050565b815167ffffffffffffffff811115612e9a57612e9a612af2565b612eae81612ea88454612d87565b84612e32565b602080601f831160018114612ee35760008415612ecb5750858301515b600019600386901b1c1916600185901b178555612e78565b600085815260208120601f198616915b82811015612f1257888601518255948401946001909101908401612ef3565b5085821015612f305787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000816000190483118215151615612f9157612f91612dc1565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612fbb57612fbb612f96565b500490565b6000808454612fce81612d87565b60018281168015612fe65760018114612ffb5761302a565b60ff198416875282151583028701945061302a565b8860005260208060002060005b858110156130215781548a820152908401908201613008565b50505082870194505b50505050835161303e8183602088016129f9565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061308a90830184612a1d565b9695505050505050565b6000602082840312156130a657600080fd5b81516129bf816129c6565b6000600182016130c3576130c3612dc1565b5060010190565b6000826130d9576130d9612f96565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220d1968b52cfadf2365ad72ffbe45b77eb13f0e441fe57ce46c522a990071fd43f64736f6c63430008100033

Deployed Bytecode

0x60806040526004361061037a5760003560e01c80638a333b50116101d1578063aeb5a90811610102578063d683251f116100a0578063f2fde38b1161006f578063f2fde38b146109b6578063f48b8989146109d6578063f7097e57146109ec578063fa702b7d14610a0257600080fd5b8063d683251f14610936578063e0a8085314610956578063e985e9c514610976578063ed08fa261461099657600080fd5b8063c87b56dd116100dc578063c87b56dd146108b6578063ced2053b146108d6578063d3c2dfc1146108f6578063d5e73dfd1461091657600080fd5b8063aeb5a9081461086d578063b88d4fde14610883578063ba41b0c6146108a357600080fd5b8063a22cb4651161016f578063a5ed2d3c11610149578063a5ed2d3c146107f7578063a8027a5d1461080d578063a8297ffd1461082d578063ad3e31b71461084d57600080fd5b8063a22cb465146107a1578063a264df9d146107c1578063a58fdc11146107d757600080fd5b806394e86b20116101ab57806394e86b201461074057806395d89b41146107565780639a7885131461076b5780639ebbefad1461078b57600080fd5b80638a333b50146106f65780638d3dbaed1461070c5780638da5cb5b1461072257600080fd5b80633ba0ea2f116102ab5780636352211e116102495780636f8b44b0116102235780636f8b44b01461068157806370a08231146106a1578063715018a6146106c157806379b21a96146106d657600080fd5b80636352211e1461062b578063685e51bc1461064b57806369b5b29c1461066157600080fd5b8063518302271161028557806351830227146105bb57806356171417146105d557806356ce2f52146105f55780635dcce2341461060b57600080fd5b80633ba0ea2f1461057d5780633ccfd60b1461059357806342842e0e1461059b57600080fd5b8063151f45c3116103185780632920bbb2116102f25780632920bbb21461050a5780632b18f2ea1461052a5780632db115441461054a5780632f9a7c581461055d57600080fd5b8063151f45c3146104bf57806318160ddd146104d557806323b872dd146104ea57600080fd5b8063081812fc11610354578063081812fc14610439578063095ea7b3146104715780630f5604061461049357806310f61905146104a957600080fd5b8063016005da146103be57806301ffc9a7146103e757806306fdde031461041757600080fd5b366103b957604080513381523460208201527f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c52910160405180910390a1005b600080fd5b3480156103ca57600080fd5b506103d460185481565b6040519081526020015b60405180910390f35b3480156103f357600080fd5b506104076104023660046129dc565b610a22565b60405190151581526020016103de565b34801561042357600080fd5b5061042c610a74565b6040516103de9190612a49565b34801561044557600080fd5b50610459610454366004612a5c565b610b06565b6040516001600160a01b0390911681526020016103de565b34801561047d57600080fd5b5061049161048c366004612a8c565b610b4a565b005b34801561049f57600080fd5b506103d460155481565b3480156104b557600080fd5b506103d460135481565b3480156104cb57600080fd5b506103d460175481565b3480156104e157600080fd5b506103d4610bd0565b3480156104f657600080fd5b50610491610505366004612ab6565b610c18565b34801561051657600080fd5b50610491610525366004612a5c565b610c23565b34801561053657600080fd5b50610491610545366004612b7e565b610c5b565b610491610558366004612a5c565b610c95565b34801561056957600080fd5b50610491610578366004612a5c565b610ec1565b34801561058957600080fd5b506103d460195481565b610491610ef0565b3480156105a757600080fd5b506104916105b6366004612ab6565b61133c565b3480156105c757600080fd5b506010546104079060ff1681565b3480156105e157600080fd5b506104916105f0366004612a5c565b611357565b34801561060157600080fd5b506103d460115481565b34801561061757600080fd5b50610491610626366004612b7e565b611386565b34801561063757600080fd5b50610459610646366004612a5c565b6113bc565b34801561065757600080fd5b506103d4600c5481565b34801561066d57600080fd5b5061049161067c366004612bc7565b6113ce565b34801561068d57600080fd5b5061049161069c366004612a5c565b611498565b3480156106ad57600080fd5b506103d46106bc366004612be9565b6114c7565b3480156106cd57600080fd5b50610491611515565b3480156106e257600080fd5b506104916106f1366004612a5c565b61154b565b34801561070257600080fd5b506103d4600b5481565b34801561071857600080fd5b506103d4600e5481565b34801561072e57600080fd5b50600a546001600160a01b0316610459565b34801561074c57600080fd5b506103d460165481565b34801561076257600080fd5b5061042c61157a565b34801561077757600080fd5b50610491610786366004612a5c565b611589565b34801561079757600080fd5b506103d4601b5481565b3480156107ad57600080fd5b506104916107bc366004612c14565b6115b8565b3480156107cd57600080fd5b506103d4601a5481565b3480156107e357600080fd5b506104916107f2366004612a5c565b61164d565b34801561080357600080fd5b506103d460125481565b34801561081957600080fd5b50610491610828366004612a5c565b61167c565b34801561083957600080fd5b50610491610848366004612a5c565b6116ab565b34801561085957600080fd5b50610491610868366004612a5c565b6116da565b34801561087957600080fd5b506103d460145481565b34801561088f57600080fd5b5061049161089e366004612c47565b611709565b6104916108b1366004612cc3565b611743565b3480156108c257600080fd5b5061042c6108d1366004612a5c565b611d5c565b3480156108e257600080fd5b506104916108f1366004612a5c565b611eac565b34801561090257600080fd5b50610491610911366004612a5c565b611edb565b34801561092257600080fd5b50610491610931366004612a5c565b611f0a565b34801561094257600080fd5b50610491610951366004612a5c565b611f39565b34801561096257600080fd5b50610491610971366004612d42565b611f68565b34801561098257600080fd5b50610407610991366004612d5d565b611fa5565b3480156109a257600080fd5b506104916109b1366004612a5c565b611fd3565b3480156109c257600080fd5b506104916109d1366004612be9565b612002565b3480156109e257600080fd5b506103d4600f5481565b3480156109f857600080fd5b506103d4600d5481565b348015610a0e57600080fd5b50610491610a1d366004612a5c565b61209d565b60006001600160e01b031982166380ac58cd60e01b1480610a5357506001600160e01b03198216635b5e139f60e01b145b80610a6e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610a8390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90612d87565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b5050505050905090565b6000610b11826120cc565b610b2e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610b55826113bc565b9050806001600160a01b0316836001600160a01b031603610b895760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610bc057610ba38133611fa5565b610bc0576040516367d9dca160e11b815260040160405180910390fd5b610bcb8383836120f9565b505050565b60006001805460386002546101f3600354610beb9190612dd7565b610bf59190612dea565b610bff9190612dd7565b610c099190612dea565b610c139190612dd7565b905090565b610bcb838383612155565b600a546001600160a01b03163314610c565760405162461bcd60e51b8152600401610c4d90612dfd565b60405180910390fd5b601855565b600a546001600160a01b03163314610c855760405162461bcd60e51b8152600401610c4d90612dfd565b601d610c918282612e80565b5050565b600260005403610cb75760405162461bcd60e51b8152600401610c4d90612f40565b6002600055323314610d0b5760405162461bcd60e51b815260206004820152601b60248201527f747269656420746f206d696e742066726f6d20636f6e747261637400000000006044820152606401610c4d565b600d54421015610d565760405162461bcd60e51b81526020600482015260166024820152757075626c69632073616c65206e6f742061637469766560501b6044820152606401610c4d565b600b5481610d62610bd0565b610d6c9190612dea565b1115610dc95760405162461bcd60e51b815260206004820152602660248201527f747269656420746f206d696e74206d6f7265207468616e206d617820737570706044820152656c79206a696360d01b6064820152608401610c4d565b60006101f36002541015610e4d5750600280546101f390610dea9084612dea565b1115610e4d5760405162461bcd60e51b815260206004820152602c60248201527f6572726f722c20747269656420746f206d696e7420746f6f206d616e7920646960448201526b616d6f6e64207075626c696360a01b6064820152608401610c4d565b601654600f54610e5d9190612f77565b341015610eac5760405162461bcd60e51b815260206004820152601860248201527f7075626c6963206469646e27742070617920656e6f75676800000000000000006044820152606401610c4d565b610eb8335b83836123c7565b50506001600055565b600a546001600160a01b03163314610eeb5760405162461bcd60e51b8152600401610c4d90612dfd565b600f55565b600260005403610f125760405162461bcd60e51b8152600401610c4d90612f40565b6002600090815547907301656d41e041b50fc7c1eb270f7d891021937436612710610f3f846103e8612f77565b610f499190612fac565b604051600081818185875af1925050503d8060008114610f85576040519150601f19603f3d011682016040523d82523d6000602084013e610f8a565b606091505b50909150600090507397cc51cd15ba17b79046004d34341fce028d9505612710610fb6856103e8612f77565b610fc09190612fac565b604051600081818185875af1925050503d8060008114610ffc576040519150601f19603f3d011682016040523d82523d6000602084013e611001565b606091505b50909150600090507313eedd1582fc3738c67c3afee997d394802c2c6b61271061102d866103e8612f77565b6110379190612fac565b604051600081818185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b509091506000905073681bc14ad38069705197506bd7f1de40b49a8e446127106110a487610371612f77565b6110ae9190612fac565b604051600081818185875af1925050503d80600081146110ea576040519150601f19603f3d011682016040523d82523d6000602084013e6110ef565b606091505b5090915060009050732a97e97c5bea2de2a3c79482ba850e91683a01d061271061111b88610bb8612f77565b6111259190612fac565b604051600081818185875af1925050503d8060008114611161576040519150601f19603f3d011682016040523d82523d6000602084013e611166565b606091505b509091506000905073c042b012998c94fccf5ba78685f3a7efc9228d6b612710611192896104b0612f77565b61119c9190612fac565b604051600081818185875af1925050503d80600081146111d8576040519150601f19603f3d011682016040523d82523d6000602084013e6111dd565b606091505b509091506000905073fc78ac48ee9e375d1bb63b983f4929279656df1b6127106112098a610384612f77565b6112139190612fac565b604051600081818185875af1925050503d806000811461124f576040519150601f19603f3d011682016040523d82523d6000602084013e611254565b606091505b509091506000905073c05207e2936141134dd92e731c15c4b0a1032e436127106112808b6103fb612f77565b61128a9190612fac565b604051600081818185875af1925050503d80600081146112c6576040519150601f19603f3d011682016040523d82523d6000602084013e6112cb565b606091505b505090508780156112d95750865b80156112e25750855b80156112eb5750845b80156112f45750835b80156112fd5750825b80156113065750815b801561130f5750805b61132c57604051631d42c86760e21b815260040160405180910390fd5b5050600160005550505050505050565b610bcb83838360405180602001604052806000815250611709565b600a546001600160a01b031633146113815760405162461bcd60e51b8152600401610c4d90612dfd565b600d55565b600a546001600160a01b031633146113b05760405162461bcd60e51b8152600401610c4d90612dfd565b601c610c918282612e80565b60006113c78261256c565b5192915050565b600a546001600160a01b031633146113f85760405162461bcd60e51b8152600401610c4d90612dfd565b600b5482611404610bd0565b61140e9190612dea565b111561146a5760405162461bcd60e51b815260206004820152602560248201527f747269656420746f206d696e74206d6f7265207468616e206d617820737570706044820152646c7920746d60d81b6064820152608401610c4d565b8060010361147b57610c9133610eb1565b8060020361148c57610c9133610eb1565b610c91338360006123c7565b600a546001600160a01b031633146114c25760405162461bcd60e51b8152600401610c4d90612dfd565b600b55565b60006001600160a01b0382166114f0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160801b031690565b600a546001600160a01b0316331461153f5760405162461bcd60e51b8152600401610c4d90612dfd565b6115496000612686565b565b600a546001600160a01b031633146115755760405162461bcd60e51b8152600401610c4d90612dfd565b601455565b606060058054610a8390612d87565b600a546001600160a01b031633146115b35760405162461bcd60e51b8152600401610c4d90612dfd565b601255565b336001600160a01b038316036115e15760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146116775760405162461bcd60e51b8152600401610c4d90612dfd565b601955565b600a546001600160a01b031633146116a65760405162461bcd60e51b8152600401610c4d90612dfd565b601655565b600a546001600160a01b031633146116d55760405162461bcd60e51b8152600401610c4d90612dfd565b601355565b600a546001600160a01b031633146117045760405162461bcd60e51b8152600401610c4d90612dfd565b601b55565b611714848484612155565b611720848484846126d8565b61173d576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6002600054036117655760405162461bcd60e51b8152600401610c4d90612f40565b60026000553233146117b95760405162461bcd60e51b815260206004820152601b60248201527f747269656420746f206d696e742066726f6d20636f6e747261637400000000006044820152606401610c4d565b600c544210156118005760405162461bcd60e51b8152602060048201526012602482015271776c2073616c65206e6f742061637469766560701b6044820152606401610c4d565b600b548361180c610bd0565b6118169190612dea565b111561186f5760405162461bcd60e51b815260206004820152602260248201527f747269656420746f206d696e74206d6f7265207468616e206d617820737570706044820152616c7960f01b6064820152608401610c4d565b60006118f18383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060175491503390505b6040516020016118d6919060609190911b6bffffffffffffffffffffffff1916815260140190565b604051602081830303815290604052805190602001206127db565b156119635760115484611903336127f1565b61190d9190612dea565b111561195b5760405162461bcd60e51b815260206004820152601b60248201527f747269656420746f206d696e7420746f6f206d616e7920676f6c6400000000006044820152606401610c4d565b506001611d46565b6119a48383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060185491503390506118ae565b15611a2457601254846119b6336127f1565b6119c09190612dea565b1115611a1a5760405162461bcd60e51b8152602060048201526024808201527f747269656420746f206d696e7420746f6f206d616e7920696e766573746f722f6044820152637465616d60e01b6064820152608401610c4d565b6012549350611d46565b611a658383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060195491503390506118ae565b15611ad75760135484611a77336127f1565b611a819190612dea565b1115611acf5760405162461bcd60e51b815260206004820152601960248201527f747269656420746f206d696e7420746f6f206d616e79206f67000000000000006044820152606401610c4d565b506002611d46565b611b1883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a5491503390506118ae565b15611b875760145484611b2a336127f1565b611b349190612dea565b1115611b825760405162461bcd60e51b815260206004820152601960248201527f747269656420746f206d696e7420746f6f206d616e79206672000000000000006044820152606401610c4d565b611d46565b611bc883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601b5491503390506118ae565b15611d075760155484611bda336127f1565b611be49190612dea565b1115611c325760405162461bcd60e51b815260206004820152601960248201527f747269656420746f206d696e7420746f6f206d616e7920776c000000000000006044820152606401610c4d565b601554600e54611c429190612f77565b341015611c885760405162461bcd60e51b81526020600482015260146024820152730eed840c8d2c8dc4ee840e0c2f240cadcdeeaced60631b6044820152606401610c4d565b6101f36002541015611b825750600280546101f390611ca79086612dea565b1115611b825760405162461bcd60e51b815260206004820152602960248201527f6572726f722c20747269656420746f206d696e7420746f6f206d616e79206469604482015268616d6f6e642070726560b81b6064820152608401610c4d565b60405162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610c4d565b611d513385836123c7565b505060016000555050565b6060611d67826120cc565b611d8457604051630a14c4b560e41b815260040160405180910390fd5b60105460ff1615611deb57601c8054611d9c90612d87565b9050600003611dba5760405180602001604052806000815250610a6e565b601c611dc583612846565b604051602001611dd6929190612fc0565b60405160208183030381529060405292915050565b601d8054611df890612d87565b9050600003611e165760405180602001604052806000815250610a6e565b601d8054611e2390612d87565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4f90612d87565b8015611e9c5780601f10611e7157610100808354040283529160200191611e9c565b820191906000526020600020905b815481529060010190602001808311611e7f57829003601f168201915b505050505092915050565b919050565b600a546001600160a01b03163314611ed65760405162461bcd60e51b8152600401610c4d90612dfd565b600e55565b600a546001600160a01b03163314611f055760405162461bcd60e51b8152600401610c4d90612dfd565b601755565b600a546001600160a01b03163314611f345760405162461bcd60e51b8152600401610c4d90612dfd565b601a55565b600a546001600160a01b03163314611f635760405162461bcd60e51b8152600401610c4d90612dfd565b601155565b600a546001600160a01b03163314611f925760405162461bcd60e51b8152600401610c4d90612dfd565b6010805460ff1916911515919091179055565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b600a546001600160a01b03163314611ffd5760405162461bcd60e51b8152600401610c4d90612dfd565b600c55565b600a546001600160a01b0316331461202c5760405162461bcd60e51b8152600401610c4d90612dfd565b6001600160a01b0381166120915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c4d565b61209a81612686565b50565b600a546001600160a01b031633146120c75760405162461bcd60e51b8152600401610c4d90612dfd565b601555565b600060388210156120df57506001541190565b6101f38210156120f157506002541190565b506003541190565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6002600054036121775760405162461bcd60e51b8152600401610c4d90612f40565b60026000556001600160a01b0382166121a357604051633a954ecd60e21b815260040160405180910390fd5b60006121ae8261256c565b9050836001600160a01b031681600001516001600160a01b0316146121e55760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061220357506122038533611fa5565b8061221e57503361221384610b06565b6001600160a01b0316145b90508061223e57604051632ce44b5f60e11b815260040160405180910390fd5b61224a600084876120f9565b6001600160a01b03808616600090815260076020908152604080832080546000196001600160801b038083169190910181166001600160801b031992831617909255898616808652838620805480851660019081019095169316929092179091558251808401845290815267ffffffffffffffff4281168286019081528a87526006909552838620915182549551909116600160a01b026001600160e01b0319909516908716179390931790925590860180835291205490911661237957612311816120cc565b156123795760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600690935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450506001600055505050565b6001600160a01b0383166123ed57604051622e076360e81b815260040160405180910390fd5b8160000361240e5760405163b562e8dd60e01b815260040160405180910390fd5b6000816001036124215750600154612437565b816002036124325750600254612437565b506003545b6001600160a01b03841660008181526007602090815260408083208054600160801b6001600160801b031982166001600160801b039283168b01831690811782900483168b01909216021790558483526006909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b8481101561253a5760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461251160008784604051806020016040528060008152506126d8565b61252e5760405163d099061d60e01b815260040160405180910390fd5b600191820191016124b5565b508260010361254d576001819055612565565b8260020361255f576002819055612565565b60038190555b5050505050565b60408051808201909152600080825260208201528160018110801590612593575060015481105b806125ab5750806038111580156125ab575060025481105b806125c45750806101f3111580156125c4575060035481105b1561266d576000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612616579392505050565b50600019016000818152600660209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612668579392505050565b612616565b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156127cf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061271c903390899088908890600401613057565b6020604051808303816000875af1925050508015612757575060408051601f3d908101601f1916820190925261275491810190613094565b60015b6127b5573d808015612785576040519150601f19603f3d011682016040523d82523d6000602084013e61278a565b606091505b5080516000036127ad57604051638f11c40160e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127d3565b5060015b949350505050565b6000826127e88584612947565b14949350505050565b60006001600160a01b03821661281a576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260076020526040902054600160801b90046001600160801b031690565b60608160000361286d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128975780612881816130b1565b91506128909050600a83612fac565b9150612871565b60008167ffffffffffffffff8111156128b2576128b2612af2565b6040519080825280601f01601f1916602001820160405280156128dc576020820181803683370190505b5090505b84156127d3576128f1600183612dd7565b91506128fe600a866130ca565b612909906030612dea565b60f81b81838151811061291e5761291e6130de565b60200101906001600160f81b031916908160001a905350612940600a86612fac565b94506128e0565b600081815b845181101561298c576129788286838151811061296b5761296b6130de565b6020026020010151612994565b915080612984816130b1565b91505061294c565b509392505050565b60008183106129b05760008281526020849052604090206129bf565b60008381526020839052604090205b9392505050565b6001600160e01b03198116811461209a57600080fd5b6000602082840312156129ee57600080fd5b81356129bf816129c6565b60005b83811015612a145781810151838201526020016129fc565b50506000910152565b60008151808452612a358160208601602086016129f9565b601f01601f19169290920160200192915050565b6020815260006129bf6020830184612a1d565b600060208284031215612a6e57600080fd5b5035919050565b80356001600160a01b0381168114611ea757600080fd5b60008060408385031215612a9f57600080fd5b612aa883612a75565b946020939093013593505050565b600080600060608486031215612acb57600080fd5b612ad484612a75565b9250612ae260208501612a75565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612b2357612b23612af2565b604051601f8501601f19908116603f01168101908282118183101715612b4b57612b4b612af2565b81604052809350858152868686011115612b6457600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612b9057600080fd5b813567ffffffffffffffff811115612ba757600080fd5b8201601f81018413612bb857600080fd5b6127d384823560208401612b08565b60008060408385031215612bda57600080fd5b50508035926020909101359150565b600060208284031215612bfb57600080fd5b6129bf82612a75565b80358015158114611ea757600080fd5b60008060408385031215612c2757600080fd5b612c3083612a75565b9150612c3e60208401612c04565b90509250929050565b60008060008060808587031215612c5d57600080fd5b612c6685612a75565b9350612c7460208601612a75565b925060408501359150606085013567ffffffffffffffff811115612c9757600080fd5b8501601f81018713612ca857600080fd5b612cb787823560208401612b08565b91505092959194509250565b600080600060408486031215612cd857600080fd5b83359250602084013567ffffffffffffffff80821115612cf757600080fd5b818601915086601f830112612d0b57600080fd5b813581811115612d1a57600080fd5b8760208260051b8501011115612d2f57600080fd5b6020830194508093505050509250925092565b600060208284031215612d5457600080fd5b6129bf82612c04565b60008060408385031215612d7057600080fd5b612d7983612a75565b9150612c3e60208401612a75565b600181811c90821680612d9b57607f821691505b602082108103612dbb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a6e57610a6e612dc1565b80820180821115610a6e57610a6e612dc1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610bcb57600081815260208120601f850160051c81016020861015612e595750805b601f850160051c820191505b81811015612e7857828155600101612e65565b505050505050565b815167ffffffffffffffff811115612e9a57612e9a612af2565b612eae81612ea88454612d87565b84612e32565b602080601f831160018114612ee35760008415612ecb5750858301515b600019600386901b1c1916600185901b178555612e78565b600085815260208120601f198616915b82811015612f1257888601518255948401946001909101908401612ef3565b5085821015612f305787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000816000190483118215151615612f9157612f91612dc1565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612fbb57612fbb612f96565b500490565b6000808454612fce81612d87565b60018281168015612fe65760018114612ffb5761302a565b60ff198416875282151583028701945061302a565b8860005260208060002060005b858110156130215781548a820152908401908201613008565b50505082870194505b50505050835161303e8183602088016129f9565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061308a90830184612a1d565b9695505050505050565b6000602082840312156130a657600080fd5b81516129bf816129c6565b6000600182016130c3576130c3612dc1565b5060010190565b6000826130d9576130d9612f96565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220d1968b52cfadf2365ad72ffbe45b77eb13f0e441fe57ce46c522a990071fd43f64736f6c63430008100033

Deployed Bytecode Sourcemap

47680:8274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54759:39;;;54776:10;188:51:1;;54788:9:0;270:2:1;255:18;;248:34;54759:39:0;;161:18:1;54759:39:0;;;;;;;47680:8274;;;;;48460:31;;;;;;;;;;;;;;;;;;;439:25:1;;;427:2;412:18;48460:31:0;;;;;;;;27031:305;;;;;;;;;;-1:-1:-1;27031:305:0;;;;;:::i;:::-;;:::i;:::-;;;1026:14:1;;1019:22;1001:41;;989:2;974:18;27031:305:0;861:187:1;29231:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30623:204::-;;;;;;;;;;-1:-1:-1;30623:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2158:32:1;;;2140:51;;2128:2;2113:18;30623:204:0;1994:203:1;30185:372:0;;;;;;;;;;-1:-1:-1;30185:372:0;;;;;:::i;:::-;;:::i;:::-;;48304:36;;;;;;;;;;;;;;;;48188;;;;;;;;;;;;;;;;48422:31;;;;;;;;;;;;;;;;26813:146;;;;;;;;;;;;;:::i;31480:162::-;;;;;;;;;;-1:-1:-1;31480:162:0;;;;;:::i;:::-;;:::i;50205:116::-;;;;;;;;;;-1:-1:-1;50205:116:0;;;;;:::i;:::-;;:::i;54081:123::-;;;;;;;;;;-1:-1:-1;54081:123:0;;;;;:::i;:::-;;:::i;52780:702::-;;;;;;:::i;:::-;;:::i;49165:107::-;;;;;;;;;;-1:-1:-1;49165:107:0;;;;;:::i;:::-;;:::i;48498:29::-;;;;;;;;;;;;;;;;54814:1137;;;:::i;31713:177::-;;;;;;;;;;-1:-1:-1;31713:177:0;;;;;:::i;:::-;;:::i;48035:28::-;;;;;;;;;;-1:-1:-1;48035:28:0;;;;;;;;48949:111;;;;;;;;;;-1:-1:-1;48949:111:0;;;;;:::i;:::-;;:::i;48072:36::-;;;;;;;;;;;;;;;;53960:115;;;;;;;;;;-1:-1:-1;53960:115:0;;;;;:::i;:::-;;:::i;29039:125::-;;;;;;;;;;-1:-1:-1;29039:125:0;;;;;:::i;:::-;;:::i;47795:40::-;;;;;;;;;;;;;;;;53490:462;;;;;;;;;;-1:-1:-1;53490:462:0;;;;;:::i;:::-;;:::i;48736:104::-;;;;;;;;;;-1:-1:-1;48736:104:0;;;;;:::i;:::-;;:::i;27400:206::-;;;;;;;;;;-1:-1:-1;27400:206:0;;;;;:::i;:::-;;:::i;4762:94::-;;;;;;;;;;;;;:::i;49731:108::-;;;;;;;;;;-1:-1:-1;49731:108:0;;;;;:::i;:::-;;:::i;47756:32::-;;;;;;;;;;;;;;;;47945:35;;;;;;;;;;;;;;;;4111:87;;;;;;;;;;-1:-1:-1;4184:6:0;;-1:-1:-1;;;;;4184:6:0;4111:87;;48362:36;;;;;;;;;;;;;;;;29400:104;;;;;;;;;;;;;:::i;49499:112::-;;;;;;;;;;-1:-1:-1;49499:112:0;;;;;:::i;:::-;;:::i;48570:29::-;;;;;;;;;;;;;;;;30899:279;;;;;;;;;;-1:-1:-1;30899:279:0;;;;;:::i;:::-;;:::i;48534:29::-;;;;;;;;;;;;;;;;50327:112;;;;;;;;;;-1:-1:-1;50327:112:0;;;;;:::i;:::-;;:::i;48130:37::-;;;;;;;;;;;;;;;;49959:116;;;;;;;;;;-1:-1:-1;49959:116:0;;;;;:::i;:::-;;:::i;49617:108::-;;;;;;;;;;-1:-1:-1;49617:108:0;;;;;:::i;:::-;;:::i;50445:112::-;;;;;;;;;;-1:-1:-1;50445:112:0;;;;;:::i;:::-;;:::i;48246:36::-;;;;;;;;;;;;;;;;31961:334;;;;;;;;;;-1:-1:-1;31961:334:0;;;;;:::i;:::-;;:::i;50736:2036::-;;;;;;:::i;:::-;;:::i;54212:435::-;;;;;;;;;;-1:-1:-1;54212:435:0;;;;;:::i;:::-;;:::i;49068:91::-;;;;;;;;;;-1:-1:-1;49068:91:0;;;;;:::i;:::-;;:::i;50083:116::-;;;;;;;;;;-1:-1:-1;50083:116:0;;;;;:::i;:::-;;:::i;50563:112::-;;;;;;;;;;-1:-1:-1;50563:112:0;;;;;:::i;:::-;;:::i;49381:::-;;;;;;;;;;-1:-1:-1;49381:112:0;;;;;:::i;:::-;;:::i;49278:95::-;;;;;;;;;;-1:-1:-1;49278:95:0;;;;;:::i;:::-;;:::i;31249:164::-;;;;;;;;;;-1:-1:-1;31249:164:0;;;;;:::i;:::-;;:::i;48848:95::-;;;;;;;;;;-1:-1:-1;48848:95:0;;;;;:::i;:::-;;:::i;5011:192::-;;;;;;;;;;-1:-1:-1;5011:192:0;;;;;:::i;:::-;;:::i;47987:39::-;;;;;;;;;;;;;;;;47879:40;;;;;;;;;;;;;;;;49845:108;;;;;;;;;;-1:-1:-1;49845:108:0;;;;;:::i;:::-;;:::i;27031:305::-;27133:4;-1:-1:-1;;;;;;27170:40:0;;-1:-1:-1;;;27170:40:0;;:105;;-1:-1:-1;;;;;;;27227:48:0;;-1:-1:-1;;;27227:48:0;27170:105;:158;;;-1:-1:-1;;;;;;;;;;18534:40:0;;;27292:36;27150:178;27031:305;-1:-1:-1;;27031:305:0:o;29231:100::-;29285:13;29318:5;29311:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29231:100;:::o;30623:204::-;30691:7;30716:16;30724:7;30716;:16::i;:::-;30711:64;;30741:34;;-1:-1:-1;;;30741:34:0;;;;;;;;;;;30711:64;-1:-1:-1;30795:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30795:24:0;;30623:204::o;30185:372::-;30258:13;30274:24;30290:7;30274:15;:24::i;:::-;30258:40;;30319:5;-1:-1:-1;;;;;30313:11:0;:2;-1:-1:-1;;;;;30313:11:0;;30309:48;;30333:24;;-1:-1:-1;;;30333:24:0;;;;;;;;;;;30309:48;3008:10;-1:-1:-1;;;;;30374:21:0;;;30370:139;;30401:37;30418:5;3008:10;31249:164;:::i;30401:37::-;30397:112;;30462:35;;-1:-1:-1;;;30462:35:0;;;;;;;;;;;30397:112;30521:28;30530:2;30534:7;30543:5;30521:8;:28::i;:::-;30247:310;30185:372;;:::o;26813:146::-;26857:7;26949:1;26931:17;;26926:2;26905:20;;26899:3;26885:13;;:17;;;;:::i;:::-;:40;;;;:::i;:::-;:43;;;;:::i;:::-;:63;;;;:::i;:::-;:65;;;;:::i;:::-;26877:74;;26813:146;:::o;31480:162::-;31606:28;31616:4;31622:2;31626:7;31606:9;:28::i;50205:116::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;;;;;;;;;50283:16:::1;:30:::0;50205:116::o;54081:123::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;54166:12:::1;:30;54181:15:::0;54166:12;:30:::1;:::i;:::-;;54081:123:::0;:::o;52780:702::-;14988:1;15586:7;;:19;15578:63;;;;-1:-1:-1;;;15578:63:0;;;;;;;:::i;:::-;14988:1;15719:7;:18;52869:9:::1;52882:10;52869:23;52861:63;;;::::0;-1:-1:-1;;;52861:63:0;;11149:2:1;52861:63:0::1;::::0;::::1;11131:21:1::0;11188:2;11168:18;;;11161:30;11227:29;11207:18;;;11200:57;11274:18;;52861:63:0::1;10947:351:1::0;52861:63:0::1;52962:12;;52943:15;:31;;52935:66;;;::::0;-1:-1:-1;;;52935:66:0;;11505:2:1;52935:66:0::1;::::0;::::1;11487:21:1::0;11544:2;11524:18;;;11517:30;-1:-1:-1;;;11563:18:1;;;11556:52;11625:18;;52935:66:0::1;11303:346:1::0;52935:66:0::1;53050:10;;53036;53020:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:40;;53012:91;;;::::0;-1:-1:-1;;;53012:91:0;;11856:2:1;53012:91:0::1;::::0;::::1;11838:21:1::0;11895:2;11875:18;;;11868:30;11934:34;11914:18;;;11907:62;-1:-1:-1;;;11985:18:1;;;11978:36;12031:19;;53012:91:0::1;11654:402:1::0;53012:91:0::1;53116:13;53171:3;53148:20;;:26;53144:188;;;-1:-1:-1::0;53203:1:0::1;53244:20:::0;;53268:3:::1;::::0;53231:33:::1;::::0;:10;:33:::1;:::i;:::-;:40;;53223:97;;;::::0;-1:-1:-1;;;53223:97:0;;12263:2:1;53223:97:0::1;::::0;::::1;12245:21:1::0;12302:2;12282:18;;;12275:30;12341:34;12321:18;;;12314:62;-1:-1:-1;;;12392:18:1;;;12385:42;12444:19;;53223:97:0::1;12061:408:1::0;53223:97:0::1;53375:17;;53363:11;;:29;;;;:::i;:::-;53350:9;:42;;53342:79;;;::::0;-1:-1:-1;;;53342:79:0;;12849:2:1;53342:79:0::1;::::0;::::1;12831:21:1::0;12888:2;12868:18;;;12861:30;12927:26;12907:18;;;12900:54;12971:18;;53342:79:0::1;12647:348:1::0;53342:79:0::1;53432:42;3008:10:::0;53442:12:::1;53456:10;53468:5;53432:9;:42::i;:::-;-1:-1:-1::0;;14944:1:0;15898:7;:22;52780:702::o;49165:107::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49239:11:::1;:25:::0;49165:107::o;54814:1137::-;14988:1;15586:7;;:19;15578:63;;;;-1:-1:-1;;;15578:63:0;;;;;;;:::i;:::-;14988:1;15719:7;:18;;;54894:21:::1;::::0;54950:42:::1;55024:5;55006:15;54894:21:::0;55017:4:::1;55006:15;:::i;:::-;:23;;;;:::i;:::-;54942:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;54928:106:0;;-1:-1:-1;55046:7:0::1;::::0;-1:-1:-1;55067:42:0::1;55141:5;55123:15;:8:::0;55134:4:::1;55123:15;:::i;:::-;:23;;;;:::i;:::-;55059:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;55045:106:0;;-1:-1:-1;55163:7:0::1;::::0;-1:-1:-1;55184:42:0::1;55258:5;55240:15;:8:::0;55251:4:::1;55240:15;:::i;:::-;:23;;;;:::i;:::-;55176:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;55162:106:0;;-1:-1:-1;55281:7:0::1;::::0;-1:-1:-1;55302:42:0::1;55376:5;55358:15;:8:::0;55370:3:::1;55358:15;:::i;:::-;:23;;;;:::i;:::-;55294:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;55280:106:0;;-1:-1:-1;55398:7:0::1;::::0;-1:-1:-1;55419:42:0::1;55493:5;55475:15;:8:::0;55486:4:::1;55475:15;:::i;:::-;:23;;;;:::i;:::-;55411:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;55397:106:0;;-1:-1:-1;55515:7:0::1;::::0;-1:-1:-1;55536:42:0::1;55610:5;55592:15;:8:::0;55603:4:::1;55592:15;:::i;:::-;:23;;;;:::i;:::-;55528:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;55514:106:0;;-1:-1:-1;55632:7:0::1;::::0;-1:-1:-1;55653:42:0::1;55727:5;55709:15;:8:::0;55721:3:::1;55709:15;:::i;:::-;:23;;;;:::i;:::-;55645:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;55631:106:0;;-1:-1:-1;55749:7:0::1;::::0;-1:-1:-1;55770:42:0::1;55844:5;55826:15;:8:::0;55837:4:::1;55826:15;:::i;:::-;:23;;;;:::i;:::-;55762:92;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55748:106;;;55873:2;:8;;;;;55879:2;55873:8;:14;;;;;55885:2;55873:14;:20;;;;;55891:2;55873:20;:26;;;;;55897:2;55873:26;:32;;;;;55903:2;55873:32;:38;;;;;55909:2;55873:38;:44;;;;;55915:2;55873:44;55867:76;;55927:16;;-1:-1:-1::0;;;55927:16:0::1;;;;;;;;;;;55867:76;-1:-1:-1::0;;14944:1:0;15898:7;:22;-1:-1:-1;;;;;;;54814:1137:0:o;31713:177::-;31843:39;31860:4;31866:2;31870:7;31843:39;;;;;;;;;;;;:16;:39::i;48949:111::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49025:12:::1;:27:::0;48949:111::o;53960:115::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;54041:10:::1;:26;54054:13:::0;54041:10;:26:::1;:::i;29039:125::-:0;29103:7;29130:21;29143:7;29130:12;:21::i;:::-;:26;;29039:125;-1:-1:-1;;29039:125:0:o;53490:462::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;53612:10:::1;;53598;53582:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:40;;53574:90;;;::::0;-1:-1:-1;;;53574:90:0;;13669:2:1;53574:90:0::1;::::0;::::1;13651:21:1::0;13708:2;13688:18;;;13681:30;13747:34;13727:18;;;13720:62;-1:-1:-1;;;13798:18:1;;;13791:35;13843:19;;53574:90:0::1;13467:401:1::0;53574:90:0::1;53679:6;53689:1;53679:11:::0;53675:270:::1;;53715:43;3008:10:::0;53725:12:::1;2928:98:::0;53675:270:::1;53780:6;53790:1;53780:11:::0;53776:169:::1;;53819:43;3008:10:::0;53829:12:::1;2928:98:::0;53776:169:::1;53895:38;3008:10:::0;53919::::1;53931:1;53895:9;:38::i;48736:104::-:0;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;48809:10:::1;:23:::0;48736:104::o;27400:206::-;27464:7;-1:-1:-1;;;;;27488:19:0;;27484:60;;27516:28;;-1:-1:-1;;;27516:28:0;;;;;;;;;;;27484:60;-1:-1:-1;;;;;;27570:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27570:27:0;;27400:206::o;4762:94::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;4827:21:::1;4845:1;4827:9;:21::i;:::-;4762:94::o:0;49731:108::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49805:13:::1;:26:::0;49731:108::o;29400:104::-;29456:13;29489:7;29482:14;;;;;:::i;49499:112::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49575:15:::1;:28:::0;49499:112::o;30899:279::-;3008:10;-1:-1:-1;;;;;30990:24:0;;;30986:54;;31023:17;;-1:-1:-1;;;31023:17:0;;;;;;;;;;;30986:54;3008:10;31053:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31053:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31053:53:0;;;;;;;;;;31122:48;;1001:41:1;;;31053:42:0;;3008:10;31122:48;;974:18:1;31122:48:0;;;;;;;30899:279;;:::o;50327:112::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;50403:14:::1;:28:::0;50327:112::o;49959:116::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;50037:17:::1;:30:::0;49959:116::o;49617:108::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49691:13:::1;:26:::0;49617:108::o;50445:112::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;50521:14:::1;:28:::0;50445:112::o;31961:334::-;32120:28;32130:4;32136:2;32140:7;32120:9;:28::i;:::-;32164:48;32187:4;32193:2;32197:7;32206:5;32164:22;:48::i;:::-;32159:129;;32236:40;;-1:-1:-1;;;32236:40:0;;;;;;;;;;;32159:129;31961:334;;;;:::o;50736:2036::-;14988:1;15586:7;;:19;15578:63;;;;-1:-1:-1;;;15578:63:0;;;;;;;:::i;:::-;14988:1;15719:7;:18;50852:9:::1;50865:10;50852:23;50844:63;;;::::0;-1:-1:-1;;;50844:63:0;;11149:2:1;50844:63:0::1;::::0;::::1;11131:21:1::0;11188:2;11168:18;;;11161:30;11227:29;11207:18;;;11200:57;11274:18;;50844:63:0::1;10947:351:1::0;50844:63:0::1;50945:8;;50926:15;:27;;50918:58;;;::::0;-1:-1:-1;;;50918:58:0;;14075:2:1;50918:58:0::1;::::0;::::1;14057:21:1::0;14114:2;14094:18;;;14087:30;-1:-1:-1;;;14133:18:1;;;14126:48;14191:18;;50918:58:0::1;13873:342:1::0;50918:58:0::1;51025:10;;51011;50995:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:40;;50987:87;;;::::0;-1:-1:-1;;;50987:87:0;;14422:2:1;50987:87:0::1;::::0;::::1;14404:21:1::0;14461:2;14441:18;;;14434:30;14500:34;14480:18;;;14473:62;-1:-1:-1;;;14551:18:1;;;14544:32;14593:19;;50987:87:0::1;14220:398:1::0;50987:87:0::1;51087:13;51119:93;51138:12;;51119:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;51152:16:0::1;::::0;;-1:-1:-1;3008:10:0;;-1:-1:-1;51197:12:0::1;51180:30;;;;;;;14772:2:1::0;14768:15;;;;-1:-1:-1;;14764:53:1;14752:66;;14843:2;14834:12;;14623:229;51180:30:0::1;;;;;;;;;;;;;51170:41;;;;;;51119:18;:93::i;:::-;51115:1597;;;51281:15;::::0;51267:10;51237:27:::1;3008:10:::0;51237:13:::1;:27::i;:::-;:40;;;;:::i;:::-;:59;;51229:99;;;::::0;-1:-1:-1;;;51229:99:0;;15059:2:1;51229:99:0::1;::::0;::::1;15041:21:1::0;15098:2;15078:18;;;15071:30;15137:29;15117:18;;;15110:57;15184:18;;51229:99:0::1;14857:351:1::0;51229:99:0::1;-1:-1:-1::0;51351:1:0::1;51115:1597;;;51382:93;51401:12;;51382:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;51415:16:0::1;::::0;;-1:-1:-1;3008:10:0;;-1:-1:-1;51460:12:0::1;2928:98:::0;51382:93:::1;51378:1334;;;51544:15;::::0;51530:10;51500:27:::1;3008:10:::0;51237:13:::1;:27::i;51500:::-;:40;;;;:::i;:::-;:59;;51492:108;;;::::0;-1:-1:-1;;;51492:108:0;;15415:2:1;51492:108:0::1;::::0;::::1;15397:21:1::0;15454:2;15434:18;;;15427:30;15493:34;15473:18;;;15466:62;-1:-1:-1;;;15544:18:1;;;15537:34;15588:19;;51492:108:0::1;15213:400:1::0;51492:108:0::1;51628:15;;51615:28;;51378:1334;;;51665:91;51684:12;;51665:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;51698:14:0::1;::::0;;-1:-1:-1;3008:10:0;;-1:-1:-1;51741:12:0::1;2928:98:::0;51665:91:::1;51661:1051;;;51825:13;::::0;51811:10;51781:27:::1;3008:10:::0;51237:13:::1;:27::i;51781:::-;:40;;;;:::i;:::-;:57;;51773:95;;;::::0;-1:-1:-1;;;51773:95:0;;15820:2:1;51773:95:0::1;::::0;::::1;15802:21:1::0;15859:2;15839:18;;;15832:30;15898:27;15878:18;;;15871:55;15943:18;;51773:95:0::1;15618:349:1::0;51773:95:0::1;-1:-1:-1::0;51891:1:0::1;51661:1051;;;51914:91;51933:12;;51914:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;51947:14:0::1;::::0;;-1:-1:-1;3008:10:0;;-1:-1:-1;51990:12:0::1;2928:98:::0;51914:91:::1;51910:802;;;52074:13;::::0;52060:10;52030:27:::1;3008:10:::0;51237:13:::1;:27::i;52030:::-;:40;;;;:::i;:::-;:57;;52022:95;;;::::0;-1:-1:-1;;;52022:95:0;;16174:2:1;52022:95:0::1;::::0;::::1;16156:21:1::0;16213:2;16193:18;;;16186:30;16252:27;16232:18;;;16225:55;16297:18;;52022:95:0::1;15972:349:1::0;52022:95:0::1;51910:802;;;52139:91;52158:12;;52139:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;52172:14:0::1;::::0;;-1:-1:-1;3008:10:0;;-1:-1:-1;52215:12:0::1;2928:98:::0;52139:91:::1;52135:577;;;52299:13;::::0;52285:10;52255:27:::1;3008:10:::0;51237:13:::1;:27::i;52255:::-;:40;;;;:::i;:::-;:57;;52247:95;;;::::0;-1:-1:-1;;;52247:95:0;;16528:2:1;52247:95:0::1;::::0;::::1;16510:21:1::0;16567:2;16547:18;;;16540:30;16606:27;16586:18;;;16579:55;16651:18;;52247:95:0::1;16326:349:1::0;52247:95:0::1;52386:13;;52378:7;;:21;;;;:::i;:::-;52365:9;:34;;52357:67;;;::::0;-1:-1:-1;;;52357:67:0;;16882:2:1;52357:67:0::1;::::0;::::1;16864:21:1::0;16921:2;16901:18;;;16894:30;-1:-1:-1;;;16940:18:1;;;16933:50;17000:18;;52357:67:0::1;16680:344:1::0;52357:67:0::1;52468:3;52445:20;;:26;52441:189;;;-1:-1:-1::0;52500:1:0::1;52541:20:::0;;52565:3:::1;::::0;52528:33:::1;::::0;:10;:33:::1;:::i;:::-;:40;;52520:94;;;::::0;-1:-1:-1;;;52520:94:0;;17231:2:1;52520:94:0::1;::::0;::::1;17213:21:1::0;17270:2;17250:18;;;17243:30;17309:34;17289:18;;;17282:62;-1:-1:-1;;;17360:18:1;;;17353:39;17409:19;;52520:94:0::1;17029:405:1::0;52135:577:0::1;52662:38;::::0;-1:-1:-1;;;52662:38:0;;17641:2:1;52662:38:0::1;::::0;::::1;17623:21:1::0;17680:2;17660:18;;;17653:30;-1:-1:-1;;;17699:18:1;;;17692:50;17759:18;;52662:38:0::1;17439:344:1::0;52662:38:0::1;52722:42;3008:10:::0;52746::::1;52758:5;52722:9;:42::i;:::-;-1:-1:-1::0;;14944:1:0;15898:7;:22;-1:-1:-1;;50736:2036:0:o;54212:435::-;54294:13;54325:16;54333:7;54325;:16::i;:::-;54320:59;;54350:29;;-1:-1:-1;;;54350:29:0;;;;;;;;;;;54320:59;54403:8;;;;54399:241;;;54441:10;54435:24;;;;;:::i;:::-;;;54463:1;54435:29;:102;;;;;;;;;;;;;;;;;54491:10;54503:18;:7;:16;:18::i;:::-;54474:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54428:109;54212:435;-1:-1:-1;;54212:435:0:o;54399:241::-;54583:12;54577:26;;;;;:::i;:::-;;;54607:1;54577:31;:51;;;;;;;;;;;;;;;;;54611:12;54577:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54570:58;54212:435;-1:-1:-1;;54212:435:0:o;54399:241::-;54212:435;;;:::o;49068:91::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49134:7:::1;:17:::0;49068:91::o;50083:116::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;50161:16:::1;:30:::0;50083:116::o;50563:112::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;50639:14:::1;:28:::0;50563:112::o;49381:::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49457:15:::1;:28:::0;49381:112::o;49278:95::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49345:8:::1;:20:::0;;-1:-1:-1;;49345:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49278:95::o;31249:164::-;-1:-1:-1;;;;;31370:25:0;;;31346:4;31370:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31249:164::o;48848:95::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;48916:8:::1;:19:::0;48848:95::o;5011:192::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5100:22:0;::::1;5092:73;;;::::0;-1:-1:-1;;;5092:73:0;;19182:2:1;5092:73:0::1;::::0;::::1;19164:21:1::0;19221:2;19201:18;;;19194:30;19260:34;19240:18;;;19233:62;-1:-1:-1;;;19311:18:1;;;19304:36;19357:19;;5092:73:0::1;18980:402:1::0;5092:73:0::1;5176:19;5186:8;5176:9;:19::i;:::-;5011:192:::0;:::o;49845:108::-;4184:6;;-1:-1:-1;;;;;4184:6:0;3008:10;4331:23;4323:68;;;;-1:-1:-1;;;4323:68:0;;;;;;;:::i;:::-;49919:13:::1;:26:::0;49845:108::o;32550:312::-;32607:4;32638:2;32628:7;:12;32624:231;;;-1:-1:-1;32674:17:0;;-1:-1:-1;32664:27:0;32550:312::o;32624:231::-;32723:3;32713:7;:13;32709:146;;;-1:-1:-1;32760:20:0;;-1:-1:-1;32750:30:0;32550:312::o;32709:146::-;-1:-1:-1;32830:13:0;;-1:-1:-1;32820:23:0;32550:312::o;37367:196::-;37482:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;37482:29:0;-1:-1:-1;;;;;37482:29:0;;;;;;;;;37527:28;;37482:24;;37527:28;;;;;;;37367:196;;;:::o;35213:2036::-;14988:1;15586:7;;:19;15578:63;;;;-1:-1:-1;;;15578:63:0;;;;;;;:::i;:::-;14988:1;15719:7;:18;-1:-1:-1;;;;;35345:16:0;::::1;35341:52;;35370:23;;-1:-1:-1::0;;;35370:23:0::1;;;;;;;;;;;35341:52;35406:35;35444:21;35457:7;35444:12;:21::i;:::-;35406:59;;35502:4;-1:-1:-1::0;;;;;35480:26:0::1;:13;:18;;;-1:-1:-1::0;;;;;35480:26:0::1;;35476:67;;35515:28;;-1:-1:-1::0;;;35515:28:0::1;;;;;;;;;;;35476:67;35556:22;3008:10:::0;-1:-1:-1;;;;;35582:20:0;::::1;;::::0;:73:::1;;-1:-1:-1::0;35619:36:0::1;35636:4:::0;3008:10;31249:164;:::i;35619:36::-:1;35582:126;;;-1:-1:-1::0;3008:10:0;35672:20:::1;35684:7:::0;35672:11:::1;:20::i;:::-;-1:-1:-1::0;;;;;35672:36:0::1;;35582:126;35556:153;;35727:17;35722:66;;35753:35;;-1:-1:-1::0;;;35753:35:0::1;;;;;;;;;;;35722:66;35853:35;35870:1;35874:7;35883:4;35853:8;:35::i;:::-;-1:-1:-1::0;;;;;36399:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;;;:31;;-1:-1:-1;;;;;;;36399:31:0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;;;;36399:31:0;;::::1;;::::0;;;36445:16;;::::1;::::0;;;;;;:29;;;;::::1;36429:1;36445:29:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;36514:43;;;;::::1;::::0;;;;;::::1;36540:15;36514:43:::0;::::1;::::0;;::::1;::::0;;;36491:20;;;:11:::1;:20:::0;;;;;;:66;;;;;;;;::::1;-1:-1:-1::0;;;36491:66:0::1;-1:-1:-1::0;;;;;;36491:66:0;;;;;::::1;::::0;;;;::::1;::::0;;;36831:11;;::::1;36861:24:::0;;;;;:29;36831:11;;36861:29:::1;36857:316;;36929:20;36937:11;36929:7;:20::i;:::-;36925:233;;;37001:137;::::0;;;;::::1;::::0;;37042:18;;-1:-1:-1;;;;;37001:137:0;;::::1;::::0;;::::1;37087:28:::0;;::::1;::::0;37001:137:::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;36974:24:0;;;:11:::1;:24:::0;;;;;;;:164;;;;;;;;::::1;-1:-1:-1::0;;;36974:164:0::1;-1:-1:-1::0;;;;;;36974:164:0;;;;::::1;::::0;;;;::::1;::::0;;36925:233:::1;36374:810;37233:7;37229:2;-1:-1:-1::0;;;;;37214:27:0::1;37223:4;-1:-1:-1::0;;;;;37214:27:0::1;;;;;;;;;;;-1:-1:-1::0;;14944:1:0;15898:7;:22;-1:-1:-1;;;35213:2036:0:o;33235:1724::-;-1:-1:-1;;;;;33359:16:0;;33355:48;;33384:19;;-1:-1:-1;;;33384:19:0;;;;;;;;;;;33355:48;33418:8;33430:1;33418:13;33414:44;;33440:18;;-1:-1:-1;;;33440:18:0;;;;;;;;;;;33414:44;33471:20;33506:7;33517:1;33506:12;33502:243;;-1:-1:-1;33558:17:0;;33502:243;;;33597:7;33608:1;33597:12;33593:152;;-1:-1:-1;33652:20:0;;33593:152;;;-1:-1:-1;33720:13:0;;33593:152;-1:-1:-1;;;;;34014:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;34014:45:0;;-1:-1:-1;;;;;34014:45:0;;;;;;;;;;34074:50;;;;;;;;;;;;;;34141:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;34191:66:0;;;;-1:-1:-1;;;34241:15:0;34191:66;;;;;;;34141:25;;34326:319;34350:8;34346:1;:12;34326:319;;;34389:38;;34414:12;;-1:-1:-1;;;;;34389:38:0;;;34406:1;;34389:38;;34406:1;;34389:38;34451:56;34482:1;34486:2;34490:12;34451:56;;;;;;;;;;;;:22;:56::i;:::-;34446:149;;34539:36;;-1:-1:-1;;;34539:36:0;;;;;;;;;;;34446:149;34613:14;;;;;34360:3;34326:319;;;;34665:7;34676:1;34665:12;34661:267;;34706:17;:32;;;34661:267;;;34764:7;34775:1;34764:12;34760:168;;34808:20;:35;;;34760:168;;;34884:13;:28;;;34760:168;33989:950;33344:1615;33235:1724;;;:::o;28097:880::-;-1:-1:-1;;;;;;;;;;;;;;;;;28208:7:0;28259:1;:9;-1:-1:-1;28259:9:0;;;:37;;;28279:17;;28272:4;:24;28259:37;28258:86;;;;28308:4;28302:2;:10;;:41;;;;;28323:20;;28316:4;:27;28302:41;28258:127;;;;28356:4;28349:3;:11;;:35;;;;;28371:13;;28364:4;:20;28349:35;28253:644;;;28407:31;28441:17;;;:11;:17;;;;;;;;;28407:51;;;;;;;;;-1:-1:-1;;;;;28407:51:0;;;;;-1:-1:-1;;;28407:51:0;;;;;;;;;;;;28481:28;28477:93;;28541:9;28097:880;-1:-1:-1;;;28097:880:0:o;28477:93::-;-1:-1:-1;;;28681:6:0;28722:17;;;;:11;:17;;;;;;;;;28710:29;;;;;;;;;-1:-1:-1;;;;;28710:29:0;;;;;-1:-1:-1;;;28710:29:0;;;;;;;;;;;;28766:28;28762:101;;28830:9;28097:880;-1:-1:-1;;;28097:880:0:o;28762:101::-;28645:237;;28253:644;28938:31;;-1:-1:-1;;;28938:31:0;;;;;;;;;;;5211:173;5286:6;;;-1:-1:-1;;;;;5303:17:0;;;-1:-1:-1;;;;;;5303:17:0;;;;;;;5336:40;;5286:6;;;5303:17;5286:6;;5336:40;;5267:16;;5336:40;5256:128;5211:173;:::o;38055:798::-;38210:4;-1:-1:-1;;;;;38231:13:0;;6452:20;6500:8;38227:619;;38267:72;;-1:-1:-1;;;38267:72:0;;-1:-1:-1;;;;;38267:36:0;;;;;:72;;3008:10;;38318:4;;38324:7;;38333:5;;38267:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38267:72:0;;;;;;;;-1:-1:-1;;38267:72:0;;;;;;;;;;;;:::i;:::-;;;38263:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38513:6;:13;38530:1;38513:18;38509:267;;38563:48;;-1:-1:-1;;;38563:48:0;;;;;;;;;;;38509:267;38726:6;38720:13;38711:6;38707:2;38703:15;38696:38;38263:528;-1:-1:-1;;;;;;38390:55:0;-1:-1:-1;;;38390:55:0;;-1:-1:-1;38383:62:0;;38227:619;-1:-1:-1;38830:4:0;38227:619;38055:798;;;;;;:::o;40006:190::-;40131:4;40184;40155:25;40168:5;40175:4;40155:12;:25::i;:::-;:33;;40006:190;-1:-1:-1;;;;40006:190:0:o;27688:207::-;27749:7;-1:-1:-1;;;;;27773:19:0;;27769:59;;27801:27;;-1:-1:-1;;;27801:27:0;;;;;;;;;;;27769:59;-1:-1:-1;;;;;;27854:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;27854:32:0;;-1:-1:-1;;;;;27854:32:0;;27688:207::o;572:723::-;628:13;849:5;858:1;849:10;845:53;;-1:-1:-1;;876:10:0;;;;;;;;;;;;-1:-1:-1;;;876:10:0;;;;;572:723::o;845:53::-;923:5;908:12;964:78;971:9;;964:78;;997:8;;;;:::i;:::-;;-1:-1:-1;1020:10:0;;-1:-1:-1;1028:2:0;1020:10;;:::i;:::-;;;964:78;;;1052:19;1084:6;1074:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1074:17:0;;1052:39;;1102:154;1109:10;;1102:154;;1136:11;1146:1;1136:11;;:::i;:::-;;-1:-1:-1;1205:10:0;1213:2;1205:5;:10;:::i;:::-;1192:24;;:2;:24;:::i;:::-;1179:39;;1162:6;1169;1162:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1162:56:0;;;;;;;;-1:-1:-1;1233:11:0;1242:2;1233:11;;:::i;:::-;;;1102:154;;40873:296;40956:7;40999:4;40956:7;41014:118;41038:5;:12;41034:1;:16;41014:118;;;41087:33;41097:12;41111:5;41117:1;41111:8;;;;;;;;:::i;:::-;;;;;;;41087:9;:33::i;:::-;41072:48;-1:-1:-1;41052:3:0;;;;:::i;:::-;;;;41014:118;;;-1:-1:-1;41149:12:0;40873:296;-1:-1:-1;;;40873:296:0:o;47080:149::-;47143:7;47174:1;47170;:5;:51;;47305:13;47399:15;;;47435:4;47428:15;;;47482:4;47466:21;;47170:51;;;47305:13;47399:15;;;47435:4;47428:15;;;47482:4;47466:21;;47178:20;47163:58;47080:149;-1:-1:-1;;;47080:149:0:o;475:131:1:-;-1:-1:-1;;;;;;549:32:1;;539:43;;529:71;;596:1;593;586:12;611:245;669:6;722:2;710:9;701:7;697:23;693:32;690:52;;;738:1;735;728:12;690:52;777:9;764:23;796:30;820:5;796:30;:::i;1053:250::-;1138:1;1148:113;1162:6;1159:1;1156:13;1148:113;;;1238:11;;;1232:18;1219:11;;;1212:39;1184:2;1177:10;1148:113;;;-1:-1:-1;;1295:1:1;1277:16;;1270:27;1053:250::o;1308:271::-;1350:3;1388:5;1382:12;1415:6;1410:3;1403:19;1431:76;1500:6;1493:4;1488:3;1484:14;1477:4;1470:5;1466:16;1431:76;:::i;:::-;1561:2;1540:15;-1:-1:-1;;1536:29:1;1527:39;;;;1568:4;1523:50;;1308:271;-1:-1:-1;;1308:271:1:o;1584:220::-;1733:2;1722:9;1715:21;1696:4;1753:45;1794:2;1783:9;1779:18;1771:6;1753:45;:::i;1809:180::-;1868:6;1921:2;1909:9;1900:7;1896:23;1892:32;1889:52;;;1937:1;1934;1927:12;1889:52;-1:-1:-1;1960:23:1;;1809:180;-1:-1:-1;1809:180:1:o;2202:173::-;2270:20;;-1:-1:-1;;;;;2319:31:1;;2309:42;;2299:70;;2365:1;2362;2355:12;2380:254;2448:6;2456;2509:2;2497:9;2488:7;2484:23;2480:32;2477:52;;;2525:1;2522;2515:12;2477:52;2548:29;2567:9;2548:29;:::i;:::-;2538:39;2624:2;2609:18;;;;2596:32;;-1:-1:-1;;;2380:254:1:o;2821:328::-;2898:6;2906;2914;2967:2;2955:9;2946:7;2942:23;2938:32;2935:52;;;2983:1;2980;2973:12;2935:52;3006:29;3025:9;3006:29;:::i;:::-;2996:39;;3054:38;3088:2;3077:9;3073:18;3054:38;:::i;:::-;3044:48;;3139:2;3128:9;3124:18;3111:32;3101:42;;2821:328;;;;;:::o;3339:127::-;3400:10;3395:3;3391:20;3388:1;3381:31;3431:4;3428:1;3421:15;3455:4;3452:1;3445:15;3471:632;3536:5;3566:18;3607:2;3599:6;3596:14;3593:40;;;3613:18;;:::i;:::-;3688:2;3682:9;3656:2;3742:15;;-1:-1:-1;;3738:24:1;;;3764:2;3734:33;3730:42;3718:55;;;3788:18;;;3808:22;;;3785:46;3782:72;;;3834:18;;:::i;:::-;3874:10;3870:2;3863:22;3903:6;3894:15;;3933:6;3925;3918:22;3973:3;3964:6;3959:3;3955:16;3952:25;3949:45;;;3990:1;3987;3980:12;3949:45;4040:6;4035:3;4028:4;4020:6;4016:17;4003:44;4095:1;4088:4;4079:6;4071;4067:19;4063:30;4056:41;;;;3471:632;;;;;:::o;4108:451::-;4177:6;4230:2;4218:9;4209:7;4205:23;4201:32;4198:52;;;4246:1;4243;4236:12;4198:52;4286:9;4273:23;4319:18;4311:6;4308:30;4305:50;;;4351:1;4348;4341:12;4305:50;4374:22;;4427:4;4419:13;;4415:27;-1:-1:-1;4405:55:1;;4456:1;4453;4446:12;4405:55;4479:74;4545:7;4540:2;4527:16;4522:2;4518;4514:11;4479:74;:::i;4564:248::-;4632:6;4640;4693:2;4681:9;4672:7;4668:23;4664:32;4661:52;;;4709:1;4706;4699:12;4661:52;-1:-1:-1;;4732:23:1;;;4802:2;4787:18;;;4774:32;;-1:-1:-1;4564:248:1:o;4817:186::-;4876:6;4929:2;4917:9;4908:7;4904:23;4900:32;4897:52;;;4945:1;4942;4935:12;4897:52;4968:29;4987:9;4968:29;:::i;5008:160::-;5073:20;;5129:13;;5122:21;5112:32;;5102:60;;5158:1;5155;5148:12;5173:254;5238:6;5246;5299:2;5287:9;5278:7;5274:23;5270:32;5267:52;;;5315:1;5312;5305:12;5267:52;5338:29;5357:9;5338:29;:::i;:::-;5328:39;;5386:35;5417:2;5406:9;5402:18;5386:35;:::i;:::-;5376:45;;5173:254;;;;;:::o;5432:667::-;5527:6;5535;5543;5551;5604:3;5592:9;5583:7;5579:23;5575:33;5572:53;;;5621:1;5618;5611:12;5572:53;5644:29;5663:9;5644:29;:::i;:::-;5634:39;;5692:38;5726:2;5715:9;5711:18;5692:38;:::i;:::-;5682:48;;5777:2;5766:9;5762:18;5749:32;5739:42;;5832:2;5821:9;5817:18;5804:32;5859:18;5851:6;5848:30;5845:50;;;5891:1;5888;5881:12;5845:50;5914:22;;5967:4;5959:13;;5955:27;-1:-1:-1;5945:55:1;;5996:1;5993;5986:12;5945:55;6019:74;6085:7;6080:2;6067:16;6062:2;6058;6054:11;6019:74;:::i;:::-;6009:84;;;5432:667;;;;;;;:::o;6104:683::-;6199:6;6207;6215;6268:2;6256:9;6247:7;6243:23;6239:32;6236:52;;;6284:1;6281;6274:12;6236:52;6320:9;6307:23;6297:33;;6381:2;6370:9;6366:18;6353:32;6404:18;6445:2;6437:6;6434:14;6431:34;;;6461:1;6458;6451:12;6431:34;6499:6;6488:9;6484:22;6474:32;;6544:7;6537:4;6533:2;6529:13;6525:27;6515:55;;6566:1;6563;6556:12;6515:55;6606:2;6593:16;6632:2;6624:6;6621:14;6618:34;;;6648:1;6645;6638:12;6618:34;6701:7;6696:2;6686:6;6683:1;6679:14;6675:2;6671:23;6667:32;6664:45;6661:65;;;6722:1;6719;6712:12;6661:65;6753:2;6749;6745:11;6735:21;;6775:6;6765:16;;;;;6104:683;;;;;:::o;6792:180::-;6848:6;6901:2;6889:9;6880:7;6876:23;6872:32;6869:52;;;6917:1;6914;6907:12;6869:52;6940:26;6956:9;6940:26;:::i;6977:260::-;7045:6;7053;7106:2;7094:9;7085:7;7081:23;7077:32;7074:52;;;7122:1;7119;7112:12;7074:52;7145:29;7164:9;7145:29;:::i;:::-;7135:39;;7193:38;7227:2;7216:9;7212:18;7193:38;:::i;7242:380::-;7321:1;7317:12;;;;7364;;;7385:61;;7439:4;7431:6;7427:17;7417:27;;7385:61;7492:2;7484:6;7481:14;7461:18;7458:38;7455:161;;7538:10;7533:3;7529:20;7526:1;7519:31;7573:4;7570:1;7563:15;7601:4;7598:1;7591:15;7455:161;;7242:380;;;:::o;7627:127::-;7688:10;7683:3;7679:20;7676:1;7669:31;7719:4;7716:1;7709:15;7743:4;7740:1;7733:15;7759:128;7826:9;;;7847:11;;;7844:37;;;7861:18;;:::i;7892:125::-;7957:9;;;7978:10;;;7975:36;;;7991:18;;:::i;8022:356::-;8224:2;8206:21;;;8243:18;;;8236:30;8302:34;8297:2;8282:18;;8275:62;8369:2;8354:18;;8022:356::o;8509:545::-;8611:2;8606:3;8603:11;8600:448;;;8647:1;8672:5;8668:2;8661:17;8717:4;8713:2;8703:19;8787:2;8775:10;8771:19;8768:1;8764:27;8758:4;8754:38;8823:4;8811:10;8808:20;8805:47;;;-1:-1:-1;8846:4:1;8805:47;8901:2;8896:3;8892:12;8889:1;8885:20;8879:4;8875:31;8865:41;;8956:82;8974:2;8967:5;8964:13;8956:82;;;9019:17;;;9000:1;8989:13;8956:82;;;8960:3;;;8509:545;;;:::o;9230:1352::-;9356:3;9350:10;9383:18;9375:6;9372:30;9369:56;;;9405:18;;:::i;:::-;9434:97;9524:6;9484:38;9516:4;9510:11;9484:38;:::i;:::-;9478:4;9434:97;:::i;:::-;9586:4;;9650:2;9639:14;;9667:1;9662:663;;;;10369:1;10386:6;10383:89;;;-1:-1:-1;10438:19:1;;;10432:26;10383:89;-1:-1:-1;;9187:1:1;9183:11;;;9179:24;9175:29;9165:40;9211:1;9207:11;;;9162:57;10485:81;;9632:944;;9662:663;8456:1;8449:14;;;8493:4;8480:18;;-1:-1:-1;;9698:20:1;;;9816:236;9830:7;9827:1;9824:14;9816:236;;;9919:19;;;9913:26;9898:42;;10011:27;;;;9979:1;9967:14;;;;9846:19;;9816:236;;;9820:3;10080:6;10071:7;10068:19;10065:201;;;10141:19;;;10135:26;-1:-1:-1;;10224:1:1;10220:14;;;10236:3;10216:24;10212:37;10208:42;10193:58;10178:74;;10065:201;-1:-1:-1;;;;;10312:1:1;10296:14;;;10292:22;10279:36;;-1:-1:-1;9230:1352:1:o;10587:355::-;10789:2;10771:21;;;10828:2;10808:18;;;10801:30;10867:33;10862:2;10847:18;;10840:61;10933:2;10918:18;;10587:355::o;12474:168::-;12514:7;12580:1;12576;12572:6;12568:14;12565:1;12562:21;12557:1;12550:9;12543:17;12539:45;12536:71;;;12587:18;;:::i;:::-;-1:-1:-1;12627:9:1;;12474:168::o;13000:127::-;13061:10;13056:3;13052:20;13049:1;13042:31;13092:4;13089:1;13082:15;13116:4;13113:1;13106:15;13132:120;13172:1;13198;13188:35;;13203:18;;:::i;:::-;-1:-1:-1;13237:9:1;;13132:120::o;17788:1187::-;18065:3;18094:1;18127:6;18121:13;18157:36;18183:9;18157:36;:::i;:::-;18212:1;18229:18;;;18256:133;;;;18403:1;18398:356;;;;18222:532;;18256:133;-1:-1:-1;;18289:24:1;;18277:37;;18362:14;;18355:22;18343:35;;18334:45;;;-1:-1:-1;18256:133:1;;18398:356;18429:6;18426:1;18419:17;18459:4;18504:2;18501:1;18491:16;18529:1;18543:165;18557:6;18554:1;18551:13;18543:165;;;18635:14;;18622:11;;;18615:35;18678:16;;;;18572:10;;18543:165;;;18547:3;;;18737:6;18732:3;18728:16;18721:23;;18222:532;;;;;18785:6;18779:13;18801:68;18860:8;18855:3;18848:4;18840:6;18836:17;18801:68;:::i;:::-;-1:-1:-1;;;18891:18:1;;18918:22;;;18967:1;18956:13;;17788:1187;-1:-1:-1;;;;17788:1187:1:o;19387:489::-;-1:-1:-1;;;;;19656:15:1;;;19638:34;;19708:15;;19703:2;19688:18;;19681:43;19755:2;19740:18;;19733:34;;;19803:3;19798:2;19783:18;;19776:31;;;19581:4;;19824:46;;19850:19;;19842:6;19824:46;:::i;:::-;19816:54;19387:489;-1:-1:-1;;;;;;19387:489:1:o;19881:249::-;19950:6;20003:2;19991:9;19982:7;19978:23;19974:32;19971:52;;;20019:1;20016;20009:12;19971:52;20051:9;20045:16;20070:30;20094:5;20070:30;:::i;20135:135::-;20174:3;20195:17;;;20192:43;;20215:18;;:::i;:::-;-1:-1:-1;20262:1:1;20251:13;;20135:135::o;20275:112::-;20307:1;20333;20323:35;;20338:18;;:::i;:::-;-1:-1:-1;20372:9:1;;20275:112::o;20392:127::-;20453:10;20448:3;20444:20;20441:1;20434:31;20484:4;20481:1;20474:15;20508:4;20505:1;20498:15

Swarm Source

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