ETH Price: $2,868.20 (-10.44%)
Gas: 14 Gwei

Token

The Shmurfs Official Collection (SHMURFS)
 

Overview

Max Total Supply

191 SHMURFS

Holders

101

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
maycforever.eth
Balance
1 SHMURFS
0x8e2f648437db509f5a62dc29d111b9fda4edd16d
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:
TheShmurfs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-14
*/

//   /$$$$$$$$ /$$                        /$$$$$$  /$$                                          /$$$$$$                 /$$$$$$   /$$$$$$   /$$$$$$  /$$           /$$           /$$        /$$$$$$            /$$ /$$                       /$$     /$$                    
//  |__  $$__/| $$                       /$$__  $$| $$                                         /$$__  $$               /$$__  $$ /$$__  $$ /$$__  $$|__/          |__/          | $$       /$$__  $$          | $$| $$                      | $$    |__/                    
//     | $$   | $$$$$$$   /$$$$$$       | $$  \__/| $$$$$$$  /$$$$$$/$$$$  /$$   /$$  /$$$$$$ | $$  \__//$$$$$$$      | $$  \ $$| $$  \__/| $$  \__/ /$$  /$$$$$$$ /$$  /$$$$$$ | $$      | $$  \__/  /$$$$$$ | $$| $$  /$$$$$$   /$$$$$$$ /$$$$$$   /$$  /$$$$$$  /$$$$$$$ 
//     | $$   | $$__  $$ /$$__  $$      |  $$$$$$ | $$__  $$| $$_  $$_  $$| $$  | $$ /$$__  $$| $$$$   /$$_____/      | $$  | $$| $$$$    | $$$$    | $$ /$$_____/| $$ |____  $$| $$      | $$       /$$__  $$| $$| $$ /$$__  $$ /$$_____/|_  $$_/  | $$ /$$__  $$| $$__  $$
//     | $$   | $$  \ $$| $$$$$$$$       \____  $$| $$  \ $$| $$ \ $$ \ $$| $$  | $$| $$  \__/| $$_/  |  $$$$$$       | $$  | $$| $$_/    | $$_/    | $$| $$      | $$  /$$$$$$$| $$      | $$      | $$  \ $$| $$| $$| $$$$$$$$| $$        | $$    | $$| $$  \ $$| $$  \ $$
//     | $$   | $$  | $$| $$_____/       /$$  \ $$| $$  | $$| $$ | $$ | $$| $$  | $$| $$      | $$     \____  $$      | $$  | $$| $$      | $$      | $$| $$      | $$ /$$__  $$| $$      | $$    $$| $$  | $$| $$| $$| $$_____/| $$        | $$ /$$| $$| $$  | $$| $$  | $$
//     | $$   | $$  | $$|  $$$$$$$      |  $$$$$$/| $$  | $$| $$ | $$ | $$|  $$$$$$/| $$      | $$     /$$$$$$$/      |  $$$$$$/| $$      | $$      | $$|  $$$$$$$| $$|  $$$$$$$| $$      |  $$$$$$/|  $$$$$$/| $$| $$|  $$$$$$$|  $$$$$$$  |  $$$$/| $$|  $$$$$$/| $$  | $$
//     |__/   |__/  |__/ \_______/       \______/ |__/  |__/|__/ |__/ |__/ \______/ |__/      |__/    |_______/        \______/ |__/      |__/      |__/ \_______/|__/ \_______/|__/       \______/  \______/ |__/|__/ \_______/ \_______/   \___/  |__/ \______/ |__/  |__/
//
//    The Shmurfs are a collection of 1,000, 3D amazing PFP NFT's that offer real long term value!
//    This value proposition includes merchandise, Tokenomics and series 2 value by way of our $SHMURF Tokens and much more! 
//
//

// File: @openzeppelin\contracts\utils\Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin\contracts\access\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\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\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\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\token\ERC721\extensions\IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin\contracts\utils\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\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\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: contracts\ERC721A.sol
// Creator: Chiru Labs

pragma solidity ^0.8.4;







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

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

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

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

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

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

// File: contracts\TheShmurfs.sol

pragma solidity ^0.8.4;


contract TheShmurfs is Ownable, ERC721A {

  enum Step {
    Inactive,
    WhitelistSale,
    PublicSale
  }

  Step public sellingStep;

  string private baseURI;
  string private unrevealedImageURL;
  bool private revealed;

  uint public MAX_SUPPLY          = 1000;
  uint private constant PRICE_WHITELIST     = 0.08 ether;
  uint private constant PRICE_PUBLIC        = 0.09 ether;
  uint private constant MAX_WHITELIST_BATCH = 3;

  address private fundWallet    = payable(0xe8a18cD415e54A99FCd2d89F52434dd8259926fb); // Owner Fund Wallet Address
  address private devOneWallet  = payable(0x083f8CDfE40BB7Db756A9BF2C6b4Ad18d64Ca4d7); // Developer Wallet Address

  mapping(address => uint8) private whitelistBuyList;

  constructor() ERC721A("The Shmurfs Official Collection", "SHMURFS") {
    sellingStep = Step.Inactive;
    revealed = false;
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }

  modifier whitelistSaleIsOpen() {
    require(sellingStep == Step.WhitelistSale, "Whitelist Sale is not activated");
    _;
  }

  modifier publicSaleIsOpen() {
    require(sellingStep == Step.PublicSale, "Public Sale is not activated");
    _;
  }

  function whitelistMint(uint8 quantity) external payable callerIsUser whitelistSaleIsOpen {
    require(totalSupply() < MAX_SUPPLY, "WHITELIST_SALE: Please go to the Opensea to buy The Shmurfs.");
    require(totalSupply() + quantity <= MAX_SUPPLY, "WHITELIST_SALE: Max supply exceeded");
    require(whitelistBuyList[msg.sender] + quantity <= MAX_WHITELIST_BATCH, "WHITELIST_SALE: You can not get more than 3 NFTs on the Whitelist Sale");
    require(msg.value >= PRICE_WHITELIST * quantity, "WHITELIST_SALE: Not enough funds");

    whitelistBuyList[msg.sender] += quantity;
    _safeMint(msg.sender, quantity);

    refundIfOver(PRICE_WHITELIST * quantity);
  }

  function publicSaleMint(uint8 quantity) external payable callerIsUser publicSaleIsOpen{
    require(totalSupply() < MAX_SUPPLY, "PUBLIC_SALE: Please go to the Opensea to buy The Shmurfs.");
    require(totalSupply() + quantity <= MAX_SUPPLY, "PUBLIC_SALE: Max supply exceeded");
    require(msg.value >= PRICE_PUBLIC * quantity, "WHITELIST_SALE: Not enough funds");

    _safeMint(msg.sender, quantity);
    refundIfOver(PRICE_PUBLIC * quantity);
  }

  function setStepAsInactive() external onlyOwner {
    sellingStep = Step.Inactive;
  }

  function setStepAsWhitelistSale() external onlyOwner {
    sellingStep = Step.WhitelistSale;
  }

  function setStepAsPublicSale() external onlyOwner {
    sellingStep = Step.PublicSale;
  }

  function setMaxSupply(uint max_) external onlyOwner {
    MAX_SUPPLY = max_;
  }
  
  // metadata URI
  function setUnrevealedImageURL(string calldata _imageURL) external onlyOwner {
    unrevealedImageURL = _imageURL;
  }

  function setRevealed(bool _reveal) external onlyOwner {
    revealed = _reveal;
  }

  function setBaseURI(string calldata _baseuri) external onlyOwner {
    baseURI = _baseuri;
  }

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

  function tokenURI(uint _tokenId) public view override returns (string memory) {
    require(_exists(_tokenId), "URI query for nonexistent token");

    if (revealed)
      return super.tokenURI(_tokenId);
    else
      return unrevealedImageURL;
  }

  // fund
  function withdrawAll() external onlyOwner {
    uint totalBalance = address(this).balance;
    require(totalBalance > 0, "WITHDRAW: No balance in contract");

    uint devOneBalance = totalBalance / 10; // 10% of total sale
    uint ownerBalance = totalBalance - devOneBalance; // 90% of total sale

    _withdraw(devOneWallet, devOneBalance);
    _withdraw(fundWallet, ownerBalance);
  }

  function _withdraw(address _address, uint _amount) private {
    (bool success, ) = _address.call{value: _amount}("");

    require(success, "WITHDRAW: Transfer failed.");
  }

  function refundIfOver(uint price) private {
    require(msg.value >= price, "Need to send more ETH.");

    if (msg.value > price) {
      payable(msg.sender).transfer(msg.value - price);
    }
  }

  function getPrice() public view returns (uint) {
    require(sellingStep != Step.Inactive, "Sale not activated");
    if (sellingStep == Step.PublicSale)
      return PRICE_PUBLIC;
    else
      return PRICE_WHITELIST;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"quantity","type":"uint8"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellingStep","outputs":[{"internalType":"enum TheShmurfs.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStepAsInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStepAsPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStepAsWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageURL","type":"string"}],"name":"setUnrevealedImageURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":[{"internalType":"uint8","name":"quantity","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e8600d5573e8a18cd415e54a99fcd2d89f52434dd8259926fb600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073083f8cdfe40bb7db756a9bf2c6b4ad18d64ca4d7600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000c157600080fd5b506040518060400160405280601f81526020017f5468652053686d75726673204f6666696369616c20436f6c6c656374696f6e008152506040518060400160405280600781526020017f53484d55524653000000000000000000000000000000000000000000000000008152506200014e62000142620001e760201b60201c565b620001ef60201b60201c565b816003908051906020019062000166929190620002b8565b5080600490805190602001906200017f929190620002b8565b5062000190620002b360201b60201c565b60018190555050506000600960006101000a81548160ff02191690836002811115620001c157620001c06200039e565b5b02179055506000600c60006101000a81548160ff021916908315150217905550620003fc565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002c69062000368565b90600052602060002090601f016020900481019282620002ea576000855562000336565b82601f106200030557805160ff191683800117855562000336565b8280016001018555821562000336579182015b828111156200033557825182559160200191906001019062000318565b5b50905062000345919062000349565b5090565b5b80821115620003645760008160009055506001016200034a565b5090565b600060028204905060018216806200038157607f821691505b60208210811415620003985762000397620003cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6143b0806200040c6000396000f3fe6080604052600436106101cd5760003560e01c80638d9ce5e1116100f7578063b8919df311610095578063e0a8085311610064578063e0a808531461060c578063e985e9c514610635578063f09351e614610672578063f2fde38b14610689576101cd565b8063b8919df314610571578063c76df80e14610588578063c87b56dd146105a4578063cbccefb2146105e1576101cd565b806395d89b41116100d157806395d89b41146104c957806398d5fdca146104f4578063a22cb4651461051f578063b88d4fde14610548576101cd565b80638d9ce5e11461045e5780638da5cb5b1461048757806390caedae146104b2576101cd565b806342842e0e1161016f5780636f8b44b01161013e5780636f8b44b0146103ca57806370a08231146103f3578063715018a614610430578063853828b614610447576101cd565b806342842e0e1461031f57806355f804b31461034857806360e85cde146103715780636352211e1461038d576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb57806332cb6b0c146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613338565b6106b2565b604051610206919061380b565b60405180910390f35b34801561021b57600080fd5b50610224610794565b6040516102319190613841565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906133df565b610826565b60405161026e91906137a4565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906132cb565b6108a2565b005b3480156102ac57600080fd5b506102b56109ad565b6040516102c29190613a63565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906131b5565b6109c4565b005b34801561030057600080fd5b506103096109d4565b6040516103169190613a63565b60405180910390f35b34801561032b57600080fd5b50610346600480360381019061034191906131b5565b6109da565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613392565b6109fa565b005b61038b6004803603810190610386919061340c565b610a8c565b005b34801561039957600080fd5b506103b460048036038101906103af91906133df565b610dae565b6040516103c191906137a4565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906133df565b610dc4565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190613148565b610e4a565b6040516104279190613a63565b60405180910390f35b34801561043c57600080fd5b50610445610f1a565b005b34801561045357600080fd5b5061045c610fa2565b005b34801561046a57600080fd5b5061048560048036038101906104809190613392565b6110e4565b005b34801561049357600080fd5b5061049c611176565b6040516104a991906137a4565b60405180910390f35b3480156104be57600080fd5b506104c761119f565b005b3480156104d557600080fd5b506104de611248565b6040516104eb9190613841565b60405180910390f35b34801561050057600080fd5b506105096112da565b6040516105169190613a63565b60405180910390f35b34801561052b57600080fd5b506105466004803603810190610541919061328b565b6113ac565b005b34801561055457600080fd5b5061056f600480360381019061056a9190613208565b611524565b005b34801561057d57600080fd5b506105866115a0565b005b6105a2600480360381019061059d919061340c565b611649565b005b3480156105b057600080fd5b506105cb60048036038101906105c691906133df565b611859565b6040516105d89190613841565b60405180910390f35b3480156105ed57600080fd5b506105f661195b565b6040516106039190613826565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e919061330b565b61196e565b005b34801561064157600080fd5b5061065c60048036038101906106579190613175565b611a07565b604051610669919061380b565b60405180910390f35b34801561067e57600080fd5b50610687611a9b565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613148565b611b44565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078d575061078c82611c3c565b5b9050919050565b6060600380546107a390613d56565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf90613d56565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b600061083182611ca6565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad82610dae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610915576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610934611cf4565b73ffffffffffffffffffffffffffffffffffffffff161415801561096657506109648161095f611cf4565b611a07565b155b1561099d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109a8838383611cfc565b505050565b60006109b7611dae565b6002546001540303905090565b6109cf838383611db3565b505050565b600d5481565b6109f583838360405180602001604052806000815250611524565b505050565b610a02611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610a20611176565b73ffffffffffffffffffffffffffffffffffffffff1614610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90613983565b60405180910390fd5b8181600a9190610a87929190612f1e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613923565b60405180910390fd5b60016002811115610b0e57610b0d613e91565b5b600960009054906101000a900460ff166002811115610b3057610b2f613e91565b5b14610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790613a23565b60405180910390fd5b600d54610b7b6109ad565b10610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb2906139a3565b60405180910390fd5b600d548160ff16610bca6109ad565b610bd49190613b22565b1115610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90613943565b60405180910390fd5b600381601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c6f9190613b78565b60ff161115610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613a43565b60405180910390fd5b8060ff1667011c37937e080000610cca9190613be0565b341015610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d03906138c3565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16610d679190613b78565b92506101000a81548160ff021916908360ff160217905550610d8c338260ff16612269565b610dab8160ff1667011c37937e080000610da69190613be0565b612287565b50565b6000610db982612328565b600001519050919050565b610dcc611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610dea611176565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613983565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f22611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610f40611176565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613983565b60405180910390fd5b610fa060006125b7565b565b610faa611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610fc8611176565b73ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590613983565b60405180910390fd5b600047905060008111611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d906139c3565b60405180910390fd5b6000600a826110759190613baf565b9050600081836110859190613c3a565b90506110b3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361267b565b6110df600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261267b565b505050565b6110ec611cf4565b73ffffffffffffffffffffffffffffffffffffffff1661110a611176565b73ffffffffffffffffffffffffffffffffffffffff1614611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613983565b60405180910390fd5b8181600b9190611171929190612f1e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111a7611cf4565b73ffffffffffffffffffffffffffffffffffffffff166111c5611176565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613983565b60405180910390fd5b6002600960006101000a81548160ff0219169083600281111561124157611240613e91565b5b0217905550565b60606004805461125790613d56565b80601f016020809104026020016040519081016040528092919081815260200182805461128390613d56565b80156112d05780601f106112a5576101008083540402835291602001916112d0565b820191906000526020600020905b8154815290600101906020018083116112b357829003601f168201915b5050505050905090565b60008060028111156112ef576112ee613e91565b5b600960009054906101000a900460ff16600281111561131157611310613e91565b5b1415611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990613a03565b60405180910390fd5b60028081111561136557611364613e91565b5b600960009054906101000a900460ff16600281111561138757611386613e91565b5b141561139d5767013fbe85edc9000090506113a9565b67011c37937e08000090505b90565b6113b4611cf4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611419576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611426611cf4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114d3611cf4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611518919061380b565b60405180910390a35050565b61152f848484611db3565b61154e8373ffffffffffffffffffffffffffffffffffffffff1661272c565b801561156357506115618484848461273f565b155b1561159a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6115a8611cf4565b73ffffffffffffffffffffffffffffffffffffffff166115c6611176565b73ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390613983565b60405180910390fd5b6001600960006101000a81548160ff0219169083600281111561164257611641613e91565b5b0217905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613923565b60405180910390fd5b6002808111156116ca576116c9613e91565b5b600960009054906101000a900460ff1660028111156116ec576116eb613e91565b5b1461172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613903565b60405180910390fd5b600d546117376109ad565b10611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e906138e3565b60405180910390fd5b600d548160ff166117866109ad565b6117909190613b22565b11156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613963565b60405180910390fd5b8060ff1667013fbe85edc900006117e89190613be0565b34101561182a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611821906138c3565b60405180910390fd5b611837338260ff16612269565b6118568160ff1667013fbe85edc900006118519190613be0565b612287565b50565b606061186482611ca6565b6118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90613863565b60405180910390fd5b600c60009054906101000a900460ff16156118c8576118c18261289f565b9050611956565b600b80546118d590613d56565b80601f016020809104026020016040519081016040528092919081815260200182805461190190613d56565b801561194e5780601f106119235761010080835404028352916020019161194e565b820191906000526020600020905b81548152906001019060200180831161193157829003601f168201915b505050505090505b919050565b600960009054906101000a900460ff1681565b611976611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611994611176565b73ffffffffffffffffffffffffffffffffffffffff16146119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190613983565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aa3611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611ac1611176565b73ffffffffffffffffffffffffffffffffffffffff1614611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e90613983565b60405180910390fd5b6000600960006101000a81548160ff02191690836002811115611b3d57611b3c613e91565b5b0217905550565b611b4c611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611b6a611176565b73ffffffffffffffffffffffffffffffffffffffff1614611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790613983565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613883565b60405180910390fd5b611c39816125b7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611cb1611dae565b11158015611cc0575060015482105b8015611ced575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611dbe82612328565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e4a611cf4565b73ffffffffffffffffffffffffffffffffffffffff161480611e795750611e7885611e73611cf4565b611a07565b5b80611ebe5750611e87611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611ea684610826565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ef7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f5e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f6b858585600161293e565b611f7760008487611cfc565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121f75760015482146121f657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122628585856001612944565b5050505050565b61228382826040518060200160405280600081525061294a565b5050565b803410156122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c1906139e3565b60405180910390fd5b80341115612325573373ffffffffffffffffffffffffffffffffffffffff166108fc82346122f89190613c3a565b9081150290604051600060405180830381858888f19350505050158015612323573d6000803e3d6000fd5b505b50565b612330612fa4565b60008290508061233e611dae565b1115801561234d575060015481105b15612580576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161257e57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124625780925050506125b2565b5b60011561257d57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125785780925050506125b2565b612463565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126a19061378f565b60006040518083038185875af1925050503d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b5050905080612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e906138a3565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612765611cf4565b8786866040518563ffffffff1660e01b815260040161278794939291906137bf565b602060405180830381600087803b1580156127a157600080fd5b505af19250505080156127d257506040513d601f19601f820116820180604052508101906127cf9190613365565b60015b61284c573d8060008114612802576040519150601f19603f3d011682016040523d82523d6000602084013e612807565b606091505b50600081511415612844576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606128aa82611ca6565b6128e0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128ea61295c565b905060008151141561290b5760405180602001604052806000815250612936565b80612915846129ee565b60405160200161292692919061376b565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6129578383836001612b4f565b505050565b6060600a805461296b90613d56565b80601f016020809104026020016040519081016040528092919081815260200182805461299790613d56565b80156129e45780601f106129b9576101008083540402835291602001916129e4565b820191906000526020600020905b8154815290600101906020018083116129c757829003601f168201915b5050505050905090565b60606000821415612a36576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b4a565b600082905060005b60008214612a68578080612a5190613db9565b915050600a82612a619190613baf565b9150612a3e565b60008167ffffffffffffffff811115612a8457612a83613f1e565b5b6040519080825280601f01601f191660200182016040528015612ab65781602001600182028036833780820191505090505b5090505b60008514612b4357600182612acf9190613c3a565b9150600a85612ade9190613e02565b6030612aea9190613b22565b60f81b818381518110612b0057612aff613eef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3c9190613baf565b9450612aba565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612bbd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612bf8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c05600086838761293e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612dcf5750612dce8773ffffffffffffffffffffffffffffffffffffffff1661272c565b5b15612e95575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e44600088848060010195508861273f565b612e7a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612dd5578260015414612e9057600080fd5b612f01565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612e96575b816001819055505050612f176000868387612944565b5050505050565b828054612f2a90613d56565b90600052602060002090601f016020900481019282612f4c5760008555612f93565b82601f10612f6557803560ff1916838001178555612f93565b82800160010185558215612f93579182015b82811115612f92578235825591602001919060010190612f77565b5b509050612fa09190612fe7565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613000576000816000905550600101612fe8565b5090565b600061301761301284613aa3565b613a7e565b90508281526020810184848401111561303357613032613f5c565b5b61303e848285613d14565b509392505050565b60008135905061305581614307565b92915050565b60008135905061306a8161431e565b92915050565b60008135905061307f81614335565b92915050565b60008151905061309481614335565b92915050565b600082601f8301126130af576130ae613f52565b5b81356130bf848260208601613004565b91505092915050565b60008083601f8401126130de576130dd613f52565b5b8235905067ffffffffffffffff8111156130fb576130fa613f4d565b5b60208301915083600182028301111561311757613116613f57565b5b9250929050565b60008135905061312d8161434c565b92915050565b60008135905061314281614363565b92915050565b60006020828403121561315e5761315d613f66565b5b600061316c84828501613046565b91505092915050565b6000806040838503121561318c5761318b613f66565b5b600061319a85828601613046565b92505060206131ab85828601613046565b9150509250929050565b6000806000606084860312156131ce576131cd613f66565b5b60006131dc86828701613046565b93505060206131ed86828701613046565b92505060406131fe8682870161311e565b9150509250925092565b6000806000806080858703121561322257613221613f66565b5b600061323087828801613046565b945050602061324187828801613046565b93505060406132528782880161311e565b925050606085013567ffffffffffffffff81111561327357613272613f61565b5b61327f8782880161309a565b91505092959194509250565b600080604083850312156132a2576132a1613f66565b5b60006132b085828601613046565b92505060206132c18582860161305b565b9150509250929050565b600080604083850312156132e2576132e1613f66565b5b60006132f085828601613046565b92505060206133018582860161311e565b9150509250929050565b60006020828403121561332157613320613f66565b5b600061332f8482850161305b565b91505092915050565b60006020828403121561334e5761334d613f66565b5b600061335c84828501613070565b91505092915050565b60006020828403121561337b5761337a613f66565b5b600061338984828501613085565b91505092915050565b600080602083850312156133a9576133a8613f66565b5b600083013567ffffffffffffffff8111156133c7576133c6613f61565b5b6133d3858286016130c8565b92509250509250929050565b6000602082840312156133f5576133f4613f66565b5b60006134038482850161311e565b91505092915050565b60006020828403121561342257613421613f66565b5b600061343084828501613133565b91505092915050565b61344281613c6e565b82525050565b61345181613c80565b82525050565b600061346282613ad4565b61346c8185613aea565b935061347c818560208601613d23565b61348581613f6b565b840191505092915050565b61349981613d02565b82525050565b60006134aa82613adf565b6134b48185613b06565b93506134c4818560208601613d23565b6134cd81613f6b565b840191505092915050565b60006134e382613adf565b6134ed8185613b17565b93506134fd818560208601613d23565b80840191505092915050565b6000613516601f83613b06565b915061352182613f7c565b602082019050919050565b6000613539602683613b06565b915061354482613fa5565b604082019050919050565b600061355c601a83613b06565b915061356782613ff4565b602082019050919050565b600061357f602083613b06565b915061358a8261401d565b602082019050919050565b60006135a2603983613b06565b91506135ad82614046565b604082019050919050565b60006135c5601c83613b06565b91506135d082614095565b602082019050919050565b60006135e8601e83613b06565b91506135f3826140be565b602082019050919050565b600061360b602383613b06565b9150613616826140e7565b604082019050919050565b600061362e602083613b06565b915061363982614136565b602082019050919050565b6000613651602083613b06565b915061365c8261415f565b602082019050919050565b6000613674603c83613b06565b915061367f82614188565b604082019050919050565b6000613697602083613b06565b91506136a2826141d7565b602082019050919050565b60006136ba600083613afb565b91506136c582614200565b600082019050919050565b60006136dd601683613b06565b91506136e882614203565b602082019050919050565b6000613700601283613b06565b915061370b8261422c565b602082019050919050565b6000613723601f83613b06565b915061372e82614255565b602082019050919050565b6000613746604683613b06565b91506137518261427e565b606082019050919050565b61376581613ceb565b82525050565b600061377782856134d8565b915061378382846134d8565b91508190509392505050565b600061379a826136ad565b9150819050919050565b60006020820190506137b96000830184613439565b92915050565b60006080820190506137d46000830187613439565b6137e16020830186613439565b6137ee604083018561375c565b81810360608301526138008184613457565b905095945050505050565b60006020820190506138206000830184613448565b92915050565b600060208201905061383b6000830184613490565b92915050565b6000602082019050818103600083015261385b818461349f565b905092915050565b6000602082019050818103600083015261387c81613509565b9050919050565b6000602082019050818103600083015261389c8161352c565b9050919050565b600060208201905081810360008301526138bc8161354f565b9050919050565b600060208201905081810360008301526138dc81613572565b9050919050565b600060208201905081810360008301526138fc81613595565b9050919050565b6000602082019050818103600083015261391c816135b8565b9050919050565b6000602082019050818103600083015261393c816135db565b9050919050565b6000602082019050818103600083015261395c816135fe565b9050919050565b6000602082019050818103600083015261397c81613621565b9050919050565b6000602082019050818103600083015261399c81613644565b9050919050565b600060208201905081810360008301526139bc81613667565b9050919050565b600060208201905081810360008301526139dc8161368a565b9050919050565b600060208201905081810360008301526139fc816136d0565b9050919050565b60006020820190508181036000830152613a1c816136f3565b9050919050565b60006020820190508181036000830152613a3c81613716565b9050919050565b60006020820190508181036000830152613a5c81613739565b9050919050565b6000602082019050613a78600083018461375c565b92915050565b6000613a88613a99565b9050613a948282613d88565b919050565b6000604051905090565b600067ffffffffffffffff821115613abe57613abd613f1e565b5b613ac782613f6b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b2d82613ceb565b9150613b3883613ceb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b6d57613b6c613e33565b5b828201905092915050565b6000613b8382613cf5565b9150613b8e83613cf5565b92508260ff03821115613ba457613ba3613e33565b5b828201905092915050565b6000613bba82613ceb565b9150613bc583613ceb565b925082613bd557613bd4613e62565b5b828204905092915050565b6000613beb82613ceb565b9150613bf683613ceb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c2f57613c2e613e33565b5b828202905092915050565b6000613c4582613ceb565b9150613c5083613ceb565b925082821015613c6357613c62613e33565b5b828203905092915050565b6000613c7982613ccb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613cc6826142f3565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613d0d82613cb8565b9050919050565b82818337600083830152505050565b60005b83811015613d41578082015181840152602081019050613d26565b83811115613d50576000848401525b50505050565b60006002820490506001821680613d6e57607f821691505b60208210811415613d8257613d81613ec0565b5b50919050565b613d9182613f6b565b810181811067ffffffffffffffff82111715613db057613daf613f1e565b5b80604052505050565b6000613dc482613ceb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613df757613df6613e33565b5b600182019050919050565b6000613e0d82613ceb565b9150613e1883613ceb565b925082613e2857613e27613e62565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57495448445241573a205472616e73666572206661696c65642e000000000000600082015250565b7f57484954454c4953545f53414c453a204e6f7420656e6f7567682066756e6473600082015250565b7f5055424c49435f53414c453a20506c6561736520676f20746f20746865204f7060008201527f656e73656120746f20627579205468652053686d757266732e00000000000000602082015250565b7f5075626c69632053616c65206973206e6f742061637469766174656400000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f57484954454c4953545f53414c453a204d617820737570706c7920657863656560008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b7f5055424c49435f53414c453a204d617820737570706c79206578636565646564600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f57484954454c4953545f53414c453a20506c6561736520676f20746f2074686560008201527f204f70656e73656120746f20627579205468652053686d757266732e00000000602082015250565b7f57495448445241573a204e6f2062616c616e636520696e20636f6e7472616374600082015250565b50565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f53616c65206e6f74206163746976617465640000000000000000000000000000600082015250565b7f57686974656c6973742053616c65206973206e6f742061637469766174656400600082015250565b7f57484954454c4953545f53414c453a20596f752063616e206e6f74206765742060008201527f6d6f7265207468616e2033204e465473206f6e207468652057686974656c697360208201527f742053616c650000000000000000000000000000000000000000000000000000604082015250565b6003811061430457614303613e91565b5b50565b61431081613c6e565b811461431b57600080fd5b50565b61432781613c80565b811461433257600080fd5b50565b61433e81613c8c565b811461434957600080fd5b50565b61435581613ceb565b811461436057600080fd5b50565b61436c81613cf5565b811461437757600080fd5b5056fea264697066735822122014b19099b7957356efe9a7efda20e222f53e25aedb9dd0c0e4e37065bb5d7f2c64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638d9ce5e1116100f7578063b8919df311610095578063e0a8085311610064578063e0a808531461060c578063e985e9c514610635578063f09351e614610672578063f2fde38b14610689576101cd565b8063b8919df314610571578063c76df80e14610588578063c87b56dd146105a4578063cbccefb2146105e1576101cd565b806395d89b41116100d157806395d89b41146104c957806398d5fdca146104f4578063a22cb4651461051f578063b88d4fde14610548576101cd565b80638d9ce5e11461045e5780638da5cb5b1461048757806390caedae146104b2576101cd565b806342842e0e1161016f5780636f8b44b01161013e5780636f8b44b0146103ca57806370a08231146103f3578063715018a614610430578063853828b614610447576101cd565b806342842e0e1461031f57806355f804b31461034857806360e85cde146103715780636352211e1461038d576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb57806332cb6b0c146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613338565b6106b2565b604051610206919061380b565b60405180910390f35b34801561021b57600080fd5b50610224610794565b6040516102319190613841565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906133df565b610826565b60405161026e91906137a4565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906132cb565b6108a2565b005b3480156102ac57600080fd5b506102b56109ad565b6040516102c29190613a63565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906131b5565b6109c4565b005b34801561030057600080fd5b506103096109d4565b6040516103169190613a63565b60405180910390f35b34801561032b57600080fd5b50610346600480360381019061034191906131b5565b6109da565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613392565b6109fa565b005b61038b6004803603810190610386919061340c565b610a8c565b005b34801561039957600080fd5b506103b460048036038101906103af91906133df565b610dae565b6040516103c191906137a4565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906133df565b610dc4565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190613148565b610e4a565b6040516104279190613a63565b60405180910390f35b34801561043c57600080fd5b50610445610f1a565b005b34801561045357600080fd5b5061045c610fa2565b005b34801561046a57600080fd5b5061048560048036038101906104809190613392565b6110e4565b005b34801561049357600080fd5b5061049c611176565b6040516104a991906137a4565b60405180910390f35b3480156104be57600080fd5b506104c761119f565b005b3480156104d557600080fd5b506104de611248565b6040516104eb9190613841565b60405180910390f35b34801561050057600080fd5b506105096112da565b6040516105169190613a63565b60405180910390f35b34801561052b57600080fd5b506105466004803603810190610541919061328b565b6113ac565b005b34801561055457600080fd5b5061056f600480360381019061056a9190613208565b611524565b005b34801561057d57600080fd5b506105866115a0565b005b6105a2600480360381019061059d919061340c565b611649565b005b3480156105b057600080fd5b506105cb60048036038101906105c691906133df565b611859565b6040516105d89190613841565b60405180910390f35b3480156105ed57600080fd5b506105f661195b565b6040516106039190613826565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e919061330b565b61196e565b005b34801561064157600080fd5b5061065c60048036038101906106579190613175565b611a07565b604051610669919061380b565b60405180910390f35b34801561067e57600080fd5b50610687611a9b565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613148565b611b44565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078d575061078c82611c3c565b5b9050919050565b6060600380546107a390613d56565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf90613d56565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b600061083182611ca6565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad82610dae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610915576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610934611cf4565b73ffffffffffffffffffffffffffffffffffffffff161415801561096657506109648161095f611cf4565b611a07565b155b1561099d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109a8838383611cfc565b505050565b60006109b7611dae565b6002546001540303905090565b6109cf838383611db3565b505050565b600d5481565b6109f583838360405180602001604052806000815250611524565b505050565b610a02611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610a20611176565b73ffffffffffffffffffffffffffffffffffffffff1614610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90613983565b60405180910390fd5b8181600a9190610a87929190612f1e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613923565b60405180910390fd5b60016002811115610b0e57610b0d613e91565b5b600960009054906101000a900460ff166002811115610b3057610b2f613e91565b5b14610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790613a23565b60405180910390fd5b600d54610b7b6109ad565b10610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb2906139a3565b60405180910390fd5b600d548160ff16610bca6109ad565b610bd49190613b22565b1115610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90613943565b60405180910390fd5b600381601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c6f9190613b78565b60ff161115610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613a43565b60405180910390fd5b8060ff1667011c37937e080000610cca9190613be0565b341015610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d03906138c3565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16610d679190613b78565b92506101000a81548160ff021916908360ff160217905550610d8c338260ff16612269565b610dab8160ff1667011c37937e080000610da69190613be0565b612287565b50565b6000610db982612328565b600001519050919050565b610dcc611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610dea611176565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613983565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f22611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610f40611176565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90613983565b60405180910390fd5b610fa060006125b7565b565b610faa611cf4565b73ffffffffffffffffffffffffffffffffffffffff16610fc8611176565b73ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590613983565b60405180910390fd5b600047905060008111611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d906139c3565b60405180910390fd5b6000600a826110759190613baf565b9050600081836110859190613c3a565b90506110b3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361267b565b6110df600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261267b565b505050565b6110ec611cf4565b73ffffffffffffffffffffffffffffffffffffffff1661110a611176565b73ffffffffffffffffffffffffffffffffffffffff1614611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613983565b60405180910390fd5b8181600b9190611171929190612f1e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111a7611cf4565b73ffffffffffffffffffffffffffffffffffffffff166111c5611176565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613983565b60405180910390fd5b6002600960006101000a81548160ff0219169083600281111561124157611240613e91565b5b0217905550565b60606004805461125790613d56565b80601f016020809104026020016040519081016040528092919081815260200182805461128390613d56565b80156112d05780601f106112a5576101008083540402835291602001916112d0565b820191906000526020600020905b8154815290600101906020018083116112b357829003601f168201915b5050505050905090565b60008060028111156112ef576112ee613e91565b5b600960009054906101000a900460ff16600281111561131157611310613e91565b5b1415611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990613a03565b60405180910390fd5b60028081111561136557611364613e91565b5b600960009054906101000a900460ff16600281111561138757611386613e91565b5b141561139d5767013fbe85edc9000090506113a9565b67011c37937e08000090505b90565b6113b4611cf4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611419576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611426611cf4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114d3611cf4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611518919061380b565b60405180910390a35050565b61152f848484611db3565b61154e8373ffffffffffffffffffffffffffffffffffffffff1661272c565b801561156357506115618484848461273f565b155b1561159a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6115a8611cf4565b73ffffffffffffffffffffffffffffffffffffffff166115c6611176565b73ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390613983565b60405180910390fd5b6001600960006101000a81548160ff0219169083600281111561164257611641613e91565b5b0217905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613923565b60405180910390fd5b6002808111156116ca576116c9613e91565b5b600960009054906101000a900460ff1660028111156116ec576116eb613e91565b5b1461172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613903565b60405180910390fd5b600d546117376109ad565b10611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e906138e3565b60405180910390fd5b600d548160ff166117866109ad565b6117909190613b22565b11156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613963565b60405180910390fd5b8060ff1667013fbe85edc900006117e89190613be0565b34101561182a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611821906138c3565b60405180910390fd5b611837338260ff16612269565b6118568160ff1667013fbe85edc900006118519190613be0565b612287565b50565b606061186482611ca6565b6118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a90613863565b60405180910390fd5b600c60009054906101000a900460ff16156118c8576118c18261289f565b9050611956565b600b80546118d590613d56565b80601f016020809104026020016040519081016040528092919081815260200182805461190190613d56565b801561194e5780601f106119235761010080835404028352916020019161194e565b820191906000526020600020905b81548152906001019060200180831161193157829003601f168201915b505050505090505b919050565b600960009054906101000a900460ff1681565b611976611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611994611176565b73ffffffffffffffffffffffffffffffffffffffff16146119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190613983565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aa3611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611ac1611176565b73ffffffffffffffffffffffffffffffffffffffff1614611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e90613983565b60405180910390fd5b6000600960006101000a81548160ff02191690836002811115611b3d57611b3c613e91565b5b0217905550565b611b4c611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611b6a611176565b73ffffffffffffffffffffffffffffffffffffffff1614611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790613983565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613883565b60405180910390fd5b611c39816125b7565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611cb1611dae565b11158015611cc0575060015482105b8015611ced575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611dbe82612328565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e4a611cf4565b73ffffffffffffffffffffffffffffffffffffffff161480611e795750611e7885611e73611cf4565b611a07565b5b80611ebe5750611e87611cf4565b73ffffffffffffffffffffffffffffffffffffffff16611ea684610826565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ef7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f5e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f6b858585600161293e565b611f7760008487611cfc565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121f75760015482146121f657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122628585856001612944565b5050505050565b61228382826040518060200160405280600081525061294a565b5050565b803410156122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c1906139e3565b60405180910390fd5b80341115612325573373ffffffffffffffffffffffffffffffffffffffff166108fc82346122f89190613c3a565b9081150290604051600060405180830381858888f19350505050158015612323573d6000803e3d6000fd5b505b50565b612330612fa4565b60008290508061233e611dae565b1115801561234d575060015481105b15612580576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161257e57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124625780925050506125b2565b5b60011561257d57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125785780925050506125b2565b612463565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126a19061378f565b60006040518083038185875af1925050503d80600081146126de576040519150601f19603f3d011682016040523d82523d6000602084013e6126e3565b606091505b5050905080612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e906138a3565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612765611cf4565b8786866040518563ffffffff1660e01b815260040161278794939291906137bf565b602060405180830381600087803b1580156127a157600080fd5b505af19250505080156127d257506040513d601f19601f820116820180604052508101906127cf9190613365565b60015b61284c573d8060008114612802576040519150601f19603f3d011682016040523d82523d6000602084013e612807565b606091505b50600081511415612844576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606128aa82611ca6565b6128e0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128ea61295c565b905060008151141561290b5760405180602001604052806000815250612936565b80612915846129ee565b60405160200161292692919061376b565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6129578383836001612b4f565b505050565b6060600a805461296b90613d56565b80601f016020809104026020016040519081016040528092919081815260200182805461299790613d56565b80156129e45780601f106129b9576101008083540402835291602001916129e4565b820191906000526020600020905b8154815290600101906020018083116129c757829003601f168201915b5050505050905090565b60606000821415612a36576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b4a565b600082905060005b60008214612a68578080612a5190613db9565b915050600a82612a619190613baf565b9150612a3e565b60008167ffffffffffffffff811115612a8457612a83613f1e565b5b6040519080825280601f01601f191660200182016040528015612ab65781602001600182028036833780820191505090505b5090505b60008514612b4357600182612acf9190613c3a565b9150600a85612ade9190613e02565b6030612aea9190613b22565b60f81b818381518110612b0057612aff613eef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3c9190613baf565b9450612aba565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612bbd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612bf8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c05600086838761293e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612dcf5750612dce8773ffffffffffffffffffffffffffffffffffffffff1661272c565b5b15612e95575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e44600088848060010195508861273f565b612e7a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612dd5578260015414612e9057600080fd5b612f01565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612e96575b816001819055505050612f176000868387612944565b5050505050565b828054612f2a90613d56565b90600052602060002090601f016020900481019282612f4c5760008555612f93565b82601f10612f6557803560ff1916838001178555612f93565b82800160010185558215612f93579182015b82811115612f92578235825591602001919060010190612f77565b5b509050612fa09190612fe7565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613000576000816000905550600101612fe8565b5090565b600061301761301284613aa3565b613a7e565b90508281526020810184848401111561303357613032613f5c565b5b61303e848285613d14565b509392505050565b60008135905061305581614307565b92915050565b60008135905061306a8161431e565b92915050565b60008135905061307f81614335565b92915050565b60008151905061309481614335565b92915050565b600082601f8301126130af576130ae613f52565b5b81356130bf848260208601613004565b91505092915050565b60008083601f8401126130de576130dd613f52565b5b8235905067ffffffffffffffff8111156130fb576130fa613f4d565b5b60208301915083600182028301111561311757613116613f57565b5b9250929050565b60008135905061312d8161434c565b92915050565b60008135905061314281614363565b92915050565b60006020828403121561315e5761315d613f66565b5b600061316c84828501613046565b91505092915050565b6000806040838503121561318c5761318b613f66565b5b600061319a85828601613046565b92505060206131ab85828601613046565b9150509250929050565b6000806000606084860312156131ce576131cd613f66565b5b60006131dc86828701613046565b93505060206131ed86828701613046565b92505060406131fe8682870161311e565b9150509250925092565b6000806000806080858703121561322257613221613f66565b5b600061323087828801613046565b945050602061324187828801613046565b93505060406132528782880161311e565b925050606085013567ffffffffffffffff81111561327357613272613f61565b5b61327f8782880161309a565b91505092959194509250565b600080604083850312156132a2576132a1613f66565b5b60006132b085828601613046565b92505060206132c18582860161305b565b9150509250929050565b600080604083850312156132e2576132e1613f66565b5b60006132f085828601613046565b92505060206133018582860161311e565b9150509250929050565b60006020828403121561332157613320613f66565b5b600061332f8482850161305b565b91505092915050565b60006020828403121561334e5761334d613f66565b5b600061335c84828501613070565b91505092915050565b60006020828403121561337b5761337a613f66565b5b600061338984828501613085565b91505092915050565b600080602083850312156133a9576133a8613f66565b5b600083013567ffffffffffffffff8111156133c7576133c6613f61565b5b6133d3858286016130c8565b92509250509250929050565b6000602082840312156133f5576133f4613f66565b5b60006134038482850161311e565b91505092915050565b60006020828403121561342257613421613f66565b5b600061343084828501613133565b91505092915050565b61344281613c6e565b82525050565b61345181613c80565b82525050565b600061346282613ad4565b61346c8185613aea565b935061347c818560208601613d23565b61348581613f6b565b840191505092915050565b61349981613d02565b82525050565b60006134aa82613adf565b6134b48185613b06565b93506134c4818560208601613d23565b6134cd81613f6b565b840191505092915050565b60006134e382613adf565b6134ed8185613b17565b93506134fd818560208601613d23565b80840191505092915050565b6000613516601f83613b06565b915061352182613f7c565b602082019050919050565b6000613539602683613b06565b915061354482613fa5565b604082019050919050565b600061355c601a83613b06565b915061356782613ff4565b602082019050919050565b600061357f602083613b06565b915061358a8261401d565b602082019050919050565b60006135a2603983613b06565b91506135ad82614046565b604082019050919050565b60006135c5601c83613b06565b91506135d082614095565b602082019050919050565b60006135e8601e83613b06565b91506135f3826140be565b602082019050919050565b600061360b602383613b06565b9150613616826140e7565b604082019050919050565b600061362e602083613b06565b915061363982614136565b602082019050919050565b6000613651602083613b06565b915061365c8261415f565b602082019050919050565b6000613674603c83613b06565b915061367f82614188565b604082019050919050565b6000613697602083613b06565b91506136a2826141d7565b602082019050919050565b60006136ba600083613afb565b91506136c582614200565b600082019050919050565b60006136dd601683613b06565b91506136e882614203565b602082019050919050565b6000613700601283613b06565b915061370b8261422c565b602082019050919050565b6000613723601f83613b06565b915061372e82614255565b602082019050919050565b6000613746604683613b06565b91506137518261427e565b606082019050919050565b61376581613ceb565b82525050565b600061377782856134d8565b915061378382846134d8565b91508190509392505050565b600061379a826136ad565b9150819050919050565b60006020820190506137b96000830184613439565b92915050565b60006080820190506137d46000830187613439565b6137e16020830186613439565b6137ee604083018561375c565b81810360608301526138008184613457565b905095945050505050565b60006020820190506138206000830184613448565b92915050565b600060208201905061383b6000830184613490565b92915050565b6000602082019050818103600083015261385b818461349f565b905092915050565b6000602082019050818103600083015261387c81613509565b9050919050565b6000602082019050818103600083015261389c8161352c565b9050919050565b600060208201905081810360008301526138bc8161354f565b9050919050565b600060208201905081810360008301526138dc81613572565b9050919050565b600060208201905081810360008301526138fc81613595565b9050919050565b6000602082019050818103600083015261391c816135b8565b9050919050565b6000602082019050818103600083015261393c816135db565b9050919050565b6000602082019050818103600083015261395c816135fe565b9050919050565b6000602082019050818103600083015261397c81613621565b9050919050565b6000602082019050818103600083015261399c81613644565b9050919050565b600060208201905081810360008301526139bc81613667565b9050919050565b600060208201905081810360008301526139dc8161368a565b9050919050565b600060208201905081810360008301526139fc816136d0565b9050919050565b60006020820190508181036000830152613a1c816136f3565b9050919050565b60006020820190508181036000830152613a3c81613716565b9050919050565b60006020820190508181036000830152613a5c81613739565b9050919050565b6000602082019050613a78600083018461375c565b92915050565b6000613a88613a99565b9050613a948282613d88565b919050565b6000604051905090565b600067ffffffffffffffff821115613abe57613abd613f1e565b5b613ac782613f6b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b2d82613ceb565b9150613b3883613ceb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b6d57613b6c613e33565b5b828201905092915050565b6000613b8382613cf5565b9150613b8e83613cf5565b92508260ff03821115613ba457613ba3613e33565b5b828201905092915050565b6000613bba82613ceb565b9150613bc583613ceb565b925082613bd557613bd4613e62565b5b828204905092915050565b6000613beb82613ceb565b9150613bf683613ceb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c2f57613c2e613e33565b5b828202905092915050565b6000613c4582613ceb565b9150613c5083613ceb565b925082821015613c6357613c62613e33565b5b828203905092915050565b6000613c7982613ccb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613cc6826142f3565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613d0d82613cb8565b9050919050565b82818337600083830152505050565b60005b83811015613d41578082015181840152602081019050613d26565b83811115613d50576000848401525b50505050565b60006002820490506001821680613d6e57607f821691505b60208210811415613d8257613d81613ec0565b5b50919050565b613d9182613f6b565b810181811067ffffffffffffffff82111715613db057613daf613f1e565b5b80604052505050565b6000613dc482613ceb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613df757613df6613e33565b5b600182019050919050565b6000613e0d82613ceb565b9150613e1883613ceb565b925082613e2857613e27613e62565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57495448445241573a205472616e73666572206661696c65642e000000000000600082015250565b7f57484954454c4953545f53414c453a204e6f7420656e6f7567682066756e6473600082015250565b7f5055424c49435f53414c453a20506c6561736520676f20746f20746865204f7060008201527f656e73656120746f20627579205468652053686d757266732e00000000000000602082015250565b7f5075626c69632053616c65206973206e6f742061637469766174656400000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f57484954454c4953545f53414c453a204d617820737570706c7920657863656560008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b7f5055424c49435f53414c453a204d617820737570706c79206578636565646564600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f57484954454c4953545f53414c453a20506c6561736520676f20746f2074686560008201527f204f70656e73656120746f20627579205468652053686d757266732e00000000602082015250565b7f57495448445241573a204e6f2062616c616e636520696e20636f6e7472616374600082015250565b50565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f53616c65206e6f74206163746976617465640000000000000000000000000000600082015250565b7f57686974656c6973742053616c65206973206e6f742061637469766174656400600082015250565b7f57484954454c4953545f53414c453a20596f752063616e206e6f74206765742060008201527f6d6f7265207468616e2033204e465473206f6e207468652057686974656c697360208201527f742053616c650000000000000000000000000000000000000000000000000000604082015250565b6003811061430457614303613e91565b5b50565b61431081613c6e565b811461431b57600080fd5b50565b61432781613c80565b811461433257600080fd5b50565b61433e81613c8c565b811461434957600080fd5b50565b61435581613ceb565b811461436057600080fd5b50565b61436c81613cf5565b811461437757600080fd5b5056fea264697066735822122014b19099b7957356efe9a7efda20e222f53e25aedb9dd0c0e4e37065bb5d7f2c64736f6c63430008070033

Deployed Bytecode Sourcemap

46807:4532:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28996:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32109:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33612:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33175:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28245:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34477:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47050:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34718:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49834:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48070:673;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31917:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49508:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29365:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5030:103;;;;;;;;;;;;;:::i;:::-;;50310:397;;;;;;;;;;;;;:::i;:::-;;49617:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4379:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49410:92;;;;;;;;;;;;;:::i;:::-;;32278:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51107:229;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33888:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34974:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49306:98;;;;;;;;;;;;;:::i;:::-;;48749:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50036:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46927:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49743:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34246:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49212:88;;;;;;;;;;;;;:::i;:::-;;5288:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28996:305;29098:4;29150:25;29135:40;;;:11;:40;;;;:105;;;;29207:33;29192:48;;;:11;:48;;;;29135:105;:158;;;;29257:36;29281:11;29257:23;:36::i;:::-;29135:158;29115:178;;28996:305;;;:::o;32109:100::-;32163:13;32196:5;32189:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32109:100;:::o;33612:204::-;33680:7;33705:16;33713:7;33705;:16::i;:::-;33700:64;;33730:34;;;;;;;;;;;;;;33700:64;33784:15;:24;33800:7;33784:24;;;;;;;;;;;;;;;;;;;;;33777:31;;33612:204;;;:::o;33175:371::-;33248:13;33264:24;33280:7;33264:15;:24::i;:::-;33248:40;;33309:5;33303:11;;:2;:11;;;33299:48;;;33323:24;;;;;;;;;;;;;;33299:48;33380:5;33364:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33390:37;33407:5;33414:12;:10;:12::i;:::-;33390:16;:37::i;:::-;33389:38;33364:63;33360:138;;;33451:35;;;;;;;;;;;;;;33360:138;33510:28;33519:2;33523:7;33532:5;33510:8;:28::i;:::-;33237:309;33175:371;;:::o;28245:303::-;28289:7;28514:15;:13;:15::i;:::-;28499:12;;28483:13;;:28;:46;28476:53;;28245:303;:::o;34477:170::-;34611:28;34621:4;34627:2;34631:7;34611:9;:28::i;:::-;34477:170;;;:::o;47050:38::-;;;;:::o;34718:185::-;34856:39;34873:4;34879:2;34883:7;34856:39;;;;;;;;;;;;:16;:39::i;:::-;34718:185;;;:::o;49834:96::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49916:8:::1;;49906:7;:18;;;;;;;:::i;:::-;;49834:96:::0;;:::o;48070:673::-;47744:10;47731:23;;:9;:23;;;47723:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47870:18:::1;47855:33;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;47847:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48190:10:::2;;48174:13;:11;:13::i;:::-;:26;48166:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48308:10;;48296:8;48280:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;48272:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;47255:1;48404:8;48373:16;:28;48390:10;48373:28;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:62;;;;48365:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;48556:8;48538:26;;47137:10;48538:26;;;;:::i;:::-;48525:9;:39;;48517:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;48642:8;48610:16;:28;48627:10;48610:28;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48657:31;48667:10;48679:8;48657:31;;:9;:31::i;:::-;48697:40;48728:8;48710:26;;47137:10;48710:26;;;;:::i;:::-;48697:12;:40::i;:::-;48070:673:::0;:::o;31917:125::-;31981:7;32008:21;32021:7;32008:12;:21::i;:::-;:26;;;32001:33;;31917:125;;;:::o;49508:82::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49580:4:::1;49567:10;:17;;;;49508:82:::0;:::o;29365:206::-;29429:7;29470:1;29453:19;;:5;:19;;;29449:60;;;29481:28;;;;;;;;;;;;;;29449:60;29535:12;:19;29548:5;29535:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29527:36;;29520:43;;29365:206;;;:::o;5030:103::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5095:30:::1;5122:1;5095:18;:30::i;:::-;5030:103::o:0;50310:397::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50359:17:::1;50379:21;50359:41;;50430:1;50415:12;:16;50407:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50477:18;50513:2;50498:12;:17;;;;:::i;:::-;50477:38;;50543:17;50578:13;50563:12;:28;;;;:::i;:::-;50543:48;;50621:38;50631:12;;;;;;;;;;;50645:13;50621:9;:38::i;:::-;50666:35;50676:10;;;;;;;;;;;50688:12;50666:9;:35::i;:::-;50352:355;;;50310:397::o:0;49617:120::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49722:9:::1;;49701:18;:30;;;;;;;:::i;:::-;;49617:120:::0;;:::o;4379:87::-;4425:7;4452:6;;;;;;;;;;;4445:13;;4379:87;:::o;49410:92::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49481:15:::1;49467:11;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;49410:92::o:0;32278:104::-;32334:13;32367:7;32360:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32278:104;:::o;51107:229::-;51148:4;51184:13;51169:28;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;;51161:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51246:15;51231:30;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;51227:103;;;47196:10;51270:19;;;;51227:103;47137:10;51308:22;;51107:229;;:::o;33888:287::-;33999:12;:10;:12::i;:::-;33987:24;;:8;:24;;;33983:54;;;34020:17;;;;;;;;;;;;;;33983:54;34095:8;34050:18;:32;34069:12;:10;:12::i;:::-;34050:32;;;;;;;;;;;;;;;:42;34083:8;34050:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34148:8;34119:48;;34134:12;:10;:12::i;:::-;34119:48;;;34158:8;34119:48;;;;;;:::i;:::-;;;;;;;;33888:287;;:::o;34974:369::-;35141:28;35151:4;35157:2;35161:7;35141:9;:28::i;:::-;35184:15;:2;:13;;;:15::i;:::-;:76;;;;;35204:56;35235:4;35241:2;35245:7;35254:5;35204:30;:56::i;:::-;35203:57;35184:76;35180:156;;;35284:40;;;;;;;;;;;;;;35180:156;34974:369;;;;:::o;49306:98::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49380:18:::1;49366:11;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;49306:98::o:0;48749:457::-;47744:10;47731:23;;:9;:23;;;47723:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48002:15:::1;47987:30:::0;::::1;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;47979:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48866:10:::2;;48850:13;:11;:13::i;:::-;:26;48842:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;48981:10;;48969:8;48953:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;48945:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;49071:8;49056:23;;47196:10;49056:23;;;;:::i;:::-;49043:9;:36;;49035:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49125:31;49135:10;49147:8;49125:31;;:9;:31::i;:::-;49163:37;49191:8;49176:23;;47196:10;49176:23;;;;:::i;:::-;49163:12;:37::i;:::-;48749:457:::0;:::o;50036:257::-;50099:13;50129:17;50137:8;50129:7;:17::i;:::-;50121:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50195:8;;;;;;;;;;;50191:96;;;50219:24;50234:8;50219:14;:24::i;:::-;50212:31;;;;50191:96;50269:18;50262:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50036:257;;;;:::o;46927:23::-;;;;;;;;;;;;;:::o;49743:85::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49815:7:::1;49804:8;;:18;;;;;;;;;;;;;;;;;;49743:85:::0;:::o;34246:164::-;34343:4;34367:18;:25;34386:5;34367:25;;;;;;;;;;;;;;;:35;34393:8;34367:35;;;;;;;;;;;;;;;;;;;;;;;;;34360:42;;34246:164;;;;:::o;49212:88::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49281:13:::1;49267:11;;:27;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;49212:88::o:0;5288:201::-;4610:12;:10;:12::i;:::-;4599:23;;:7;:5;:7::i;:::-;:23;;;4591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5397:1:::1;5377:22;;:8;:22;;;;5369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5453:28;5472:8;5453:18;:28::i;:::-;5288:201:::0;:::o;24576:157::-;24661:4;24700:25;24685:40;;;:11;:40;;;;24678:47;;24576:157;;;:::o;35598:174::-;35655:4;35698:7;35679:15;:13;:15::i;:::-;:26;;:53;;;;;35719:13;;35709:7;:23;35679:53;:85;;;;;35737:11;:20;35749:7;35737:20;;;;;;;;;;;:27;;;;;;;;;;;;35736:28;35679:85;35672:92;;35598:174;;;:::o;3109:98::-;3162:7;3189:10;3182:17;;3109:98;:::o;43755:196::-;43897:2;43870:15;:24;43886:7;43870:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43935:7;43931:2;43915:28;;43924:5;43915:28;;;;;;;;;;;;43755:196;;;:::o;28019:92::-;28075:7;28019:92;:::o;38698:2130::-;38813:35;38851:21;38864:7;38851:12;:21::i;:::-;38813:59;;38911:4;38889:26;;:13;:18;;;:26;;;38885:67;;38924:28;;;;;;;;;;;;;;38885:67;38965:22;39007:4;38991:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39028:36;39045:4;39051:12;:10;:12::i;:::-;39028:16;:36::i;:::-;38991:73;:126;;;;39105:12;:10;:12::i;:::-;39081:36;;:20;39093:7;39081:11;:20::i;:::-;:36;;;38991:126;38965:153;;39136:17;39131:66;;39162:35;;;;;;;;;;;;;;39131:66;39226:1;39212:16;;:2;:16;;;39208:52;;;39237:23;;;;;;;;;;;;;;39208:52;39273:43;39295:4;39301:2;39305:7;39314:1;39273:21;:43::i;:::-;39381:35;39398:1;39402:7;39411:4;39381:8;:35::i;:::-;39742:1;39712:12;:18;39725:4;39712:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39786:1;39758:12;:16;39771:2;39758:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39804:31;39838:11;:20;39850:7;39838:20;;;;;;;;;;;39804:54;;39889:2;39873:8;:13;;;:18;;;;;;;;;;;;;;;;;;39939:15;39906:8;:23;;;:49;;;;;;;;;;;;;;;;;;40207:19;40239:1;40229:7;:11;40207:33;;40255:31;40289:11;:24;40301:11;40289:24;;;;;;;;;;;40255:58;;40357:1;40332:27;;:8;:13;;;;;;;;;;;;:27;;;40328:384;;;40542:13;;40527:11;:28;40523:174;;40596:4;40580:8;:13;;;:20;;;;;;;;;;;;;;;;;;40649:13;:28;;;40623:8;:23;;;:54;;;;;;;;;;;;;;;;;;40523:174;40328:384;39687:1036;;;40759:7;40755:2;40740:27;;40749:4;40740:27;;;;;;;;;;;;40778:42;40799:4;40805:2;40809:7;40818:1;40778:20;:42::i;:::-;38802:2026;;38698:2130;;;:::o;35780:104::-;35849:27;35859:2;35863:8;35849:27;;;;;;;;;;;;:9;:27::i;:::-;35780:104;;:::o;50898:203::-;50968:5;50955:9;:18;;50947:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51025:5;51013:9;:17;51009:87;;;51049:10;51041:28;;:47;51082:5;51070:9;:17;;;;:::i;:::-;51041:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51009:87;50898:203;:::o;30746:1109::-;30808:21;;:::i;:::-;30842:12;30857:7;30842:22;;30925:4;30906:15;:13;:15::i;:::-;:23;;:47;;;;;30940:13;;30933:4;:20;30906:47;30902:886;;;30974:31;31008:11;:17;31020:4;31008:17;;;;;;;;;;;30974:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31049:9;:16;;;31044:729;;31120:1;31094:28;;:9;:14;;;:28;;;31090:101;;31158:9;31151:16;;;;;;31090:101;31493:261;31500:4;31493:261;;;31533:6;;;;;;;;31578:11;:17;31590:4;31578:17;;;;;;;;;;;31566:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31652:1;31626:28;;:9;:14;;;:28;;;31622:109;;31694:9;31687:16;;;;;;31622:109;31493:261;;;31044:729;30955:833;30902:886;31816:31;;;;;;;;;;;;;;30746:1109;;;;:::o;5649:191::-;5723:16;5742:6;;;;;;;;;;;5723:25;;5768:8;5759:6;;:17;;;;;;;;;;;;;;;;;;5823:8;5792:40;;5813:8;5792:40;;;;;;;;;;;;5712:128;5649:191;:::o;50713:179::-;50780:12;50798:8;:13;;50819:7;50798:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50779:52;;;50848:7;50840:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50772:120;50713:179;;:::o;14266:387::-;14326:4;14534:12;14601:7;14589:20;14581:28;;14644:1;14637:4;:8;14630:15;;;14266:387;;;:::o;44443:667::-;44606:4;44643:2;44627:36;;;44664:12;:10;:12::i;:::-;44678:4;44684:7;44693:5;44627:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44623:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44878:1;44861:6;:13;:18;44857:235;;;44907:40;;;;;;;;;;;;;;44857:235;45050:6;45044:13;45035:6;45031:2;45027:15;45020:38;44623:480;44756:45;;;44746:55;;;:6;:55;;;;44739:62;;;44443:667;;;;;;:::o;32453:318::-;32526:13;32557:16;32565:7;32557;:16::i;:::-;32552:59;;32582:29;;;;;;;;;;;;;;32552:59;32624:21;32648:10;:8;:10::i;:::-;32624:34;;32701:1;32682:7;32676:21;:26;;:87;;;;;;;;;;;;;;;;;32729:7;32738:18;:7;:16;:18::i;:::-;32712:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32676:87;32669:94;;;32453:318;;;:::o;45758:159::-;;;;;:::o;46576:158::-;;;;;:::o;36247:163::-;36370:32;36376:2;36380:8;36390:5;36397:4;36370:5;:32::i;:::-;36247:163;;;:::o;49936:94::-;49988:13;50017:7;50010:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49936:94;:::o;21958:723::-;22014:13;22244:1;22235:5;:10;22231:53;;;22262:10;;;;;;;;;;;;;;;;;;;;;22231:53;22294:12;22309:5;22294:20;;22325:14;22350:78;22365:1;22357:4;:9;22350:78;;22383:8;;;;;:::i;:::-;;;;22414:2;22406:10;;;;;:::i;:::-;;;22350:78;;;22438:19;22470:6;22460:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22438:39;;22488:154;22504:1;22495:5;:10;22488:154;;22532:1;22522:11;;;;;:::i;:::-;;;22599:2;22591:5;:10;;;;:::i;:::-;22578:2;:24;;;;:::i;:::-;22565:39;;22548:6;22555;22548:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22628:2;22619:11;;;;;:::i;:::-;;;22488:154;;;22666:6;22652:21;;;;;21958:723;;;;:::o;36669:1775::-;36808:20;36831:13;;36808:36;;36873:1;36859:16;;:2;:16;;;36855:48;;;36884:19;;;;;;;;;;;;;;36855:48;36930:1;36918:8;:13;36914:44;;;36940:18;;;;;;;;;;;;;;36914:44;36971:61;37001:1;37005:2;37009:12;37023:8;36971:21;:61::i;:::-;37344:8;37309:12;:16;37322:2;37309:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37408:8;37368:12;:16;37381:2;37368:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37467:2;37434:11;:25;37446:12;37434:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37534:15;37484:11;:25;37496:12;37484:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37567:20;37590:12;37567:35;;37617:11;37646:8;37631:12;:23;37617:37;;37675:4;:23;;;;;37683:15;:2;:13;;;:15::i;:::-;37675:23;37671:641;;;37719:314;37775:12;37771:2;37750:38;;37767:1;37750:38;;;;;;;;;;;;37816:69;37855:1;37859:2;37863:14;;;;;;37879:5;37816:30;:69::i;:::-;37811:174;;37921:40;;;;;;;;;;;;;;37811:174;38028:3;38012:12;:19;;37719:314;;38114:12;38097:13;;:29;38093:43;;38128:8;;;38093:43;37671:641;;;38177:120;38233:14;;;;;;38229:2;38208:40;;38225:1;38208:40;;;;;;;;;;;;38292:3;38276:12;:19;;38177:120;;37671:641;38342:12;38326:13;:28;;;;37284:1082;;38376:60;38405:1;38409:2;38413:12;38427:8;38376:20;:60::i;:::-;36797:1647;36669:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:135::-;2116:5;2154:6;2141:20;2132:29;;2170:31;2195:5;2170:31;:::i;:::-;2072:135;;;;:::o;2213:329::-;2272:6;2321:2;2309:9;2300:7;2296:23;2292:32;2289:119;;;2327:79;;:::i;:::-;2289:119;2447:1;2472:53;2517:7;2508:6;2497:9;2493:22;2472:53;:::i;:::-;2462:63;;2418:117;2213:329;;;;:::o;2548:474::-;2616:6;2624;2673:2;2661:9;2652:7;2648:23;2644:32;2641:119;;;2679:79;;:::i;:::-;2641:119;2799:1;2824:53;2869:7;2860:6;2849:9;2845:22;2824:53;:::i;:::-;2814:63;;2770:117;2926:2;2952:53;2997:7;2988:6;2977:9;2973:22;2952:53;:::i;:::-;2942:63;;2897:118;2548:474;;;;;:::o;3028:619::-;3105:6;3113;3121;3170:2;3158:9;3149:7;3145:23;3141:32;3138:119;;;3176:79;;:::i;:::-;3138:119;3296:1;3321:53;3366:7;3357:6;3346:9;3342:22;3321:53;:::i;:::-;3311:63;;3267:117;3423:2;3449:53;3494:7;3485:6;3474:9;3470:22;3449:53;:::i;:::-;3439:63;;3394:118;3551:2;3577:53;3622:7;3613:6;3602:9;3598:22;3577:53;:::i;:::-;3567:63;;3522:118;3028:619;;;;;:::o;3653:943::-;3748:6;3756;3764;3772;3821:3;3809:9;3800:7;3796:23;3792:33;3789:120;;;3828:79;;:::i;:::-;3789:120;3948:1;3973:53;4018:7;4009:6;3998:9;3994:22;3973:53;:::i;:::-;3963:63;;3919:117;4075:2;4101:53;4146:7;4137:6;4126:9;4122:22;4101:53;:::i;:::-;4091:63;;4046:118;4203:2;4229:53;4274:7;4265:6;4254:9;4250:22;4229:53;:::i;:::-;4219:63;;4174:118;4359:2;4348:9;4344:18;4331:32;4390:18;4382:6;4379:30;4376:117;;;4412:79;;:::i;:::-;4376:117;4517:62;4571:7;4562:6;4551:9;4547:22;4517:62;:::i;:::-;4507:72;;4302:287;3653:943;;;;;;;:::o;4602:468::-;4667:6;4675;4724:2;4712:9;4703:7;4699:23;4695:32;4692:119;;;4730:79;;:::i;:::-;4692:119;4850:1;4875:53;4920:7;4911:6;4900:9;4896:22;4875:53;:::i;:::-;4865:63;;4821:117;4977:2;5003:50;5045:7;5036:6;5025:9;5021:22;5003:50;:::i;:::-;4993:60;;4948:115;4602:468;;;;;:::o;5076:474::-;5144:6;5152;5201:2;5189:9;5180:7;5176:23;5172:32;5169:119;;;5207:79;;:::i;:::-;5169:119;5327:1;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5298:117;5454:2;5480:53;5525:7;5516:6;5505:9;5501:22;5480:53;:::i;:::-;5470:63;;5425:118;5076:474;;;;;:::o;5556:323::-;5612:6;5661:2;5649:9;5640:7;5636:23;5632:32;5629:119;;;5667:79;;:::i;:::-;5629:119;5787:1;5812:50;5854:7;5845:6;5834:9;5830:22;5812:50;:::i;:::-;5802:60;;5758:114;5556:323;;;;:::o;5885:327::-;5943:6;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:52;6187:7;6178:6;6167:9;6163:22;6143:52;:::i;:::-;6133:62;;6089:116;5885:327;;;;:::o;6218:349::-;6287:6;6336:2;6324:9;6315:7;6311:23;6307:32;6304:119;;;6342:79;;:::i;:::-;6304:119;6462:1;6487:63;6542:7;6533:6;6522:9;6518:22;6487:63;:::i;:::-;6477:73;;6433:127;6218:349;;;;:::o;6573:529::-;6644:6;6652;6701:2;6689:9;6680:7;6676:23;6672:32;6669:119;;;6707:79;;:::i;:::-;6669:119;6855:1;6844:9;6840:17;6827:31;6885:18;6877:6;6874:30;6871:117;;;6907:79;;:::i;:::-;6871:117;7020:65;7077:7;7068:6;7057:9;7053:22;7020:65;:::i;:::-;7002:83;;;;6798:297;6573:529;;;;;:::o;7108:329::-;7167:6;7216:2;7204:9;7195:7;7191:23;7187:32;7184:119;;;7222:79;;:::i;:::-;7184:119;7342:1;7367:53;7412:7;7403:6;7392:9;7388:22;7367:53;:::i;:::-;7357:63;;7313:117;7108:329;;;;:::o;7443:325::-;7500:6;7549:2;7537:9;7528:7;7524:23;7520:32;7517:119;;;7555:79;;:::i;:::-;7517:119;7675:1;7700:51;7743:7;7734:6;7723:9;7719:22;7700:51;:::i;:::-;7690:61;;7646:115;7443:325;;;;:::o;7774:118::-;7861:24;7879:5;7861:24;:::i;:::-;7856:3;7849:37;7774:118;;:::o;7898:109::-;7979:21;7994:5;7979:21;:::i;:::-;7974:3;7967:34;7898:109;;:::o;8013:360::-;8099:3;8127:38;8159:5;8127:38;:::i;:::-;8181:70;8244:6;8239:3;8181:70;:::i;:::-;8174:77;;8260:52;8305:6;8300:3;8293:4;8286:5;8282:16;8260:52;:::i;:::-;8337:29;8359:6;8337:29;:::i;:::-;8332:3;8328:39;8321:46;;8103:270;8013:360;;;;:::o;8379:145::-;8473:44;8511:5;8473:44;:::i;:::-;8468:3;8461:57;8379:145;;:::o;8530:364::-;8618:3;8646:39;8679:5;8646:39;:::i;:::-;8701:71;8765:6;8760:3;8701:71;:::i;:::-;8694:78;;8781:52;8826:6;8821:3;8814:4;8807:5;8803:16;8781:52;:::i;:::-;8858:29;8880:6;8858:29;:::i;:::-;8853:3;8849:39;8842:46;;8622:272;8530:364;;;;:::o;8900:377::-;9006:3;9034:39;9067:5;9034:39;:::i;:::-;9089:89;9171:6;9166:3;9089:89;:::i;:::-;9082:96;;9187:52;9232:6;9227:3;9220:4;9213:5;9209:16;9187:52;:::i;:::-;9264:6;9259:3;9255:16;9248:23;;9010:267;8900:377;;;;:::o;9283:366::-;9425:3;9446:67;9510:2;9505:3;9446:67;:::i;:::-;9439:74;;9522:93;9611:3;9522:93;:::i;:::-;9640:2;9635:3;9631:12;9624:19;;9283:366;;;:::o;9655:::-;9797:3;9818:67;9882:2;9877:3;9818:67;:::i;:::-;9811:74;;9894:93;9983:3;9894:93;:::i;:::-;10012:2;10007:3;10003:12;9996:19;;9655:366;;;:::o;10027:::-;10169:3;10190:67;10254:2;10249:3;10190:67;:::i;:::-;10183:74;;10266:93;10355:3;10266:93;:::i;:::-;10384:2;10379:3;10375:12;10368:19;;10027:366;;;:::o;10399:::-;10541:3;10562:67;10626:2;10621:3;10562:67;:::i;:::-;10555:74;;10638:93;10727:3;10638:93;:::i;:::-;10756:2;10751:3;10747:12;10740:19;;10399:366;;;:::o;10771:::-;10913:3;10934:67;10998:2;10993:3;10934:67;:::i;:::-;10927:74;;11010:93;11099:3;11010:93;:::i;:::-;11128:2;11123:3;11119:12;11112:19;;10771:366;;;:::o;11143:::-;11285:3;11306:67;11370:2;11365:3;11306:67;:::i;:::-;11299:74;;11382:93;11471:3;11382:93;:::i;:::-;11500:2;11495:3;11491:12;11484:19;;11143:366;;;:::o;11515:::-;11657:3;11678:67;11742:2;11737:3;11678:67;:::i;:::-;11671:74;;11754:93;11843:3;11754:93;:::i;:::-;11872:2;11867:3;11863:12;11856:19;;11515:366;;;:::o;11887:::-;12029:3;12050:67;12114:2;12109:3;12050:67;:::i;:::-;12043:74;;12126:93;12215:3;12126:93;:::i;:::-;12244:2;12239:3;12235:12;12228:19;;11887:366;;;:::o;12259:::-;12401:3;12422:67;12486:2;12481:3;12422:67;:::i;:::-;12415:74;;12498:93;12587:3;12498:93;:::i;:::-;12616:2;12611:3;12607:12;12600:19;;12259:366;;;:::o;12631:::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12631:366;;;:::o;13003:::-;13145:3;13166:67;13230:2;13225:3;13166:67;:::i;:::-;13159:74;;13242:93;13331:3;13242:93;:::i;:::-;13360:2;13355:3;13351:12;13344:19;;13003:366;;;:::o;13375:::-;13517:3;13538:67;13602:2;13597:3;13538:67;:::i;:::-;13531:74;;13614:93;13703:3;13614:93;:::i;:::-;13732:2;13727:3;13723:12;13716:19;;13375:366;;;:::o;13747:398::-;13906:3;13927:83;14008:1;14003:3;13927:83;:::i;:::-;13920:90;;14019:93;14108:3;14019:93;:::i;:::-;14137:1;14132:3;14128:11;14121:18;;13747:398;;;:::o;14151:366::-;14293:3;14314:67;14378:2;14373:3;14314:67;:::i;:::-;14307:74;;14390:93;14479:3;14390:93;:::i;:::-;14508:2;14503:3;14499:12;14492:19;;14151:366;;;:::o;14523:::-;14665:3;14686:67;14750:2;14745:3;14686:67;:::i;:::-;14679:74;;14762:93;14851:3;14762:93;:::i;:::-;14880:2;14875:3;14871:12;14864:19;;14523:366;;;:::o;14895:::-;15037:3;15058:67;15122:2;15117:3;15058:67;:::i;:::-;15051:74;;15134:93;15223:3;15134:93;:::i;:::-;15252:2;15247:3;15243:12;15236:19;;14895:366;;;:::o;15267:::-;15409:3;15430:67;15494:2;15489:3;15430:67;:::i;:::-;15423:74;;15506:93;15595:3;15506:93;:::i;:::-;15624:2;15619:3;15615:12;15608:19;;15267:366;;;:::o;15639:118::-;15726:24;15744:5;15726:24;:::i;:::-;15721:3;15714:37;15639:118;;:::o;15763:435::-;15943:3;15965:95;16056:3;16047:6;15965:95;:::i;:::-;15958:102;;16077:95;16168:3;16159:6;16077:95;:::i;:::-;16070:102;;16189:3;16182:10;;15763:435;;;;;:::o;16204:379::-;16388:3;16410:147;16553:3;16410:147;:::i;:::-;16403:154;;16574:3;16567:10;;16204:379;;;:::o;16589:222::-;16682:4;16720:2;16709:9;16705:18;16697:26;;16733:71;16801:1;16790:9;16786:17;16777:6;16733:71;:::i;:::-;16589:222;;;;:::o;16817:640::-;17012:4;17050:3;17039:9;17035:19;17027:27;;17064:71;17132:1;17121:9;17117:17;17108:6;17064:71;:::i;:::-;17145:72;17213:2;17202:9;17198:18;17189:6;17145:72;:::i;:::-;17227;17295:2;17284:9;17280:18;17271:6;17227:72;:::i;:::-;17346:9;17340:4;17336:20;17331:2;17320:9;17316:18;17309:48;17374:76;17445:4;17436:6;17374:76;:::i;:::-;17366:84;;16817:640;;;;;;;:::o;17463:210::-;17550:4;17588:2;17577:9;17573:18;17565:26;;17601:65;17663:1;17652:9;17648:17;17639:6;17601:65;:::i;:::-;17463:210;;;;:::o;17679:236::-;17779:4;17817:2;17806:9;17802:18;17794:26;;17830:78;17905:1;17894:9;17890:17;17881:6;17830:78;:::i;:::-;17679:236;;;;:::o;17921:313::-;18034:4;18072:2;18061:9;18057:18;18049:26;;18121:9;18115:4;18111:20;18107:1;18096:9;18092:17;18085:47;18149:78;18222:4;18213:6;18149:78;:::i;:::-;18141:86;;17921:313;;;;:::o;18240:419::-;18406:4;18444:2;18433:9;18429:18;18421:26;;18493:9;18487:4;18483:20;18479:1;18468:9;18464:17;18457:47;18521:131;18647:4;18521:131;:::i;:::-;18513:139;;18240:419;;;:::o;18665:::-;18831:4;18869:2;18858:9;18854:18;18846:26;;18918:9;18912:4;18908:20;18904:1;18893:9;18889:17;18882:47;18946:131;19072:4;18946:131;:::i;:::-;18938:139;;18665:419;;;:::o;19090:::-;19256:4;19294:2;19283:9;19279:18;19271:26;;19343:9;19337:4;19333:20;19329:1;19318:9;19314:17;19307:47;19371:131;19497:4;19371:131;:::i;:::-;19363:139;;19090:419;;;:::o;19515:::-;19681:4;19719:2;19708:9;19704:18;19696:26;;19768:9;19762:4;19758:20;19754:1;19743:9;19739:17;19732:47;19796:131;19922:4;19796:131;:::i;:::-;19788:139;;19515:419;;;:::o;19940:::-;20106:4;20144:2;20133:9;20129:18;20121:26;;20193:9;20187:4;20183:20;20179:1;20168:9;20164:17;20157:47;20221:131;20347:4;20221:131;:::i;:::-;20213:139;;19940:419;;;:::o;20365:::-;20531:4;20569:2;20558:9;20554:18;20546:26;;20618:9;20612:4;20608:20;20604:1;20593:9;20589:17;20582:47;20646:131;20772:4;20646:131;:::i;:::-;20638:139;;20365:419;;;:::o;20790:::-;20956:4;20994:2;20983:9;20979:18;20971:26;;21043:9;21037:4;21033:20;21029:1;21018:9;21014:17;21007:47;21071:131;21197:4;21071:131;:::i;:::-;21063:139;;20790:419;;;:::o;21215:::-;21381:4;21419:2;21408:9;21404:18;21396:26;;21468:9;21462:4;21458:20;21454:1;21443:9;21439:17;21432:47;21496:131;21622:4;21496:131;:::i;:::-;21488:139;;21215:419;;;:::o;21640:::-;21806:4;21844:2;21833:9;21829:18;21821:26;;21893:9;21887:4;21883:20;21879:1;21868:9;21864:17;21857:47;21921:131;22047:4;21921:131;:::i;:::-;21913:139;;21640:419;;;:::o;22065:::-;22231:4;22269:2;22258:9;22254:18;22246:26;;22318:9;22312:4;22308:20;22304:1;22293:9;22289:17;22282:47;22346:131;22472:4;22346:131;:::i;:::-;22338:139;;22065:419;;;:::o;22490:::-;22656:4;22694:2;22683:9;22679:18;22671:26;;22743:9;22737:4;22733:20;22729:1;22718:9;22714:17;22707:47;22771:131;22897:4;22771:131;:::i;:::-;22763:139;;22490:419;;;:::o;22915:::-;23081:4;23119:2;23108:9;23104:18;23096:26;;23168:9;23162:4;23158:20;23154:1;23143:9;23139:17;23132:47;23196:131;23322:4;23196:131;:::i;:::-;23188:139;;22915:419;;;:::o;23340:::-;23506:4;23544:2;23533:9;23529:18;23521:26;;23593:9;23587:4;23583:20;23579:1;23568:9;23564:17;23557:47;23621:131;23747:4;23621:131;:::i;:::-;23613:139;;23340:419;;;:::o;23765:::-;23931:4;23969:2;23958:9;23954:18;23946:26;;24018:9;24012:4;24008:20;24004:1;23993:9;23989:17;23982:47;24046:131;24172:4;24046:131;:::i;:::-;24038:139;;23765:419;;;:::o;24190:::-;24356:4;24394:2;24383:9;24379:18;24371:26;;24443:9;24437:4;24433:20;24429:1;24418:9;24414:17;24407:47;24471:131;24597:4;24471:131;:::i;:::-;24463:139;;24190:419;;;:::o;24615:::-;24781:4;24819:2;24808:9;24804:18;24796:26;;24868:9;24862:4;24858:20;24854:1;24843:9;24839:17;24832:47;24896:131;25022:4;24896:131;:::i;:::-;24888:139;;24615:419;;;:::o;25040:222::-;25133:4;25171:2;25160:9;25156:18;25148:26;;25184:71;25252:1;25241:9;25237:17;25228:6;25184:71;:::i;:::-;25040:222;;;;:::o;25268:129::-;25302:6;25329:20;;:::i;:::-;25319:30;;25358:33;25386:4;25378:6;25358:33;:::i;:::-;25268:129;;;:::o;25403:75::-;25436:6;25469:2;25463:9;25453:19;;25403:75;:::o;25484:307::-;25545:4;25635:18;25627:6;25624:30;25621:56;;;25657:18;;:::i;:::-;25621:56;25695:29;25717:6;25695:29;:::i;:::-;25687:37;;25779:4;25773;25769:15;25761:23;;25484:307;;;:::o;25797:98::-;25848:6;25882:5;25876:12;25866:22;;25797:98;;;:::o;25901:99::-;25953:6;25987:5;25981:12;25971:22;;25901:99;;;:::o;26006:168::-;26089:11;26123:6;26118:3;26111:19;26163:4;26158:3;26154:14;26139:29;;26006:168;;;;:::o;26180:147::-;26281:11;26318:3;26303:18;;26180:147;;;;:::o;26333:169::-;26417:11;26451:6;26446:3;26439:19;26491:4;26486:3;26482:14;26467:29;;26333:169;;;;:::o;26508:148::-;26610:11;26647:3;26632:18;;26508:148;;;;:::o;26662:305::-;26702:3;26721:20;26739:1;26721:20;:::i;:::-;26716:25;;26755:20;26773:1;26755:20;:::i;:::-;26750:25;;26909:1;26841:66;26837:74;26834:1;26831:81;26828:107;;;26915:18;;:::i;:::-;26828:107;26959:1;26956;26952:9;26945:16;;26662:305;;;;:::o;26973:237::-;27011:3;27030:18;27046:1;27030:18;:::i;:::-;27025:23;;27062:18;27078:1;27062:18;:::i;:::-;27057:23;;27152:1;27146:4;27142:12;27139:1;27136:19;27133:45;;;27158:18;;:::i;:::-;27133:45;27202:1;27199;27195:9;27188:16;;26973:237;;;;:::o;27216:185::-;27256:1;27273:20;27291:1;27273:20;:::i;:::-;27268:25;;27307:20;27325:1;27307:20;:::i;:::-;27302:25;;27346:1;27336:35;;27351:18;;:::i;:::-;27336:35;27393:1;27390;27386:9;27381:14;;27216:185;;;;:::o;27407:348::-;27447:7;27470:20;27488:1;27470:20;:::i;:::-;27465:25;;27504:20;27522:1;27504:20;:::i;:::-;27499:25;;27692:1;27624:66;27620:74;27617:1;27614:81;27609:1;27602:9;27595:17;27591:105;27588:131;;;27699:18;;:::i;:::-;27588:131;27747:1;27744;27740:9;27729:20;;27407:348;;;;:::o;27761:191::-;27801:4;27821:20;27839:1;27821:20;:::i;:::-;27816:25;;27855:20;27873:1;27855:20;:::i;:::-;27850:25;;27894:1;27891;27888:8;27885:34;;;27899:18;;:::i;:::-;27885:34;27944:1;27941;27937:9;27929:17;;27761:191;;;;:::o;27958:96::-;27995:7;28024:24;28042:5;28024:24;:::i;:::-;28013:35;;27958:96;;;:::o;28060:90::-;28094:7;28137:5;28130:13;28123:21;28112:32;;28060:90;;;:::o;28156:149::-;28192:7;28232:66;28225:5;28221:78;28210:89;;28156:149;;;:::o;28311:129::-;28357:7;28386:5;28375:16;;28392:42;28428:5;28392:42;:::i;:::-;28311:129;;;:::o;28446:126::-;28483:7;28523:42;28516:5;28512:54;28501:65;;28446:126;;;:::o;28578:77::-;28615:7;28644:5;28633:16;;28578:77;;;:::o;28661:86::-;28696:7;28736:4;28729:5;28725:16;28714:27;;28661:86;;;:::o;28753:129::-;28810:9;28843:33;28870:5;28843:33;:::i;:::-;28830:46;;28753:129;;;:::o;28888:154::-;28972:6;28967:3;28962;28949:30;29034:1;29025:6;29020:3;29016:16;29009:27;28888:154;;;:::o;29048:307::-;29116:1;29126:113;29140:6;29137:1;29134:13;29126:113;;;29225:1;29220:3;29216:11;29210:18;29206:1;29201:3;29197:11;29190:39;29162:2;29159:1;29155:10;29150:15;;29126:113;;;29257:6;29254:1;29251:13;29248:101;;;29337:1;29328:6;29323:3;29319:16;29312:27;29248:101;29097:258;29048:307;;;:::o;29361:320::-;29405:6;29442:1;29436:4;29432:12;29422:22;;29489:1;29483:4;29479:12;29510:18;29500:81;;29566:4;29558:6;29554:17;29544:27;;29500:81;29628:2;29620:6;29617:14;29597:18;29594:38;29591:84;;;29647:18;;:::i;:::-;29591:84;29412:269;29361:320;;;:::o;29687:281::-;29770:27;29792:4;29770:27;:::i;:::-;29762:6;29758:40;29900:6;29888:10;29885:22;29864:18;29852:10;29849:34;29846:62;29843:88;;;29911:18;;:::i;:::-;29843:88;29951:10;29947:2;29940:22;29730:238;29687:281;;:::o;29974:233::-;30013:3;30036:24;30054:5;30036:24;:::i;:::-;30027:33;;30082:66;30075:5;30072:77;30069:103;;;30152:18;;:::i;:::-;30069:103;30199:1;30192:5;30188:13;30181:20;;29974:233;;;:::o;30213:176::-;30245:1;30262:20;30280:1;30262:20;:::i;:::-;30257:25;;30296:20;30314:1;30296:20;:::i;:::-;30291:25;;30335:1;30325:35;;30340:18;;:::i;:::-;30325:35;30381:1;30378;30374:9;30369:14;;30213:176;;;;:::o;30395:180::-;30443:77;30440:1;30433:88;30540:4;30537:1;30530:15;30564:4;30561:1;30554:15;30581:180;30629:77;30626:1;30619:88;30726:4;30723:1;30716:15;30750:4;30747:1;30740:15;30767:180;30815:77;30812:1;30805:88;30912:4;30909:1;30902:15;30936:4;30933:1;30926:15;30953:180;31001:77;30998:1;30991:88;31098:4;31095:1;31088:15;31122:4;31119:1;31112:15;31139:180;31187:77;31184:1;31177:88;31284:4;31281:1;31274:15;31308:4;31305:1;31298:15;31325:180;31373:77;31370:1;31363:88;31470:4;31467:1;31460:15;31494:4;31491:1;31484:15;31511:117;31620:1;31617;31610:12;31634:117;31743:1;31740;31733:12;31757:117;31866:1;31863;31856:12;31880:117;31989:1;31986;31979:12;32003:117;32112:1;32109;32102:12;32126:117;32235:1;32232;32225:12;32249:102;32290:6;32341:2;32337:7;32332:2;32325:5;32321:14;32317:28;32307:38;;32249:102;;;:::o;32357:181::-;32497:33;32493:1;32485:6;32481:14;32474:57;32357:181;:::o;32544:225::-;32684:34;32680:1;32672:6;32668:14;32661:58;32753:8;32748:2;32740:6;32736:15;32729:33;32544:225;:::o;32775:176::-;32915:28;32911:1;32903:6;32899:14;32892:52;32775:176;:::o;32957:182::-;33097:34;33093:1;33085:6;33081:14;33074:58;32957:182;:::o;33145:244::-;33285:34;33281:1;33273:6;33269:14;33262:58;33354:27;33349:2;33341:6;33337:15;33330:52;33145:244;:::o;33395:178::-;33535:30;33531:1;33523:6;33519:14;33512:54;33395:178;:::o;33579:180::-;33719:32;33715:1;33707:6;33703:14;33696:56;33579:180;:::o;33765:222::-;33905:34;33901:1;33893:6;33889:14;33882:58;33974:5;33969:2;33961:6;33957:15;33950:30;33765:222;:::o;33993:182::-;34133:34;34129:1;34121:6;34117:14;34110:58;33993:182;:::o;34181:::-;34321:34;34317:1;34309:6;34305:14;34298:58;34181:182;:::o;34369:247::-;34509:34;34505:1;34497:6;34493:14;34486:58;34578:30;34573:2;34565:6;34561:15;34554:55;34369:247;:::o;34622:182::-;34762:34;34758:1;34750:6;34746:14;34739:58;34622:182;:::o;34810:114::-;;:::o;34930:172::-;35070:24;35066:1;35058:6;35054:14;35047:48;34930:172;:::o;35108:168::-;35248:20;35244:1;35236:6;35232:14;35225:44;35108:168;:::o;35282:181::-;35422:33;35418:1;35410:6;35406:14;35399:57;35282:181;:::o;35469:294::-;35609:34;35605:1;35597:6;35593:14;35586:58;35678:34;35673:2;35665:6;35661:15;35654:59;35747:8;35742:2;35734:6;35730:15;35723:33;35469:294;:::o;35769:114::-;35851:1;35844:5;35841:12;35831:46;;35857:18;;:::i;:::-;35831:46;35769:114;:::o;35889:122::-;35962:24;35980:5;35962:24;:::i;:::-;35955:5;35952:35;35942:63;;36001:1;35998;35991:12;35942:63;35889:122;:::o;36017:116::-;36087:21;36102:5;36087:21;:::i;:::-;36080:5;36077:32;36067:60;;36123:1;36120;36113:12;36067:60;36017:116;:::o;36139:120::-;36211:23;36228:5;36211:23;:::i;:::-;36204:5;36201:34;36191:62;;36249:1;36246;36239:12;36191:62;36139:120;:::o;36265:122::-;36338:24;36356:5;36338:24;:::i;:::-;36331:5;36328:35;36318:63;;36377:1;36374;36367:12;36318:63;36265:122;:::o;36393:118::-;36464:22;36480:5;36464:22;:::i;:::-;36457:5;36454:33;36444:61;;36501:1;36498;36491:12;36444:61;36393:118;:::o

Swarm Source

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