ETH Price: $3,405.87 (+6.70%)
Gas: 39 Gwei

Token

Low Effort Nouns (LEN)
 

Overview

Max Total Supply

0 LEN

Holders

569

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LEN
0x451725385c5274d1cbfd0353fb9681f3fc28f67d
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:
SimpleCollectible

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-02
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/LEN.sol

//"SPDX-License-Identifier: UNLICENSED"
pragma solidity ^0.8.7;
pragma experimental ABIEncoderV2;




/*
* $$$$$$$\                            $$$$$$$\                      $$\       
* $$  __$$\                           $$  __$$\                     $$ |      
* $$ |  $$ |$$\   $$\ $$\   $$\       $$ |  $$ |$$\   $$\ $$$$$$$\  $$ |  $$\ 
* $$$$$$$\ |$$ |  $$ |$$ |  $$ |      $$$$$$$  |$$ |  $$ |$$  __$$\ $$ | $$  |
* $$  __$$\ $$ |  $$ |$$ |  $$ |      $$  ____/ $$ |  $$ |$$ |  $$ |$$$$$$  / 
* $$ |  $$ |$$ |  $$ |$$ |  $$ |      $$ |      $$ |  $$ |$$ |  $$ |$$  _$$<  
* $$$$$$$  |\$$$$$$  |\$$$$$$$ |      $$ |      \$$$$$$  |$$ |  $$ |$$ | \$$\ 
* \_______/  \______/  \____$$ |      \__|       \______/ \__|  \__|\__|  \__|
*                     $$\   $$ |                                              
*                     \$$$$$$  |                                              
*                      \______/             -> https://opensea.io/collection/low-effort-punks                                 
*                                            - LamboWhale & WhaleGoddess
*/

/* Thanks to Nouns DAO for the inspiration. nouns.wtf */

contract SimpleCollectible is ERC721, Ownable {
    using SafeMath for uint256;
    uint256 public tokenCounter;

    uint256 private _salePrice = .01 ether; // .01 ETH

    uint256 private _maxPerTx = 70; // Set to one higher than actual, to save gas on <= checks.

    uint256 public _totalSupply = 5635; 

    string private _baseTokenURI;
    bool private paused; 
    
    address private WG = 0x1B3FEA07590E63Ce68Cb21951f3C133a35032473;
    address private LW = 0x01e0d267E922C33469a97ec60753f93C6A4C15Ff;
    
    constructor () ERC721 ("Low Effort Nouns","LEN")  {
        setBaseURI("https://gateway.pinata.cloud/ipfs/QmYtC928MTEf5bksypYYejwrV6xMHaA6ZubfzR3tmW2GC9");
        tokenCounter = 0;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(getBaseURI(), Strings.toString(tokenId), ".json"));
    }
    function mintCollectibles(uint256 _count) public payable {
        require(!paused, "Sale is not yet open");
        require(_count < _maxPerTx, "Cant mint more than mintMax");
        require((_count + tokenCounter) <= _totalSupply, "Ran out of NFTs for sale! Sry!");
        require(msg.value >= (_salePrice * _count), "Ether value sent is not correct");

        createCollectibles(msg.sender, _count);
    }

	function mintWithWGPass(address _user) public {
	    require(msg.sender == address(0x1B7c412E7D83Daf1Bf13bb0DbAc471C71AfaC9af), "Only the mint pass contract may call this function");
        require((1 + tokenCounter) <= _totalSupply, "Ran out of NFTs for sale! Sry!");
        
        createCollectibles(_user, 1);
	}

    function ownerMint(uint256 _count, address _user) public onlyOwner {
        require((_count + tokenCounter) <= _totalSupply, "Ran out of NFTs for presale! Sry!");

        createCollectibles(_user, _count);
    }

    function createCollectibles(address _user, uint256 _count) private {
        for(uint i = 0; i < _count; i++) {
            createCollectible(_user);
        }
    }

    function createCollectible(address _user) private {
            _safeMint(_user, tokenCounter);
            tokenCounter = tokenCounter + 1;
    }
    
    function maxMintsPerTransaction() public view returns (uint) {
        return _maxPerTx - 1; //_maxPerTx is off by 1 for require checks in HOF Mint. Allows use of < instead of <=, less gas
    }

    function toggleSaleState() public onlyOwner {
        paused = !paused;
    }
    
    function getSalePrice() private view returns (uint){
        return _salePrice;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function getBaseURI() public view returns (string memory){
        return _baseTokenURI;
    }
    function withdrawAll() public onlyOwner {
        uint256 bal = address(this).balance;
        payable(WG).transfer(bal.div(100).mul(5));
        payable(LW).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_totalSupply","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":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintCollectibles","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"mintWithWGPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc100006008556046600955611603600a55731b3fea07590e63ce68cb21951f3c133a35032473600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507301e0d267e922c33469a97ec60753f93c6a4c15ff600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d157600080fd5b506040518060400160405280601081526020017f4c6f77204566666f7274204e6f756e73000000000000000000000000000000008152506040518060400160405280600381526020017f4c454e00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001569291906200036d565b5080600190805190602001906200016f9291906200036d565b5050506200019262000186620001ca60201b60201c565b620001d260201b60201c565b620001bc60405180608001604052806050815260200162003ea9605091396200029860201b60201c565b600060078190555062000505565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a8620001ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ce6200034360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031e9062000444565b60405180910390fd5b80600b90805190602001906200033f9291906200036d565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200037b9062000477565b90600052602060002090601f0160209004810192826200039f5760008555620003eb565b82601f10620003ba57805160ff1916838001178555620003eb565b82800160010185558215620003eb579182015b82811115620003ea578251825591602001919060010190620003cd565b5b509050620003fa9190620003fe565b5090565b5b8082111562000419576000816000905550600101620003ff565b5090565b60006200042c60208362000466565b91506200043982620004dc565b602082019050919050565b600060208201905081810360008301526200045f816200041d565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200049057607f821691505b60208210811415620004a757620004a6620004ad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61399480620005156000396000f3fe6080604052600436106101815760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063d52c57e011610064578063d52c57e01461054d578063daaeec8614610576578063e985e9c51461058d578063f2fde38b146105ca57610181565b8063b88d4fde146104bc578063c87b56dd146104e5578063d082e3811461052257610181565b8063715018a6146103e6578063853828b6146103fd57806386cbadce146104145780638da5cb5b1461043d57806395d89b4114610468578063a22cb4651461049357610181565b80633eaaf86b1161013e5780636352211e116101185780636352211e1461031657806364aa0c791461035357806370a082311461037e578063714c5398146103bb57610181565b80633eaaf86b1461029957806342842e0e146102c457806355f804b3146102ed57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b578063178a85691461025457806323b872dd14610270575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a8919061260a565b6105f3565b6040516101ba9190612ba5565b60405180910390f35b3480156101cf57600080fd5b506101d86106d5565b6040516101e59190612bc0565b60405180910390f35b3480156101fa57600080fd5b50610215600480360381019061021091906126ad565b610767565b6040516102229190612b3e565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906125ca565b6107ec565b005b61026e600480360381019061026991906126ad565b610904565b005b34801561027c57600080fd5b50610297600480360381019061029291906124b4565b610a47565b005b3480156102a557600080fd5b506102ae610aa7565b6040516102bb9190612ea2565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906124b4565b610aad565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612664565b610acd565b005b34801561032257600080fd5b5061033d600480360381019061033891906126ad565b610b63565b60405161034a9190612b3e565b60405180910390f35b34801561035f57600080fd5b50610368610c15565b6040516103759190612ea2565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190612447565b610c2b565b6040516103b29190612ea2565b60405180910390f35b3480156103c757600080fd5b506103d0610ce3565b6040516103dd9190612bc0565b60405180910390f35b3480156103f257600080fd5b506103fb610d75565b005b34801561040957600080fd5b50610412610dfd565b005b34801561042057600080fd5b5061043b60048036038101906104369190612447565b610f79565b005b34801561044957600080fd5b5061045261105c565b60405161045f9190612b3e565b60405180910390f35b34801561047457600080fd5b5061047d611086565b60405161048a9190612bc0565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061258a565b611118565b005b3480156104c857600080fd5b506104e360048036038101906104de9190612507565b61112e565b005b3480156104f157600080fd5b5061050c600480360381019061050791906126ad565b611190565b6040516105199190612bc0565b60405180910390f35b34801561052e57600080fd5b50610537611212565b6040516105449190612ea2565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f91906126da565b611218565b005b34801561058257600080fd5b5061058b6112f4565b005b34801561059957600080fd5b506105b460048036038101906105af9190612474565b61139c565b6040516105c19190612ba5565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec9190612447565b611430565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ce57506106cd82611528565b5b9050919050565b6060600080546106e490613152565b80601f016020809104026020016040519081016040528092919081815260200182805461071090613152565b801561075d5780601f106107325761010080835404028352916020019161075d565b820191906000526020600020905b81548152906001019060200180831161074057829003601f168201915b5050505050905090565b600061077282611592565b6107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a890612da2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f782610b63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085f90612e42565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108876115fe565b73ffffffffffffffffffffffffffffffffffffffff1614806108b657506108b5816108b06115fe565b61139c565b5b6108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90612ce2565b60405180910390fd5b6108ff8383611606565b505050565b600c60009054906101000a900460ff1615610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90612c42565b60405180910390fd5b6009548110610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90612d62565b60405180910390fd5b600a54600754826109a99190612f87565b11156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612d82565b60405180910390fd5b806008546109f8919061300e565b341015610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3190612ca2565b60405180910390fd5b610a4433826116bf565b50565b610a58610a526115fe565b826116eb565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90612e62565b60405180910390fd5b610aa28383836117c9565b505050565b600a5481565b610ac88383836040518060200160405280600081525061112e565b505050565b610ad56115fe565b73ffffffffffffffffffffffffffffffffffffffff16610af361105c565b73ffffffffffffffffffffffffffffffffffffffff1614610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090612dc2565b60405180910390fd5b80600b9080519060200190610b5f92919061225b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390612d22565b60405180910390fd5b80915050919050565b60006001600954610c269190613068565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390612d02565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600b8054610cf290613152565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1e90613152565b8015610d6b5780601f10610d4057610100808354040283529160200191610d6b565b820191906000526020600020905b815481529060010190602001808311610d4e57829003601f168201915b5050505050905090565b610d7d6115fe565b73ffffffffffffffffffffffffffffffffffffffff16610d9b61105c565b73ffffffffffffffffffffffffffffffffffffffff1614610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890612dc2565b60405180910390fd5b610dfb6000611a25565b565b610e056115fe565b73ffffffffffffffffffffffffffffffffffffffff16610e2361105c565b73ffffffffffffffffffffffffffffffffffffffff1614610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090612dc2565b60405180910390fd5b6000479050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc610ee16005610ed3606486611aeb90919063ffffffff16565b611b0190919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610f0c573d6000803e3d6000fd5b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f75573d6000803e3d6000fd5b5050565b731b7c412e7d83daf1bf13bb0dbac471c71afac9af73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290612e82565b60405180910390fd5b600a54600754600161100d9190612f87565b111561104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590612d82565b60405180910390fd5b6110598160016116bf565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461109590613152565b80601f01602080910402602001604051908101604052809291908181526020018280546110c190613152565b801561110e5780601f106110e35761010080835404028352916020019161110e565b820191906000526020600020905b8154815290600101906020018083116110f157829003601f168201915b5050505050905090565b61112a6111236115fe565b8383611b17565b5050565b61113f6111396115fe565b836116eb565b61117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590612e62565b60405180910390fd5b61118a84848484611c84565b50505050565b606061119b82611592565b6111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d190612e02565b60405180910390fd5b6111e2610ce3565b6111eb83611ce0565b6040516020016111fc929190612b0f565b6040516020818303038152906040529050919050565b60075481565b6112206115fe565b73ffffffffffffffffffffffffffffffffffffffff1661123e61105c565b73ffffffffffffffffffffffffffffffffffffffff1614611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90612dc2565b60405180910390fd5b600a54600754836112a59190612f87565b11156112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dd90612e22565b60405180910390fd5b6112f081836116bf565b5050565b6112fc6115fe565b73ffffffffffffffffffffffffffffffffffffffff1661131a61105c565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790612dc2565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114386115fe565b73ffffffffffffffffffffffffffffffffffffffff1661145661105c565b73ffffffffffffffffffffffffffffffffffffffff16146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390612dc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612c02565b60405180910390fd5b61152581611a25565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661167983610b63565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b818110156116e6576116d383611e41565b80806116de906131b5565b9150506116c2565b505050565b60006116f682611592565b611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c90612cc2565b60405180910390fd5b600061174083610b63565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117af57508373ffffffffffffffffffffffffffffffffffffffff1661179784610767565b73ffffffffffffffffffffffffffffffffffffffff16145b806117c057506117bf818561139c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117e982610b63565b73ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690612de2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690612c62565b60405180910390fd5b6118ba838383611e65565b6118c5600082611606565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119159190613068565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461196c9190612f87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611af99190612fdd565b905092915050565b60008183611b0f919061300e565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d90612c82565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c779190612ba5565b60405180910390a3505050565b611c8f8484846117c9565b611c9b84848484611e6a565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190612be2565b60405180910390fd5b50505050565b60606000821415611d28576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e3c565b600082905060005b60008214611d5a578080611d43906131b5565b915050600a82611d539190612fdd565b9150611d30565b60008167ffffffffffffffff811115611d7657611d756132eb565b5b6040519080825280601f01601f191660200182016040528015611da85781602001600182028036833780820191505090505b5090505b60008514611e3557600182611dc19190613068565b9150600a85611dd091906131fe565b6030611ddc9190612f87565b60f81b818381518110611df257611df16132bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e2e9190612fdd565b9450611dac565b8093505050505b919050565b611e4d81600754612001565b6001600754611e5c9190612f87565b60078190555050565b505050565b6000611e8b8473ffffffffffffffffffffffffffffffffffffffff1661201f565b15611ff4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb46115fe565b8786866040518563ffffffff1660e01b8152600401611ed69493929190612b59565b602060405180830381600087803b158015611ef057600080fd5b505af1925050508015611f2157506040513d601f19601f82011682018060405250810190611f1e9190612637565b60015b611fa4573d8060008114611f51576040519150601f19603f3d011682016040523d82523d6000602084013e611f56565b606091505b50600081511415611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390612be2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ff9565b600190505b949350505050565b61201b828260405180602001604052806000815250612032565b5050565b600080823b905060008111915050919050565b61203c838361208d565b6120496000848484611e6a565b612088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207f90612be2565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490612d42565b60405180910390fd5b61210681611592565b15612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d90612c22565b60405180910390fd5b61215260008383611e65565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a29190612f87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461226790613152565b90600052602060002090601f01602090048101928261228957600085556122d0565b82601f106122a257805160ff19168380011785556122d0565b828001600101855582156122d0579182015b828111156122cf5782518255916020019190600101906122b4565b5b5090506122dd91906122e1565b5090565b5b808211156122fa5760008160009055506001016122e2565b5090565b600061231161230c84612ee2565b612ebd565b90508281526020810184848401111561232d5761232c61331f565b5b612338848285613110565b509392505050565b600061235361234e84612f13565b612ebd565b90508281526020810184848401111561236f5761236e61331f565b5b61237a848285613110565b509392505050565b60008135905061239181613902565b92915050565b6000813590506123a681613919565b92915050565b6000813590506123bb81613930565b92915050565b6000815190506123d081613930565b92915050565b600082601f8301126123eb576123ea61331a565b5b81356123fb8482602086016122fe565b91505092915050565b600082601f8301126124195761241861331a565b5b8135612429848260208601612340565b91505092915050565b60008135905061244181613947565b92915050565b60006020828403121561245d5761245c613329565b5b600061246b84828501612382565b91505092915050565b6000806040838503121561248b5761248a613329565b5b600061249985828601612382565b92505060206124aa85828601612382565b9150509250929050565b6000806000606084860312156124cd576124cc613329565b5b60006124db86828701612382565b93505060206124ec86828701612382565b92505060406124fd86828701612432565b9150509250925092565b6000806000806080858703121561252157612520613329565b5b600061252f87828801612382565b945050602061254087828801612382565b935050604061255187828801612432565b925050606085013567ffffffffffffffff81111561257257612571613324565b5b61257e878288016123d6565b91505092959194509250565b600080604083850312156125a1576125a0613329565b5b60006125af85828601612382565b92505060206125c085828601612397565b9150509250929050565b600080604083850312156125e1576125e0613329565b5b60006125ef85828601612382565b925050602061260085828601612432565b9150509250929050565b6000602082840312156126205761261f613329565b5b600061262e848285016123ac565b91505092915050565b60006020828403121561264d5761264c613329565b5b600061265b848285016123c1565b91505092915050565b60006020828403121561267a57612679613329565b5b600082013567ffffffffffffffff81111561269857612697613324565b5b6126a484828501612404565b91505092915050565b6000602082840312156126c3576126c2613329565b5b60006126d184828501612432565b91505092915050565b600080604083850312156126f1576126f0613329565b5b60006126ff85828601612432565b925050602061271085828601612382565b9150509250929050565b6127238161309c565b82525050565b612732816130ae565b82525050565b600061274382612f44565b61274d8185612f5a565b935061275d81856020860161311f565b6127668161332e565b840191505092915050565b600061277c82612f4f565b6127868185612f6b565b935061279681856020860161311f565b61279f8161332e565b840191505092915050565b60006127b582612f4f565b6127bf8185612f7c565b93506127cf81856020860161311f565b80840191505092915050565b60006127e8603283612f6b565b91506127f38261333f565b604082019050919050565b600061280b602683612f6b565b91506128168261338e565b604082019050919050565b600061282e601c83612f6b565b9150612839826133dd565b602082019050919050565b6000612851601483612f6b565b915061285c82613406565b602082019050919050565b6000612874602483612f6b565b915061287f8261342f565b604082019050919050565b6000612897601983612f6b565b91506128a28261347e565b602082019050919050565b60006128ba601f83612f6b565b91506128c5826134a7565b602082019050919050565b60006128dd602c83612f6b565b91506128e8826134d0565b604082019050919050565b6000612900603883612f6b565b915061290b8261351f565b604082019050919050565b6000612923602a83612f6b565b915061292e8261356e565b604082019050919050565b6000612946602983612f6b565b9150612951826135bd565b604082019050919050565b6000612969602083612f6b565b91506129748261360c565b602082019050919050565b600061298c601b83612f6b565b915061299782613635565b602082019050919050565b60006129af601e83612f6b565b91506129ba8261365e565b602082019050919050565b60006129d2602c83612f6b565b91506129dd82613687565b604082019050919050565b60006129f5600583612f7c565b9150612a00826136d6565b600582019050919050565b6000612a18602083612f6b565b9150612a23826136ff565b602082019050919050565b6000612a3b602983612f6b565b9150612a4682613728565b604082019050919050565b6000612a5e602f83612f6b565b9150612a6982613777565b604082019050919050565b6000612a81602183612f6b565b9150612a8c826137c6565b604082019050919050565b6000612aa4602183612f6b565b9150612aaf82613815565b604082019050919050565b6000612ac7603183612f6b565b9150612ad282613864565b604082019050919050565b6000612aea603283612f6b565b9150612af5826138b3565b604082019050919050565b612b0981613106565b82525050565b6000612b1b82856127aa565b9150612b2782846127aa565b9150612b32826129e8565b91508190509392505050565b6000602082019050612b53600083018461271a565b92915050565b6000608082019050612b6e600083018761271a565b612b7b602083018661271a565b612b886040830185612b00565b8181036060830152612b9a8184612738565b905095945050505050565b6000602082019050612bba6000830184612729565b92915050565b60006020820190508181036000830152612bda8184612771565b905092915050565b60006020820190508181036000830152612bfb816127db565b9050919050565b60006020820190508181036000830152612c1b816127fe565b9050919050565b60006020820190508181036000830152612c3b81612821565b9050919050565b60006020820190508181036000830152612c5b81612844565b9050919050565b60006020820190508181036000830152612c7b81612867565b9050919050565b60006020820190508181036000830152612c9b8161288a565b9050919050565b60006020820190508181036000830152612cbb816128ad565b9050919050565b60006020820190508181036000830152612cdb816128d0565b9050919050565b60006020820190508181036000830152612cfb816128f3565b9050919050565b60006020820190508181036000830152612d1b81612916565b9050919050565b60006020820190508181036000830152612d3b81612939565b9050919050565b60006020820190508181036000830152612d5b8161295c565b9050919050565b60006020820190508181036000830152612d7b8161297f565b9050919050565b60006020820190508181036000830152612d9b816129a2565b9050919050565b60006020820190508181036000830152612dbb816129c5565b9050919050565b60006020820190508181036000830152612ddb81612a0b565b9050919050565b60006020820190508181036000830152612dfb81612a2e565b9050919050565b60006020820190508181036000830152612e1b81612a51565b9050919050565b60006020820190508181036000830152612e3b81612a74565b9050919050565b60006020820190508181036000830152612e5b81612a97565b9050919050565b60006020820190508181036000830152612e7b81612aba565b9050919050565b60006020820190508181036000830152612e9b81612add565b9050919050565b6000602082019050612eb76000830184612b00565b92915050565b6000612ec7612ed8565b9050612ed38282613184565b919050565b6000604051905090565b600067ffffffffffffffff821115612efd57612efc6132eb565b5b612f068261332e565b9050602081019050919050565b600067ffffffffffffffff821115612f2e57612f2d6132eb565b5b612f378261332e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f9282613106565b9150612f9d83613106565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fd257612fd161322f565b5b828201905092915050565b6000612fe882613106565b9150612ff383613106565b9250826130035761300261325e565b5b828204905092915050565b600061301982613106565b915061302483613106565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561305d5761305c61322f565b5b828202905092915050565b600061307382613106565b915061307e83613106565b9250828210156130915761309061322f565b5b828203905092915050565b60006130a7826130e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561313d578082015181840152602081019050613122565b8381111561314c576000848401525b50505050565b6000600282049050600182168061316a57607f821691505b6020821081141561317e5761317d61328d565b5b50919050565b61318d8261332e565b810181811067ffffffffffffffff821117156131ac576131ab6132eb565b5b80604052505050565b60006131c082613106565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131f3576131f261322f565b5b600182019050919050565b600061320982613106565b915061321483613106565b9250826132245761322361325e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206973206e6f7420796574206f70656e000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f43616e74206d696e74206d6f7265207468616e206d696e744d61780000000000600082015250565b7f52616e206f7574206f66204e46547320666f722073616c652120537279210000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f52616e206f7574206f66204e46547320666f722070726573616c65212053727960008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f6e6c7920746865206d696e74207061737320636f6e7472616374206d61792060008201527f63616c6c20746869732066756e6374696f6e0000000000000000000000000000602082015250565b61390b8161309c565b811461391657600080fd5b50565b613922816130ae565b811461392d57600080fd5b50565b613939816130ba565b811461394457600080fd5b50565b61395081613106565b811461395b57600080fd5b5056fea2646970667358221220822caba070b3475c054d55aeef15ae5b32ca383121588c8c6d9488d47eb83cfd64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5974433932384d54456635626b7379705959656a77725636784d486141365a7562667a5233746d5732474339

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063d52c57e011610064578063d52c57e01461054d578063daaeec8614610576578063e985e9c51461058d578063f2fde38b146105ca57610181565b8063b88d4fde146104bc578063c87b56dd146104e5578063d082e3811461052257610181565b8063715018a6146103e6578063853828b6146103fd57806386cbadce146104145780638da5cb5b1461043d57806395d89b4114610468578063a22cb4651461049357610181565b80633eaaf86b1161013e5780636352211e116101185780636352211e1461031657806364aa0c791461035357806370a082311461037e578063714c5398146103bb57610181565b80633eaaf86b1461029957806342842e0e146102c457806355f804b3146102ed57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b578063178a85691461025457806323b872dd14610270575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a8919061260a565b6105f3565b6040516101ba9190612ba5565b60405180910390f35b3480156101cf57600080fd5b506101d86106d5565b6040516101e59190612bc0565b60405180910390f35b3480156101fa57600080fd5b50610215600480360381019061021091906126ad565b610767565b6040516102229190612b3e565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906125ca565b6107ec565b005b61026e600480360381019061026991906126ad565b610904565b005b34801561027c57600080fd5b50610297600480360381019061029291906124b4565b610a47565b005b3480156102a557600080fd5b506102ae610aa7565b6040516102bb9190612ea2565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906124b4565b610aad565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612664565b610acd565b005b34801561032257600080fd5b5061033d600480360381019061033891906126ad565b610b63565b60405161034a9190612b3e565b60405180910390f35b34801561035f57600080fd5b50610368610c15565b6040516103759190612ea2565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190612447565b610c2b565b6040516103b29190612ea2565b60405180910390f35b3480156103c757600080fd5b506103d0610ce3565b6040516103dd9190612bc0565b60405180910390f35b3480156103f257600080fd5b506103fb610d75565b005b34801561040957600080fd5b50610412610dfd565b005b34801561042057600080fd5b5061043b60048036038101906104369190612447565b610f79565b005b34801561044957600080fd5b5061045261105c565b60405161045f9190612b3e565b60405180910390f35b34801561047457600080fd5b5061047d611086565b60405161048a9190612bc0565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b5919061258a565b611118565b005b3480156104c857600080fd5b506104e360048036038101906104de9190612507565b61112e565b005b3480156104f157600080fd5b5061050c600480360381019061050791906126ad565b611190565b6040516105199190612bc0565b60405180910390f35b34801561052e57600080fd5b50610537611212565b6040516105449190612ea2565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f91906126da565b611218565b005b34801561058257600080fd5b5061058b6112f4565b005b34801561059957600080fd5b506105b460048036038101906105af9190612474565b61139c565b6040516105c19190612ba5565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec9190612447565b611430565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106ce57506106cd82611528565b5b9050919050565b6060600080546106e490613152565b80601f016020809104026020016040519081016040528092919081815260200182805461071090613152565b801561075d5780601f106107325761010080835404028352916020019161075d565b820191906000526020600020905b81548152906001019060200180831161074057829003601f168201915b5050505050905090565b600061077282611592565b6107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a890612da2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f782610b63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085f90612e42565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108876115fe565b73ffffffffffffffffffffffffffffffffffffffff1614806108b657506108b5816108b06115fe565b61139c565b5b6108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90612ce2565b60405180910390fd5b6108ff8383611606565b505050565b600c60009054906101000a900460ff1615610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90612c42565b60405180910390fd5b6009548110610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90612d62565b60405180910390fd5b600a54600754826109a99190612f87565b11156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612d82565b60405180910390fd5b806008546109f8919061300e565b341015610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3190612ca2565b60405180910390fd5b610a4433826116bf565b50565b610a58610a526115fe565b826116eb565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90612e62565b60405180910390fd5b610aa28383836117c9565b505050565b600a5481565b610ac88383836040518060200160405280600081525061112e565b505050565b610ad56115fe565b73ffffffffffffffffffffffffffffffffffffffff16610af361105c565b73ffffffffffffffffffffffffffffffffffffffff1614610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090612dc2565b60405180910390fd5b80600b9080519060200190610b5f92919061225b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390612d22565b60405180910390fd5b80915050919050565b60006001600954610c269190613068565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390612d02565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600b8054610cf290613152565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1e90613152565b8015610d6b5780601f10610d4057610100808354040283529160200191610d6b565b820191906000526020600020905b815481529060010190602001808311610d4e57829003601f168201915b5050505050905090565b610d7d6115fe565b73ffffffffffffffffffffffffffffffffffffffff16610d9b61105c565b73ffffffffffffffffffffffffffffffffffffffff1614610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890612dc2565b60405180910390fd5b610dfb6000611a25565b565b610e056115fe565b73ffffffffffffffffffffffffffffffffffffffff16610e2361105c565b73ffffffffffffffffffffffffffffffffffffffff1614610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090612dc2565b60405180910390fd5b6000479050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc610ee16005610ed3606486611aeb90919063ffffffff16565b611b0190919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610f0c573d6000803e3d6000fd5b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f75573d6000803e3d6000fd5b5050565b731b7c412e7d83daf1bf13bb0dbac471c71afac9af73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290612e82565b60405180910390fd5b600a54600754600161100d9190612f87565b111561104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590612d82565b60405180910390fd5b6110598160016116bf565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461109590613152565b80601f01602080910402602001604051908101604052809291908181526020018280546110c190613152565b801561110e5780601f106110e35761010080835404028352916020019161110e565b820191906000526020600020905b8154815290600101906020018083116110f157829003601f168201915b5050505050905090565b61112a6111236115fe565b8383611b17565b5050565b61113f6111396115fe565b836116eb565b61117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590612e62565b60405180910390fd5b61118a84848484611c84565b50505050565b606061119b82611592565b6111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d190612e02565b60405180910390fd5b6111e2610ce3565b6111eb83611ce0565b6040516020016111fc929190612b0f565b6040516020818303038152906040529050919050565b60075481565b6112206115fe565b73ffffffffffffffffffffffffffffffffffffffff1661123e61105c565b73ffffffffffffffffffffffffffffffffffffffff1614611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90612dc2565b60405180910390fd5b600a54600754836112a59190612f87565b11156112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dd90612e22565b60405180910390fd5b6112f081836116bf565b5050565b6112fc6115fe565b73ffffffffffffffffffffffffffffffffffffffff1661131a61105c565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790612dc2565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114386115fe565b73ffffffffffffffffffffffffffffffffffffffff1661145661105c565b73ffffffffffffffffffffffffffffffffffffffff16146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390612dc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612c02565b60405180910390fd5b61152581611a25565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661167983610b63565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b818110156116e6576116d383611e41565b80806116de906131b5565b9150506116c2565b505050565b60006116f682611592565b611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c90612cc2565b60405180910390fd5b600061174083610b63565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117af57508373ffffffffffffffffffffffffffffffffffffffff1661179784610767565b73ffffffffffffffffffffffffffffffffffffffff16145b806117c057506117bf818561139c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117e982610b63565b73ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690612de2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690612c62565b60405180910390fd5b6118ba838383611e65565b6118c5600082611606565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119159190613068565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461196c9190612f87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611af99190612fdd565b905092915050565b60008183611b0f919061300e565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d90612c82565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c779190612ba5565b60405180910390a3505050565b611c8f8484846117c9565b611c9b84848484611e6a565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190612be2565b60405180910390fd5b50505050565b60606000821415611d28576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e3c565b600082905060005b60008214611d5a578080611d43906131b5565b915050600a82611d539190612fdd565b9150611d30565b60008167ffffffffffffffff811115611d7657611d756132eb565b5b6040519080825280601f01601f191660200182016040528015611da85781602001600182028036833780820191505090505b5090505b60008514611e3557600182611dc19190613068565b9150600a85611dd091906131fe565b6030611ddc9190612f87565b60f81b818381518110611df257611df16132bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e2e9190612fdd565b9450611dac565b8093505050505b919050565b611e4d81600754612001565b6001600754611e5c9190612f87565b60078190555050565b505050565b6000611e8b8473ffffffffffffffffffffffffffffffffffffffff1661201f565b15611ff4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb46115fe565b8786866040518563ffffffff1660e01b8152600401611ed69493929190612b59565b602060405180830381600087803b158015611ef057600080fd5b505af1925050508015611f2157506040513d601f19601f82011682018060405250810190611f1e9190612637565b60015b611fa4573d8060008114611f51576040519150601f19603f3d011682016040523d82523d6000602084013e611f56565b606091505b50600081511415611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390612be2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ff9565b600190505b949350505050565b61201b828260405180602001604052806000815250612032565b5050565b600080823b905060008111915050919050565b61203c838361208d565b6120496000848484611e6a565b612088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207f90612be2565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490612d42565b60405180910390fd5b61210681611592565b15612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d90612c22565b60405180910390fd5b61215260008383611e65565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a29190612f87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461226790613152565b90600052602060002090601f01602090048101928261228957600085556122d0565b82601f106122a257805160ff19168380011785556122d0565b828001600101855582156122d0579182015b828111156122cf5782518255916020019190600101906122b4565b5b5090506122dd91906122e1565b5090565b5b808211156122fa5760008160009055506001016122e2565b5090565b600061231161230c84612ee2565b612ebd565b90508281526020810184848401111561232d5761232c61331f565b5b612338848285613110565b509392505050565b600061235361234e84612f13565b612ebd565b90508281526020810184848401111561236f5761236e61331f565b5b61237a848285613110565b509392505050565b60008135905061239181613902565b92915050565b6000813590506123a681613919565b92915050565b6000813590506123bb81613930565b92915050565b6000815190506123d081613930565b92915050565b600082601f8301126123eb576123ea61331a565b5b81356123fb8482602086016122fe565b91505092915050565b600082601f8301126124195761241861331a565b5b8135612429848260208601612340565b91505092915050565b60008135905061244181613947565b92915050565b60006020828403121561245d5761245c613329565b5b600061246b84828501612382565b91505092915050565b6000806040838503121561248b5761248a613329565b5b600061249985828601612382565b92505060206124aa85828601612382565b9150509250929050565b6000806000606084860312156124cd576124cc613329565b5b60006124db86828701612382565b93505060206124ec86828701612382565b92505060406124fd86828701612432565b9150509250925092565b6000806000806080858703121561252157612520613329565b5b600061252f87828801612382565b945050602061254087828801612382565b935050604061255187828801612432565b925050606085013567ffffffffffffffff81111561257257612571613324565b5b61257e878288016123d6565b91505092959194509250565b600080604083850312156125a1576125a0613329565b5b60006125af85828601612382565b92505060206125c085828601612397565b9150509250929050565b600080604083850312156125e1576125e0613329565b5b60006125ef85828601612382565b925050602061260085828601612432565b9150509250929050565b6000602082840312156126205761261f613329565b5b600061262e848285016123ac565b91505092915050565b60006020828403121561264d5761264c613329565b5b600061265b848285016123c1565b91505092915050565b60006020828403121561267a57612679613329565b5b600082013567ffffffffffffffff81111561269857612697613324565b5b6126a484828501612404565b91505092915050565b6000602082840312156126c3576126c2613329565b5b60006126d184828501612432565b91505092915050565b600080604083850312156126f1576126f0613329565b5b60006126ff85828601612432565b925050602061271085828601612382565b9150509250929050565b6127238161309c565b82525050565b612732816130ae565b82525050565b600061274382612f44565b61274d8185612f5a565b935061275d81856020860161311f565b6127668161332e565b840191505092915050565b600061277c82612f4f565b6127868185612f6b565b935061279681856020860161311f565b61279f8161332e565b840191505092915050565b60006127b582612f4f565b6127bf8185612f7c565b93506127cf81856020860161311f565b80840191505092915050565b60006127e8603283612f6b565b91506127f38261333f565b604082019050919050565b600061280b602683612f6b565b91506128168261338e565b604082019050919050565b600061282e601c83612f6b565b9150612839826133dd565b602082019050919050565b6000612851601483612f6b565b915061285c82613406565b602082019050919050565b6000612874602483612f6b565b915061287f8261342f565b604082019050919050565b6000612897601983612f6b565b91506128a28261347e565b602082019050919050565b60006128ba601f83612f6b565b91506128c5826134a7565b602082019050919050565b60006128dd602c83612f6b565b91506128e8826134d0565b604082019050919050565b6000612900603883612f6b565b915061290b8261351f565b604082019050919050565b6000612923602a83612f6b565b915061292e8261356e565b604082019050919050565b6000612946602983612f6b565b9150612951826135bd565b604082019050919050565b6000612969602083612f6b565b91506129748261360c565b602082019050919050565b600061298c601b83612f6b565b915061299782613635565b602082019050919050565b60006129af601e83612f6b565b91506129ba8261365e565b602082019050919050565b60006129d2602c83612f6b565b91506129dd82613687565b604082019050919050565b60006129f5600583612f7c565b9150612a00826136d6565b600582019050919050565b6000612a18602083612f6b565b9150612a23826136ff565b602082019050919050565b6000612a3b602983612f6b565b9150612a4682613728565b604082019050919050565b6000612a5e602f83612f6b565b9150612a6982613777565b604082019050919050565b6000612a81602183612f6b565b9150612a8c826137c6565b604082019050919050565b6000612aa4602183612f6b565b9150612aaf82613815565b604082019050919050565b6000612ac7603183612f6b565b9150612ad282613864565b604082019050919050565b6000612aea603283612f6b565b9150612af5826138b3565b604082019050919050565b612b0981613106565b82525050565b6000612b1b82856127aa565b9150612b2782846127aa565b9150612b32826129e8565b91508190509392505050565b6000602082019050612b53600083018461271a565b92915050565b6000608082019050612b6e600083018761271a565b612b7b602083018661271a565b612b886040830185612b00565b8181036060830152612b9a8184612738565b905095945050505050565b6000602082019050612bba6000830184612729565b92915050565b60006020820190508181036000830152612bda8184612771565b905092915050565b60006020820190508181036000830152612bfb816127db565b9050919050565b60006020820190508181036000830152612c1b816127fe565b9050919050565b60006020820190508181036000830152612c3b81612821565b9050919050565b60006020820190508181036000830152612c5b81612844565b9050919050565b60006020820190508181036000830152612c7b81612867565b9050919050565b60006020820190508181036000830152612c9b8161288a565b9050919050565b60006020820190508181036000830152612cbb816128ad565b9050919050565b60006020820190508181036000830152612cdb816128d0565b9050919050565b60006020820190508181036000830152612cfb816128f3565b9050919050565b60006020820190508181036000830152612d1b81612916565b9050919050565b60006020820190508181036000830152612d3b81612939565b9050919050565b60006020820190508181036000830152612d5b8161295c565b9050919050565b60006020820190508181036000830152612d7b8161297f565b9050919050565b60006020820190508181036000830152612d9b816129a2565b9050919050565b60006020820190508181036000830152612dbb816129c5565b9050919050565b60006020820190508181036000830152612ddb81612a0b565b9050919050565b60006020820190508181036000830152612dfb81612a2e565b9050919050565b60006020820190508181036000830152612e1b81612a51565b9050919050565b60006020820190508181036000830152612e3b81612a74565b9050919050565b60006020820190508181036000830152612e5b81612a97565b9050919050565b60006020820190508181036000830152612e7b81612aba565b9050919050565b60006020820190508181036000830152612e9b81612add565b9050919050565b6000602082019050612eb76000830184612b00565b92915050565b6000612ec7612ed8565b9050612ed38282613184565b919050565b6000604051905090565b600067ffffffffffffffff821115612efd57612efc6132eb565b5b612f068261332e565b9050602081019050919050565b600067ffffffffffffffff821115612f2e57612f2d6132eb565b5b612f378261332e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f9282613106565b9150612f9d83613106565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fd257612fd161322f565b5b828201905092915050565b6000612fe882613106565b9150612ff383613106565b9250826130035761300261325e565b5b828204905092915050565b600061301982613106565b915061302483613106565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561305d5761305c61322f565b5b828202905092915050565b600061307382613106565b915061307e83613106565b9250828210156130915761309061322f565b5b828203905092915050565b60006130a7826130e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561313d578082015181840152602081019050613122565b8381111561314c576000848401525b50505050565b6000600282049050600182168061316a57607f821691505b6020821081141561317e5761317d61328d565b5b50919050565b61318d8261332e565b810181811067ffffffffffffffff821117156131ac576131ab6132eb565b5b80604052505050565b60006131c082613106565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131f3576131f261322f565b5b600182019050919050565b600061320982613106565b915061321483613106565b9250826132245761322361325e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206973206e6f7420796574206f70656e000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f43616e74206d696e74206d6f7265207468616e206d696e744d61780000000000600082015250565b7f52616e206f7574206f66204e46547320666f722073616c652120537279210000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f52616e206f7574206f66204e46547320666f722070726573616c65212053727960008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f6e6c7920746865206d696e74207061737320636f6e7472616374206d61792060008201527f63616c6c20746869732066756e6374696f6e0000000000000000000000000000602082015250565b61390b8161309c565b811461391657600080fd5b50565b613922816130ae565b811461392d57600080fd5b50565b613939816130ba565b811461394457600080fd5b50565b61395081613106565b811461395b57600080fd5b5056fea2646970667358221220822caba070b3475c054d55aeef15ae5b32ca383121588c8c6d9488d47eb83cfd64736f6c63430008070033

Deployed Bytecode Sourcemap

44420:3143:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30769:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31714:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33273:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32796:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45436:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34023:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44699:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34433:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47148:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31408:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46754:196;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31138:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47258:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11757:103;;;;;;;;;;;;;:::i;:::-;;47360:200;;;;;;;;;;;;;:::i;:::-;;45859:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11106:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31883:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33566:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34689:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45155:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44506:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46191:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46958:79;;;;;;;;;;;;;:::i;:::-;;33792:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30769:305;30871:4;30923:25;30908:40;;;:11;:40;;;;:105;;;;30980:33;30965:48;;;:11;:48;;;;30908:105;:158;;;;31030:36;31054:11;31030:23;:36::i;:::-;30908:158;30888:178;;30769:305;;;:::o;31714:100::-;31768:13;31801:5;31794:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31714:100;:::o;33273:221::-;33349:7;33377:16;33385:7;33377;:16::i;:::-;33369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33462:15;:24;33478:7;33462:24;;;;;;;;;;;;;;;;;;;;;33455:31;;33273:221;;;:::o;32796:411::-;32877:13;32893:23;32908:7;32893:14;:23::i;:::-;32877:39;;32941:5;32935:11;;:2;:11;;;;32927:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33035:5;33019:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33044:37;33061:5;33068:12;:10;:12::i;:::-;33044:16;:37::i;:::-;33019:62;32997:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33178:21;33187:2;33191:7;33178:8;:21::i;:::-;32866:341;32796:411;;:::o;45436:418::-;45513:6;;;;;;;;;;;45512:7;45504:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;45572:9;;45563:6;:18;45555:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45659:12;;45642;;45633:6;:21;;;;:::i;:::-;45632:39;;45624:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;45752:6;45739:10;;:19;;;;:::i;:::-;45725:9;:34;;45717:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;45808:38;45827:10;45839:6;45808:18;:38::i;:::-;45436:418;:::o;34023:339::-;34218:41;34237:12;:10;:12::i;:::-;34251:7;34218:18;:41::i;:::-;34210:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34326:28;34336:4;34342:2;34346:7;34326:9;:28::i;:::-;34023:339;;;:::o;44699:34::-;;;;:::o;34433:185::-;34571:39;34588:4;34594:2;34598:7;34571:39;;;;;;;;;;;;:16;:39::i;:::-;34433:185;;;:::o;47148:102::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47235:7:::1;47219:13;:23;;;;;;;;;;;;:::i;:::-;;47148:102:::0;:::o;31408:239::-;31480:7;31500:13;31516:7;:16;31524:7;31516:16;;;;;;;;;;;;;;;;;;;;;31500:32;;31568:1;31551:19;;:5;:19;;;;31543:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31634:5;31627:12;;;31408:239;;;:::o;46754:196::-;46809:4;46845:1;46833:9;;:13;;;;:::i;:::-;46826:20;;46754:196;:::o;31138:208::-;31210:7;31255:1;31238:19;;:5;:19;;;;31230:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31322:9;:16;31332:5;31322:16;;;;;;;;;;;;;;;;31315:23;;31138:208;;;:::o;47258:96::-;47301:13;47333;47326:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47258:96;:::o;11757:103::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11822:30:::1;11849:1;11822:18;:30::i;:::-;11757:103::o:0;47360:200::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47411:11:::1;47425:21;47411:35;;47465:2;;;;;;;;;;;47457:20;;:41;47478:19;47495:1;47478:12;47486:3;47478;:7;;:12;;;;:::i;:::-;:16;;:19;;;;:::i;:::-;47457:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47517:2;;;;;;;;;;;47509:20;;:43;47530:21;47509:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47400:160;47360:200::o:0;45859:324::-;45943:42;45921:65;;:10;:65;;;45913:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;46082:12;;46065;;46061:1;:16;;;;:::i;:::-;46060:34;;46052:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;46150:28;46169:5;46176:1;46150:18;:28::i;:::-;45859:324;:::o;11106:87::-;11152:7;11179:6;;;;;;;;;;;11172:13;;11106:87;:::o;31883:104::-;31939:13;31972:7;31965:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31883:104;:::o;33566:155::-;33661:52;33680:12;:10;:12::i;:::-;33694:8;33704;33661:18;:52::i;:::-;33566:155;;:::o;34689:328::-;34864:41;34883:12;:10;:12::i;:::-;34897:7;34864:18;:41::i;:::-;34856:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34970:39;34984:4;34990:2;34994:7;35003:5;34970:13;:39::i;:::-;34689:328;;;;:::o;45155:275::-;45228:13;45262:16;45270:7;45262;:16::i;:::-;45254:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45372:12;:10;:12::i;:::-;45386:25;45403:7;45386:16;:25::i;:::-;45355:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45341:81;;45155:275;;;:::o;44506:27::-;;;;:::o;46191:217::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46304:12:::1;;46287;;46278:6;:21;;;;:::i;:::-;46277:39;;46269:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46367:33;46386:5;46393:6;46367:18;:33::i;:::-;46191:217:::0;;:::o;46958:79::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47023:6:::1;;;;;;;;;;;47022:7;47013:6;;:16;;;;;;;;;;;;;;;;;;46958:79::o:0;33792:164::-;33889:4;33913:18;:25;33932:5;33913:25;;;;;;;;;;;;;;;:35;33939:8;33913:35;;;;;;;;;;;;;;;;;;;;;;;;;33906:42;;33792:164;;;;:::o;12015:201::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12124:1:::1;12104:22;;:8;:22;;;;12096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12180:28;12199:8;12180:18;:28::i;:::-;12015:201:::0;:::o;23538:157::-;23623:4;23662:25;23647:40;;;:11;:40;;;;23640:47;;23538:157;;;:::o;36527:127::-;36592:4;36644:1;36616:30;;:7;:16;36624:7;36616:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36609:37;;36527:127;;;:::o;9830:98::-;9883:7;9910:10;9903:17;;9830:98;:::o;40509:174::-;40611:2;40584:15;:24;40600:7;40584:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40667:7;40663:2;40629:46;;40638:23;40653:7;40638:14;:23::i;:::-;40629:46;;;;;;;;;;;;40509:174;;:::o;46416:169::-;46498:6;46494:84;46514:6;46510:1;:10;46494:84;;;46542:24;46560:5;46542:17;:24::i;:::-;46522:3;;;;;:::i;:::-;;;;46494:84;;;;46416:169;;:::o;36821:348::-;36914:4;36939:16;36947:7;36939;:16::i;:::-;36931:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37015:13;37031:23;37046:7;37031:14;:23::i;:::-;37015:39;;37084:5;37073:16;;:7;:16;;;:51;;;;37117:7;37093:31;;:20;37105:7;37093:11;:20::i;:::-;:31;;;37073:51;:87;;;;37128:32;37145:5;37152:7;37128:16;:32::i;:::-;37073:87;37065:96;;;36821:348;;;;:::o;39813:578::-;39972:4;39945:31;;:23;39960:7;39945:14;:23::i;:::-;:31;;;39937:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40055:1;40041:16;;:2;:16;;;;40033:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40111:39;40132:4;40138:2;40142:7;40111:20;:39::i;:::-;40215:29;40232:1;40236:7;40215:8;:29::i;:::-;40276:1;40257:9;:15;40267:4;40257:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40305:1;40288:9;:13;40298:2;40288:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40336:2;40317:7;:16;40325:7;40317:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40375:7;40371:2;40356:27;;40365:4;40356:27;;;;;;;;;;;;39813:578;;;:::o;12376:191::-;12450:16;12469:6;;;;;;;;;;;12450:25;;12495:8;12486:6;;:17;;;;;;;;;;;;;;;;;;12550:8;12519:40;;12540:8;12519:40;;;;;;;;;;;;12439:128;12376:191;:::o;3999:98::-;4057:7;4088:1;4084;:5;;;;:::i;:::-;4077:12;;3999:98;;;;:::o;3600:::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;40825:315::-;40980:8;40971:17;;:5;:17;;;;40963:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41067:8;41029:18;:25;41048:5;41029:25;;;;;;;;;;;;;;;:35;41055:8;41029:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41113:8;41091:41;;41106:5;41091:41;;;41123:8;41091:41;;;;;;:::i;:::-;;;;;;;;40825:315;;;:::o;35899:::-;36056:28;36066:4;36072:2;36076:7;36056:9;:28::i;:::-;36103:48;36126:4;36132:2;36136:7;36145:5;36103:22;:48::i;:::-;36095:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35899:315;;;;:::o;7392:723::-;7448:13;7678:1;7669:5;:10;7665:53;;;7696:10;;;;;;;;;;;;;;;;;;;;;7665:53;7728:12;7743:5;7728:20;;7759:14;7784:78;7799:1;7791:4;:9;7784:78;;7817:8;;;;;:::i;:::-;;;;7848:2;7840:10;;;;;:::i;:::-;;;7784:78;;;7872:19;7904:6;7894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7872:39;;7922:154;7938:1;7929:5;:10;7922:154;;7966:1;7956:11;;;;;:::i;:::-;;;8033:2;8025:5;:10;;;;:::i;:::-;8012:2;:24;;;;:::i;:::-;7999:39;;7982:6;7989;7982:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8062:2;8053:11;;;;;:::i;:::-;;;7922:154;;;8100:6;8086:21;;;;;7392:723;;;;:::o;46593:149::-;46658:30;46668:5;46675:12;;46658:9;:30::i;:::-;46733:1;46718:12;;:16;;;;:::i;:::-;46703:12;:31;;;;46593:149;:::o;43076:126::-;;;;:::o;41705:799::-;41860:4;41881:15;:2;:13;;;:15::i;:::-;41877:620;;;41933:2;41917:36;;;41954:12;:10;:12::i;:::-;41968:4;41974:7;41983:5;41917:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41913:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42176:1;42159:6;:13;:18;42155:272;;;42202:60;;;;;;;;;;:::i;:::-;;;;;;;;42155:272;42377:6;42371:13;42362:6;42358:2;42354:15;42347:38;41913:529;42050:41;;;42040:51;;;:6;:51;;;;42033:58;;;;;41877:620;42481:4;42474:11;;41705:799;;;;;;;:::o;37511:110::-;37587:26;37597:2;37601:7;37587:26;;;;;;;;;;;;:9;:26::i;:::-;37511:110;;:::o;13394:387::-;13454:4;13662:12;13729:7;13717:20;13709:28;;13772:1;13765:4;:8;13758:15;;;13394:387;;;:::o;37848:321::-;37978:18;37984:2;37988:7;37978:5;:18::i;:::-;38029:54;38060:1;38064:2;38068:7;38077:5;38029:22;:54::i;:::-;38007:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37848:321;;;:::o;38505:382::-;38599:1;38585:16;;:2;:16;;;;38577:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38658:16;38666:7;38658;:16::i;:::-;38657:17;38649:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38720:45;38749:1;38753:2;38757:7;38720:20;:45::i;:::-;38795:1;38778:9;:13;38788:2;38778:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38826:2;38807:7;:16;38815:7;38807:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38871:7;38867:2;38846:33;;38863:1;38846:33;;;;;;;;;;;;38505:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:474::-;7226:6;7234;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7409:1;7434:53;7479:7;7470:6;7459:9;7455:22;7434:53;:::i;:::-;7424:63;;7380:117;7536:2;7562:53;7607:7;7598:6;7587:9;7583:22;7562:53;:::i;:::-;7552:63;;7507:118;7158:474;;;;;:::o;7638:118::-;7725:24;7743:5;7725:24;:::i;:::-;7720:3;7713:37;7638:118;;:::o;7762:109::-;7843:21;7858:5;7843:21;:::i;:::-;7838:3;7831:34;7762:109;;:::o;7877:360::-;7963:3;7991:38;8023:5;7991:38;:::i;:::-;8045:70;8108:6;8103:3;8045:70;:::i;:::-;8038:77;;8124:52;8169:6;8164:3;8157:4;8150:5;8146:16;8124:52;:::i;:::-;8201:29;8223:6;8201:29;:::i;:::-;8196:3;8192:39;8185:46;;7967:270;7877:360;;;;:::o;8243:364::-;8331:3;8359:39;8392:5;8359:39;:::i;:::-;8414:71;8478:6;8473:3;8414:71;:::i;:::-;8407:78;;8494:52;8539:6;8534:3;8527:4;8520:5;8516:16;8494:52;:::i;:::-;8571:29;8593:6;8571:29;:::i;:::-;8566:3;8562:39;8555:46;;8335:272;8243:364;;;;:::o;8613:377::-;8719:3;8747:39;8780:5;8747:39;:::i;:::-;8802:89;8884:6;8879:3;8802:89;:::i;:::-;8795:96;;8900:52;8945:6;8940:3;8933:4;8926:5;8922:16;8900:52;:::i;:::-;8977:6;8972:3;8968:16;8961:23;;8723:267;8613:377;;;;:::o;8996:366::-;9138:3;9159:67;9223:2;9218:3;9159:67;:::i;:::-;9152:74;;9235:93;9324:3;9235:93;:::i;:::-;9353:2;9348:3;9344:12;9337:19;;8996:366;;;:::o;9368:::-;9510:3;9531:67;9595:2;9590:3;9531:67;:::i;:::-;9524:74;;9607:93;9696:3;9607:93;:::i;:::-;9725:2;9720:3;9716:12;9709:19;;9368:366;;;:::o;9740:::-;9882:3;9903:67;9967:2;9962:3;9903:67;:::i;:::-;9896:74;;9979:93;10068:3;9979:93;:::i;:::-;10097:2;10092:3;10088:12;10081:19;;9740:366;;;:::o;10112:::-;10254:3;10275:67;10339:2;10334:3;10275:67;:::i;:::-;10268:74;;10351:93;10440:3;10351:93;:::i;:::-;10469:2;10464:3;10460:12;10453:19;;10112:366;;;:::o;10484:::-;10626:3;10647:67;10711:2;10706:3;10647:67;:::i;:::-;10640:74;;10723:93;10812:3;10723:93;:::i;:::-;10841:2;10836:3;10832:12;10825:19;;10484:366;;;:::o;10856:::-;10998:3;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11095:93;11184:3;11095:93;:::i;:::-;11213:2;11208:3;11204:12;11197:19;;10856:366;;;:::o;11228:::-;11370:3;11391:67;11455:2;11450:3;11391:67;:::i;:::-;11384:74;;11467:93;11556:3;11467:93;:::i;:::-;11585:2;11580:3;11576:12;11569:19;;11228:366;;;:::o;11600:::-;11742:3;11763:67;11827:2;11822:3;11763:67;:::i;:::-;11756:74;;11839:93;11928:3;11839:93;:::i;:::-;11957:2;11952:3;11948:12;11941:19;;11600:366;;;:::o;11972:::-;12114:3;12135:67;12199:2;12194:3;12135:67;:::i;:::-;12128:74;;12211:93;12300:3;12211:93;:::i;:::-;12329:2;12324:3;12320:12;12313:19;;11972:366;;;:::o;12344:::-;12486:3;12507:67;12571:2;12566:3;12507:67;:::i;:::-;12500:74;;12583:93;12672:3;12583:93;:::i;:::-;12701:2;12696:3;12692:12;12685:19;;12344:366;;;:::o;12716:::-;12858:3;12879:67;12943:2;12938:3;12879:67;:::i;:::-;12872:74;;12955:93;13044:3;12955:93;:::i;:::-;13073:2;13068:3;13064:12;13057:19;;12716:366;;;:::o;13088:::-;13230:3;13251:67;13315:2;13310:3;13251:67;:::i;:::-;13244:74;;13327:93;13416:3;13327:93;:::i;:::-;13445:2;13440:3;13436:12;13429:19;;13088:366;;;:::o;13460:::-;13602:3;13623:67;13687:2;13682:3;13623:67;:::i;:::-;13616:74;;13699:93;13788:3;13699:93;:::i;:::-;13817:2;13812:3;13808:12;13801:19;;13460:366;;;:::o;13832:::-;13974:3;13995:67;14059:2;14054:3;13995:67;:::i;:::-;13988:74;;14071:93;14160:3;14071:93;:::i;:::-;14189:2;14184:3;14180:12;14173:19;;13832:366;;;:::o;14204:::-;14346:3;14367:67;14431:2;14426:3;14367:67;:::i;:::-;14360:74;;14443:93;14532:3;14443:93;:::i;:::-;14561:2;14556:3;14552:12;14545:19;;14204:366;;;:::o;14576:400::-;14736:3;14757:84;14839:1;14834:3;14757:84;:::i;:::-;14750:91;;14850:93;14939:3;14850:93;:::i;:::-;14968:1;14963:3;14959:11;14952:18;;14576:400;;;:::o;14982:366::-;15124:3;15145:67;15209:2;15204:3;15145:67;:::i;:::-;15138:74;;15221:93;15310:3;15221:93;:::i;:::-;15339:2;15334:3;15330:12;15323:19;;14982:366;;;:::o;15354:::-;15496:3;15517:67;15581:2;15576:3;15517:67;:::i;:::-;15510:74;;15593:93;15682:3;15593:93;:::i;:::-;15711:2;15706:3;15702:12;15695:19;;15354:366;;;:::o;15726:::-;15868:3;15889:67;15953:2;15948:3;15889:67;:::i;:::-;15882:74;;15965:93;16054:3;15965:93;:::i;:::-;16083:2;16078:3;16074:12;16067:19;;15726:366;;;:::o;16098:::-;16240:3;16261:67;16325:2;16320:3;16261:67;:::i;:::-;16254:74;;16337:93;16426:3;16337:93;:::i;:::-;16455:2;16450:3;16446:12;16439:19;;16098:366;;;:::o;16470:::-;16612:3;16633:67;16697:2;16692:3;16633:67;:::i;:::-;16626:74;;16709:93;16798:3;16709:93;:::i;:::-;16827:2;16822:3;16818:12;16811:19;;16470:366;;;:::o;16842:::-;16984:3;17005:67;17069:2;17064:3;17005:67;:::i;:::-;16998:74;;17081:93;17170:3;17081:93;:::i;:::-;17199:2;17194:3;17190:12;17183:19;;16842:366;;;:::o;17214:::-;17356:3;17377:67;17441:2;17436:3;17377:67;:::i;:::-;17370:74;;17453:93;17542:3;17453:93;:::i;:::-;17571:2;17566:3;17562:12;17555:19;;17214:366;;;:::o;17586:118::-;17673:24;17691:5;17673:24;:::i;:::-;17668:3;17661:37;17586:118;;:::o;17710:701::-;17991:3;18013:95;18104:3;18095:6;18013:95;:::i;:::-;18006:102;;18125:95;18216:3;18207:6;18125:95;:::i;:::-;18118:102;;18237:148;18381:3;18237:148;:::i;:::-;18230:155;;18402:3;18395:10;;17710:701;;;;;:::o;18417:222::-;18510:4;18548:2;18537:9;18533:18;18525:26;;18561:71;18629:1;18618:9;18614:17;18605:6;18561:71;:::i;:::-;18417:222;;;;:::o;18645:640::-;18840:4;18878:3;18867:9;18863:19;18855:27;;18892:71;18960:1;18949:9;18945:17;18936:6;18892:71;:::i;:::-;18973:72;19041:2;19030:9;19026:18;19017:6;18973:72;:::i;:::-;19055;19123:2;19112:9;19108:18;19099:6;19055:72;:::i;:::-;19174:9;19168:4;19164:20;19159:2;19148:9;19144:18;19137:48;19202:76;19273:4;19264:6;19202:76;:::i;:::-;19194:84;;18645:640;;;;;;;:::o;19291:210::-;19378:4;19416:2;19405:9;19401:18;19393:26;;19429:65;19491:1;19480:9;19476:17;19467:6;19429:65;:::i;:::-;19291:210;;;;:::o;19507:313::-;19620:4;19658:2;19647:9;19643:18;19635:26;;19707:9;19701:4;19697:20;19693:1;19682:9;19678:17;19671:47;19735:78;19808:4;19799:6;19735:78;:::i;:::-;19727:86;;19507:313;;;;:::o;19826:419::-;19992:4;20030:2;20019:9;20015:18;20007:26;;20079:9;20073:4;20069:20;20065:1;20054:9;20050:17;20043:47;20107:131;20233:4;20107:131;:::i;:::-;20099:139;;19826:419;;;:::o;20251:::-;20417:4;20455:2;20444:9;20440:18;20432:26;;20504:9;20498:4;20494:20;20490:1;20479:9;20475:17;20468:47;20532:131;20658:4;20532:131;:::i;:::-;20524:139;;20251:419;;;:::o;20676:::-;20842:4;20880:2;20869:9;20865:18;20857:26;;20929:9;20923:4;20919:20;20915:1;20904:9;20900:17;20893:47;20957:131;21083:4;20957:131;:::i;:::-;20949:139;;20676:419;;;:::o;21101:::-;21267:4;21305:2;21294:9;21290:18;21282:26;;21354:9;21348:4;21344:20;21340:1;21329:9;21325:17;21318:47;21382:131;21508:4;21382:131;:::i;:::-;21374:139;;21101:419;;;:::o;21526:::-;21692:4;21730:2;21719:9;21715:18;21707:26;;21779:9;21773:4;21769:20;21765:1;21754:9;21750:17;21743:47;21807:131;21933:4;21807:131;:::i;:::-;21799:139;;21526:419;;;:::o;21951:::-;22117:4;22155:2;22144:9;22140:18;22132:26;;22204:9;22198:4;22194:20;22190:1;22179:9;22175:17;22168:47;22232:131;22358:4;22232:131;:::i;:::-;22224:139;;21951:419;;;:::o;22376:::-;22542:4;22580:2;22569:9;22565:18;22557:26;;22629:9;22623:4;22619:20;22615:1;22604:9;22600:17;22593:47;22657:131;22783:4;22657:131;:::i;:::-;22649:139;;22376:419;;;:::o;22801:::-;22967:4;23005:2;22994:9;22990:18;22982:26;;23054:9;23048:4;23044:20;23040:1;23029:9;23025:17;23018:47;23082:131;23208:4;23082:131;:::i;:::-;23074:139;;22801:419;;;:::o;23226:::-;23392:4;23430:2;23419:9;23415:18;23407:26;;23479:9;23473:4;23469:20;23465:1;23454:9;23450:17;23443:47;23507:131;23633:4;23507:131;:::i;:::-;23499:139;;23226:419;;;:::o;23651:::-;23817:4;23855:2;23844:9;23840:18;23832:26;;23904:9;23898:4;23894:20;23890:1;23879:9;23875:17;23868:47;23932:131;24058:4;23932:131;:::i;:::-;23924:139;;23651:419;;;:::o;24076:::-;24242:4;24280:2;24269:9;24265:18;24257:26;;24329:9;24323:4;24319:20;24315:1;24304:9;24300:17;24293:47;24357:131;24483:4;24357:131;:::i;:::-;24349:139;;24076:419;;;:::o;24501:::-;24667:4;24705:2;24694:9;24690:18;24682:26;;24754:9;24748:4;24744:20;24740:1;24729:9;24725:17;24718:47;24782:131;24908:4;24782:131;:::i;:::-;24774:139;;24501:419;;;:::o;24926:::-;25092:4;25130:2;25119:9;25115:18;25107:26;;25179:9;25173:4;25169:20;25165:1;25154:9;25150:17;25143:47;25207:131;25333:4;25207:131;:::i;:::-;25199:139;;24926:419;;;:::o;25351:::-;25517:4;25555:2;25544:9;25540:18;25532:26;;25604:9;25598:4;25594:20;25590:1;25579:9;25575:17;25568:47;25632:131;25758:4;25632:131;:::i;:::-;25624:139;;25351:419;;;:::o;25776:::-;25942:4;25980:2;25969:9;25965:18;25957:26;;26029:9;26023:4;26019:20;26015:1;26004:9;26000:17;25993:47;26057:131;26183:4;26057:131;:::i;:::-;26049:139;;25776:419;;;:::o;26201:::-;26367:4;26405:2;26394:9;26390:18;26382:26;;26454:9;26448:4;26444:20;26440:1;26429:9;26425:17;26418:47;26482:131;26608:4;26482:131;:::i;:::-;26474:139;;26201:419;;;:::o;26626:::-;26792:4;26830:2;26819:9;26815:18;26807:26;;26879:9;26873:4;26869:20;26865:1;26854:9;26850:17;26843:47;26907:131;27033:4;26907:131;:::i;:::-;26899:139;;26626:419;;;:::o;27051:::-;27217:4;27255:2;27244:9;27240:18;27232:26;;27304:9;27298:4;27294:20;27290:1;27279:9;27275:17;27268:47;27332:131;27458:4;27332:131;:::i;:::-;27324:139;;27051:419;;;:::o;27476:::-;27642:4;27680:2;27669:9;27665:18;27657:26;;27729:9;27723:4;27719:20;27715:1;27704:9;27700:17;27693:47;27757:131;27883:4;27757:131;:::i;:::-;27749:139;;27476:419;;;:::o;27901:::-;28067:4;28105:2;28094:9;28090:18;28082:26;;28154:9;28148:4;28144:20;28140:1;28129:9;28125:17;28118:47;28182:131;28308:4;28182:131;:::i;:::-;28174:139;;27901:419;;;:::o;28326:::-;28492:4;28530:2;28519:9;28515:18;28507:26;;28579:9;28573:4;28569:20;28565:1;28554:9;28550:17;28543:47;28607:131;28733:4;28607:131;:::i;:::-;28599:139;;28326:419;;;:::o;28751:::-;28917:4;28955:2;28944:9;28940:18;28932:26;;29004:9;28998:4;28994:20;28990:1;28979:9;28975:17;28968:47;29032:131;29158:4;29032:131;:::i;:::-;29024:139;;28751:419;;;:::o;29176:222::-;29269:4;29307:2;29296:9;29292:18;29284:26;;29320:71;29388:1;29377:9;29373:17;29364:6;29320:71;:::i;:::-;29176:222;;;;:::o;29404:129::-;29438:6;29465:20;;:::i;:::-;29455:30;;29494:33;29522:4;29514:6;29494:33;:::i;:::-;29404:129;;;:::o;29539:75::-;29572:6;29605:2;29599:9;29589:19;;29539:75;:::o;29620:307::-;29681:4;29771:18;29763:6;29760:30;29757:56;;;29793:18;;:::i;:::-;29757:56;29831:29;29853:6;29831:29;:::i;:::-;29823:37;;29915:4;29909;29905:15;29897:23;;29620:307;;;:::o;29933:308::-;29995:4;30085:18;30077:6;30074:30;30071:56;;;30107:18;;:::i;:::-;30071:56;30145:29;30167:6;30145:29;:::i;:::-;30137:37;;30229:4;30223;30219:15;30211:23;;29933:308;;;:::o;30247:98::-;30298:6;30332:5;30326:12;30316:22;;30247:98;;;:::o;30351:99::-;30403:6;30437:5;30431:12;30421:22;;30351:99;;;:::o;30456:168::-;30539:11;30573:6;30568:3;30561:19;30613:4;30608:3;30604:14;30589:29;;30456:168;;;;:::o;30630:169::-;30714:11;30748:6;30743:3;30736:19;30788:4;30783:3;30779:14;30764:29;;30630:169;;;;:::o;30805:148::-;30907:11;30944:3;30929:18;;30805:148;;;;:::o;30959:305::-;30999:3;31018:20;31036:1;31018:20;:::i;:::-;31013:25;;31052:20;31070:1;31052:20;:::i;:::-;31047:25;;31206:1;31138:66;31134:74;31131:1;31128:81;31125:107;;;31212:18;;:::i;:::-;31125:107;31256:1;31253;31249:9;31242:16;;30959:305;;;;:::o;31270:185::-;31310:1;31327:20;31345:1;31327:20;:::i;:::-;31322:25;;31361:20;31379:1;31361:20;:::i;:::-;31356:25;;31400:1;31390:35;;31405:18;;:::i;:::-;31390:35;31447:1;31444;31440:9;31435:14;;31270:185;;;;:::o;31461:348::-;31501:7;31524:20;31542:1;31524:20;:::i;:::-;31519:25;;31558:20;31576:1;31558:20;:::i;:::-;31553:25;;31746:1;31678:66;31674:74;31671:1;31668:81;31663:1;31656:9;31649:17;31645:105;31642:131;;;31753:18;;:::i;:::-;31642:131;31801:1;31798;31794:9;31783:20;;31461:348;;;;:::o;31815:191::-;31855:4;31875:20;31893:1;31875:20;:::i;:::-;31870:25;;31909:20;31927:1;31909:20;:::i;:::-;31904:25;;31948:1;31945;31942:8;31939:34;;;31953:18;;:::i;:::-;31939:34;31998:1;31995;31991:9;31983:17;;31815:191;;;;:::o;32012:96::-;32049:7;32078:24;32096:5;32078:24;:::i;:::-;32067:35;;32012:96;;;:::o;32114:90::-;32148:7;32191:5;32184:13;32177:21;32166:32;;32114:90;;;:::o;32210:149::-;32246:7;32286:66;32279:5;32275:78;32264:89;;32210:149;;;:::o;32365:126::-;32402:7;32442:42;32435:5;32431:54;32420:65;;32365:126;;;:::o;32497:77::-;32534:7;32563:5;32552:16;;32497:77;;;:::o;32580:154::-;32664:6;32659:3;32654;32641:30;32726:1;32717:6;32712:3;32708:16;32701:27;32580:154;;;:::o;32740:307::-;32808:1;32818:113;32832:6;32829:1;32826:13;32818:113;;;32917:1;32912:3;32908:11;32902:18;32898:1;32893:3;32889:11;32882:39;32854:2;32851:1;32847:10;32842:15;;32818:113;;;32949:6;32946:1;32943:13;32940:101;;;33029:1;33020:6;33015:3;33011:16;33004:27;32940:101;32789:258;32740:307;;;:::o;33053:320::-;33097:6;33134:1;33128:4;33124:12;33114:22;;33181:1;33175:4;33171:12;33202:18;33192:81;;33258:4;33250:6;33246:17;33236:27;;33192:81;33320:2;33312:6;33309:14;33289:18;33286:38;33283:84;;;33339:18;;:::i;:::-;33283:84;33104:269;33053:320;;;:::o;33379:281::-;33462:27;33484:4;33462:27;:::i;:::-;33454:6;33450:40;33592:6;33580:10;33577:22;33556:18;33544:10;33541:34;33538:62;33535:88;;;33603:18;;:::i;:::-;33535:88;33643:10;33639:2;33632:22;33422:238;33379:281;;:::o;33666:233::-;33705:3;33728:24;33746:5;33728:24;:::i;:::-;33719:33;;33774:66;33767:5;33764:77;33761:103;;;33844:18;;:::i;:::-;33761:103;33891:1;33884:5;33880:13;33873:20;;33666:233;;;:::o;33905:176::-;33937:1;33954:20;33972:1;33954:20;:::i;:::-;33949:25;;33988:20;34006:1;33988:20;:::i;:::-;33983:25;;34027:1;34017:35;;34032:18;;:::i;:::-;34017:35;34073:1;34070;34066:9;34061:14;;33905:176;;;;:::o;34087:180::-;34135:77;34132:1;34125:88;34232:4;34229:1;34222:15;34256:4;34253:1;34246:15;34273:180;34321:77;34318:1;34311:88;34418:4;34415:1;34408:15;34442:4;34439:1;34432:15;34459:180;34507:77;34504:1;34497:88;34604:4;34601:1;34594:15;34628:4;34625:1;34618:15;34645:180;34693:77;34690:1;34683:88;34790:4;34787:1;34780:15;34814:4;34811:1;34804:15;34831:180;34879:77;34876:1;34869:88;34976:4;34973:1;34966:15;35000:4;34997:1;34990:15;35017:117;35126:1;35123;35116:12;35140:117;35249:1;35246;35239:12;35263:117;35372:1;35369;35362:12;35386:117;35495:1;35492;35485:12;35509:102;35550:6;35601:2;35597:7;35592:2;35585:5;35581:14;35577:28;35567:38;;35509:102;;;:::o;35617:237::-;35757:34;35753:1;35745:6;35741:14;35734:58;35826:20;35821:2;35813:6;35809:15;35802:45;35617:237;:::o;35860:225::-;36000:34;35996:1;35988:6;35984:14;35977:58;36069:8;36064:2;36056:6;36052:15;36045:33;35860:225;:::o;36091:178::-;36231:30;36227:1;36219:6;36215:14;36208:54;36091:178;:::o;36275:170::-;36415:22;36411:1;36403:6;36399:14;36392:46;36275:170;:::o;36451:223::-;36591:34;36587:1;36579:6;36575:14;36568:58;36660:6;36655:2;36647:6;36643:15;36636:31;36451:223;:::o;36680:175::-;36820:27;36816:1;36808:6;36804:14;36797:51;36680:175;:::o;36861:181::-;37001:33;36997:1;36989:6;36985:14;36978:57;36861:181;:::o;37048:231::-;37188:34;37184:1;37176:6;37172:14;37165:58;37257:14;37252:2;37244:6;37240:15;37233:39;37048:231;:::o;37285:243::-;37425:34;37421:1;37413:6;37409:14;37402:58;37494:26;37489:2;37481:6;37477:15;37470:51;37285:243;:::o;37534:229::-;37674:34;37670:1;37662:6;37658:14;37651:58;37743:12;37738:2;37730:6;37726:15;37719:37;37534:229;:::o;37769:228::-;37909:34;37905:1;37897:6;37893:14;37886:58;37978:11;37973:2;37965:6;37961:15;37954:36;37769:228;:::o;38003:182::-;38143:34;38139:1;38131:6;38127:14;38120:58;38003:182;:::o;38191:177::-;38331:29;38327:1;38319:6;38315:14;38308:53;38191:177;:::o;38374:180::-;38514:32;38510:1;38502:6;38498:14;38491:56;38374:180;:::o;38560:231::-;38700:34;38696:1;38688:6;38684:14;38677:58;38769:14;38764:2;38756:6;38752:15;38745:39;38560:231;:::o;38797:155::-;38937:7;38933:1;38925:6;38921:14;38914:31;38797:155;:::o;38958:182::-;39098:34;39094:1;39086:6;39082:14;39075:58;38958:182;:::o;39146:228::-;39286:34;39282:1;39274:6;39270:14;39263:58;39355:11;39350:2;39342:6;39338:15;39331:36;39146:228;:::o;39380:234::-;39520:34;39516:1;39508:6;39504:14;39497:58;39589:17;39584:2;39576:6;39572:15;39565:42;39380:234;:::o;39620:220::-;39760:34;39756:1;39748:6;39744:14;39737:58;39829:3;39824:2;39816:6;39812:15;39805:28;39620:220;:::o;39846:::-;39986:34;39982:1;39974:6;39970:14;39963:58;40055:3;40050:2;40042:6;40038:15;40031:28;39846:220;:::o;40072:236::-;40212:34;40208:1;40200:6;40196:14;40189:58;40281:19;40276:2;40268:6;40264:15;40257:44;40072:236;:::o;40314:237::-;40454:34;40450:1;40442:6;40438:14;40431:58;40523:20;40518:2;40510:6;40506:15;40499:45;40314:237;:::o;40557:122::-;40630:24;40648:5;40630:24;:::i;:::-;40623:5;40620:35;40610:63;;40669:1;40666;40659:12;40610:63;40557:122;:::o;40685:116::-;40755:21;40770:5;40755:21;:::i;:::-;40748:5;40745:32;40735:60;;40791:1;40788;40781:12;40735:60;40685:116;:::o;40807:120::-;40879:23;40896:5;40879:23;:::i;:::-;40872:5;40869:34;40859:62;;40917:1;40914;40907:12;40859:62;40807:120;:::o;40933:122::-;41006:24;41024:5;41006:24;:::i;:::-;40999:5;40996:35;40986:63;;41045:1;41042;41035:12;40986:63;40933:122;:::o

Swarm Source

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