ETH Price: $3,354.36 (-8.29%)
 

Overview

Max Total Supply

2,527 MCNFT

Holders

447

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MCNFT
0x884c7b90a0288d3f07f351160ebf4680d89190de
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:
McNiftyNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

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

// File: final/contracts/LetsgoNFTBase.sol

//SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract LetsgoNFTBase {
    uint256 public mantissa = 10000;

    struct AddreessWithPercent {
        address addr;
        uint256 value;
    }

    function validateCoCreators(AddreessWithPercent[] memory coCreators) external view{
         require(
            coCreators.length <= 10,
            "validateCoCreators: coCreators length should be less or equal to 10"
        );

        uint256 coCreatorsSum = 0;

        for (uint256 i = 0; i < coCreators.length; i++) {
            require(
                coCreators[i].addr != address(0),
                "validateCoCreators: coCreator address address can't be empty"
            );
            require(
                coCreators[i].value > 0,
                "validateCoCreators: coCreator value must be higher than 0"
            );
            coCreatorsSum += coCreators[i].value;
        }
        
        require(
            coCreatorsSum <= mantissa,
            "validateCoCreators: coCreators sum should be less or equal to 100%"
        );
    }
}
// File: final/contracts/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees 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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
// File: @openzeppelin/contracts/utils/Counters.sol


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: final/contracts/NFT_FINAL_CONTRACT_V2 (2).sol



pragma solidity >=0.7.0 <0.9.0;

// import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol";






contract McNiftyNFT is ERC721, Ownable, LetsgoNFTBase {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public xname = "McNiftyTrump";
  string public xsymbol = "MCNFT";

  constructor() ERC721(xname, xsymbol){
    status_airdrop = true;
    status_presale = true;
    status_revealed = true;

    url_revealedJSON = "ipfs://QmcE1zXDX5DDDfxqfz5BvZeCwNW9PBAEyj1xSHXQ4VXfwY/";
    url_collection = "https://gateway.pinata.cloud/ipfs/QmWhHAqNFVdtgHagLHKBLWNdm1uVShWdotkQA1STcGPkDe/";

    cost_presale = 100000000000000000;
    cost_publicSale = 150000000000000000;

    limit_mintPresale = 20;
    limit_mintPublicSale = 20;
    limit_airdropClaims = 100;

    total_NFTSupply = 10000;
  }

  string private url_revealedJSON;
  string private url_hiddenJSON;
  string private url_collection;
  string private url_hiddenImage;

  bytes32 private merkle_airdrop;

  bool public status_revealed;
  bool public status_paused;
  bool public status_presale;
  bool public status_airdrop;

  uint256 private report_totalWithdrawn;
  uint256 private report_totalRoyaltySales;
  uint256 private report_totalSales;
  uint256 private report_totalAirdropMinted;

  uint256 private limit_mintPresale;
  uint256 private limit_mintPublicSale;
  uint256 private limit_airdropClaims;

  uint256 private cost_presale;
  uint256 private cost_publicSale;

  uint256 private total_NFTSupply;

  uint256[] private list_royaltyAmounts;
  address[] private list_royaltyAddresses;
  address[] private list_airdropAddresses;
  address[] private list_airdropMintingAddresses;
  address[] private list_whitelistAddresses;

  mapping(address => uint256) public map_whitelistMinting;
  mapping(address => uint256) public map_airdropClaims;
  mapping(address => uint256) public map_airdropMintedClaims;

  bytes4 _interfaceId = 0xce77acc3;
  uint256 private _royalty = 500;
  mapping(uint256 => address) private _creators;

  function totalSupply() public view returns(uint256){
    return supply.current();
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return url_revealedJSON;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    
    if(status_revealed == false) {
      return url_hiddenJSON;
    }

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

  function isOwner() public view returns(bool){
    return msg.sender == owner();
  }

  function setPaused(bool _state) public onlyOwner {
    status_paused = _state;
  }

  function getCollectionURL(address addr) public view returns(string memory){
    if(addr == owner() || status_revealed){
      return url_collection;
    }
    return url_hiddenImage;
  }

  function computeCost(uint256 _mintAmount) private view returns(uint256){
    return (status_presale ? cost_presale : cost_publicSale) * _mintAmount;
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory){
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while(ownedTokenIndex < ownerTokenCount && currentTokenId <= total_NFTSupply){
      address currentTokenOwner = ownerOf(currentTokenId);
      if(currentTokenOwner == _owner){
        tokenIds[ownedTokenIndex] = currentTokenId;
        ownedTokenIndex += 1;
      }
      currentTokenId += 1;
    }

    return tokenIds;
  }

  function withdraw() public payable onlyOwner {
    uint256 amount = 0;
    uint256 i = 0; 
    uint balance = address(this).balance;
    uint256 remaining = balance;
    while(i < list_royaltyAmounts.length && remaining > 0){
      amount = balance * list_royaltyAmounts[i] / 100;
      remaining = remaining - amount;
      (bool o,) = payable(list_royaltyAddresses[i]).call{value: amount}("");
      require(o);
      i += 1;
    }

    if(remaining > 0){
      (bool a,) = payable(owner()).call{value: remaining}("");
      require(a);
    }
  }

  function mint(uint256 _mintAmount) public payable{
    require(!status_paused, "Minting is paused");
    require(supply.current() + _mintAmount <= total_NFTSupply, "Mint quantity exceeds max supply");

    if (!isOwner()) {
        require(msg.value >= computeCost(_mintAmount), "Cost is too low");
    }

    for (uint256 i = 1; i <= _mintAmount; i+=1) {
      supply.increment();
      _safeMint(msg.sender, supply.current());
     
      _creators[supply.current()] = msg.sender;
    }
  }

  function sendAirdrop(address[] memory addresses) public onlyOwner{
    require(status_airdrop, "Airdrop is not enabled");
    require(supply.current() + addresses.length < total_NFTSupply, "Airdrop addresses exceeds the total NFT supply");
    
    uint256 i = 0; 
    while(i < addresses.length){
      supply.increment();
      _safeMint(addresses[i], supply.current());
      map_airdropClaims[addresses[i]] += 1;
      i += 1; 
    }
  }

  function claimAirdrop(bytes32[] calldata _merkleProof) public {
    require(status_airdrop, "Airdrop is not enabled");
    require(report_totalAirdropMinted < limit_airdropClaims, "No more available airdrops.");
    uint256 claimed = map_airdropMintedClaims[msg.sender];

    require(claimed == 0, "Address already claimed");

    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, merkle_airdrop, leaf), "Invalid proof");
    map_airdropMintedClaims[msg.sender] += 1;
    supply.increment();
    _safeMint(msg.sender, supply.current());
    report_totalAirdropMinted += 1;
  }

  function bulkTransfer(uint256[] memory tokenIds, address receiver) public{
    uint256[] memory ownedTokens = walletOfOwner(msg.sender);

    uint256 i = 0; 
    uint256 j = 0;
    while(i < tokenIds.length){
      j = 0;
      while(j < ownedTokens.length){
        if(tokenIds[i] == ownedTokens[j]){
          _transfer(msg.sender, receiver, ownedTokens[j]);
        }
        j+=1; 
      }
      i+=1;
    }
  }

  function setSettings(
    uint256 xPublicSaleCost,
    uint256 xPreSaleCost,
    uint256 xtotalNFTSupply,
    uint256 xMaxMintQuantity,
    uint256 xNFTPerAddressLimit,
    uint256[] memory xRoyalty,
    address[] memory xRoyaltyAddress,
    bool xPaused,
    bool xRevealed,
    bool xPreSaleEnabled
    ) public onlyOwner{
    cost_publicSale = xPublicSaleCost;
    cost_presale = xPreSaleCost;
    total_NFTSupply = xtotalNFTSupply;
    limit_mintPublicSale = xMaxMintQuantity;
    limit_mintPresale = xNFTPerAddressLimit;
    list_royaltyAmounts = xRoyalty;
    list_royaltyAddresses = xRoyaltyAddress;
    status_paused = xPaused;
    status_revealed = xRevealed;
    status_presale = xPreSaleEnabled;
  }

  function setURL(
    string memory newBaseURL, 
    string memory newNotRevealedURL,
    string memory newArtURL,
    string memory newHiddenArtURL
    ) public onlyOwner{
    url_revealedJSON = newBaseURL;
    url_hiddenJSON = newNotRevealedURL;
    url_collection = newArtURL;
    url_hiddenImage = newHiddenArtURL;
  }

  function setAirdrop(
    bool xAirdropEnabled, 
    bytes32 xAirdropAddresses,
    bool updateAddress,
    uint256 xAirdropLimit
    ) public onlyOwner{
    status_airdrop = xAirdropEnabled;
    limit_airdropClaims = xAirdropLimit;
    if(updateAddress){
      merkle_airdrop = xAirdropAddresses;
    }
  }

  function setWhitelist(
    address[] memory addresses
  ) public onlyOwner{
    list_whitelistAddresses = addresses;
  }

  function getAirdropClaims(address addr, bool isMinted) public view returns (uint256){
    if(isMinted){
      return map_airdropMintedClaims[addr];
    }
    return map_airdropClaims[addr];
  }

  function getSettings()public view returns(
    uint256, 
    uint256, 
    uint256, 
    uint256, 
    uint256, 
    uint256, 
    uint256[] memory, 
    address[] memory, 
    bool, bool, bool, 
    address[] memory){
    return (
      cost_publicSale,
      cost_presale,
      total_NFTSupply,
      totalSupply(),
      limit_mintPublicSale,
      limit_mintPresale,
      list_royaltyAmounts,
      list_royaltyAddresses,
      status_paused,
      status_revealed,
      status_presale, 
      list_whitelistAddresses
    );
  }

  function getAirdropSettings(address sender) public view returns(
    bool, 
    uint256,
    uint256,
    uint256,
    uint256,
    address[] memory,
    address[] memory){
    return (
      status_airdrop, 
      report_totalAirdropMinted,
      limit_airdropClaims,
      map_airdropClaims[sender], 
      map_airdropMintedClaims[sender],
      list_airdropAddresses,
      list_airdropMintingAddresses
    );
  }

  function getURLs(address addr) public view returns(
    string memory, 
    string memory, 
    string memory, 
    string memory, 
    string memory, 
    string memory){
    return (
      url_revealedJSON, 
      url_hiddenJSON, 
      getCollectionURL(addr), 
      url_hiddenImage, 
      xname, 
      xsymbol
    );
  }

  function getSales() public view returns(
    uint256, 
    uint256, 
    uint256, 
    uint256){
    return(
      report_totalSales, 
      report_totalRoyaltySales, 
      report_totalWithdrawn, 
      address(this).balance
    );
  }

   function getRoyalty(uint256 tokenId) external view returns (uint256) {
        return _royalty;
    }

    function getCreator(uint256 tokenId) external view returns (address) {
        return _creators[tokenId];
    }

    function getCoCreators(uint256 tokenId) external view returns (AddreessWithPercent[] memory) {
        AddreessWithPercent[] memory array;
        return array;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721)
        returns (bool)
    {
        return
            interfaceId == _interfaceId || super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"receiver","type":"address"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isMinted","type":"bool"}],"name":"getAirdropClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"getAirdropSettings","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"address[]","name":"","type":"address[]"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getCoCreators","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct LetsgoNFTBase.AddreessWithPercent[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getCollectionURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSettings","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getURLs","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"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":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mantissa","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"map_airdropClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"map_airdropMintedClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"map_whitelistMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"sendAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"xAirdropEnabled","type":"bool"},{"internalType":"bytes32","name":"xAirdropAddresses","type":"bytes32"},{"internalType":"bool","name":"updateAddress","type":"bool"},{"internalType":"uint256","name":"xAirdropLimit","type":"uint256"}],"name":"setAirdrop","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":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"xPublicSaleCost","type":"uint256"},{"internalType":"uint256","name":"xPreSaleCost","type":"uint256"},{"internalType":"uint256","name":"xtotalNFTSupply","type":"uint256"},{"internalType":"uint256","name":"xMaxMintQuantity","type":"uint256"},{"internalType":"uint256","name":"xNFTPerAddressLimit","type":"uint256"},{"internalType":"uint256[]","name":"xRoyalty","type":"uint256[]"},{"internalType":"address[]","name":"xRoyaltyAddress","type":"address[]"},{"internalType":"bool","name":"xPaused","type":"bool"},{"internalType":"bool","name":"xRevealed","type":"bool"},{"internalType":"bool","name":"xPreSaleEnabled","type":"bool"}],"name":"setSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURL","type":"string"},{"internalType":"string","name":"newNotRevealedURL","type":"string"},{"internalType":"string","name":"newArtURL","type":"string"},{"internalType":"string","name":"newHiddenArtURL","type":"string"}],"name":"setURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status_airdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct LetsgoNFTBase.AddreessWithPercent[]","name":"coCreators","type":"tuple[]"}],"name":"validateCoCreators","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"xname","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xsymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

61271060075560c0604052600c60808190526b04d634e696674795472756d760a41b60a0908152620000359160099190620002f7565b50604080518082019091526005808252641350d3919560da1b60209092019182526200006491600a91620002f7565b506023805463ffffffff191663ce77acc31790556101f46024553480156200008b57600080fd5b50600980546200009b906200039d565b80601f0160208091040260200160405190810160405280929190818152602001828054620000c9906200039d565b80156200011a5780601f10620000ee576101008083540402835291602001916200011a565b820191906000526020600020905b815481529060010190602001808311620000fc57829003601f168201915b5050505050600a80546200012e906200039d565b80601f01602080910402602001604051908101604052809291908181526020018280546200015c906200039d565b8015620001ad5780601f106200018157610100808354040283529160200191620001ad565b820191906000526020600020905b8154815290600101906020018083116200018f57829003601f168201915b50508451620001c7935060009250602086019150620002f7565b508051620001dd906001906020840190620002f7565b505050620001fa620001f4620002a160201b60201c565b620002a5565b6010805463ffff00ff191663010100011790556040805160608101909152603680825262003e1c602083013980516200023c91600b91602090910190620002f7565b5060405180608001604052806051815260200162003e526051913980516200026d91600d91602090910190620002f7565b5067016345785d8a0000601855670214e8348c4f0000601955601460158190556016556064601755612710601a55620003da565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000305906200039d565b90600052602060002090601f01602090048101928262000329576000855562000374565b82601f106200034457805160ff191683800117855562000374565b8280016001018555821562000374579182015b828111156200037457825182559160200191906001019062000357565b506200038292915062000386565b5090565b5b8082111562000382576000815560010162000387565b600181811c90821680620003b257607f821691505b60208210811415620003d457634e487b7160e01b600052602260045260246000fd5b50919050565b613a3280620003ea6000396000f3fe6080604052600436106102ae5760003560e01c80638556093e11610175578063beab1f1d116100dc578063e27d466311610095578063ea29e9381161006f578063ea29e938146108d7578063f2fde38b14610904578063f421764814610924578063f4c4dcd21461094457600080fd5b8063e27d46631461084e578063e6166f901461086e578063e985e9c51461088e57600080fd5b8063beab1f1d14610770578063c87b56dd14610785578063d0d9dc7d146107a5578063d48e638a146107c6578063df3c410f146107fc578063e23ab55b1461081c57600080fd5b8063981a033b1161012e578063981a033b146106c35780639ffdaa61146106e3578063a0712d68146106fd578063a22cb46514610710578063a3f0939b14610730578063b88d4fde1461075057600080fd5b80638556093e1461060257806385b4bb53146106225780638da5cb5b1461064f5780638f32d59b1461066d57806395d89b411461068257806396a3c7a61461069757600080fd5b8063438b6300116102195780635e8b5ff9116101d25780635e8b5ff9146105415780636352211e1461056e578063657d95011461058e57806370a08231146105ae57806370b54f1b146105ce578063715018a6146105ed57600080fd5b8063438b6300146104685780634beb2219146104955780635092e130146104c857806350e0ab6b146104f657806353223ab01461050b5780635c8177a21461052b57600080fd5b806316c38b3c1161026b57806316c38b3c146103bb57806318160ddd146103db5780631af9cf49146103fe57806323b872dd146104205780633ccfd60b1461044057806342842e0e1461044857600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063081812fc1461030a57806308af86f814610342578063095ea7b3146103645780630d83304c14610384575b600080fd5b3480156102bf57600080fd5b506102d36102ce36600461328b565b610964565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd610992565b6040516102df919061361f565b34801561031657600080fd5b5061032a610325366004613365565b610a24565b6040516001600160a01b0390911681526020016102df565b34801561034e57600080fd5b5061036261035d366004613247565b610abe565b005b34801561037057600080fd5b5061036261037f366004613055565b610b16565b34801561039057600080fd5b50601354601254601154476040805194855260208501939093529183015260608201526080016102df565b3480156103c757600080fd5b506103626103d636600461322c565b610c2c565b3480156103e757600080fd5b506103f0610c70565b6040519081526020016102df565b34801561040a57600080fd5b506103f0610419366004613365565b5060245490565b34801561042c57600080fd5b5061036261043b366004612f74565b610c80565b610362610cb1565b34801561045457600080fd5b50610362610463366004612f74565b610e47565b34801561047457600080fd5b50610488610483366004612f26565b610e62565b6040516102df91906135b9565b3480156104a157600080fd5b506104b56104b0366004612f26565b610f42565b6040516102df97969594939291906135cc565b3480156104d457600080fd5b506104e96104e3366004613365565b50606090565b6040516102df9190613561565b34801561050257600080fd5b506102fd61105f565b34801561051757600080fd5b506103626105263660046130b3565b6110ed565b34801561053757600080fd5b506103f060075481565b34801561054d57600080fd5b506103f061055c366004612f26565b60216020526000908152604090205481565b34801561057a57600080fd5b5061032a610589366004613365565b611304565b34801561059a57600080fd5b506103626105a936600461307f565b61137b565b3480156105ba57600080fd5b506103f06105c9366004612f26565b611518565b3480156105da57600080fd5b506010546102d390610100900460ff1681565b3480156105f957600080fd5b5061036261159f565b34801561060e57600080fd5b5061036261061d36600461337e565b6115d5565b34801561062e57600080fd5b5061063761167f565b6040516102df9c9b9a9998979695949392919061378c565b34801561065b57600080fd5b506006546001600160a01b031661032a565b34801561067957600080fd5b506102d36117fb565b34801561068e57600080fd5b506102fd611828565b3480156106a357600080fd5b506103f06106b2366004612f26565b602080526000908152604090205481565b3480156106cf57600080fd5b506103626106de3660046132c5565b611837565b3480156106ef57600080fd5b506010546102d39060ff1681565b61036261070b366004613365565b6118b0565b34801561071c57600080fd5b5061036261072b36600461302b565b611a2a565b34801561073c57600080fd5b5061036261074b366004613127565b611a35565b34801561075c57600080fd5b5061036261076b366004612fb0565b611cc0565b34801561077c57600080fd5b506102fd611cf2565b34801561079157600080fd5b506102fd6107a0366004613365565b611cff565b3480156107b157600080fd5b506010546102d3906301000000900460ff1681565b3480156107d257600080fd5b5061032a6107e1366004613365565b6000908152602560205260409020546001600160a01b031690565b34801561080857600080fd5b506103626108173660046131e8565b611e76565b34801561082857600080fd5b5061083c610837366004612f26565b611f1f565b6040516102df96959493929190613632565b34801561085a57600080fd5b506103f061086936600461302b565b61220c565b34801561087a57600080fd5b506010546102d39062010000900460ff1681565b34801561089a57600080fd5b506102d36108a9366004612f41565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108e357600080fd5b506103f06108f2366004612f26565b60226020526000908152604090205481565b34801561091057600080fd5b5061036261091f366004612f26565b612250565b34801561093057600080fd5b5061036261093f36600461307f565b6122eb565b34801561095057600080fd5b506102fd61095f366004612f26565b612328565b60235460009060e01b6001600160e01b0319908116908316148061098c575061098c8261237c565b92915050565b6060600080546109a190613924565b80601f01602080910402602001604051908101604052809291908181526020018280546109cd90613924565b8015610a1a5780601f106109ef57610100808354040283529160200191610a1a565b820191906000526020600020905b8154815290600101906020018083116109fd57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610aa25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b03163314610ae85760405162461bcd60e51b8152600401610a9990613706565b6010805463ff000000191663010000008615150217905560178190558115610b1057600f8390555b50505050565b6000610b2182611304565b9050806001600160a01b0316836001600160a01b03161415610b8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a99565b336001600160a01b0382161480610bab5750610bab81336108a9565b610c1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a99565b610c2783836123cc565b505050565b6006546001600160a01b03163314610c565760405162461bcd60e51b8152600401610a9990613706565b601080549115156101000261ff0019909216919091179055565b6000610c7b60085490565b905090565b610c8a338261243a565b610ca65760405162461bcd60e51b8152600401610a999061373b565b610c27838383612531565b6006546001600160a01b03163314610cdb5760405162461bcd60e51b8152600401610a9990613706565b60008047805b601b5483108015610cf25750600081115b15610dc9576064601b8481548110610d0c57610d0c6139ba565b906000526020600020015483610d2291906138c2565b610d2c91906138ae565b9350610d3884826138e1565b90506000601c8481548110610d4f57610d4f6139ba565b60009182526020822001546040516001600160a01b039091169187919081818185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610db657600080fd5b610dc1600185613896565b935050610ce1565b8015610b10576000610de36006546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e2d576040519150601f19603f3d011682016040523d82523d6000602084013e610e32565b606091505b5050905080610e4057600080fd5b5050505050565b610c2783838360405180602001604052806000815250611cc0565b60606000610e6f83611518565b90506000816001600160401b03811115610e8b57610e8b6139d0565b604051908082528060200260200182016040528015610eb4578160200160208202803683370190505b509050600160005b8381108015610ecd5750601a548211155b15610f38576000610edd83611304565b9050866001600160a01b0316816001600160a01b03161415610f255782848381518110610f0c57610f0c6139ba565b6020908102919091010152610f22600183613896565b91505b610f30600184613896565b925050610ebc565b5090949350505050565b6010546014546017546001600160a01b0384166000908152602160209081526040808320546022835281842054601d8054845181870281018701909552808552959889988998899889986060988998630100000090960460ff169794969395949392601e92849190830182828015610fe357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc5575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561103f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611021575b505050505090509650965096509650965096509650919395979092949650565b6009805461106c90613924565b80601f016020809104026020016040519081016040528092919081815260200182805461109890613924565b80156110e55780601f106110ba576101008083540402835291602001916110e5565b820191906000526020600020905b8154815290600101906020018083116110c857829003601f168201915b505050505081565b6010546301000000900460ff1661113f5760405162461bcd60e51b8152602060048201526016602482015275105a5c991c9bdc081a5cc81b9bdd08195b98589b195960521b6044820152606401610a99565b601754601454106111925760405162461bcd60e51b815260206004820152601b60248201527f4e6f206d6f726520617661696c61626c652061697264726f70732e00000000006044820152606401610a99565b3360009081526022602052604090205480156111f05760405162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d65640000000000000000006044820152606401610a99565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061126a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f5491508490506126d1565b6112a65760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610a99565b3360009081526022602052604081208054600192906112c6908490613896565b90915550506008805460010190556112e6336112e160085490565b6126e7565b6001601460008282546112f99190613896565b909155505050505050565b6000818152600260205260408120546001600160a01b03168061098c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a99565b6006546001600160a01b031633146113a55760405162461bcd60e51b8152600401610a9990613706565b6010546301000000900460ff166113f75760405162461bcd60e51b8152602060048201526016602482015275105a5c991c9bdc081a5cc81b9bdd08195b98589b195960521b6044820152606401610a99565b601a5481516008546114099190613896565b1061146d5760405162461bcd60e51b815260206004820152602e60248201527f41697264726f702061646472657373657320657863656564732074686520746f60448201526d74616c204e465420737570706c7960901b6064820152608401610a99565b60005b815181101561151457611487600880546001019055565b6114ad82828151811061149c5761149c6139ba565b60200260200101516112e160085490565b6001602160008484815181106114c5576114c56139ba565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546114fc9190613896565b9091555061150d9050600182613896565b9050611470565b5050565b60006001600160a01b0382166115835760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a99565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115c95760405162461bcd60e51b8152600401610a9990613706565b6115d36000612701565b565b6006546001600160a01b031633146115ff5760405162461bcd60e51b8152600401610a9990613706565b60198a90556018899055601a88905560168790556015869055845161162b90601b906020880190612c82565b50835161163f90601c906020870190612ccd565b506010805461ffff19166101009415159490940260ff1916939093179115159190911762ff00001916620100009115159190910217905550505050505050565b60008060008060008060608060008060006060601954601854601a546116a3610c70565b601654601554601054601b8054604080516020808402820181019092528281529293601c9360ff6101008304811694818416946201000090940490911692601f9291889183018282801561171657602002820191906000526020600020905b815481526020019060010190808311611702575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561177257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611754575b50505050509450808054806020026020016040519081016040528092919081815260200182805480156117ce57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117b0575b505050505090509b509b509b509b509b509b509b509b509b509b509b509b50909192939495969798999a9b565b600061180f6006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b6060600180546109a190613924565b6006546001600160a01b031633146118615760405162461bcd60e51b8152600401610a9990613706565b835161187490600b906020870190612d22565b50825161188890600c906020860190612d22565b50815161189c90600d906020850190612d22565b508051610e4090600e906020840190612d22565b601054610100900460ff16156118fc5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610a99565b601a548161190960085490565b6119139190613896565b11156119615760405162461bcd60e51b815260206004820181905260248201527f4d696e74207175616e746974792065786365656473206d617820737570706c796044820152606401610a99565b6119696117fb565b6119b75761197681612753565b3410156119b75760405162461bcd60e51b815260206004820152600f60248201526e436f737420697320746f6f206c6f7760881b6044820152606401610a99565b60015b818111611514576119cf600880546001019055565b6119dc336112e160085490565b33602560006119ea60085490565b8152602081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055611a23600182613896565b90506119ba565b61151433838361277e565b600a81511115611ab95760405162461bcd60e51b815260206004820152604360248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7273206c60448201527f656e6774682073686f756c64206265206c657373206f7220657175616c20746f60648201526202031360ec1b608482015260a401610a99565b6000805b8251811015611c3c5760006001600160a01b0316838281518110611ae357611ae36139ba565b6020026020010151600001516001600160a01b03161415611b6c5760405162461bcd60e51b815260206004820152603c60248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7220616460448201527f647265737320616464726573732063616e277420626520656d707479000000006064820152608401610a99565b6000838281518110611b8057611b806139ba565b60200260200101516020015111611bff5760405162461bcd60e51b815260206004820152603960248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7220766160448201527f6c7565206d75737420626520686967686572207468616e2030000000000000006064820152608401610a99565b828181518110611c1157611c116139ba565b60200260200101516020015182611c289190613896565b915080611c348161395f565b915050611abd565b506007548111156115145760405162461bcd60e51b815260206004820152604260248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7273207360448201527f756d2073686f756c64206265206c657373206f7220657175616c20746f203130606482015261302560f01b608482015260a401610a99565b611cca338361243a565b611ce65760405162461bcd60e51b8152600401610a999061373b565b610b108484848461284d565b600a805461106c90613924565b6000818152600260205260409020546060906001600160a01b0316611d7e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a99565b60105460ff16611e1a57600c8054611d9590613924565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc190613924565b8015611e0e5780601f10611de357610100808354040283529160200191611e0e565b820191906000526020600020905b815481529060010190602001808311611df157829003601f168201915b50505050509050919050565b6000611e24612880565b90506000815111611e445760405180602001604052806000815250611e6f565b80611e4e8461288f565b604051602001611e5f9291906134e5565b6040516020818303038152906040525b9392505050565b6000611e8133610e62565b90506000805b8451821015610e40575060005b8251811015611f0d57828181518110611eaf57611eaf6139ba565b6020026020010151858381518110611ec957611ec96139ba565b60200260200101511415611efb57611efb3385858481518110611eee57611eee6139ba565b6020026020010151612531565b611f06600182613896565b9050611e94565b611f18600183613896565b9150611e87565b606080606080606080600b600c611f3589612328565b600e6009600a858054611f4790613924565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7390613924565b8015611fc05780601f10611f9557610100808354040283529160200191611fc0565b820191906000526020600020905b815481529060010190602001808311611fa357829003601f168201915b50505050509550848054611fd390613924565b80601f0160208091040260200160405190810160405280929190818152602001828054611fff90613924565b801561204c5780601f106120215761010080835404028352916020019161204c565b820191906000526020600020905b81548152906001019060200180831161202f57829003601f168201915b5050505050945082805461205f90613924565b80601f016020809104026020016040519081016040528092919081815260200182805461208b90613924565b80156120d85780601f106120ad576101008083540402835291602001916120d8565b820191906000526020600020905b8154815290600101906020018083116120bb57829003601f168201915b505050505092508180546120eb90613924565b80601f016020809104026020016040519081016040528092919081815260200182805461211790613924565b80156121645780601f1061213957610100808354040283529160200191612164565b820191906000526020600020905b81548152906001019060200180831161214757829003601f168201915b5050505050915080805461217790613924565b80601f01602080910402602001604051908101604052809291908181526020018280546121a390613924565b80156121f05780601f106121c5576101008083540402835291602001916121f0565b820191906000526020600020905b8154815290600101906020018083116121d357829003601f168201915b5050505050905095509550955095509550955091939550919395565b6000811561223357506001600160a01b03821660009081526022602052604090205461098c565b50506001600160a01b031660009081526021602052604090205490565b6006546001600160a01b0316331461227a5760405162461bcd60e51b8152600401610a9990613706565b6001600160a01b0381166122df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a99565b6122e881612701565b50565b6006546001600160a01b031633146123155760405162461bcd60e51b8152600401610a9990613706565b805161151490601f906020840190612ccd565b606061233c6006546001600160a01b031690565b6001600160a01b0316826001600160a01b0316148061235d575060105460ff165b1561236f57600d8054611d9590613924565b600e8054611d9590613924565b60006001600160e01b031982166380ac58cd60e01b14806123ad57506001600160e01b03198216635b5e139f60e01b145b8061098c57506301ffc9a760e01b6001600160e01b031983161461098c565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061240182611304565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124b35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a99565b60006124be83611304565b9050806001600160a01b0316846001600160a01b031614806124f95750836001600160a01b03166124ee84610a24565b6001600160a01b0316145b8061252957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661254482611304565b6001600160a01b0316146125ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a99565b6001600160a01b03821661260e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a99565b6126196000826123cc565b6001600160a01b03831660009081526003602052604081208054600192906126429084906138e1565b90915550506001600160a01b0382166000908152600360205260408120805460019290612670908490613896565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826126de858461298c565b14949350505050565b611514828260405180602001604052806000815250612a00565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601054600090829062010000900460ff1661277057601954612774565b6018545b61098c91906138c2565b816001600160a01b0316836001600160a01b031614156127e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a99565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612858848484612531565b61286484848484612a33565b610b105760405162461bcd60e51b8152600401610a99906136b4565b6060600b80546109a190613924565b6060816128b35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128dd57806128c78161395f565b91506128d69050600a836138ae565b91506128b7565b6000816001600160401b038111156128f7576128f76139d0565b6040519080825280601f01601f191660200182016040528015612921576020820181803683370190505b5090505b8415612529576129366001836138e1565b9150612943600a8661397a565b61294e906030613896565b60f81b818381518110612963576129636139ba565b60200101906001600160f81b031916908160001a905350612985600a866138ae565b9450612925565b600081815b84518110156129f85760008582815181106129ae576129ae6139ba565b602002602001015190508083116129d457600083815260208290526040902092506129e5565b600081815260208490526040902092505b50806129f08161395f565b915050612991565b509392505050565b612a0a8383612b40565b612a176000848484612a33565b610c275760405162461bcd60e51b8152600401610a99906136b4565b60006001600160a01b0384163b15612b3557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a77903390899088908890600401613524565b602060405180830381600087803b158015612a9157600080fd5b505af1925050508015612ac1575060408051601f3d908101601f19168201909252612abe918101906132a8565b60015b612b1b573d808015612aef576040519150601f19603f3d011682016040523d82523d6000602084013e612af4565b606091505b508051612b135760405162461bcd60e51b8152600401610a99906136b4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612529565b506001949350505050565b6001600160a01b038216612b965760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a99565b6000818152600260205260409020546001600160a01b031615612bfb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a99565b6001600160a01b0382166000908152600360205260408120805460019290612c24908490613896565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054828255906000526020600020908101928215612cbd579160200282015b82811115612cbd578251825591602001919060010190612ca2565b50612cc9929150612d95565b5090565b828054828255906000526020600020908101928215612cbd579160200282015b82811115612cbd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612ced565b828054612d2e90613924565b90600052602060002090601f016020900481019282612d505760008555612cbd565b82601f10612d6957805160ff1916838001178555612cbd565b82800160010185558215612cbd5791820182811115612cbd578251825591602001919060010190612ca2565b5b80821115612cc95760008155600101612d96565b60006001600160401b03831115612dc357612dc36139d0565b612dd6601f8401601f1916602001613843565b9050828152838383011115612dea57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612e1857600080fd5b919050565b600082601f830112612e2e57600080fd5b81356020612e43612e3e83613873565b613843565b80838252828201915082860187848660051b8901011115612e6357600080fd5b60005b85811015612e8957612e7782612e01565b84529284019290840190600101612e66565b5090979650505050505050565b600082601f830112612ea757600080fd5b81356020612eb7612e3e83613873565b80838252828201915082860187848660051b8901011115612ed757600080fd5b60005b85811015612e8957813584529284019290840190600101612eda565b80358015158114612e1857600080fd5b600082601f830112612f1757600080fd5b611e6f83833560208501612daa565b600060208284031215612f3857600080fd5b611e6f82612e01565b60008060408385031215612f5457600080fd5b612f5d83612e01565b9150612f6b60208401612e01565b90509250929050565b600080600060608486031215612f8957600080fd5b612f9284612e01565b9250612fa060208501612e01565b9150604084013590509250925092565b60008060008060808587031215612fc657600080fd5b612fcf85612e01565b9350612fdd60208601612e01565b92506040850135915060608501356001600160401b03811115612fff57600080fd5b8501601f8101871361301057600080fd5b61301f87823560208401612daa565b91505092959194509250565b6000806040838503121561303e57600080fd5b61304783612e01565b9150612f6b60208401612ef6565b6000806040838503121561306857600080fd5b61307183612e01565b946020939093013593505050565b60006020828403121561309157600080fd5b81356001600160401b038111156130a757600080fd5b61252984828501612e1d565b600080602083850312156130c657600080fd5b82356001600160401b03808211156130dd57600080fd5b818501915085601f8301126130f157600080fd5b81358181111561310057600080fd5b8660208260051b850101111561311557600080fd5b60209290920196919550909350505050565b6000602080838503121561313a57600080fd5b82356001600160401b0381111561315057600080fd5b8301601f8101851361316157600080fd5b803561316f612e3e82613873565b80828252848201915084840188868560061b870101111561318f57600080fd5b60009450845b848110156131da57604080838c0312156131ad578687fd5b6131b561381b565b6131be84612e01565b8152838901358982015285529387019390910190600101613195565b509098975050505050505050565b600080604083850312156131fb57600080fd5b82356001600160401b0381111561321157600080fd5b61321d85828601612e96565b925050612f6b60208401612e01565b60006020828403121561323e57600080fd5b611e6f82612ef6565b6000806000806080858703121561325d57600080fd5b61326685612ef6565b93506020850135925061327b60408601612ef6565b9396929550929360600135925050565b60006020828403121561329d57600080fd5b8135611e6f816139e6565b6000602082840312156132ba57600080fd5b8151611e6f816139e6565b600080600080608085870312156132db57600080fd5b84356001600160401b03808211156132f257600080fd5b6132fe88838901612f06565b9550602087013591508082111561331457600080fd5b61332088838901612f06565b9450604087013591508082111561333657600080fd5b61334288838901612f06565b9350606087013591508082111561335857600080fd5b5061301f87828801612f06565b60006020828403121561337757600080fd5b5035919050565b6000806000806000806000806000806101408b8d03121561339e57600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b01356001600160401b03808211156133d857600080fd5b6133e48e838f01612e96565b965060c08d01359150808211156133fa57600080fd5b506134078d828e01612e1d565b94505061341660e08c01612ef6565b92506134256101008c01612ef6565b91506134346101208c01612ef6565b90509295989b9194979a5092959850565b600081518084526020808501945080840160005b8381101561347e5781516001600160a01b031687529582019590820190600101613459565b509495945050505050565b600081518084526020808501945080840160005b8381101561347e5781518752958201959082019060010161349d565b600081518084526134d18160208601602086016138f8565b601f01601f19169290920160200192915050565b600083516134f78184602088016138f8565b83519083019061350b8183602088016138f8565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613557908301846134b9565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156135ac57815180516001600160a01b0316855286015186850152928401929085019060010161357e565b5091979650505050505050565b602081526000611e6f6020830184613489565b871515815286602082015285604082015284606082015283608082015260e060a082015260006135ff60e0830185613445565b82810360c08401526136118185613445565b9a9950505050505050505050565b602081526000611e6f60208301846134b9565b60c08152600061364560c08301896134b9565b828103602084015261365781896134b9565b9050828103604084015261366b81886134b9565b9050828103606084015261367f81876134b9565b9050828103608084015261369381866134b9565b905082810360a08401526136a781856134b9565b9998505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006101808e83528d60208401528c60408401528b60608401528a60808401528960a08401528060c08401526137c48184018a613489565b905082810360e08401526137d88189613445565b90508615156101008401528515156101208401528415156101408401528281036101608401526138088185613445565b9f9e505050505050505050505050505050565b604080519081016001600160401b038111828210171561383d5761383d6139d0565b60405290565b604051601f8201601f191681016001600160401b038111828210171561386b5761386b6139d0565b604052919050565b60006001600160401b0382111561388c5761388c6139d0565b5060051b60200190565b600082198211156138a9576138a961398e565b500190565b6000826138bd576138bd6139a4565b500490565b60008160001904831182151516156138dc576138dc61398e565b500290565b6000828210156138f3576138f361398e565b500390565b60005b838110156139135781810151838201526020016138fb565b83811115610b105750506000910152565b600181811c9082168061393857607f821691505b6020821081141561395957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139735761397361398e565b5060010190565b600082613989576139896139a4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146122e857600080fdfea2646970667358221220ead30f07fe457292e66d4b5f3bf2a080867d553efda4f2f389cee3abf5d94a9a64736f6c63430008070033697066733a2f2f516d6345317a58445835444444667871667a3542765a6543774e573950424145796a3178534858513456586677592f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d57684841714e46566474674861674c484b424c574e646d317556536857646f746b51413153546347506b44652f

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80638556093e11610175578063beab1f1d116100dc578063e27d466311610095578063ea29e9381161006f578063ea29e938146108d7578063f2fde38b14610904578063f421764814610924578063f4c4dcd21461094457600080fd5b8063e27d46631461084e578063e6166f901461086e578063e985e9c51461088e57600080fd5b8063beab1f1d14610770578063c87b56dd14610785578063d0d9dc7d146107a5578063d48e638a146107c6578063df3c410f146107fc578063e23ab55b1461081c57600080fd5b8063981a033b1161012e578063981a033b146106c35780639ffdaa61146106e3578063a0712d68146106fd578063a22cb46514610710578063a3f0939b14610730578063b88d4fde1461075057600080fd5b80638556093e1461060257806385b4bb53146106225780638da5cb5b1461064f5780638f32d59b1461066d57806395d89b411461068257806396a3c7a61461069757600080fd5b8063438b6300116102195780635e8b5ff9116101d25780635e8b5ff9146105415780636352211e1461056e578063657d95011461058e57806370a08231146105ae57806370b54f1b146105ce578063715018a6146105ed57600080fd5b8063438b6300146104685780634beb2219146104955780635092e130146104c857806350e0ab6b146104f657806353223ab01461050b5780635c8177a21461052b57600080fd5b806316c38b3c1161026b57806316c38b3c146103bb57806318160ddd146103db5780631af9cf49146103fe57806323b872dd146104205780633ccfd60b1461044057806342842e0e1461044857600080fd5b806301ffc9a7146102b357806306fdde03146102e8578063081812fc1461030a57806308af86f814610342578063095ea7b3146103645780630d83304c14610384575b600080fd5b3480156102bf57600080fd5b506102d36102ce36600461328b565b610964565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fd610992565b6040516102df919061361f565b34801561031657600080fd5b5061032a610325366004613365565b610a24565b6040516001600160a01b0390911681526020016102df565b34801561034e57600080fd5b5061036261035d366004613247565b610abe565b005b34801561037057600080fd5b5061036261037f366004613055565b610b16565b34801561039057600080fd5b50601354601254601154476040805194855260208501939093529183015260608201526080016102df565b3480156103c757600080fd5b506103626103d636600461322c565b610c2c565b3480156103e757600080fd5b506103f0610c70565b6040519081526020016102df565b34801561040a57600080fd5b506103f0610419366004613365565b5060245490565b34801561042c57600080fd5b5061036261043b366004612f74565b610c80565b610362610cb1565b34801561045457600080fd5b50610362610463366004612f74565b610e47565b34801561047457600080fd5b50610488610483366004612f26565b610e62565b6040516102df91906135b9565b3480156104a157600080fd5b506104b56104b0366004612f26565b610f42565b6040516102df97969594939291906135cc565b3480156104d457600080fd5b506104e96104e3366004613365565b50606090565b6040516102df9190613561565b34801561050257600080fd5b506102fd61105f565b34801561051757600080fd5b506103626105263660046130b3565b6110ed565b34801561053757600080fd5b506103f060075481565b34801561054d57600080fd5b506103f061055c366004612f26565b60216020526000908152604090205481565b34801561057a57600080fd5b5061032a610589366004613365565b611304565b34801561059a57600080fd5b506103626105a936600461307f565b61137b565b3480156105ba57600080fd5b506103f06105c9366004612f26565b611518565b3480156105da57600080fd5b506010546102d390610100900460ff1681565b3480156105f957600080fd5b5061036261159f565b34801561060e57600080fd5b5061036261061d36600461337e565b6115d5565b34801561062e57600080fd5b5061063761167f565b6040516102df9c9b9a9998979695949392919061378c565b34801561065b57600080fd5b506006546001600160a01b031661032a565b34801561067957600080fd5b506102d36117fb565b34801561068e57600080fd5b506102fd611828565b3480156106a357600080fd5b506103f06106b2366004612f26565b602080526000908152604090205481565b3480156106cf57600080fd5b506103626106de3660046132c5565b611837565b3480156106ef57600080fd5b506010546102d39060ff1681565b61036261070b366004613365565b6118b0565b34801561071c57600080fd5b5061036261072b36600461302b565b611a2a565b34801561073c57600080fd5b5061036261074b366004613127565b611a35565b34801561075c57600080fd5b5061036261076b366004612fb0565b611cc0565b34801561077c57600080fd5b506102fd611cf2565b34801561079157600080fd5b506102fd6107a0366004613365565b611cff565b3480156107b157600080fd5b506010546102d3906301000000900460ff1681565b3480156107d257600080fd5b5061032a6107e1366004613365565b6000908152602560205260409020546001600160a01b031690565b34801561080857600080fd5b506103626108173660046131e8565b611e76565b34801561082857600080fd5b5061083c610837366004612f26565b611f1f565b6040516102df96959493929190613632565b34801561085a57600080fd5b506103f061086936600461302b565b61220c565b34801561087a57600080fd5b506010546102d39062010000900460ff1681565b34801561089a57600080fd5b506102d36108a9366004612f41565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108e357600080fd5b506103f06108f2366004612f26565b60226020526000908152604090205481565b34801561091057600080fd5b5061036261091f366004612f26565b612250565b34801561093057600080fd5b5061036261093f36600461307f565b6122eb565b34801561095057600080fd5b506102fd61095f366004612f26565b612328565b60235460009060e01b6001600160e01b0319908116908316148061098c575061098c8261237c565b92915050565b6060600080546109a190613924565b80601f01602080910402602001604051908101604052809291908181526020018280546109cd90613924565b8015610a1a5780601f106109ef57610100808354040283529160200191610a1a565b820191906000526020600020905b8154815290600101906020018083116109fd57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610aa25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b03163314610ae85760405162461bcd60e51b8152600401610a9990613706565b6010805463ff000000191663010000008615150217905560178190558115610b1057600f8390555b50505050565b6000610b2182611304565b9050806001600160a01b0316836001600160a01b03161415610b8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a99565b336001600160a01b0382161480610bab5750610bab81336108a9565b610c1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a99565b610c2783836123cc565b505050565b6006546001600160a01b03163314610c565760405162461bcd60e51b8152600401610a9990613706565b601080549115156101000261ff0019909216919091179055565b6000610c7b60085490565b905090565b610c8a338261243a565b610ca65760405162461bcd60e51b8152600401610a999061373b565b610c27838383612531565b6006546001600160a01b03163314610cdb5760405162461bcd60e51b8152600401610a9990613706565b60008047805b601b5483108015610cf25750600081115b15610dc9576064601b8481548110610d0c57610d0c6139ba565b906000526020600020015483610d2291906138c2565b610d2c91906138ae565b9350610d3884826138e1565b90506000601c8481548110610d4f57610d4f6139ba565b60009182526020822001546040516001600160a01b039091169187919081818185875af1925050503d8060008114610da3576040519150601f19603f3d011682016040523d82523d6000602084013e610da8565b606091505b5050905080610db657600080fd5b610dc1600185613896565b935050610ce1565b8015610b10576000610de36006546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e2d576040519150601f19603f3d011682016040523d82523d6000602084013e610e32565b606091505b5050905080610e4057600080fd5b5050505050565b610c2783838360405180602001604052806000815250611cc0565b60606000610e6f83611518565b90506000816001600160401b03811115610e8b57610e8b6139d0565b604051908082528060200260200182016040528015610eb4578160200160208202803683370190505b509050600160005b8381108015610ecd5750601a548211155b15610f38576000610edd83611304565b9050866001600160a01b0316816001600160a01b03161415610f255782848381518110610f0c57610f0c6139ba565b6020908102919091010152610f22600183613896565b91505b610f30600184613896565b925050610ebc565b5090949350505050565b6010546014546017546001600160a01b0384166000908152602160209081526040808320546022835281842054601d8054845181870281018701909552808552959889988998899889986060988998630100000090960460ff169794969395949392601e92849190830182828015610fe357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc5575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561103f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611021575b505050505090509650965096509650965096509650919395979092949650565b6009805461106c90613924565b80601f016020809104026020016040519081016040528092919081815260200182805461109890613924565b80156110e55780601f106110ba576101008083540402835291602001916110e5565b820191906000526020600020905b8154815290600101906020018083116110c857829003601f168201915b505050505081565b6010546301000000900460ff1661113f5760405162461bcd60e51b8152602060048201526016602482015275105a5c991c9bdc081a5cc81b9bdd08195b98589b195960521b6044820152606401610a99565b601754601454106111925760405162461bcd60e51b815260206004820152601b60248201527f4e6f206d6f726520617661696c61626c652061697264726f70732e00000000006044820152606401610a99565b3360009081526022602052604090205480156111f05760405162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d65640000000000000000006044820152606401610a99565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061126a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f5491508490506126d1565b6112a65760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610a99565b3360009081526022602052604081208054600192906112c6908490613896565b90915550506008805460010190556112e6336112e160085490565b6126e7565b6001601460008282546112f99190613896565b909155505050505050565b6000818152600260205260408120546001600160a01b03168061098c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a99565b6006546001600160a01b031633146113a55760405162461bcd60e51b8152600401610a9990613706565b6010546301000000900460ff166113f75760405162461bcd60e51b8152602060048201526016602482015275105a5c991c9bdc081a5cc81b9bdd08195b98589b195960521b6044820152606401610a99565b601a5481516008546114099190613896565b1061146d5760405162461bcd60e51b815260206004820152602e60248201527f41697264726f702061646472657373657320657863656564732074686520746f60448201526d74616c204e465420737570706c7960901b6064820152608401610a99565b60005b815181101561151457611487600880546001019055565b6114ad82828151811061149c5761149c6139ba565b60200260200101516112e160085490565b6001602160008484815181106114c5576114c56139ba565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546114fc9190613896565b9091555061150d9050600182613896565b9050611470565b5050565b60006001600160a01b0382166115835760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a99565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115c95760405162461bcd60e51b8152600401610a9990613706565b6115d36000612701565b565b6006546001600160a01b031633146115ff5760405162461bcd60e51b8152600401610a9990613706565b60198a90556018899055601a88905560168790556015869055845161162b90601b906020880190612c82565b50835161163f90601c906020870190612ccd565b506010805461ffff19166101009415159490940260ff1916939093179115159190911762ff00001916620100009115159190910217905550505050505050565b60008060008060008060608060008060006060601954601854601a546116a3610c70565b601654601554601054601b8054604080516020808402820181019092528281529293601c9360ff6101008304811694818416946201000090940490911692601f9291889183018282801561171657602002820191906000526020600020905b815481526020019060010190808311611702575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561177257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611754575b50505050509450808054806020026020016040519081016040528092919081815260200182805480156117ce57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116117b0575b505050505090509b509b509b509b509b509b509b509b509b509b509b509b50909192939495969798999a9b565b600061180f6006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b6060600180546109a190613924565b6006546001600160a01b031633146118615760405162461bcd60e51b8152600401610a9990613706565b835161187490600b906020870190612d22565b50825161188890600c906020860190612d22565b50815161189c90600d906020850190612d22565b508051610e4090600e906020840190612d22565b601054610100900460ff16156118fc5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610a99565b601a548161190960085490565b6119139190613896565b11156119615760405162461bcd60e51b815260206004820181905260248201527f4d696e74207175616e746974792065786365656473206d617820737570706c796044820152606401610a99565b6119696117fb565b6119b75761197681612753565b3410156119b75760405162461bcd60e51b815260206004820152600f60248201526e436f737420697320746f6f206c6f7760881b6044820152606401610a99565b60015b818111611514576119cf600880546001019055565b6119dc336112e160085490565b33602560006119ea60085490565b8152602081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055611a23600182613896565b90506119ba565b61151433838361277e565b600a81511115611ab95760405162461bcd60e51b815260206004820152604360248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7273206c60448201527f656e6774682073686f756c64206265206c657373206f7220657175616c20746f60648201526202031360ec1b608482015260a401610a99565b6000805b8251811015611c3c5760006001600160a01b0316838281518110611ae357611ae36139ba565b6020026020010151600001516001600160a01b03161415611b6c5760405162461bcd60e51b815260206004820152603c60248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7220616460448201527f647265737320616464726573732063616e277420626520656d707479000000006064820152608401610a99565b6000838281518110611b8057611b806139ba565b60200260200101516020015111611bff5760405162461bcd60e51b815260206004820152603960248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7220766160448201527f6c7565206d75737420626520686967686572207468616e2030000000000000006064820152608401610a99565b828181518110611c1157611c116139ba565b60200260200101516020015182611c289190613896565b915080611c348161395f565b915050611abd565b506007548111156115145760405162461bcd60e51b815260206004820152604260248201527f76616c6964617465436f43726561746f72733a20636f43726561746f7273207360448201527f756d2073686f756c64206265206c657373206f7220657175616c20746f203130606482015261302560f01b608482015260a401610a99565b611cca338361243a565b611ce65760405162461bcd60e51b8152600401610a999061373b565b610b108484848461284d565b600a805461106c90613924565b6000818152600260205260409020546060906001600160a01b0316611d7e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a99565b60105460ff16611e1a57600c8054611d9590613924565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc190613924565b8015611e0e5780601f10611de357610100808354040283529160200191611e0e565b820191906000526020600020905b815481529060010190602001808311611df157829003601f168201915b50505050509050919050565b6000611e24612880565b90506000815111611e445760405180602001604052806000815250611e6f565b80611e4e8461288f565b604051602001611e5f9291906134e5565b6040516020818303038152906040525b9392505050565b6000611e8133610e62565b90506000805b8451821015610e40575060005b8251811015611f0d57828181518110611eaf57611eaf6139ba565b6020026020010151858381518110611ec957611ec96139ba565b60200260200101511415611efb57611efb3385858481518110611eee57611eee6139ba565b6020026020010151612531565b611f06600182613896565b9050611e94565b611f18600183613896565b9150611e87565b606080606080606080600b600c611f3589612328565b600e6009600a858054611f4790613924565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7390613924565b8015611fc05780601f10611f9557610100808354040283529160200191611fc0565b820191906000526020600020905b815481529060010190602001808311611fa357829003601f168201915b50505050509550848054611fd390613924565b80601f0160208091040260200160405190810160405280929190818152602001828054611fff90613924565b801561204c5780601f106120215761010080835404028352916020019161204c565b820191906000526020600020905b81548152906001019060200180831161202f57829003601f168201915b5050505050945082805461205f90613924565b80601f016020809104026020016040519081016040528092919081815260200182805461208b90613924565b80156120d85780601f106120ad576101008083540402835291602001916120d8565b820191906000526020600020905b8154815290600101906020018083116120bb57829003601f168201915b505050505092508180546120eb90613924565b80601f016020809104026020016040519081016040528092919081815260200182805461211790613924565b80156121645780601f1061213957610100808354040283529160200191612164565b820191906000526020600020905b81548152906001019060200180831161214757829003601f168201915b5050505050915080805461217790613924565b80601f01602080910402602001604051908101604052809291908181526020018280546121a390613924565b80156121f05780601f106121c5576101008083540402835291602001916121f0565b820191906000526020600020905b8154815290600101906020018083116121d357829003601f168201915b5050505050905095509550955095509550955091939550919395565b6000811561223357506001600160a01b03821660009081526022602052604090205461098c565b50506001600160a01b031660009081526021602052604090205490565b6006546001600160a01b0316331461227a5760405162461bcd60e51b8152600401610a9990613706565b6001600160a01b0381166122df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a99565b6122e881612701565b50565b6006546001600160a01b031633146123155760405162461bcd60e51b8152600401610a9990613706565b805161151490601f906020840190612ccd565b606061233c6006546001600160a01b031690565b6001600160a01b0316826001600160a01b0316148061235d575060105460ff165b1561236f57600d8054611d9590613924565b600e8054611d9590613924565b60006001600160e01b031982166380ac58cd60e01b14806123ad57506001600160e01b03198216635b5e139f60e01b145b8061098c57506301ffc9a760e01b6001600160e01b031983161461098c565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061240182611304565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124b35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a99565b60006124be83611304565b9050806001600160a01b0316846001600160a01b031614806124f95750836001600160a01b03166124ee84610a24565b6001600160a01b0316145b8061252957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661254482611304565b6001600160a01b0316146125ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a99565b6001600160a01b03821661260e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a99565b6126196000826123cc565b6001600160a01b03831660009081526003602052604081208054600192906126429084906138e1565b90915550506001600160a01b0382166000908152600360205260408120805460019290612670908490613896565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826126de858461298c565b14949350505050565b611514828260405180602001604052806000815250612a00565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601054600090829062010000900460ff1661277057601954612774565b6018545b61098c91906138c2565b816001600160a01b0316836001600160a01b031614156127e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a99565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612858848484612531565b61286484848484612a33565b610b105760405162461bcd60e51b8152600401610a99906136b4565b6060600b80546109a190613924565b6060816128b35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128dd57806128c78161395f565b91506128d69050600a836138ae565b91506128b7565b6000816001600160401b038111156128f7576128f76139d0565b6040519080825280601f01601f191660200182016040528015612921576020820181803683370190505b5090505b8415612529576129366001836138e1565b9150612943600a8661397a565b61294e906030613896565b60f81b818381518110612963576129636139ba565b60200101906001600160f81b031916908160001a905350612985600a866138ae565b9450612925565b600081815b84518110156129f85760008582815181106129ae576129ae6139ba565b602002602001015190508083116129d457600083815260208290526040902092506129e5565b600081815260208490526040902092505b50806129f08161395f565b915050612991565b509392505050565b612a0a8383612b40565b612a176000848484612a33565b610c275760405162461bcd60e51b8152600401610a99906136b4565b60006001600160a01b0384163b15612b3557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a77903390899088908890600401613524565b602060405180830381600087803b158015612a9157600080fd5b505af1925050508015612ac1575060408051601f3d908101601f19168201909252612abe918101906132a8565b60015b612b1b573d808015612aef576040519150601f19603f3d011682016040523d82523d6000602084013e612af4565b606091505b508051612b135760405162461bcd60e51b8152600401610a99906136b4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612529565b506001949350505050565b6001600160a01b038216612b965760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a99565b6000818152600260205260409020546001600160a01b031615612bfb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a99565b6001600160a01b0382166000908152600360205260408120805460019290612c24908490613896565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054828255906000526020600020908101928215612cbd579160200282015b82811115612cbd578251825591602001919060010190612ca2565b50612cc9929150612d95565b5090565b828054828255906000526020600020908101928215612cbd579160200282015b82811115612cbd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612ced565b828054612d2e90613924565b90600052602060002090601f016020900481019282612d505760008555612cbd565b82601f10612d6957805160ff1916838001178555612cbd565b82800160010185558215612cbd5791820182811115612cbd578251825591602001919060010190612ca2565b5b80821115612cc95760008155600101612d96565b60006001600160401b03831115612dc357612dc36139d0565b612dd6601f8401601f1916602001613843565b9050828152838383011115612dea57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612e1857600080fd5b919050565b600082601f830112612e2e57600080fd5b81356020612e43612e3e83613873565b613843565b80838252828201915082860187848660051b8901011115612e6357600080fd5b60005b85811015612e8957612e7782612e01565b84529284019290840190600101612e66565b5090979650505050505050565b600082601f830112612ea757600080fd5b81356020612eb7612e3e83613873565b80838252828201915082860187848660051b8901011115612ed757600080fd5b60005b85811015612e8957813584529284019290840190600101612eda565b80358015158114612e1857600080fd5b600082601f830112612f1757600080fd5b611e6f83833560208501612daa565b600060208284031215612f3857600080fd5b611e6f82612e01565b60008060408385031215612f5457600080fd5b612f5d83612e01565b9150612f6b60208401612e01565b90509250929050565b600080600060608486031215612f8957600080fd5b612f9284612e01565b9250612fa060208501612e01565b9150604084013590509250925092565b60008060008060808587031215612fc657600080fd5b612fcf85612e01565b9350612fdd60208601612e01565b92506040850135915060608501356001600160401b03811115612fff57600080fd5b8501601f8101871361301057600080fd5b61301f87823560208401612daa565b91505092959194509250565b6000806040838503121561303e57600080fd5b61304783612e01565b9150612f6b60208401612ef6565b6000806040838503121561306857600080fd5b61307183612e01565b946020939093013593505050565b60006020828403121561309157600080fd5b81356001600160401b038111156130a757600080fd5b61252984828501612e1d565b600080602083850312156130c657600080fd5b82356001600160401b03808211156130dd57600080fd5b818501915085601f8301126130f157600080fd5b81358181111561310057600080fd5b8660208260051b850101111561311557600080fd5b60209290920196919550909350505050565b6000602080838503121561313a57600080fd5b82356001600160401b0381111561315057600080fd5b8301601f8101851361316157600080fd5b803561316f612e3e82613873565b80828252848201915084840188868560061b870101111561318f57600080fd5b60009450845b848110156131da57604080838c0312156131ad578687fd5b6131b561381b565b6131be84612e01565b8152838901358982015285529387019390910190600101613195565b509098975050505050505050565b600080604083850312156131fb57600080fd5b82356001600160401b0381111561321157600080fd5b61321d85828601612e96565b925050612f6b60208401612e01565b60006020828403121561323e57600080fd5b611e6f82612ef6565b6000806000806080858703121561325d57600080fd5b61326685612ef6565b93506020850135925061327b60408601612ef6565b9396929550929360600135925050565b60006020828403121561329d57600080fd5b8135611e6f816139e6565b6000602082840312156132ba57600080fd5b8151611e6f816139e6565b600080600080608085870312156132db57600080fd5b84356001600160401b03808211156132f257600080fd5b6132fe88838901612f06565b9550602087013591508082111561331457600080fd5b61332088838901612f06565b9450604087013591508082111561333657600080fd5b61334288838901612f06565b9350606087013591508082111561335857600080fd5b5061301f87828801612f06565b60006020828403121561337757600080fd5b5035919050565b6000806000806000806000806000806101408b8d03121561339e57600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b01356001600160401b03808211156133d857600080fd5b6133e48e838f01612e96565b965060c08d01359150808211156133fa57600080fd5b506134078d828e01612e1d565b94505061341660e08c01612ef6565b92506134256101008c01612ef6565b91506134346101208c01612ef6565b90509295989b9194979a5092959850565b600081518084526020808501945080840160005b8381101561347e5781516001600160a01b031687529582019590820190600101613459565b509495945050505050565b600081518084526020808501945080840160005b8381101561347e5781518752958201959082019060010161349d565b600081518084526134d18160208601602086016138f8565b601f01601f19169290920160200192915050565b600083516134f78184602088016138f8565b83519083019061350b8183602088016138f8565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613557908301846134b9565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156135ac57815180516001600160a01b0316855286015186850152928401929085019060010161357e565b5091979650505050505050565b602081526000611e6f6020830184613489565b871515815286602082015285604082015284606082015283608082015260e060a082015260006135ff60e0830185613445565b82810360c08401526136118185613445565b9a9950505050505050505050565b602081526000611e6f60208301846134b9565b60c08152600061364560c08301896134b9565b828103602084015261365781896134b9565b9050828103604084015261366b81886134b9565b9050828103606084015261367f81876134b9565b9050828103608084015261369381866134b9565b905082810360a08401526136a781856134b9565b9998505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006101808e83528d60208401528c60408401528b60608401528a60808401528960a08401528060c08401526137c48184018a613489565b905082810360e08401526137d88189613445565b90508615156101008401528515156101208401528415156101408401528281036101608401526138088185613445565b9f9e505050505050505050505050505050565b604080519081016001600160401b038111828210171561383d5761383d6139d0565b60405290565b604051601f8201601f191681016001600160401b038111828210171561386b5761386b6139d0565b604052919050565b60006001600160401b0382111561388c5761388c6139d0565b5060051b60200190565b600082198211156138a9576138a961398e565b500190565b6000826138bd576138bd6139a4565b500490565b60008160001904831182151516156138dc576138dc61398e565b500290565b6000828210156138f3576138f361398e565b500390565b60005b838110156139135781810151838201526020016138fb565b83811115610b105750506000910152565b600181811c9082168061393857607f821691505b6020821081141561395957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139735761397361398e565b5060010190565b600082613989576139896139a4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146122e857600080fdfea2646970667358221220ead30f07fe457292e66d4b5f3bf2a080867d553efda4f2f389cee3abf5d94a9a64736f6c63430008070033

Deployed Bytecode Sourcemap

41449:10452:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51643:255;;;;;;;;;;-1:-1:-1;51643:255:0;;;;;:::i;:::-;;:::i;:::-;;;14525:14:1;;14518:22;14500:41;;14488:2;14473:18;51643:255:0;;;;;;;;29719:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31278:221::-;;;;;;;;;;-1:-1:-1;31278:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12720:32:1;;;12702:51;;12690:2;12675:18;31278:221:0;12556:203:1;48971:317:0;;;;;;;;;;-1:-1:-1;48971:317:0;;;;;:::i;:::-;;:::i;:::-;;30801:411;;;;;;;;;;-1:-1:-1;30801:411:0;;;;;:::i;:::-;;:::i;50980:247::-;;;;;;;;;;-1:-1:-1;51101:17:0;;51128:24;;51162:21;;51193;50980:247;;;28122:25:1;;;28178:2;28163:18;;28156:34;;;;28206:18;;;28199:34;28264:2;28249:18;;28242:34;28109:3;28094:19;50980:247:0;27891:391:1;44211:84:0;;;;;;;;;;-1:-1:-1;44211:84:0;;;;;:::i;:::-;;:::i;43475:87::-;;;;;;;;;;;;;:::i;:::-;;;27855:25:1;;;27843:2;27828:18;43475:87:0;27709:177:1;51234:103:0;;;;;;;;;;-1:-1:-1;51234:103:0;;;;;:::i;:::-;-1:-1:-1;51321:8:0;;;51234:103;32028:339;;;;;;;;;;-1:-1:-1;32028:339:0;;;;;:::i;:::-;;:::i;45273:565::-;;;:::i;32438:185::-;;;;;;;;;;-1:-1:-1;32438:185:0;;;;;:::i;:::-;;:::i;44658:609::-;;;;;;;;;;-1:-1:-1;44658:609:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50194:433::-;;;;;;;;;;-1:-1:-1;50194:433:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;51466:169::-;;;;;;;;;;-1:-1:-1;51466:169:0;;;;;:::i;:::-;-1:-1:-1;51529:28:0;;51466:169;;;;;;;;:::i;41618:36::-;;;;;;;;;;;;;:::i;46814:640::-;;;;;;;;;;-1:-1:-1;46814:640:0;;;;;:::i;:::-;;:::i;139:31::-;;;;;;;;;;;;;;;;43229:52;;;;;;;;;;-1:-1:-1;43229:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;29413:239;;;;;;;;;;-1:-1:-1;29413:239:0;;;;;:::i;:::-;;:::i;46356:452::-;;;;;;;;;;-1:-1:-1;46356:452:0;;;;;:::i;:::-;;:::i;29143:208::-;;;;;;;;;;-1:-1:-1;29143:208:0;;;;;:::i;:::-;;:::i;42443:25::-;;;;;;;;;;-1:-1:-1;42443:25:0;;;;;;;;;;;9762:103;;;;;;;;;;;;;:::i;47896:732::-;;;;;;;;;;-1:-1:-1;47896:732:0;;;;;:::i;:::-;;:::i;49628:560::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;9111:87::-;;;;;;;;;;-1:-1:-1;9184:6:0;;-1:-1:-1;;;;;9184:6:0;9111:87;;44120:85;;;;;;;;;;;;;:::i;29888:104::-;;;;;;;;;;;;;:::i;43169:55::-;;;;;;;;;;-1:-1:-1;43169:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;48634:331;;;;;;;;;;-1:-1:-1;48634:331:0;;;;;:::i;:::-;;:::i;42411:27::-;;;;;;;;;;-1:-1:-1;42411:27:0;;;;;;;;45844:506;;;;;;:::i;:::-;;:::i;31571:155::-;;;;;;;;;;-1:-1:-1;31571:155:0;;;;;:::i;:::-;;:::i;269:891::-;;;;;;;;;;-1:-1:-1;269:891:0;;;;;:::i;:::-;;:::i;32694:328::-;;;;;;;;;;-1:-1:-1;32694:328:0;;;;;:::i;:::-;;:::i;41659:31::-;;;;;;;;;;;;;:::i;43685:429::-;;;;;;;;;;-1:-1:-1;43685:429:0;;;;;:::i;:::-;;:::i;42504:26::-;;;;;;;;;;-1:-1:-1;42504:26:0;;;;;;;;;;;51345:113;;;;;;;;;;-1:-1:-1;51345:113:0;;;;;:::i;:::-;51405:7;51432:18;;;:9;:18;;;;;;-1:-1:-1;;;;;51432:18:0;;51345:113;47460:430;;;;;;;;;;-1:-1:-1;47460:430:0;;;;;:::i;:::-;;:::i;50633:341::-;;;;;;;;;;-1:-1:-1;50633:341:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;49424:198::-;;;;;;;;;;-1:-1:-1;49424:198:0;;;;;:::i;:::-;;:::i;42473:26::-;;;;;;;;;;-1:-1:-1;42473:26:0;;;;;;;;;;;31797:164;;;;;;;;;;-1:-1:-1;31797:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31918:25:0;;;31894:4;31918:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31797:164;43286:58;;;;;;;;;;-1:-1:-1;43286:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;10020:201;;;;;;;;;;-1:-1:-1;10020:201:0;;;;;:::i;:::-;;:::i;49294:124::-;;;;;;;;;;-1:-1:-1;49294:124:0;;;;;:::i;:::-;;:::i;44301:191::-;;;;;;;;;;-1:-1:-1;44301:191:0;;;;;:::i;:::-;;:::i;51643:255::-;51838:12;;51781:4;;51838:12;;-1:-1:-1;;;;;;51823:27:0;;;;;;;;:67;;;51854:36;51878:11;51854:23;:36::i;:::-;51803:87;51643:255;-1:-1:-1;;51643:255:0:o;29719:100::-;29773:13;29806:5;29799:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29719:100;:::o;31278:221::-;31354:7;34621:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34621:16:0;31374:73;;;;-1:-1:-1;;;31374:73:0;;22364:2:1;31374:73:0;;;22346:21:1;22403:2;22383:18;;;22376:30;22442:34;22422:18;;;22415:62;-1:-1:-1;;;22493:18:1;;;22486:42;22545:19;;31374:73:0;;;;;;;;;-1:-1:-1;31467:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31467:24:0;;31278:221::o;48971:317::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;49134:14:::1;:32:::0;;-1:-1:-1;;49134:32:0::1;::::0;;::::1;;;;::::0;;49173:19:::1;:35:::0;;;49215:68;::::1;;;49241:14;:34:::0;;;49215:68:::1;48971:317:::0;;;;:::o;30801:411::-;30882:13;30898:23;30913:7;30898:14;:23::i;:::-;30882:39;;30946:5;-1:-1:-1;;;;;30940:11:0;:2;-1:-1:-1;;;;;30940:11:0;;;30932:57;;;;-1:-1:-1;;;30932:57:0;;25499:2:1;30932:57:0;;;25481:21:1;25538:2;25518:18;;;25511:30;25577:34;25557:18;;;25550:62;-1:-1:-1;;;25628:18:1;;;25621:31;25669:19;;30932:57:0;25297:397:1;30932:57:0;7915:10;-1:-1:-1;;;;;31024:21:0;;;;:62;;-1:-1:-1;31049:37:0;31066:5;7915:10;31797:164;:::i;31049:37::-;31002:168;;;;-1:-1:-1;;;31002:168:0;;19970:2:1;31002:168:0;;;19952:21:1;20009:2;19989:18;;;19982:30;20048:34;20028:18;;;20021:62;20119:26;20099:18;;;20092:54;20163:19;;31002:168:0;19768:420:1;31002:168:0;31183:21;31192:2;31196:7;31183:8;:21::i;:::-;30871:341;30801:411;;:::o;44211:84::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;44267:13:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;44267:22:0;;::::1;::::0;;;::::1;::::0;;44211:84::o;43475:87::-;43518:7;43540:16;:6;4531:14;;4439:114;43540:16;43533:23;;43475:87;:::o;32028:339::-;32223:41;7915:10;32256:7;32223:18;:41::i;:::-;32215:103;;;;-1:-1:-1;;;32215:103:0;;;;;;;:::i;:::-;32331:28;32341:4;32347:2;32351:7;32331:9;:28::i;45273:565::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;45325:14:::1;::::0;45386:21:::1;::::0;45448:269:::1;45458:19;:26:::0;45454:30;::::1;:47:::0;::::1;;;;45500:1;45488:9;:13;45454:47;45448:269;;;45555:3;45530:19;45550:1;45530:22;;;;;;;;:::i;:::-;;;;;;;;;45520:7;:32;;;;:::i;:::-;:38;;;;:::i;:::-;45511:47:::0;-1:-1:-1;45579:18:0::1;45511:47:::0;45579:9;:18:::1;:::i;:::-;45567:30;;45607:6;45626:21;45648:1;45626:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;45618:57:::1;::::0;-1:-1:-1;;;;;45626:24:0;;::::1;::::0;45664:6;;45618:57;;45626:24;45618:57;45664:6;45626:24;45618:57:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45606:69;;;45692:1;45684:10;;;::::0;::::1;;45703:6;45708:1;45703:6:::0;::::1;:::i;:::-;;;45502:215;45448:269;;;45728:13:::0;;45725:108:::1;;45752:6;45771:7;9184:6:::0;;-1:-1:-1;;;;;9184:6:0;;9111:87;45771:7:::1;-1:-1:-1::0;;;;;45763:21:0::1;45792:9;45763:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45751:55;;;45823:1;45815:10;;;::::0;::::1;;45742:91;45318:520;;;;45273:565::o:0;32438:185::-;32576:39;32593:4;32599:2;32603:7;32576:39;;;;;;;;;;;;:16;:39::i;44658:609::-;44718:16;44742:23;44768:17;44778:6;44768:9;:17::i;:::-;44742:43;;44792:25;44834:15;-1:-1:-1;;;;;44820:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44820:30:0;-1:-1:-1;44792:58:0;-1:-1:-1;44888:1:0;44863:22;44932:306;44956:15;44938;:33;:70;;;;;44993:15;;44975:14;:33;;44938:70;44932:306;;;45018:25;45046:23;45054:14;45046:7;:23::i;:::-;45018:51;;45102:6;-1:-1:-1;;;;;45081:27:0;:17;-1:-1:-1;;;;;45081:27:0;;45078:125;;;45148:14;45120:8;45129:15;45120:25;;;;;;;;:::i;:::-;;;;;;;;;;:42;45173:20;45192:1;45173:20;;:::i;:::-;;;45078:125;45211:19;45229:1;45211:19;;:::i;:::-;;;45009:229;44932:306;;;-1:-1:-1;45253:8:0;;44658:609;-1:-1:-1;;;;44658:609:0:o;50194:433::-;50395:14;;50419:25;;50453:19;;-1:-1:-1;;;;;50481:25:0;;50264:4;50481:25;;;:17;:25;;;;;;;;;50516:23;:31;;;;;;50556:21;50379:242;;;;;;;;;;;;;;;;;50264:4;;;;;;;;;;50332:16;;;;50395:14;;;;;;;50419:25;;50453:19;;50481:25;50516:31;50556:21;50586:28;;50556:21;;50379:242;;;50556:21;50379:242;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50379:242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50379:242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50194:433;;;;;;;;;:::o;41618:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46814:640::-;46891:14;;;;;;;46883:49;;;;-1:-1:-1;;;46883:49:0;;23900:2:1;46883:49:0;;;23882:21:1;23939:2;23919:18;;;23912:30;-1:-1:-1;;;23958:18:1;;;23951:52;24020:18;;46883:49:0;23698:346:1;46883:49:0;46975:19;;46947:25;;:47;46939:87;;;;-1:-1:-1;;;46939:87:0;;25143:2:1;46939:87:0;;;25125:21:1;25182:2;25162:18;;;25155:30;25221:29;25201:18;;;25194:57;25268:18;;46939:87:0;24941:351:1;46939:87:0;47075:10;47033:15;47051:35;;;:23;:35;;;;;;47103:12;;47095:48;;;;-1:-1:-1;;;47095:48:0;;23138:2:1;47095:48:0;;;23120:21:1;23177:2;23157:18;;;23150:30;23216:25;23196:18;;;23189:53;23259:18;;47095:48:0;22936:347:1;47095:48:0;47177:28;;-1:-1:-1;;47194:10:0;11619:2:1;11615:15;11611:53;47177:28:0;;;11599:66:1;47152:12:0;;11681::1;;47177:28:0;;;;;;;;;;;;47167:39;;;;;;47152:54;;47221;47240:12;;47221:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47254:14:0;;;-1:-1:-1;47270:4:0;;-1:-1:-1;47221:18:0;:54::i;:::-;47213:80;;;;-1:-1:-1;;;47213:80:0;;26665:2:1;47213:80:0;;;26647:21:1;26704:2;26684:18;;;26677:30;-1:-1:-1;;;26723:18:1;;;26716:43;26776:18;;47213:80:0;26463:337:1;47213:80:0;47324:10;47300:35;;;;:23;:35;;;;;:40;;47339:1;;47300:35;:40;;47339:1;;47300:40;:::i;:::-;;;;-1:-1:-1;;47347:6:0;4650:19;;4668:1;4650:19;;;47372:39;47382:10;47394:16;:6;4531:14;;4439:114;47394:16;47372:9;:39::i;:::-;47447:1;47418:25;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;46814:640:0:o;29413:239::-;29485:7;29521:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29521:16:0;29556:19;29548:73;;;;-1:-1:-1;;;29548:73:0;;20806:2:1;29548:73:0;;;20788:21:1;20845:2;20825:18;;;20818:30;20884:34;20864:18;;;20857:62;-1:-1:-1;;;20935:18:1;;;20928:39;20984:19;;29548:73:0;20604:405:1;46356:452:0;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;46436:14:::1;::::0;;;::::1;;;46428:49;;;::::0;-1:-1:-1;;;46428:49:0;;23900:2:1;46428:49:0::1;::::0;::::1;23882:21:1::0;23939:2;23919:18;;;23912:30;-1:-1:-1;;;23958:18:1;;;23951:52;24020:18;;46428:49:0::1;23698:346:1::0;46428:49:0::1;46530:15;::::0;46511:16;;46492:6:::1;4531:14:::0;46492:35:::1;;;;:::i;:::-;:53;46484:112;;;::::0;-1:-1:-1;;;46484:112:0;;16856:2:1;46484:112:0::1;::::0;::::1;16838:21:1::0;16895:2;16875:18;;;16868:30;16934:34;16914:18;;;16907:62;-1:-1:-1;;;16985:18:1;;;16978:44;17039:19;;46484:112:0::1;16654:410:1::0;46484:112:0::1;46609:9;46630:173;46640:9;:16;46636:1;:20;46630:173;;;46666:18;:6;4650:19:::0;;4668:1;4650:19;;;4561:127;46666:18:::1;46693:41;46703:9;46713:1;46703:12;;;;;;;;:::i;:::-;;;;;;;46717:16;:6;4531:14:::0;;4439:114;46693:41:::1;46778:1;46743:17;:31;46761:9;46771:1;46761:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;46743:31:0::1;-1:-1:-1::0;;;;;46743:31:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;46788:6:0::1;::::0;-1:-1:-1;46793:1:0::1;46788:6:::0;::::1;:::i;:::-;;;46630:173;;;46421:387;46356:452:::0;:::o;29143:208::-;29215:7;-1:-1:-1;;;;;29243:19:0;;29235:74;;;;-1:-1:-1;;;29235:74:0;;20395:2:1;29235:74:0;;;20377:21:1;20434:2;20414:18;;;20407:30;20473:34;20453:18;;;20446:62;-1:-1:-1;;;20524:18:1;;;20517:40;20574:19;;29235:74:0;20193:406:1;29235:74:0;-1:-1:-1;;;;;;29327:16:0;;;;;:9;:16;;;;;;;29143:208::o;9762:103::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;9827:30:::1;9854:1;9827:18;:30::i;:::-;9762:103::o:0;47896:732::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;48237:15:::1;:33:::0;;;48277:12:::1;:27:::0;;;48311:15:::1;:33:::0;;;48351:20:::1;:39:::0;;;48397:17:::1;:39:::0;;;48443:30;;::::1;::::0;:19:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;48480:39:0;;::::1;::::0;:21:::1;::::0;:39:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;48526:13:0::1;:23:::0;;-1:-1:-1;;48556:27:0;48526:23:::1;::::0;::::1;;::::0;;;::::1;-1:-1:-1::0;;48556:27:0;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;48590:32:0::1;::::0;;::::1;;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;;47896:732:0:o;49628:560::-;49676:7;49691;49706;49721;49736;49751;49766:16;49790;49814:4;49820;49826;49838:16;49878:15;;49902:12;;49923:15;;49947:13;:11;:13::i;:::-;49969:20;;49998:17;;50082:13;;50024:19;49862:320;;;;;;;;;;;;;;;;;;;50024:19;;50052:21;;50082:13;;;;;;;50104:15;;;;50128:14;;;;;;;;50152:23;;49862:320;50024:19;;49862:320;;50024:19;49862:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49862:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49862:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49628:560;;;;;;;;;;;;:::o;44120:85::-;44159:4;44192:7;9184:6;;-1:-1:-1;;;;;9184:6:0;;9111:87;44192:7;-1:-1:-1;;;;;44178:21:0;:10;-1:-1:-1;;;;;44178:21:0;;44171:28;;44120:85;:::o;29888:104::-;29944:13;29977:7;29970:14;;;;;:::i;48634:331::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;48816:29;;::::1;::::0;:16:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;48852:34:0;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;48893:26:0;;::::1;::::0;:14:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;48926:33:0;;::::1;::::0;:15:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;45844:506::-:0;45909:13;;;;;;;45908:14;45900:44;;;;-1:-1:-1;;;45900:44:0;;26319:2:1;45900:44:0;;;26301:21:1;26358:2;26338:18;;;26331:30;-1:-1:-1;;;26377:18:1;;;26370:47;26434:18;;45900:44:0;26117:341:1;45900:44:0;45993:15;;45978:11;45959:16;:6;4531:14;;4439:114;45959:16;:30;;;;:::i;:::-;:49;;45951:94;;;;-1:-1:-1;;;45951:94:0;;21216:2:1;45951:94:0;;;21198:21:1;;;21235:18;;;21228:30;21294:34;21274:18;;;21267:62;21346:18;;45951:94:0;21014:356:1;45951:94:0;46059:9;:7;:9::i;:::-;46054:100;;46102:24;46114:11;46102;:24::i;:::-;46089:9;:37;;46081:65;;;;-1:-1:-1;;;46081:65:0;;19626:2:1;46081:65:0;;;19608:21:1;19665:2;19645:18;;;19638:30;-1:-1:-1;;;19684:18:1;;;19677:45;19739:18;;46081:65:0;19424:339:1;46081:65:0;46179:1;46162:183;46187:11;46182:1;:16;46162:183;;46215:18;:6;4650:19;;4668:1;4650:19;;;4561:127;46215:18;46242:39;46252:10;46264:16;:6;4531:14;;4439:114;46242:39;46327:10;46297:9;:27;46307:16;:6;4531:14;;4439:114;46307:16;46297:27;;;;;;;;;;;-1:-1:-1;46297:27:0;:40;;-1:-1:-1;;;;;;46297:40:0;-1:-1:-1;;;;;46297:40:0;;;;;;;;;;46200:4;-1:-1:-1;46200:4:0;;:::i;:::-;;;46162:183;;31571:155;31666:52;7915:10;31699:8;31709;31666:18;:52::i;269:891::-;406:2;385:10;:17;:23;;363:140;;;;-1:-1:-1;;;363:140:0;;24667:2:1;363:140:0;;;24649:21:1;24706:2;24686:18;;;24679:30;24745:34;24725:18;;;24718:62;24816:34;24796:18;;;24789:62;-1:-1:-1;;;24867:19:1;;;24860:34;24911:19;;363:140:0;24465:471:1;363:140:0;516:21;559:9;554:437;578:10;:17;574:1;:21;554:437;;;673:1;-1:-1:-1;;;;;643:32:0;:10;654:1;643:13;;;;;;;;:::i;:::-;;;;;;;:18;;;-1:-1:-1;;;;;643:32:0;;;617:154;;;;-1:-1:-1;;;617:154:0;;27482:2:1;617:154:0;;;27464:21:1;27521:2;27501:18;;;27494:30;27560:34;27540:18;;;27533:62;27631:30;27611:18;;;27604:58;27679:19;;617:154:0;27280:424:1;617:154:0;834:1;812:10;823:1;812:13;;;;;;;;:::i;:::-;;;;;;;:19;;;:23;786:142;;;;-1:-1:-1;;;786:142:0;;21938:2:1;786:142:0;;;21920:21:1;21977:2;21957:18;;;21950:30;22016:34;21996:18;;;21989:62;22087:27;22067:18;;;22060:55;22132:19;;786:142:0;21736:421:1;786:142:0;960:10;971:1;960:13;;;;;;;;:::i;:::-;;;;;;;:19;;;943:36;;;;;:::i;:::-;;-1:-1:-1;597:3:0;;;;:::i;:::-;;;;554:437;;;;1050:8;;1033:13;:25;;1011:141;;;;-1:-1:-1;;;1011:141:0;;27007:2:1;1011:141:0;;;26989:21:1;27046:2;27026:18;;;27019:30;27085:34;27065:18;;;27058:62;27156:34;27136:18;;;27129:62;-1:-1:-1;;;27207:19:1;;;27200:33;27250:19;;1011:141:0;26805:470:1;32694:328:0;32869:41;7915:10;32902:7;32869:18;:41::i;:::-;32861:103;;;;-1:-1:-1;;;32861:103:0;;;;;;;:::i;:::-;32975:39;32989:4;32995:2;32999:7;33008:5;32975:13;:39::i;41659:31::-;;;;;;;:::i;43685:429::-;34597:4;34621:16;;;:7;:16;;;;;;43758:13;;-1:-1:-1;;;;;34621:16:0;43780:76;;;;-1:-1:-1;;;43780:76:0;;24251:2:1;43780:76:0;;;24233:21:1;24290:2;24270:18;;;24263:30;24329:34;24309:18;;;24302:62;-1:-1:-1;;;24380:18:1;;;24373:45;24435:19;;43780:76:0;24049:411:1;43780:76:0;43872:15;;;;43869:67;;43914:14;43907:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43685:429;;;:::o;43869:67::-;43944:28;43975:10;:8;:10::i;:::-;43944:41;;44030:1;44005:14;43999:28;:32;:109;;;;;;;;;;;;;;;;;44058:14;44074:18;:7;:16;:18::i;:::-;44041:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43999:109;43992:116;43685:429;-1:-1:-1;;;43685:429:0:o;47460:430::-;47540:28;47571:25;47585:10;47571:13;:25::i;:::-;47540:56;;47605:9;47626;47646:239;47656:8;:15;47652:1;:19;47646:239;;;-1:-1:-1;47685:1:0;47695:170;47705:11;:18;47701:1;:22;47695:170;;;47753:11;47765:1;47753:14;;;;;;;;:::i;:::-;;;;;;;47738:8;47747:1;47738:11;;;;;;;;:::i;:::-;;;;;;;:29;47735:105;;;47781:47;47791:10;47803:8;47813:11;47825:1;47813:14;;;;;;;;:::i;:::-;;;;;;;47781:9;:47::i;:::-;47850:4;47853:1;47850:4;;:::i;:::-;;;47695:170;;;47873:4;47876:1;47873:4;;:::i;:::-;;;47646:239;;50633:341;50690:13;50711;50732;50753;50774;50795;50832:16;50858:14;50882:22;50899:4;50882:16;:22::i;:::-;50914:15;50939:5;50954:7;50816:152;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50633:341;;;;;;;:::o;49424:198::-;49500:7;49518:8;49515:65;;;-1:-1:-1;;;;;;49543:29:0;;;;;;:23;:29;;;;;;49536:36;;49515:65;-1:-1:-1;;;;;;;49593:23:0;;;;;:17;:23;;;;;;;49424:198::o;10020:201::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10109:22:0;::::1;10101:73;;;::::0;-1:-1:-1;;;10101:73:0;;17690:2:1;10101:73:0::1;::::0;::::1;17672:21:1::0;17729:2;17709:18;;;17702:30;17768:34;17748:18;;;17741:62;-1:-1:-1;;;17819:18:1;;;17812:36;17865:19;;10101:73:0::1;17488:402:1::0;10101:73:0::1;10185:28;10204:8;10185:18;:28::i;:::-;10020:201:::0;:::o;49294:124::-;9184:6;;-1:-1:-1;;;;;9184:6:0;7915:10;9331:23;9323:68;;;;-1:-1:-1;;;9323:68:0;;;;;;;:::i;:::-;49377:35;;::::1;::::0;:23:::1;::::0;:35:::1;::::0;::::1;::::0;::::1;:::i;44301:191::-:0;44361:13;44393:7;9184:6;;-1:-1:-1;;;;;9184:6:0;;9111:87;44393:7;-1:-1:-1;;;;;44385:15:0;:4;-1:-1:-1;;;;;44385:15:0;;:34;;;-1:-1:-1;44404:15:0;;;;44385:34;44382:76;;;44436:14;44429:21;;;;;:::i;44382:76::-;44471:15;44464:22;;;;;:::i;28774:305::-;28876:4;-1:-1:-1;;;;;;28913:40:0;;-1:-1:-1;;;28913:40:0;;:105;;-1:-1:-1;;;;;;;28970:48:0;;-1:-1:-1;;;28970:48:0;28913:105;:158;;;-1:-1:-1;;;;;;;;;;21652:40:0;;;29035:36;21543:157;38514:174;38589:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38589:29:0;-1:-1:-1;;;;;38589:29:0;;;;;;;;:24;;38643:23;38589:24;38643:14;:23::i;:::-;-1:-1:-1;;;;;38634:46:0;;;;;;;;;;;38514:174;;:::o;34826:348::-;34919:4;34621:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34621:16:0;34936:73;;;;-1:-1:-1;;;34936:73:0;;19213:2:1;34936:73:0;;;19195:21:1;19252:2;19232:18;;;19225:30;19291:34;19271:18;;;19264:62;-1:-1:-1;;;19342:18:1;;;19335:42;19394:19;;34936:73:0;19011:408:1;34936:73:0;35020:13;35036:23;35051:7;35036:14;:23::i;:::-;35020:39;;35089:5;-1:-1:-1;;;;;35078:16:0;:7;-1:-1:-1;;;;;35078:16:0;;:51;;;;35122:7;-1:-1:-1;;;;;35098:31:0;:20;35110:7;35098:11;:20::i;:::-;-1:-1:-1;;;;;35098:31:0;;35078:51;:87;;;-1:-1:-1;;;;;;31918:25:0;;;31894:4;31918:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35133:32;35070:96;34826:348;-1:-1:-1;;;;34826:348:0:o;37818:578::-;37977:4;-1:-1:-1;;;;;37950:31:0;:23;37965:7;37950:14;:23::i;:::-;-1:-1:-1;;;;;37950:31:0;;37942:85;;;;-1:-1:-1;;;37942:85:0;;23490:2:1;37942:85:0;;;23472:21:1;23529:2;23509:18;;;23502:30;23568:34;23548:18;;;23541:62;-1:-1:-1;;;23619:18:1;;;23612:39;23668:19;;37942:85:0;23288:405:1;37942:85:0;-1:-1:-1;;;;;38046:16:0;;38038:65;;;;-1:-1:-1;;;38038:65:0;;18454:2:1;38038:65:0;;;18436:21:1;18493:2;18473:18;;;18466:30;18532:34;18512:18;;;18505:62;-1:-1:-1;;;18583:18:1;;;18576:34;18627:19;;38038:65:0;18252:400:1;38038:65:0;38220:29;38237:1;38241:7;38220:8;:29::i;:::-;-1:-1:-1;;;;;38262:15:0;;;;;;:9;:15;;;;;:20;;38281:1;;38262:15;:20;;38281:1;;38262:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38293:13:0;;;;;;:9;:13;;;;;:18;;38310:1;;38293:13;:18;;38310:1;;38293:18;:::i;:::-;;;;-1:-1:-1;;38322:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38322:21:0;-1:-1:-1;;;;;38322:21:0;;;;;;;;;38361:27;;38322:16;;38361:27;;;;;;;37818:578;;;:::o;2046:190::-;2171:4;2224;2195:25;2208:5;2215:4;2195:12;:25::i;:::-;:33;;2046:190;-1:-1:-1;;;;2046:190:0:o;35516:110::-;35592:26;35602:2;35606:7;35592:26;;;;;;;;;;;;:9;:26::i;10381:191::-;10474:6;;;-1:-1:-1;;;;;10491:17:0;;;-1:-1:-1;;;;;;10491:17:0;;;;;;;10524:40;;10474:6;;;10491:17;10474:6;;10524:40;;10455:16;;10524:40;10444:128;10381:191;:::o;44498:154::-;44584:14;;44561:7;;44635:11;;44584:14;;;;;:47;;44616:15;;44584:47;;;44601:12;;44584:47;44583:63;;;;:::i;38830:315::-;38985:8;-1:-1:-1;;;;;38976:17:0;:5;-1:-1:-1;;;;;38976:17:0;;;38968:55;;;;-1:-1:-1;;;38968:55:0;;18859:2:1;38968:55:0;;;18841:21:1;18898:2;18878:18;;;18871:30;18937:27;18917:18;;;18910:55;18982:18;;38968:55:0;18657:349:1;38968:55:0;-1:-1:-1;;;;;39034:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;39034:46:0;;;;;;;;;;39096:41;;14500::1;;;39096::0;;14473:18:1;39096:41:0;;;;;;;38830:315;;;:::o;33904:::-;34061:28;34071:4;34077:2;34081:7;34061:9;:28::i;:::-;34108:48;34131:4;34137:2;34141:7;34150:5;34108:22;:48::i;:::-;34100:111;;;;-1:-1:-1;;;34100:111:0;;;;;;;:::i;43568:::-;43628:13;43657:16;43650:23;;;;;:::i;5397:723::-;5453:13;5674:10;5670:53;;-1:-1:-1;;5701:10:0;;;;;;;;;;;;-1:-1:-1;;;5701:10:0;;;;;5397:723::o;5670:53::-;5748:5;5733:12;5789:78;5796:9;;5789:78;;5822:8;;;;:::i;:::-;;-1:-1:-1;5845:10:0;;-1:-1:-1;5853:2:0;5845:10;;:::i;:::-;;;5789:78;;;5877:19;5909:6;-1:-1:-1;;;;;5899:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5899:17:0;;5877:39;;5927:154;5934:10;;5927:154;;5961:11;5971:1;5961:11;;:::i;:::-;;-1:-1:-1;6030:10:0;6038:2;6030:5;:10;:::i;:::-;6017:24;;:2;:24;:::i;:::-;6004:39;;5987:6;5994;5987:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5987:56:0;;;;;;;;-1:-1:-1;6058:11:0;6067:2;6058:11;;:::i;:::-;;;5927:154;;2598:675;2681:7;2724:4;2681:7;2739:497;2763:5;:12;2759:1;:16;2739:497;;;2797:20;2820:5;2826:1;2820:8;;;;;;;;:::i;:::-;;;;;;;2797:31;;2863:12;2847;:28;2843:382;;3349:13;3399:15;;;3435:4;3428:15;;;3482:4;3466:21;;2975:57;;2843:382;;;3349:13;3399:15;;;3435:4;3428:15;;;3482:4;3466:21;;3152:57;;2843:382;-1:-1:-1;2777:3:0;;;;:::i;:::-;;;;2739:497;;;-1:-1:-1;3253:12:0;2598:675;-1:-1:-1;;;2598:675:0:o;35853:321::-;35983:18;35989:2;35993:7;35983:5;:18::i;:::-;36034:54;36065:1;36069:2;36073:7;36082:5;36034:22;:54::i;:::-;36012:154;;;;-1:-1:-1;;;36012:154:0;;;;;;;:::i;39710:799::-;39865:4;-1:-1:-1;;;;;39886:13:0;;11722:20;11770:8;39882:620;;39922:72;;-1:-1:-1;;;39922:72:0;;-1:-1:-1;;;;;39922:36:0;;;;;:72;;7915:10;;39973:4;;39979:7;;39988:5;;39922:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39922:72:0;;;;;;;;-1:-1:-1;;39922:72:0;;;;;;;;;;;;:::i;:::-;;;39918:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40164:13:0;;40160:272;;40207:60;;-1:-1:-1;;;40207:60:0;;;;;;;:::i;40160:272::-;40382:6;40376:13;40367:6;40363:2;40359:15;40352:38;39918:529;-1:-1:-1;;;;;;40045:51:0;-1:-1:-1;;;40045:51:0;;-1:-1:-1;40038:58:0;;39882:620;-1:-1:-1;40486:4:0;39710:799;;;;;;:::o;36510:382::-;-1:-1:-1;;;;;36590:16:0;;36582:61;;;;-1:-1:-1;;;36582:61:0;;21577:2:1;36582:61:0;;;21559:21:1;;;21596:18;;;21589:30;21655:34;21635:18;;;21628:62;21707:18;;36582:61:0;21375:356:1;36582:61:0;34597:4;34621:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34621:16:0;:30;36654:58;;;;-1:-1:-1;;;36654:58:0;;18097:2:1;36654:58:0;;;18079:21:1;18136:2;18116:18;;;18109:30;18175;18155:18;;;18148:58;18223:18;;36654:58:0;17895:352:1;36654:58:0;-1:-1:-1;;;;;36783:13:0;;;;;;:9;:13;;;;;:18;;36800:1;;36783:13;:18;;36800:1;;36783:18;:::i;:::-;;;;-1:-1:-1;;36812:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36812:21:0;-1:-1:-1;;;;;36812:21:0;;;;;;;;36851:33;;36812:16;;;36851:33;;36812:16;;36851:33;36510:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:679::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:1;;603:679;-1:-1:-1;;;;;;;603:679:1:o;1287:673::-;1341:5;1394:3;1387:4;1379:6;1375:17;1371:27;1361:55;;1412:1;1409;1402:12;1361:55;1448:6;1435:20;1474:4;1498:60;1514:43;1554:2;1514:43;:::i;1498:60::-;1580:3;1604:2;1599:3;1592:15;1632:2;1627:3;1623:12;1616:19;;1667:2;1659:6;1655:15;1719:3;1714:2;1708;1705:1;1701:10;1693:6;1689:23;1685:32;1682:41;1679:61;;;1736:1;1733;1726:12;1679:61;1758:1;1768:163;1782:2;1779:1;1776:9;1768:163;;;1839:17;;1827:30;;1877:12;;;;1909;;;;1800:1;1793:9;1768:163;;1965:160;2030:20;;2086:13;;2079:21;2069:32;;2059:60;;2115:1;2112;2105:12;2130:221;2173:5;2226:3;2219:4;2211:6;2207:17;2203:27;2193:55;;2244:1;2241;2234:12;2193:55;2266:79;2341:3;2332:6;2319:20;2312:4;2304:6;2300:17;2266:79;:::i;2356:186::-;2415:6;2468:2;2456:9;2447:7;2443:23;2439:32;2436:52;;;2484:1;2481;2474:12;2436:52;2507:29;2526:9;2507:29;:::i;2547:260::-;2615:6;2623;2676:2;2664:9;2655:7;2651:23;2647:32;2644:52;;;2692:1;2689;2682:12;2644:52;2715:29;2734:9;2715:29;:::i;:::-;2705:39;;2763:38;2797:2;2786:9;2782:18;2763:38;:::i;:::-;2753:48;;2547:260;;;;;:::o;2812:328::-;2889:6;2897;2905;2958:2;2946:9;2937:7;2933:23;2929:32;2926:52;;;2974:1;2971;2964:12;2926:52;2997:29;3016:9;2997:29;:::i;:::-;2987:39;;3045:38;3079:2;3068:9;3064:18;3045:38;:::i;:::-;3035:48;;3130:2;3119:9;3115:18;3102:32;3092:42;;2812:328;;;;;:::o;3145:666::-;3240:6;3248;3256;3264;3317:3;3305:9;3296:7;3292:23;3288:33;3285:53;;;3334:1;3331;3324:12;3285:53;3357:29;3376:9;3357:29;:::i;:::-;3347:39;;3405:38;3439:2;3428:9;3424:18;3405:38;:::i;:::-;3395:48;;3490:2;3479:9;3475:18;3462:32;3452:42;;3545:2;3534:9;3530:18;3517:32;-1:-1:-1;;;;;3564:6:1;3561:30;3558:50;;;3604:1;3601;3594:12;3558:50;3627:22;;3680:4;3672:13;;3668:27;-1:-1:-1;3658:55:1;;3709:1;3706;3699:12;3658:55;3732:73;3797:7;3792:2;3779:16;3774:2;3770;3766:11;3732:73;:::i;:::-;3722:83;;;3145:666;;;;;;;:::o;3816:254::-;3881:6;3889;3942:2;3930:9;3921:7;3917:23;3913:32;3910:52;;;3958:1;3955;3948:12;3910:52;3981:29;4000:9;3981:29;:::i;:::-;3971:39;;4029:35;4060:2;4049:9;4045:18;4029:35;:::i;4075:254::-;4143:6;4151;4204:2;4192:9;4183:7;4179:23;4175:32;4172:52;;;4220:1;4217;4210:12;4172:52;4243:29;4262:9;4243:29;:::i;:::-;4233:39;4319:2;4304:18;;;;4291:32;;-1:-1:-1;;;4075:254:1:o;4334:348::-;4418:6;4471:2;4459:9;4450:7;4446:23;4442:32;4439:52;;;4487:1;4484;4477:12;4439:52;4527:9;4514:23;-1:-1:-1;;;;;4552:6:1;4549:30;4546:50;;;4592:1;4589;4582:12;4546:50;4615:61;4668:7;4659:6;4648:9;4644:22;4615:61;:::i;4687:615::-;4773:6;4781;4834:2;4822:9;4813:7;4809:23;4805:32;4802:52;;;4850:1;4847;4840:12;4802:52;4890:9;4877:23;-1:-1:-1;;;;;4960:2:1;4952:6;4949:14;4946:34;;;4976:1;4973;4966:12;4946:34;5014:6;5003:9;4999:22;4989:32;;5059:7;5052:4;5048:2;5044:13;5040:27;5030:55;;5081:1;5078;5071:12;5030:55;5121:2;5108:16;5147:2;5139:6;5136:14;5133:34;;;5163:1;5160;5153:12;5133:34;5216:7;5211:2;5201:6;5198:1;5194:14;5190:2;5186:23;5182:32;5179:45;5176:65;;;5237:1;5234;5227:12;5176:65;5268:2;5260:11;;;;;5290:6;;-1:-1:-1;4687:615:1;;-1:-1:-1;;;;4687:615:1:o;5307:1199::-;5425:6;5456:2;5499;5487:9;5478:7;5474:23;5470:32;5467:52;;;5515:1;5512;5505:12;5467:52;5555:9;5542:23;-1:-1:-1;;;;;5580:6:1;5577:30;5574:50;;;5620:1;5617;5610:12;5574:50;5643:22;;5696:4;5688:13;;5684:27;-1:-1:-1;5674:55:1;;5725:1;5722;5715:12;5674:55;5761:2;5748:16;5784:60;5800:43;5840:2;5800:43;:::i;5784:60::-;5866:3;5890:2;5885:3;5878:15;5918:2;5913:3;5909:12;5902:19;;5949:2;5945;5941:11;5997:7;5992:2;5986;5983:1;5979:10;5975:2;5971:19;5967:28;5964:41;5961:61;;;6018:1;6015;6008:12;5961:61;6040:1;6031:10;;6061:1;6071:405;6087:2;6082:3;6079:11;6071:405;;;6146:4;6189:2;6183:3;6174:7;6170:17;6166:26;6163:46;;;6205:1;6202;6195:12;6163:46;6235:22;;:::i;:::-;6284:23;6303:3;6284:23;:::i;:::-;6270:38;;6357:12;;;6344:26;6328:14;;;6321:50;6384:18;;6422:12;;;;6454;;;;6109:1;6100:11;6071:405;;;-1:-1:-1;6495:5:1;;5307:1199;-1:-1:-1;;;;;;;;5307:1199:1:o;6511:422::-;6604:6;6612;6665:2;6653:9;6644:7;6640:23;6636:32;6633:52;;;6681:1;6678;6671:12;6633:52;6721:9;6708:23;-1:-1:-1;;;;;6746:6:1;6743:30;6740:50;;;6786:1;6783;6776:12;6740:50;6809:61;6862:7;6853:6;6842:9;6838:22;6809:61;:::i;:::-;6799:71;;;6889:38;6923:2;6912:9;6908:18;6889:38;:::i;6938:180::-;6994:6;7047:2;7035:9;7026:7;7022:23;7018:32;7015:52;;;7063:1;7060;7053:12;7015:52;7086:26;7102:9;7086:26;:::i;7123:385::-;7203:6;7211;7219;7227;7280:3;7268:9;7259:7;7255:23;7251:33;7248:53;;;7297:1;7294;7287:12;7248:53;7320:26;7336:9;7320:26;:::i;:::-;7310:36;;7393:2;7382:9;7378:18;7365:32;7355:42;;7416:35;7447:2;7436:9;7432:18;7416:35;:::i;:::-;7123:385;;;;-1:-1:-1;7406:45:1;;7498:2;7483:18;7470:32;;-1:-1:-1;;7123:385:1:o;7513:245::-;7571:6;7624:2;7612:9;7603:7;7599:23;7595:32;7592:52;;;7640:1;7637;7630:12;7592:52;7679:9;7666:23;7698:30;7722:5;7698:30;:::i;7763:249::-;7832:6;7885:2;7873:9;7864:7;7860:23;7856:32;7853:52;;;7901:1;7898;7891:12;7853:52;7933:9;7927:16;7952:30;7976:5;7952:30;:::i;8017:944::-;8143:6;8151;8159;8167;8220:3;8208:9;8199:7;8195:23;8191:33;8188:53;;;8237:1;8234;8227:12;8188:53;8277:9;8264:23;-1:-1:-1;;;;;8347:2:1;8339:6;8336:14;8333:34;;;8363:1;8360;8353:12;8333:34;8386:50;8428:7;8419:6;8408:9;8404:22;8386:50;:::i;:::-;8376:60;;8489:2;8478:9;8474:18;8461:32;8445:48;;8518:2;8508:8;8505:16;8502:36;;;8534:1;8531;8524:12;8502:36;8557:52;8601:7;8590:8;8579:9;8575:24;8557:52;:::i;:::-;8547:62;;8662:2;8651:9;8647:18;8634:32;8618:48;;8691:2;8681:8;8678:16;8675:36;;;8707:1;8704;8697:12;8675:36;8730:52;8774:7;8763:8;8752:9;8748:24;8730:52;:::i;:::-;8720:62;;8835:2;8824:9;8820:18;8807:32;8791:48;;8864:2;8854:8;8851:16;8848:36;;;8880:1;8877;8870:12;8848:36;;8903:52;8947:7;8936:8;8925:9;8921:24;8903:52;:::i;8966:180::-;9025:6;9078:2;9066:9;9057:7;9053:23;9049:32;9046:52;;;9094:1;9091;9084:12;9046:52;-1:-1:-1;9117:23:1;;8966:180;-1:-1:-1;8966:180:1:o;9151:1146::-;9332:6;9340;9348;9356;9364;9372;9380;9388;9396;9404;9457:3;9445:9;9436:7;9432:23;9428:33;9425:53;;;9474:1;9471;9464:12;9425:53;9510:9;9497:23;9487:33;;9567:2;9556:9;9552:18;9539:32;9529:42;;9618:2;9607:9;9603:18;9590:32;9580:42;;9669:2;9658:9;9654:18;9641:32;9631:42;;9720:3;9709:9;9705:19;9692:33;9682:43;;9776:3;9765:9;9761:19;9748:33;-1:-1:-1;;;;;9841:2:1;9833:6;9830:14;9827:34;;;9857:1;9854;9847:12;9827:34;9880:61;9933:7;9924:6;9913:9;9909:22;9880:61;:::i;:::-;9870:71;;9994:3;9983:9;9979:19;9966:33;9950:49;;10024:2;10014:8;10011:16;10008:36;;;10040:1;10037;10030:12;10008:36;;10063:63;10118:7;10107:8;10096:9;10092:24;10063:63;:::i;:::-;10053:73;;;10145:36;10176:3;10165:9;10161:19;10145:36;:::i;:::-;10135:46;;10200:36;10231:3;10220:9;10216:19;10200:36;:::i;:::-;10190:46;;10255:36;10286:3;10275:9;10271:19;10255:36;:::i;:::-;10245:46;;9151:1146;;;;;;;;;;;;;:::o;10302:461::-;10355:3;10393:5;10387:12;10420:6;10415:3;10408:19;10446:4;10475:2;10470:3;10466:12;10459:19;;10512:2;10505:5;10501:14;10533:1;10543:195;10557:6;10554:1;10551:13;10543:195;;;10622:13;;-1:-1:-1;;;;;10618:39:1;10606:52;;10678:12;;;;10713:15;;;;10654:1;10572:9;10543:195;;;-1:-1:-1;10754:3:1;;10302:461;-1:-1:-1;;;;;10302:461:1:o;10768:435::-;10821:3;10859:5;10853:12;10886:6;10881:3;10874:19;10912:4;10941:2;10936:3;10932:12;10925:19;;10978:2;10971:5;10967:14;10999:1;11009:169;11023:6;11020:1;11017:13;11009:169;;;11084:13;;11072:26;;11118:12;;;;11153:15;;;;11045:1;11038:9;11009:169;;11208:257;11249:3;11287:5;11281:12;11314:6;11309:3;11302:19;11330:63;11386:6;11379:4;11374:3;11370:14;11363:4;11356:5;11352:16;11330:63;:::i;:::-;11447:2;11426:15;-1:-1:-1;;11422:29:1;11413:39;;;;11454:4;11409:50;;11208:257;-1:-1:-1;;11208:257:1:o;11704:637::-;11984:3;12022:6;12016:13;12038:53;12084:6;12079:3;12072:4;12064:6;12060:17;12038:53;:::i;:::-;12154:13;;12113:16;;;;12176:57;12154:13;12113:16;12210:4;12198:17;;12176:57;:::i;:::-;-1:-1:-1;;;12255:20:1;;12284:22;;;12333:1;12322:13;;11704:637;-1:-1:-1;;;;11704:637:1:o;12764:488::-;-1:-1:-1;;;;;13033:15:1;;;13015:34;;13085:15;;13080:2;13065:18;;13058:43;13132:2;13117:18;;13110:34;;;13180:3;13175:2;13160:18;;13153:31;;;12958:4;;13201:45;;13226:19;;13218:6;13201:45;:::i;:::-;13193:53;12764:488;-1:-1:-1;;;;;;12764:488:1:o;13257:832::-;13496:2;13548:21;;;13618:13;;13521:18;;;13640:22;;;13467:4;;13496:2;13681;;13699:18;;;;13740:15;;;13467:4;13783:280;13797:6;13794:1;13791:13;13783:280;;;13856:13;;13898:9;;-1:-1:-1;;;;;13894:35:1;13882:48;;13970:11;;13964:18;13950:12;;;13943:40;14003:12;;;;14038:15;;;;13926:1;13812:9;13783:280;;;-1:-1:-1;14080:3:1;;13257:832;-1:-1:-1;;;;;;;13257:832:1:o;14094:261::-;14273:2;14262:9;14255:21;14236:4;14293:56;14345:2;14334:9;14330:18;14322:6;14293:56;:::i;14552:835::-;14957:6;14950:14;14943:22;14932:9;14925:41;15002:6;14997:2;14986:9;14982:18;14975:34;15045:6;15040:2;15029:9;15025:18;15018:34;15088:6;15083:2;15072:9;15068:18;15061:34;15132:6;15126:3;15115:9;15111:19;15104:35;15176:3;15170;15159:9;15155:19;15148:32;14906:4;15203:57;15255:3;15244:9;15240:19;15232:6;15203:57;:::i;:::-;15309:9;15301:6;15297:22;15291:3;15280:9;15276:19;15269:51;15337:44;15374:6;15366;15337:44;:::i;:::-;15329:52;14552:835;-1:-1:-1;;;;;;;;;;14552:835:1:o;15392:219::-;15541:2;15530:9;15523:21;15504:4;15561:44;15601:2;15590:9;15586:18;15578:6;15561:44;:::i;15616:1033::-;16005:3;15994:9;15987:22;15968:4;16032:45;16072:3;16061:9;16057:19;16049:6;16032:45;:::i;:::-;16125:9;16117:6;16113:22;16108:2;16097:9;16093:18;16086:50;16159:32;16184:6;16176;16159:32;:::i;:::-;16145:46;;16239:9;16231:6;16227:22;16222:2;16211:9;16207:18;16200:50;16273:32;16298:6;16290;16273:32;:::i;:::-;16259:46;;16353:9;16345:6;16341:22;16336:2;16325:9;16321:18;16314:50;16387:32;16412:6;16404;16387:32;:::i;:::-;16373:46;;16468:9;16460:6;16456:22;16450:3;16439:9;16435:19;16428:51;16502:32;16527:6;16519;16502:32;:::i;:::-;16488:46;;16583:9;16575:6;16571:22;16565:3;16554:9;16550:19;16543:51;16611:32;16636:6;16628;16611:32;:::i;:::-;16603:40;15616:1033;-1:-1:-1;;;;;;;;;15616:1033:1:o;17069:414::-;17271:2;17253:21;;;17310:2;17290:18;;;17283:30;17349:34;17344:2;17329:18;;17322:62;-1:-1:-1;;;17415:2:1;17400:18;;17393:48;17473:3;17458:19;;17069:414::o;22575:356::-;22777:2;22759:21;;;22796:18;;;22789:30;22855:34;22850:2;22835:18;;22828:62;22922:2;22907:18;;22575:356::o;25699:413::-;25901:2;25883:21;;;25940:2;25920:18;;;25913:30;25979:34;25974:2;25959:18;;25952:62;-1:-1:-1;;;26045:2:1;26030:18;;26023:47;26102:3;26087:19;;25699:413::o;28287:1372::-;28821:4;28850:3;28880:6;28869:9;28862:25;28923:6;28918:2;28907:9;28903:18;28896:34;28966:6;28961:2;28950:9;28946:18;28939:34;29009:6;29004:2;28993:9;28989:18;28982:34;29053:6;29047:3;29036:9;29032:19;29025:35;29097:6;29091:3;29080:9;29076:19;29069:35;29141:2;29135:3;29124:9;29120:19;29113:31;29167:56;29219:2;29208:9;29204:18;29196:6;29167:56;:::i;:::-;29153:70;;29272:9;29264:6;29260:22;29254:3;29243:9;29239:19;29232:51;29306:44;29343:6;29335;29306:44;:::i;:::-;29292:58;;29401:6;29394:14;29387:22;29381:3;29370:9;29366:19;29359:51;29461:6;29454:14;29447:22;29441:3;29430:9;29426:19;29419:51;29521:7;29514:15;29507:23;29501:3;29490:9;29486:19;29479:52;29580:9;29572:6;29568:22;29562:3;29551:9;29547:19;29540:51;29608:45;29646:6;29637:7;29608:45;:::i;:::-;29600:53;28287:1372;-1:-1:-1;;;;;;;;;;;;;;;28287:1372:1:o;29664:257::-;29736:4;29730:11;;;29768:17;;-1:-1:-1;;;;;29800:34:1;;29836:22;;;29797:62;29794:88;;;29862:18;;:::i;:::-;29898:4;29891:24;29664:257;:::o;29926:275::-;29997:2;29991:9;30062:2;30043:13;;-1:-1:-1;;30039:27:1;30027:40;;-1:-1:-1;;;;;30082:34:1;;30118:22;;;30079:62;30076:88;;;30144:18;;:::i;:::-;30180:2;30173:22;29926:275;;-1:-1:-1;29926:275:1:o;30206:183::-;30266:4;-1:-1:-1;;;;;30291:6:1;30288:30;30285:56;;;30321:18;;:::i;:::-;-1:-1:-1;30366:1:1;30362:14;30378:4;30358:25;;30206:183::o;30394:128::-;30434:3;30465:1;30461:6;30458:1;30455:13;30452:39;;;30471:18;;:::i;:::-;-1:-1:-1;30507:9:1;;30394:128::o;30527:120::-;30567:1;30593;30583:35;;30598:18;;:::i;:::-;-1:-1:-1;30632:9:1;;30527:120::o;30652:168::-;30692:7;30758:1;30754;30750:6;30746:14;30743:1;30740:21;30735:1;30728:9;30721:17;30717:45;30714:71;;;30765:18;;:::i;:::-;-1:-1:-1;30805:9:1;;30652:168::o;30825:125::-;30865:4;30893:1;30890;30887:8;30884:34;;;30898:18;;:::i;:::-;-1:-1:-1;30935:9:1;;30825:125::o;30955:258::-;31027:1;31037:113;31051:6;31048:1;31045:13;31037:113;;;31127:11;;;31121:18;31108:11;;;31101:39;31073:2;31066:10;31037:113;;;31168:6;31165:1;31162:13;31159:48;;;-1:-1:-1;;31203:1:1;31185:16;;31178:27;30955:258::o;31218:380::-;31297:1;31293:12;;;;31340;;;31361:61;;31415:4;31407:6;31403:17;31393:27;;31361:61;31468:2;31460:6;31457:14;31437:18;31434:38;31431:161;;;31514:10;31509:3;31505:20;31502:1;31495:31;31549:4;31546:1;31539:15;31577:4;31574:1;31567:15;31431:161;;31218:380;;;:::o;31603:135::-;31642:3;-1:-1:-1;;31663:17:1;;31660:43;;;31683:18;;:::i;:::-;-1:-1:-1;31730:1:1;31719:13;;31603:135::o;31743:112::-;31775:1;31801;31791:35;;31806:18;;:::i;:::-;-1:-1:-1;31840:9:1;;31743:112::o;31860:127::-;31921:10;31916:3;31912:20;31909:1;31902:31;31952:4;31949:1;31942:15;31976:4;31973:1;31966:15;31992:127;32053:10;32048:3;32044:20;32041:1;32034:31;32084:4;32081:1;32074:15;32108:4;32105:1;32098:15;32124:127;32185:10;32180:3;32176:20;32173:1;32166:31;32216:4;32213:1;32206:15;32240:4;32237:1;32230:15;32256:127;32317:10;32312:3;32308:20;32305:1;32298:31;32348:4;32345:1;32338:15;32372:4;32369:1;32362:15;32388:131;-1:-1:-1;;;;;;32462:32:1;;32452:43;;32442:71;;32509:1;32506;32499:12

Swarm Source

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