ETH Price: $3,087.24 (-0.04%)
Gas: 4 Gwei

Token

Grumpy Bear Yacht Club (GBYC)
 

Overview

Max Total Supply

1,800 GBYC

Holders

1,683

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GBYC
0xf5745dB66fFEDe31449A5DAA30fAbB9E855fA97d
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:
GBYC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-07
*/

/**
 *Submitted for verification at Etherscan.io on 2022-10-28
*/

// SPDX-License-Identifier: MIT
//Developer Info:



// 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/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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: contracts/new.sol




pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}


pragma solidity ^0.8.7;
    
contract GBYC is DefaultOperatorFilterer, ERC721A, Ownable {
    using Strings for uint256;


  string private uriPrefix ;
  string private uriSuffix = ".json";
  string public hiddenURL;

  
  

  uint256 public cost = 0.0055 ether;
 
  

  uint16 public maxSupply = 1800;
  uint8 public maxMintAmountPerTx = 5;
  uint8 public maxFreeMintAmountPerWallet = 1;
                                                             
 
  bool public paused = true;
  bool public reveal =false;

   mapping (address => uint8) public NFTPerPublicAddress;

 
  
  
 
  

  constructor() ERC721A("Grumpy Bear Yacht Club", "GBYC") {
  }


  
 
  function mint(uint8 _mintAmount) external payable  {
     uint16 totalSupply = uint16(totalSupply());
     uint8 nft = NFTPerPublicAddress[msg.sender];
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
    require(_mintAmount + nft <= maxMintAmountPerTx, "Exceeds max per transaction.");

    require(!paused, "The contract is paused!");
    
      if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= cost * costAmount, "Insufficient funds!");
       }
       
         
    }
    


    _safeMint(msg.sender , _mintAmount);

    NFTPerPublicAddress[msg.sender] = _mintAmount + nft;
     
     delete totalSupply;
     delete _mintAmount;
  }
  
  function Reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
     _safeMint(_receiver , _mintAmount);
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

  function  Airdrop(uint8 _amountPerAddress, address[] calldata addresses) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
     uint totalAmount =   _amountPerAddress * addresses.length;
    require(totalSupply + totalAmount <= maxSupply, "Exceeds max supply.");
     for (uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], _amountPerAddress);
        }

     delete _amountPerAddress;
     delete totalSupply;
  }

 

  function setMaxSupply(uint16 _maxSupply) external onlyOwner {
      maxSupply = _maxSupply;
  }



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

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


 function setFreeMaxLimitPerAddress(uint8 _limit) external onlyOwner{
    maxFreeMintAmountPerWallet = _limit;
   delete _limit;

}

    
  

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }
   function setHiddenUri(string memory _uriPrefix) external onlyOwner {
    hiddenURL = _uriPrefix;
  }


  function setPaused() external onlyOwner {
    paused = !paused;
   
  }

  function setCost(uint _cost) external onlyOwner{
      cost = _cost;

  }

 function setRevealed() external onlyOwner{
     reveal = !reveal;
 }

  function setMaxMintAmountPerTx(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerTx = _maxtx;

  }

 

  function withdraw() external onlyOwner {
  uint _balance = address(this).balance;
     payable(msg.sender).transfer(_balance ); 
       
  }


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

  function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
    super.setApprovalForAll(operator, approved);
  }

  function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
    super.approve(operator, tokenId);
  }

  function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
    super.transferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
    super.safeTransferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
    public
    override
    onlyAllowedOperator(from)
  {
    super.safeTransferFrom(from, to, tokenId, data);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"_amountPerAddress","type":"uint8"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"hiddenURL","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":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setHiddenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620004b5565b5066138a388a43c000600c55610708600d60006101000a81548161ffff021916908361ffff1602179055506005600d60026101000a81548160ff021916908360ff1602179055506001600d60036101000a81548160ff021916908360ff1602179055506001600d60046101000a81548160ff0219169083151502179055506000600d60056101000a81548160ff021916908315150217905550348015620000f757600080fd5b506040518060400160405280601681526020017f4772756d7079204265617220596163687420436c7562000000000000000000008152506040518060400160405280600481526020017f4742594300000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037057801562000236576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001fc92919062000593565b600060405180830381600087803b1580156200021757600080fd5b505af11580156200022c573d6000803e3d6000fd5b505050506200036f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002f0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002b692919062000593565b600060405180830381600087803b158015620002d157600080fd5b505af1158015620002e6573d6000803e3d6000fd5b505050506200036e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000339919062000576565b600060405180830381600087803b1580156200035457600080fd5b505af115801562000369573d6000803e3d6000fd5b505050505b5b5b505081600290805190602001906200038a929190620004b5565b508060039080519060200190620003a3929190620004b5565b50620003b4620003e260201b60201c565b6000819055505050620003dc620003d0620003e760201b60201c565b620003ef60201b60201c565b62000659565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004c390620005f4565b90600052602060002090601f016020900481019282620004e7576000855562000533565b82601f106200050257805160ff191683800117855562000533565b8280016001018555821562000533579182015b828111156200053257825182559160200191906001019062000515565b5b50905062000542919062000546565b5090565b5b808211156200056157600081600090555060010162000547565b5090565b6200057081620005c0565b82525050565b60006020820190506200058d600083018462000565565b92915050565b6000604082019050620005aa600083018562000565565b620005b9602083018462000565565b9392505050565b6000620005cd82620005d4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200060d57607f821691505b602082108114156200062457620006236200062a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61454380620006696000396000f3fe6080604052600436106102255760003560e01c80636ecd230611610123578063aa062290116100ab578063e94053c71161006f578063e94053c714610796578063e985e9c5146107d3578063eef440af14610810578063f2fde38b1461083b578063f8bf51721461086457610225565b8063aa062290146106b3578063b88d4fde146106dc578063c87b56dd14610705578063cffb6e2014610742578063d5abeb011461076b57610225565b80638da5cb5b116100f25780638da5cb5b146105de57806394354fd01461060957806395d89b4114610634578063a22cb4651461065f578063a475b5dd1461068857610225565b80636ecd23061461054557806370a0823114610561578063715018a61461059e5780637ec4a659146105b557610225565b80632f6f98e1116101b157806342842e0e1161017557806342842e0e1461046257806344a0d68a1461048b5780634d9c1848146104b45780635c975abb146104dd5780636352211e1461050857610225565b80632f6f98e1146103c957806337a66d85146103f25780633bd64968146104095780633ccfd60b1461042057806341f434341461043757610225565b8063095ea7b3116101f8578063095ea7b3146102f85780631067fcc71461032157806313faede61461034a57806318160ddd1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306421c2f1461026757806306fdde0314610290578063081812fc146102bb575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906136fe565b61088f565b60405161025e9190613bfa565b60405180910390f35b34801561027357600080fd5b5061028e600480360381019061028991906137a1565b610971565b005b34801561029c57600080fd5b506102a5610a0d565b6040516102b29190613c30565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd919061380e565b610a9f565b6040516102ef9190613b6a565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190613691565b610b1b565b005b34801561032d57600080fd5b5061034860048036038101906103439190613758565b610b34565b005b34801561035657600080fd5b5061035f610bca565b60405161036c9190613d4d565b60405180910390f35b34801561038157600080fd5b5061038a610bd0565b6040516103979190613d4d565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061357b565b610be7565b005b3480156103d557600080fd5b506103f060048036038101906103eb91906137ce565b610c36565b005b3480156103fe57600080fd5b50610407610d43565b005b34801561041557600080fd5b5061041e610deb565b005b34801561042c57600080fd5b50610435610e93565b005b34801561044357600080fd5b5061044c610f5e565b6040516104599190613c15565b60405180910390f35b34801561046e57600080fd5b506104896004803603810190610484919061357b565b610f70565b005b34801561049757600080fd5b506104b260048036038101906104ad919061380e565b610fbf565b005b3480156104c057600080fd5b506104db60048036038101906104d6919061383b565b611045565b005b3480156104e957600080fd5b506104f26110e3565b6040516104ff9190613bfa565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a919061380e565b6110f6565b60405161053c9190613b6a565b60405180910390f35b61055f600480360381019061055a919061383b565b61110c565b005b34801561056d57600080fd5b506105886004803603810190610583919061350e565b611416565b6040516105959190613d4d565b60405180910390f35b3480156105aa57600080fd5b506105b36114e6565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190613758565b61156e565b005b3480156105ea57600080fd5b506105f3611604565b6040516106009190613b6a565b60405180910390f35b34801561061557600080fd5b5061061e61162e565b60405161062b9190613d68565b60405180910390f35b34801561064057600080fd5b50610649611641565b6040516106569190613c30565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190613651565b6116d3565b005b34801561069457600080fd5b5061069d6116ec565b6040516106aa9190613bfa565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d5919061383b565b6116ff565b005b3480156106e857600080fd5b5061070360048036038101906106fe91906135ce565b611799565b005b34801561071157600080fd5b5061072c6004803603810190610727919061380e565b6117ea565b6040516107399190613c30565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190613868565b611943565b005b34801561077757600080fd5b50610780611aac565b60405161078d9190613d32565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b8919061350e565b611ac0565b6040516107ca9190613d68565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f5919061353b565b611ae0565b6040516108079190613bfa565b60405180910390f35b34801561081c57600080fd5b50610825611b74565b6040516108329190613c30565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d919061350e565b611c02565b005b34801561087057600080fd5b50610879611cfa565b6040516108869190613d68565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061096a575061096982611d0d565b5b9050919050565b610979611d77565b73ffffffffffffffffffffffffffffffffffffffff16610997611604565b73ffffffffffffffffffffffffffffffffffffffff16146109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490613c72565b60405180910390fd5b80600d60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610a1c90614121565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890614121565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b5050505050905090565b6000610aaa82611d7f565b610ae0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b2581611dcd565b610b2f8383611ed9565b505050565b610b3c611d77565b73ffffffffffffffffffffffffffffffffffffffff16610b5a611604565b73ffffffffffffffffffffffffffffffffffffffff1614610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613c72565b60405180910390fd5b80600b9080519060200190610bc692919061324a565b5050565b600c5481565b6000610bda611fe4565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2557610c2433611dcd565b5b610c30848484611fe9565b50505050565b610c3e611d77565b73ffffffffffffffffffffffffffffffffffffffff16610c5c611604565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990613c72565b60405180910390fd5b6000610cbc610bd0565b9050600d60009054906101000a900461ffff1661ffff168382610cdf9190613e62565b61ffff161115610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613cd2565b60405180910390fd5b610d32828461ffff16611ff9565b600092506000915060009050505050565b610d4b611d77565b73ffffffffffffffffffffffffffffffffffffffff16610d69611604565b73ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690613c72565b60405180910390fd5b600d60049054906101000a900460ff1615600d60046101000a81548160ff021916908315150217905550565b610df3611d77565b73ffffffffffffffffffffffffffffffffffffffff16610e11611604565b73ffffffffffffffffffffffffffffffffffffffff1614610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90613c72565b60405180910390fd5b600d60059054906101000a900460ff1615600d60056101000a81548160ff021916908315150217905550565b610e9b611d77565b73ffffffffffffffffffffffffffffffffffffffff16610eb9611604565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613c72565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f5a573d6000803e3d6000fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fae57610fad33611dcd565b5b610fb9848484612017565b50505050565b610fc7611d77565b73ffffffffffffffffffffffffffffffffffffffff16610fe5611604565b73ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290613c72565b60405180910390fd5b80600c8190555050565b61104d611d77565b73ffffffffffffffffffffffffffffffffffffffff1661106b611604565b73ffffffffffffffffffffffffffffffffffffffff16146110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890613c72565b60405180910390fd5b80600d60036101000a81548160ff021916908360ff1602179055506000905050565b600d60049054906101000a900460ff1681565b600061110182612037565b600001519050919050565b6000611116610bd0565b90506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600d60009054906101000a900461ffff1661ffff168360ff168361118d9190613e62565b61ffff1611156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c990613cd2565b60405180910390fd5b600d60029054906101000a900460ff1660ff1681846111f19190613ef0565b60ff161115611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90613cf2565b60405180910390fd5b600d60049054906101000a900460ff1615611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c90613c92565b60405180910390fd5b600d60039054906101000a900460ff1660ff168160ff16106112f9578260ff16600c546112b29190613f58565b3410156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90613d12565b60405180910390fd5b611399565b600081846113079190613ef0565b9050600d60039054906101000a900460ff1660ff168160ff16111561139757600d60039054906101000a900460ff16816113419190613fe6565b90508060ff16600c546113549190613f58565b341015611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613d12565b60405180910390fd5b5b505b6113a6338460ff16611ff9565b80836113b29190613ef0565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561147e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114ee611d77565b73ffffffffffffffffffffffffffffffffffffffff1661150c611604565b73ffffffffffffffffffffffffffffffffffffffff1614611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990613c72565b60405180910390fd5b61156c60006122c6565b565b611576611d77565b73ffffffffffffffffffffffffffffffffffffffff16611594611604565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613c72565b60405180910390fd5b806009908051906020019061160092919061324a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60029054906101000a900460ff1681565b60606003805461165090614121565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90614121565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b5050505050905090565b816116dd81611dcd565b6116e7838361238c565b505050565b600d60059054906101000a900460ff1681565b611707611d77565b73ffffffffffffffffffffffffffffffffffffffff16611725611604565b73ffffffffffffffffffffffffffffffffffffffff161461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290613c72565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117d7576117d633611dcd565b5b6117e385858585612504565b5050505050565b60606117f582611d7f565b611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613cb2565b60405180910390fd5b60001515600d60059054906101000a900460ff16151514156118e257600b805461185d90614121565b80601f016020809104026020016040519081016040528092919081815260200182805461188990614121565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050905061193e565b60006118ec612580565b9050600081511161190c576040518060200160405280600081525061193a565b8061191684612612565b600a60405160200161192a93929190613b39565b6040516020818303038152906040525b9150505b919050565b61194b611d77565b73ffffffffffffffffffffffffffffffffffffffff16611969611604565b73ffffffffffffffffffffffffffffffffffffffff16146119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613c72565b60405180910390fd5b60006119c9610bd0565b90506000838390508560ff166119df9190613f58565b9050600d60009054906101000a900461ffff1661ffff16818361ffff16611a069190613e9a565b1115611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613cd2565b60405180910390fd5b60005b84849050811015611a9c57611a89858583818110611a6b57611a6a61428b565b5b9050602002016020810190611a80919061350e565b8760ff16611ff9565b8080611a9490614184565b915050611a4a565b5060009450600091505050505050565b600d60009054906101000a900461ffff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054611b8190614121565b80601f0160208091040260200160405190810160405280929190818152602001828054611bad90614121565b8015611bfa5780601f10611bcf57610100808354040283529160200191611bfa565b820191906000526020600020905b815481529060010190602001808311611bdd57829003601f168201915b505050505081565b611c0a611d77565b73ffffffffffffffffffffffffffffffffffffffff16611c28611604565b73ffffffffffffffffffffffffffffffffffffffff1614611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7590613c72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590613c52565b60405180910390fd5b611cf7816122c6565b50565b600d60039054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d8a611fe4565b11158015611d99575060005482105b8015611dc6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ed6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e44929190613b85565b60206040518083038186803b158015611e5c57600080fd5b505afa158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9491906136d1565b611ed557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ecc9190613b6a565b60405180910390fd5b5b50565b6000611ee4826110f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f4c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611f6b611d77565b73ffffffffffffffffffffffffffffffffffffffff1614158015611f9d5750611f9b81611f96611d77565b611ae0565b155b15611fd4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fdf838383612773565b505050565b600090565b611ff4838383612825565b505050565b612013828260405180602001604052806000815250612cdb565b5050565b61203283838360405180602001604052806000815250611799565b505050565b61203f6132d0565b60008290508061204d611fe4565b1115801561205c575060005481105b1561228f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161228d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121715780925050506122c1565b5b60011561228c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122875780925050506122c1565b612172565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612394611d77565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612406611d77565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124b3611d77565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124f89190613bfa565b60405180910390a35050565b61250f848484612825565b61252e8373ffffffffffffffffffffffffffffffffffffffff16612ced565b8015612543575061254184848484612d10565b155b1561257a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606009805461258f90614121565b80601f01602080910402602001604051908101604052809291908181526020018280546125bb90614121565b80156126085780601f106125dd57610100808354040283529160200191612608565b820191906000526020600020905b8154815290600101906020018083116125eb57829003601f168201915b5050505050905090565b6060600082141561265a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061276e565b600082905060005b6000821461268c57808061267590614184565b915050600a826126859190613f27565b9150612662565b60008167ffffffffffffffff8111156126a8576126a76142ba565b5b6040519080825280601f01601f1916602001820160405280156126da5781602001600182028036833780820191505090505b5090505b60008514612767576001826126f39190613fb2565b9150600a8561270291906141cd565b603061270e9190613e9a565b60f81b8183815181106127245761272361428b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127609190613f27565b94506126de565b8093505050505b919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061283082612037565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461289b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128bc611d77565b73ffffffffffffffffffffffffffffffffffffffff1614806128eb57506128ea856128e5611d77565b611ae0565b5b8061293057506128f9611d77565b73ffffffffffffffffffffffffffffffffffffffff1661291884610a9f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612969576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129d0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129dd8585856001612e70565b6129e960008487612773565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c69576000548214612c6857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cd48585856001612e76565b5050505050565b612ce88383836001612e7c565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d36611d77565b8786866040518563ffffffff1660e01b8152600401612d589493929190613bae565b602060405180830381600087803b158015612d7257600080fd5b505af1925050508015612da357506040513d601f19601f82011682018060405250810190612da0919061372b565b60015b612e1d573d8060008114612dd3576040519150601f19603f3d011682016040523d82523d6000602084013e612dd8565b606091505b50600081511415612e15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612ee9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612f24576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f316000868387612e70565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156130fb57506130fa8773ffffffffffffffffffffffffffffffffffffffff16612ced565b5b156131c1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131706000888480600101955088612d10565b6131a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156131015782600054146131bc57600080fd5b61322d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156131c2575b8160008190555050506132436000868387612e76565b5050505050565b82805461325690614121565b90600052602060002090601f01602090048101928261327857600085556132bf565b82601f1061329157805160ff19168380011785556132bf565b828001600101855582156132bf579182015b828111156132be5782518255916020019190600101906132a3565b5b5090506132cc9190613313565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561332c576000816000905550600101613314565b5090565b600061334361333e84613da8565b613d83565b90508281526020810184848401111561335f5761335e6142f8565b5b61336a8482856140df565b509392505050565b600061338561338084613dd9565b613d83565b9050828152602081018484840111156133a1576133a06142f8565b5b6133ac8482856140df565b509392505050565b6000813590506133c381614483565b92915050565b60008083601f8401126133df576133de6142ee565b5b8235905067ffffffffffffffff8111156133fc576133fb6142e9565b5b602083019150836020820283011115613418576134176142f3565b5b9250929050565b60008135905061342e8161449a565b92915050565b6000815190506134438161449a565b92915050565b600081359050613458816144b1565b92915050565b60008151905061346d816144b1565b92915050565b600082601f830112613488576134876142ee565b5b8135613498848260208601613330565b91505092915050565b600082601f8301126134b6576134b56142ee565b5b81356134c6848260208601613372565b91505092915050565b6000813590506134de816144c8565b92915050565b6000813590506134f3816144df565b92915050565b600081359050613508816144f6565b92915050565b60006020828403121561352457613523614302565b5b6000613532848285016133b4565b91505092915050565b6000806040838503121561355257613551614302565b5b6000613560858286016133b4565b9250506020613571858286016133b4565b9150509250929050565b60008060006060848603121561359457613593614302565b5b60006135a2868287016133b4565b93505060206135b3868287016133b4565b92505060406135c4868287016134e4565b9150509250925092565b600080600080608085870312156135e8576135e7614302565b5b60006135f6878288016133b4565b9450506020613607878288016133b4565b9350506040613618878288016134e4565b925050606085013567ffffffffffffffff811115613639576136386142fd565b5b61364587828801613473565b91505092959194509250565b6000806040838503121561366857613667614302565b5b6000613676858286016133b4565b92505060206136878582860161341f565b9150509250929050565b600080604083850312156136a8576136a7614302565b5b60006136b6858286016133b4565b92505060206136c7858286016134e4565b9150509250929050565b6000602082840312156136e7576136e6614302565b5b60006136f584828501613434565b91505092915050565b60006020828403121561371457613713614302565b5b600061372284828501613449565b91505092915050565b60006020828403121561374157613740614302565b5b600061374f8482850161345e565b91505092915050565b60006020828403121561376e5761376d614302565b5b600082013567ffffffffffffffff81111561378c5761378b6142fd565b5b613798848285016134a1565b91505092915050565b6000602082840312156137b7576137b6614302565b5b60006137c5848285016134cf565b91505092915050565b600080604083850312156137e5576137e4614302565b5b60006137f3858286016134cf565b9250506020613804858286016133b4565b9150509250929050565b60006020828403121561382457613823614302565b5b6000613832848285016134e4565b91505092915050565b60006020828403121561385157613850614302565b5b600061385f848285016134f9565b91505092915050565b60008060006040848603121561388157613880614302565b5b600061388f868287016134f9565b935050602084013567ffffffffffffffff8111156138b0576138af6142fd565b5b6138bc868287016133c9565b92509250509250925092565b6138d18161401a565b82525050565b6138e08161402c565b82525050565b60006138f182613e1f565b6138fb8185613e35565b935061390b8185602086016140ee565b61391481614307565b840191505092915050565b613928816140a9565b82525050565b600061393982613e2a565b6139438185613e46565b93506139538185602086016140ee565b61395c81614307565b840191505092915050565b600061397282613e2a565b61397c8185613e57565b935061398c8185602086016140ee565b80840191505092915050565b600081546139a581614121565b6139af8186613e57565b945060018216600081146139ca57600181146139db57613a0e565b60ff19831686528186019350613a0e565b6139e485613e0a565b60005b83811015613a06578154818901526001820191506020810190506139e7565b838801955050505b50505092915050565b6000613a24602683613e46565b9150613a2f82614318565b604082019050919050565b6000613a47602083613e46565b9150613a5282614367565b602082019050919050565b6000613a6a601783613e46565b9150613a7582614390565b602082019050919050565b6000613a8d602f83613e46565b9150613a98826143b9565b604082019050919050565b6000613ab0601383613e46565b9150613abb82614408565b602082019050919050565b6000613ad3601c83613e46565b9150613ade82614431565b602082019050919050565b6000613af6601383613e46565b9150613b018261445a565b602082019050919050565b613b1581614064565b82525050565b613b2481614092565b82525050565b613b338161409c565b82525050565b6000613b458286613967565b9150613b518285613967565b9150613b5d8284613998565b9150819050949350505050565b6000602082019050613b7f60008301846138c8565b92915050565b6000604082019050613b9a60008301856138c8565b613ba760208301846138c8565b9392505050565b6000608082019050613bc360008301876138c8565b613bd060208301866138c8565b613bdd6040830185613b1b565b8181036060830152613bef81846138e6565b905095945050505050565b6000602082019050613c0f60008301846138d7565b92915050565b6000602082019050613c2a600083018461391f565b92915050565b60006020820190508181036000830152613c4a818461392e565b905092915050565b60006020820190508181036000830152613c6b81613a17565b9050919050565b60006020820190508181036000830152613c8b81613a3a565b9050919050565b60006020820190508181036000830152613cab81613a5d565b9050919050565b60006020820190508181036000830152613ccb81613a80565b9050919050565b60006020820190508181036000830152613ceb81613aa3565b9050919050565b60006020820190508181036000830152613d0b81613ac6565b9050919050565b60006020820190508181036000830152613d2b81613ae9565b9050919050565b6000602082019050613d476000830184613b0c565b92915050565b6000602082019050613d626000830184613b1b565b92915050565b6000602082019050613d7d6000830184613b2a565b92915050565b6000613d8d613d9e565b9050613d998282614153565b919050565b6000604051905090565b600067ffffffffffffffff821115613dc357613dc26142ba565b5b613dcc82614307565b9050602081019050919050565b600067ffffffffffffffff821115613df457613df36142ba565b5b613dfd82614307565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e6d82614064565b9150613e7883614064565b92508261ffff03821115613e8f57613e8e6141fe565b5b828201905092915050565b6000613ea582614092565b9150613eb083614092565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee557613ee46141fe565b5b828201905092915050565b6000613efb8261409c565b9150613f068361409c565b92508260ff03821115613f1c57613f1b6141fe565b5b828201905092915050565b6000613f3282614092565b9150613f3d83614092565b925082613f4d57613f4c61422d565b5b828204905092915050565b6000613f6382614092565b9150613f6e83614092565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fa757613fa66141fe565b5b828202905092915050565b6000613fbd82614092565b9150613fc883614092565b925082821015613fdb57613fda6141fe565b5b828203905092915050565b6000613ff18261409c565b9150613ffc8361409c565b92508282101561400f5761400e6141fe565b5b828203905092915050565b600061402582614072565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006140b4826140bb565b9050919050565b60006140c6826140cd565b9050919050565b60006140d882614072565b9050919050565b82818337600083830152505050565b60005b8381101561410c5780820151818401526020810190506140f1565b8381111561411b576000848401525b50505050565b6000600282049050600182168061413957607f821691505b6020821081141561414d5761414c61425c565b5b50919050565b61415c82614307565b810181811067ffffffffffffffff8211171561417b5761417a6142ba565b5b80604052505050565b600061418f82614092565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141c2576141c16141fe565b5b600182019050919050565b60006141d882614092565b91506141e383614092565b9250826141f3576141f261422d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61448c8161401a565b811461449757600080fd5b50565b6144a38161402c565b81146144ae57600080fd5b50565b6144ba81614038565b81146144c557600080fd5b50565b6144d181614064565b81146144dc57600080fd5b50565b6144e881614092565b81146144f357600080fd5b50565b6144ff8161409c565b811461450a57600080fd5b5056fea264697066735822122031e1b9ea4de33f78074aebd22f5de4564d0003ab294303feea0b3592a0b9064364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102255760003560e01c80636ecd230611610123578063aa062290116100ab578063e94053c71161006f578063e94053c714610796578063e985e9c5146107d3578063eef440af14610810578063f2fde38b1461083b578063f8bf51721461086457610225565b8063aa062290146106b3578063b88d4fde146106dc578063c87b56dd14610705578063cffb6e2014610742578063d5abeb011461076b57610225565b80638da5cb5b116100f25780638da5cb5b146105de57806394354fd01461060957806395d89b4114610634578063a22cb4651461065f578063a475b5dd1461068857610225565b80636ecd23061461054557806370a0823114610561578063715018a61461059e5780637ec4a659146105b557610225565b80632f6f98e1116101b157806342842e0e1161017557806342842e0e1461046257806344a0d68a1461048b5780634d9c1848146104b45780635c975abb146104dd5780636352211e1461050857610225565b80632f6f98e1146103c957806337a66d85146103f25780633bd64968146104095780633ccfd60b1461042057806341f434341461043757610225565b8063095ea7b3116101f8578063095ea7b3146102f85780631067fcc71461032157806313faede61461034a57806318160ddd1461037557806323b872dd146103a057610225565b806301ffc9a71461022a57806306421c2f1461026757806306fdde0314610290578063081812fc146102bb575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906136fe565b61088f565b60405161025e9190613bfa565b60405180910390f35b34801561027357600080fd5b5061028e600480360381019061028991906137a1565b610971565b005b34801561029c57600080fd5b506102a5610a0d565b6040516102b29190613c30565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd919061380e565b610a9f565b6040516102ef9190613b6a565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190613691565b610b1b565b005b34801561032d57600080fd5b5061034860048036038101906103439190613758565b610b34565b005b34801561035657600080fd5b5061035f610bca565b60405161036c9190613d4d565b60405180910390f35b34801561038157600080fd5b5061038a610bd0565b6040516103979190613d4d565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061357b565b610be7565b005b3480156103d557600080fd5b506103f060048036038101906103eb91906137ce565b610c36565b005b3480156103fe57600080fd5b50610407610d43565b005b34801561041557600080fd5b5061041e610deb565b005b34801561042c57600080fd5b50610435610e93565b005b34801561044357600080fd5b5061044c610f5e565b6040516104599190613c15565b60405180910390f35b34801561046e57600080fd5b506104896004803603810190610484919061357b565b610f70565b005b34801561049757600080fd5b506104b260048036038101906104ad919061380e565b610fbf565b005b3480156104c057600080fd5b506104db60048036038101906104d6919061383b565b611045565b005b3480156104e957600080fd5b506104f26110e3565b6040516104ff9190613bfa565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a919061380e565b6110f6565b60405161053c9190613b6a565b60405180910390f35b61055f600480360381019061055a919061383b565b61110c565b005b34801561056d57600080fd5b506105886004803603810190610583919061350e565b611416565b6040516105959190613d4d565b60405180910390f35b3480156105aa57600080fd5b506105b36114e6565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190613758565b61156e565b005b3480156105ea57600080fd5b506105f3611604565b6040516106009190613b6a565b60405180910390f35b34801561061557600080fd5b5061061e61162e565b60405161062b9190613d68565b60405180910390f35b34801561064057600080fd5b50610649611641565b6040516106569190613c30565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190613651565b6116d3565b005b34801561069457600080fd5b5061069d6116ec565b6040516106aa9190613bfa565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d5919061383b565b6116ff565b005b3480156106e857600080fd5b5061070360048036038101906106fe91906135ce565b611799565b005b34801561071157600080fd5b5061072c6004803603810190610727919061380e565b6117ea565b6040516107399190613c30565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190613868565b611943565b005b34801561077757600080fd5b50610780611aac565b60405161078d9190613d32565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b8919061350e565b611ac0565b6040516107ca9190613d68565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f5919061353b565b611ae0565b6040516108079190613bfa565b60405180910390f35b34801561081c57600080fd5b50610825611b74565b6040516108329190613c30565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d919061350e565b611c02565b005b34801561087057600080fd5b50610879611cfa565b6040516108869190613d68565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061096a575061096982611d0d565b5b9050919050565b610979611d77565b73ffffffffffffffffffffffffffffffffffffffff16610997611604565b73ffffffffffffffffffffffffffffffffffffffff16146109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490613c72565b60405180910390fd5b80600d60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610a1c90614121565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890614121565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b5050505050905090565b6000610aaa82611d7f565b610ae0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b2581611dcd565b610b2f8383611ed9565b505050565b610b3c611d77565b73ffffffffffffffffffffffffffffffffffffffff16610b5a611604565b73ffffffffffffffffffffffffffffffffffffffff1614610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613c72565b60405180910390fd5b80600b9080519060200190610bc692919061324a565b5050565b600c5481565b6000610bda611fe4565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2557610c2433611dcd565b5b610c30848484611fe9565b50505050565b610c3e611d77565b73ffffffffffffffffffffffffffffffffffffffff16610c5c611604565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990613c72565b60405180910390fd5b6000610cbc610bd0565b9050600d60009054906101000a900461ffff1661ffff168382610cdf9190613e62565b61ffff161115610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613cd2565b60405180910390fd5b610d32828461ffff16611ff9565b600092506000915060009050505050565b610d4b611d77565b73ffffffffffffffffffffffffffffffffffffffff16610d69611604565b73ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690613c72565b60405180910390fd5b600d60049054906101000a900460ff1615600d60046101000a81548160ff021916908315150217905550565b610df3611d77565b73ffffffffffffffffffffffffffffffffffffffff16610e11611604565b73ffffffffffffffffffffffffffffffffffffffff1614610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90613c72565b60405180910390fd5b600d60059054906101000a900460ff1615600d60056101000a81548160ff021916908315150217905550565b610e9b611d77565b73ffffffffffffffffffffffffffffffffffffffff16610eb9611604565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690613c72565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f5a573d6000803e3d6000fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fae57610fad33611dcd565b5b610fb9848484612017565b50505050565b610fc7611d77565b73ffffffffffffffffffffffffffffffffffffffff16610fe5611604565b73ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290613c72565b60405180910390fd5b80600c8190555050565b61104d611d77565b73ffffffffffffffffffffffffffffffffffffffff1661106b611604565b73ffffffffffffffffffffffffffffffffffffffff16146110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890613c72565b60405180910390fd5b80600d60036101000a81548160ff021916908360ff1602179055506000905050565b600d60049054906101000a900460ff1681565b600061110182612037565b600001519050919050565b6000611116610bd0565b90506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600d60009054906101000a900461ffff1661ffff168360ff168361118d9190613e62565b61ffff1611156111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c990613cd2565b60405180910390fd5b600d60029054906101000a900460ff1660ff1681846111f19190613ef0565b60ff161115611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90613cf2565b60405180910390fd5b600d60049054906101000a900460ff1615611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c90613c92565b60405180910390fd5b600d60039054906101000a900460ff1660ff168160ff16106112f9578260ff16600c546112b29190613f58565b3410156112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90613d12565b60405180910390fd5b611399565b600081846113079190613ef0565b9050600d60039054906101000a900460ff1660ff168160ff16111561139757600d60039054906101000a900460ff16816113419190613fe6565b90508060ff16600c546113549190613f58565b341015611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613d12565b60405180910390fd5b5b505b6113a6338460ff16611ff9565b80836113b29190613ef0565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561147e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114ee611d77565b73ffffffffffffffffffffffffffffffffffffffff1661150c611604565b73ffffffffffffffffffffffffffffffffffffffff1614611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990613c72565b60405180910390fd5b61156c60006122c6565b565b611576611d77565b73ffffffffffffffffffffffffffffffffffffffff16611594611604565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613c72565b60405180910390fd5b806009908051906020019061160092919061324a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60029054906101000a900460ff1681565b60606003805461165090614121565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90614121565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b5050505050905090565b816116dd81611dcd565b6116e7838361238c565b505050565b600d60059054906101000a900460ff1681565b611707611d77565b73ffffffffffffffffffffffffffffffffffffffff16611725611604565b73ffffffffffffffffffffffffffffffffffffffff161461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290613c72565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117d7576117d633611dcd565b5b6117e385858585612504565b5050505050565b60606117f582611d7f565b611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613cb2565b60405180910390fd5b60001515600d60059054906101000a900460ff16151514156118e257600b805461185d90614121565b80601f016020809104026020016040519081016040528092919081815260200182805461188990614121565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050905061193e565b60006118ec612580565b9050600081511161190c576040518060200160405280600081525061193a565b8061191684612612565b600a60405160200161192a93929190613b39565b6040516020818303038152906040525b9150505b919050565b61194b611d77565b73ffffffffffffffffffffffffffffffffffffffff16611969611604565b73ffffffffffffffffffffffffffffffffffffffff16146119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613c72565b60405180910390fd5b60006119c9610bd0565b90506000838390508560ff166119df9190613f58565b9050600d60009054906101000a900461ffff1661ffff16818361ffff16611a069190613e9a565b1115611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613cd2565b60405180910390fd5b60005b84849050811015611a9c57611a89858583818110611a6b57611a6a61428b565b5b9050602002016020810190611a80919061350e565b8760ff16611ff9565b8080611a9490614184565b915050611a4a565b5060009450600091505050505050565b600d60009054906101000a900461ffff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054611b8190614121565b80601f0160208091040260200160405190810160405280929190818152602001828054611bad90614121565b8015611bfa5780601f10611bcf57610100808354040283529160200191611bfa565b820191906000526020600020905b815481529060010190602001808311611bdd57829003601f168201915b505050505081565b611c0a611d77565b73ffffffffffffffffffffffffffffffffffffffff16611c28611604565b73ffffffffffffffffffffffffffffffffffffffff1614611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7590613c72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590613c52565b60405180910390fd5b611cf7816122c6565b50565b600d60039054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d8a611fe4565b11158015611d99575060005482105b8015611dc6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ed6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e44929190613b85565b60206040518083038186803b158015611e5c57600080fd5b505afa158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9491906136d1565b611ed557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ecc9190613b6a565b60405180910390fd5b5b50565b6000611ee4826110f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f4c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611f6b611d77565b73ffffffffffffffffffffffffffffffffffffffff1614158015611f9d5750611f9b81611f96611d77565b611ae0565b155b15611fd4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fdf838383612773565b505050565b600090565b611ff4838383612825565b505050565b612013828260405180602001604052806000815250612cdb565b5050565b61203283838360405180602001604052806000815250611799565b505050565b61203f6132d0565b60008290508061204d611fe4565b1115801561205c575060005481105b1561228f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161228d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121715780925050506122c1565b5b60011561228c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122875780925050506122c1565b612172565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612394611d77565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612406611d77565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124b3611d77565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124f89190613bfa565b60405180910390a35050565b61250f848484612825565b61252e8373ffffffffffffffffffffffffffffffffffffffff16612ced565b8015612543575061254184848484612d10565b155b1561257a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606009805461258f90614121565b80601f01602080910402602001604051908101604052809291908181526020018280546125bb90614121565b80156126085780601f106125dd57610100808354040283529160200191612608565b820191906000526020600020905b8154815290600101906020018083116125eb57829003601f168201915b5050505050905090565b6060600082141561265a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061276e565b600082905060005b6000821461268c57808061267590614184565b915050600a826126859190613f27565b9150612662565b60008167ffffffffffffffff8111156126a8576126a76142ba565b5b6040519080825280601f01601f1916602001820160405280156126da5781602001600182028036833780820191505090505b5090505b60008514612767576001826126f39190613fb2565b9150600a8561270291906141cd565b603061270e9190613e9a565b60f81b8183815181106127245761272361428b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127609190613f27565b94506126de565b8093505050505b919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061283082612037565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461289b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128bc611d77565b73ffffffffffffffffffffffffffffffffffffffff1614806128eb57506128ea856128e5611d77565b611ae0565b5b8061293057506128f9611d77565b73ffffffffffffffffffffffffffffffffffffffff1661291884610a9f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612969576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129d0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129dd8585856001612e70565b6129e960008487612773565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c69576000548214612c6857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cd48585856001612e76565b5050505050565b612ce88383836001612e7c565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d36611d77565b8786866040518563ffffffff1660e01b8152600401612d589493929190613bae565b602060405180830381600087803b158015612d7257600080fd5b505af1925050508015612da357506040513d601f19601f82011682018060405250810190612da0919061372b565b60015b612e1d573d8060008114612dd3576040519150601f19603f3d011682016040523d82523d6000602084013e612dd8565b606091505b50600081511415612e15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612ee9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612f24576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f316000868387612e70565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156130fb57506130fa8773ffffffffffffffffffffffffffffffffffffffff16612ced565b5b156131c1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131706000888480600101955088612d10565b6131a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156131015782600054146131bc57600080fd5b61322d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156131c2575b8160008190555050506132436000868387612e76565b5050505050565b82805461325690614121565b90600052602060002090601f01602090048101928261327857600085556132bf565b82601f1061329157805160ff19168380011785556132bf565b828001600101855582156132bf579182015b828111156132be5782518255916020019190600101906132a3565b5b5090506132cc9190613313565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561332c576000816000905550600101613314565b5090565b600061334361333e84613da8565b613d83565b90508281526020810184848401111561335f5761335e6142f8565b5b61336a8482856140df565b509392505050565b600061338561338084613dd9565b613d83565b9050828152602081018484840111156133a1576133a06142f8565b5b6133ac8482856140df565b509392505050565b6000813590506133c381614483565b92915050565b60008083601f8401126133df576133de6142ee565b5b8235905067ffffffffffffffff8111156133fc576133fb6142e9565b5b602083019150836020820283011115613418576134176142f3565b5b9250929050565b60008135905061342e8161449a565b92915050565b6000815190506134438161449a565b92915050565b600081359050613458816144b1565b92915050565b60008151905061346d816144b1565b92915050565b600082601f830112613488576134876142ee565b5b8135613498848260208601613330565b91505092915050565b600082601f8301126134b6576134b56142ee565b5b81356134c6848260208601613372565b91505092915050565b6000813590506134de816144c8565b92915050565b6000813590506134f3816144df565b92915050565b600081359050613508816144f6565b92915050565b60006020828403121561352457613523614302565b5b6000613532848285016133b4565b91505092915050565b6000806040838503121561355257613551614302565b5b6000613560858286016133b4565b9250506020613571858286016133b4565b9150509250929050565b60008060006060848603121561359457613593614302565b5b60006135a2868287016133b4565b93505060206135b3868287016133b4565b92505060406135c4868287016134e4565b9150509250925092565b600080600080608085870312156135e8576135e7614302565b5b60006135f6878288016133b4565b9450506020613607878288016133b4565b9350506040613618878288016134e4565b925050606085013567ffffffffffffffff811115613639576136386142fd565b5b61364587828801613473565b91505092959194509250565b6000806040838503121561366857613667614302565b5b6000613676858286016133b4565b92505060206136878582860161341f565b9150509250929050565b600080604083850312156136a8576136a7614302565b5b60006136b6858286016133b4565b92505060206136c7858286016134e4565b9150509250929050565b6000602082840312156136e7576136e6614302565b5b60006136f584828501613434565b91505092915050565b60006020828403121561371457613713614302565b5b600061372284828501613449565b91505092915050565b60006020828403121561374157613740614302565b5b600061374f8482850161345e565b91505092915050565b60006020828403121561376e5761376d614302565b5b600082013567ffffffffffffffff81111561378c5761378b6142fd565b5b613798848285016134a1565b91505092915050565b6000602082840312156137b7576137b6614302565b5b60006137c5848285016134cf565b91505092915050565b600080604083850312156137e5576137e4614302565b5b60006137f3858286016134cf565b9250506020613804858286016133b4565b9150509250929050565b60006020828403121561382457613823614302565b5b6000613832848285016134e4565b91505092915050565b60006020828403121561385157613850614302565b5b600061385f848285016134f9565b91505092915050565b60008060006040848603121561388157613880614302565b5b600061388f868287016134f9565b935050602084013567ffffffffffffffff8111156138b0576138af6142fd565b5b6138bc868287016133c9565b92509250509250925092565b6138d18161401a565b82525050565b6138e08161402c565b82525050565b60006138f182613e1f565b6138fb8185613e35565b935061390b8185602086016140ee565b61391481614307565b840191505092915050565b613928816140a9565b82525050565b600061393982613e2a565b6139438185613e46565b93506139538185602086016140ee565b61395c81614307565b840191505092915050565b600061397282613e2a565b61397c8185613e57565b935061398c8185602086016140ee565b80840191505092915050565b600081546139a581614121565b6139af8186613e57565b945060018216600081146139ca57600181146139db57613a0e565b60ff19831686528186019350613a0e565b6139e485613e0a565b60005b83811015613a06578154818901526001820191506020810190506139e7565b838801955050505b50505092915050565b6000613a24602683613e46565b9150613a2f82614318565b604082019050919050565b6000613a47602083613e46565b9150613a5282614367565b602082019050919050565b6000613a6a601783613e46565b9150613a7582614390565b602082019050919050565b6000613a8d602f83613e46565b9150613a98826143b9565b604082019050919050565b6000613ab0601383613e46565b9150613abb82614408565b602082019050919050565b6000613ad3601c83613e46565b9150613ade82614431565b602082019050919050565b6000613af6601383613e46565b9150613b018261445a565b602082019050919050565b613b1581614064565b82525050565b613b2481614092565b82525050565b613b338161409c565b82525050565b6000613b458286613967565b9150613b518285613967565b9150613b5d8284613998565b9150819050949350505050565b6000602082019050613b7f60008301846138c8565b92915050565b6000604082019050613b9a60008301856138c8565b613ba760208301846138c8565b9392505050565b6000608082019050613bc360008301876138c8565b613bd060208301866138c8565b613bdd6040830185613b1b565b8181036060830152613bef81846138e6565b905095945050505050565b6000602082019050613c0f60008301846138d7565b92915050565b6000602082019050613c2a600083018461391f565b92915050565b60006020820190508181036000830152613c4a818461392e565b905092915050565b60006020820190508181036000830152613c6b81613a17565b9050919050565b60006020820190508181036000830152613c8b81613a3a565b9050919050565b60006020820190508181036000830152613cab81613a5d565b9050919050565b60006020820190508181036000830152613ccb81613a80565b9050919050565b60006020820190508181036000830152613ceb81613aa3565b9050919050565b60006020820190508181036000830152613d0b81613ac6565b9050919050565b60006020820190508181036000830152613d2b81613ae9565b9050919050565b6000602082019050613d476000830184613b0c565b92915050565b6000602082019050613d626000830184613b1b565b92915050565b6000602082019050613d7d6000830184613b2a565b92915050565b6000613d8d613d9e565b9050613d998282614153565b919050565b6000604051905090565b600067ffffffffffffffff821115613dc357613dc26142ba565b5b613dcc82614307565b9050602081019050919050565b600067ffffffffffffffff821115613df457613df36142ba565b5b613dfd82614307565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e6d82614064565b9150613e7883614064565b92508261ffff03821115613e8f57613e8e6141fe565b5b828201905092915050565b6000613ea582614092565b9150613eb083614092565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee557613ee46141fe565b5b828201905092915050565b6000613efb8261409c565b9150613f068361409c565b92508260ff03821115613f1c57613f1b6141fe565b5b828201905092915050565b6000613f3282614092565b9150613f3d83614092565b925082613f4d57613f4c61422d565b5b828204905092915050565b6000613f6382614092565b9150613f6e83614092565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fa757613fa66141fe565b5b828202905092915050565b6000613fbd82614092565b9150613fc883614092565b925082821015613fdb57613fda6141fe565b5b828203905092915050565b6000613ff18261409c565b9150613ffc8361409c565b92508282101561400f5761400e6141fe565b5b828203905092915050565b600061402582614072565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006140b4826140bb565b9050919050565b60006140c6826140cd565b9050919050565b60006140d882614072565b9050919050565b82818337600083830152505050565b60005b8381101561410c5780820151818401526020810190506140f1565b8381111561411b576000848401525b50505050565b6000600282049050600182168061413957607f821691505b6020821081141561414d5761414c61425c565b5b50919050565b61415c82614307565b810181811067ffffffffffffffff8211171561417b5761417a6142ba565b5b80604052505050565b600061418f82614092565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141c2576141c16141fe565b5b600182019050919050565b60006141d882614092565b91506141e383614092565b9250826141f3576141f261422d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61448c8161401a565b811461449757600080fd5b50565b6144a38161402c565b81146144ae57600080fd5b50565b6144ba81614038565b81146144c557600080fd5b50565b6144d181614064565b81146144dc57600080fd5b50565b6144e881614092565b81146144f357600080fd5b50565b6144ff8161409c565b811461450a57600080fd5b5056fea264697066735822122031e1b9ea4de33f78074aebd22f5de4564d0003ab294303feea0b3592a0b9064364736f6c63430008070033

Deployed Bytecode Sourcemap

49346:4938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24535:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51812:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27648:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29159:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53582:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52686:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49555:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23784:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53739:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50996:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52796:74;;;;;;;;;;;;;:::i;:::-;;52957:70;;;;;;;;;;;;;:::i;:::-;;53151:144;;;;;;;;;;;;;:::i;:::-;;46916:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53902:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52876:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52427:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49792:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27456:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50012:976;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24904:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43365:103;;;;;;;;;;;;;:::i;:::-;;52579:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42713:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49638:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27817:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53406:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49822:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53033:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54073:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51924:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51328:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49603:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49855:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29793:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49515:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43623:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49678:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24535:305;24637:4;24689:25;24674:40;;;:11;:40;;;;:105;;;;24746:33;24731:48;;;:11;:48;;;;24674:105;:158;;;;24796:36;24820:11;24796:23;:36::i;:::-;24674:158;24654:178;;24535:305;;;:::o;51812:97::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51893:10:::1;51881:9;;:22;;;;;;;;;;;;;;;;;;51812:97:::0;:::o;27648:100::-;27702:13;27735:5;27728:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27648:100;:::o;29159:204::-;29227:7;29252:16;29260:7;29252;:16::i;:::-;29247:64;;29277:34;;;;;;;;;;;;;;29247:64;29331:15;:24;29347:7;29331:24;;;;;;;;;;;;;;;;;;;;;29324:31;;29159:204;;;:::o;53582:151::-;53678:8;48437:30;48458:8;48437:20;:30::i;:::-;53695:32:::1;53709:8;53719:7;53695:13;:32::i;:::-;53582:151:::0;;;:::o;52686:102::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52772:10:::1;52760:9;:22;;;;;;;;;;;;:::i;:::-;;52686:102:::0;:::o;49555:34::-;;;;:::o;23784:303::-;23828:7;24053:15;:13;:15::i;:::-;24038:12;;24022:13;;:28;:46;24015:53;;23784:303;:::o;53739:157::-;53840:4;48265:10;48257:18;;:4;:18;;;48253:83;;48292:32;48313:10;48292:20;:32::i;:::-;48253:83;53853:37:::1;53872:4;53878:2;53882:7;53853:18;:37::i;:::-;53739:157:::0;;;;:::o;50996:326::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51079:18:::1;51107:13;:11;:13::i;:::-;51079:42;;51165:9;;;;;;;;;;;51136:38;;51150:11;51136;:25;;;;:::i;:::-;:38;;;;51128:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51206:34;51216:9;51228:11;51206:34;;:9;:34::i;:::-;51248:18;;;51274:16;;;51298:18;;;51071:251;50996:326:::0;;:::o;52796:74::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52853:6:::1;;;;;;;;;;;52852:7;52843:6;;:16;;;;;;;;;;;;;;;;;;52796:74::o:0;52957:70::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53016:6:::1;;;;;;;;;;;53015:7;53006:6;;:16;;;;;;;;;;;;;;;;;;52957:70::o:0;53151:144::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53195:13:::1;53211:21;53195:37;;53248:10;53240:28;;:39;53269:8;53240:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53190:105;53151:144::o:0;46916:143::-;47016:42;46916:143;:::o;53902:165::-;54007:4;48265:10;48257:18;;:4;:18;;;48253:83;;48292:32;48313:10;48292:20;:32::i;:::-;48253:83;54020:41:::1;54043:4;54049:2;54053:7;54020:22;:41::i;:::-;53902:165:::0;;;;:::o;52876:76::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52939:5:::1;52932:4;:12;;;;52876:76:::0;:::o;52427:134::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52530:6:::1;52501:26;;:35;;;;;;;;;;;;;;;;;;52542:13;;;52427:134:::0;:::o;49792:25::-;;;;;;;;;;;;;:::o;27456:125::-;27520:7;27547:21;27560:7;27547:12;:21::i;:::-;:26;;;27540:33;;27456:125;;;:::o;50012:976::-;50071:18;50099:13;:11;:13::i;:::-;50071:42;;50121:9;50133:19;:31;50153:10;50133:31;;;;;;;;;;;;;;;;;;;;;;;;;50121:43;;50208:9;;;;;;;;;;;50179:38;;50193:11;50179:25;;:11;:25;;;;:::i;:::-;:38;;;;50171:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50277:18;;;;;;;;;;;50256:39;;50270:3;50256:11;:17;;;;:::i;:::-;:39;;;;50248:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;50346:6;;;;;;;;;;;50345:7;50337:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50405:26;;;;;;;;;;;50398:33;;:3;:33;;;50395:417;;50473:11;50466:18;;:4;;:18;;;;:::i;:::-;50453:9;:31;;50445:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50395:417;;;50539:16;50572:3;50558:11;:17;;;;:::i;:::-;50539:36;;50602:26;;;;;;;;;;;50589:39;;:10;:39;;;50586:199;;;50675:26;;;;;;;;;;;50662:10;:39;;;;:::i;:::-;50649:52;;50740:10;50733:17;;:4;;:17;;;;:::i;:::-;50720:9;:30;;50712:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50586:199;50527:285;50395:417;50828:35;50838:10;50851:11;50828:35;;:9;:35::i;:::-;50920:3;50906:11;:17;;;;:::i;:::-;50872:19;:31;50892:10;50872:31;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;50938:18;;;50964;;;50063:925;;50012:976;:::o;24904:206::-;24968:7;25009:1;24992:19;;:5;:19;;;24988:60;;;25020:28;;;;;;;;;;;;;;24988:60;25074:12;:19;25087:5;25074:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25066:36;;25059:43;;24904:206;;;:::o;43365:103::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43430:30:::1;43457:1;43430:18;:30::i;:::-;43365:103::o:0;52579:102::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52665:10:::1;52653:9;:22;;;;;;;;;;;;:::i;:::-;;52579:102:::0;:::o;42713:87::-;42759:7;42786:6;;;;;;;;;;;42779:13;;42713:87;:::o;49638:35::-;;;;;;;;;;;;;:::o;27817:104::-;27873:13;27906:7;27899:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27817:104;:::o;53406:170::-;53510:8;48437:30;48458:8;48437:20;:30::i;:::-;53527:43:::1;53551:8;53561;53527:23;:43::i;:::-;53406:170:::0;;;:::o;49822:25::-;;;;;;;;;;;;;:::o;53033:107::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53126:6:::1;53105:18;;:27;;;;;;;;;;;;;;;;;;53033:107:::0;:::o;54073:208::-;54212:4;48265:10;48257:18;;:4;:18;;;48253:83;;48292:32;48313:10;48292:20;:32::i;:::-;48253:83;54228:47:::1;54251:4;54257:2;54261:7;54270:4;54228:22;:47::i;:::-;54073:208:::0;;;;;:::o;51924:490::-;52023:13;52064:17;52072:8;52064:7;:17::i;:::-;52048:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;52174:5;52164:15;;:6;;;;;;;;;;;:15;;;52159:50;;;52196:9;52189:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52159:50;52223:28;52254:10;:8;:10::i;:::-;52223:41;;52309:1;52284:14;52278:28;:32;:130;;;;;;;;;;;;;;;;;52346:14;52362:19;:8;:17;:19::i;:::-;52383:9;52329:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52278:130;52271:137;;;51924:490;;;;:::o;51328:473::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51428:18:::1;51456:13;:11;:13::i;:::-;51428:42;;51478:16;51519:9;;:16;;51499:17;:36;;;;;;:::i;:::-;51478:57;;51579:9;;;;;;;;;;;51550:38;;51564:11;51550;:25;;;;;;:::i;:::-;:38;;51542:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51625:9;51620:116;51644:9;;:16;;51640:1;:20;51620:116;;;51682:42;51692:9;;51702:1;51692:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51706:17;51682:42;;:9;:42::i;:::-;51662:3;;;;;:::i;:::-;;;;51620:116;;;;51745:24;;;51777:18;;;51420:381;;51328:473:::0;;;:::o;49603:30::-;;;;;;;;;;;;;:::o;49855:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;29793:164::-;29890:4;29914:18;:25;29933:5;29914:25;;;;;;;;;;;;;;;:35;29940:8;29914:35;;;;;;;;;;;;;;;;;;;;;;;;;29907:42;;29793:164;;;;:::o;49515:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43623:201::-;42944:12;:10;:12::i;:::-;42933:23;;:7;:5;:7::i;:::-;:23;;;42925:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43732:1:::1;43712:22;;:8;:22;;;;43704:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43788:28;43807:8;43788:18;:28::i;:::-;43623:201:::0;:::o;49678:43::-;;;;;;;;;;;;;:::o;14460:157::-;14545:4;14584:25;14569:40;;;:11;:40;;;;14562:47;;14460:157;;;:::o;2930:98::-;2983:7;3010:10;3003:17;;2930:98;:::o;31145:187::-;31202:4;31245:7;31226:15;:13;:15::i;:::-;:26;;:53;;;;;31266:13;;31256:7;:23;31226:53;:98;;;;;31297:11;:20;31309:7;31297:20;;;;;;;;;;;:27;;;;;;;;;;;;31296:28;31226:98;31219:105;;31145:187;;;:::o;48495:419::-;48734:1;47016:42;48686:45;;;:49;48682:225;;;47016:42;48757;;;48808:4;48815:8;48757:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48752:144;;48871:8;48852:28;;;;;;;;;;;:::i;:::-;;;;;;;;48752:144;48682:225;48495:419;:::o;28714:379::-;28795:13;28811:24;28827:7;28811:15;:24::i;:::-;28795:40;;28856:5;28850:11;;:2;:11;;;28846:48;;;28870:24;;;;;;;;;;;;;;28846:48;28927:5;28911:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28937:37;28954:5;28961:12;:10;:12::i;:::-;28937:16;:37::i;:::-;28936:38;28911:63;28907:138;;;28998:35;;;;;;;;;;;;;;28907:138;29057:28;29066:2;29070:7;29079:5;29057:8;:28::i;:::-;28784:309;28714:379;;:::o;23558:92::-;23614:7;23558:92;:::o;30024:170::-;30158:28;30168:4;30174:2;30178:7;30158:9;:28::i;:::-;30024:170;;;:::o;31340:104::-;31409:27;31419:2;31423:8;31409:27;;;;;;;;;;;;:9;:27::i;:::-;31340:104;;:::o;30265:185::-;30403:39;30420:4;30426:2;30430:7;30403:39;;;;;;;;;;;;:16;:39::i;:::-;30265:185;;;:::o;26285:1109::-;26347:21;;:::i;:::-;26381:12;26396:7;26381:22;;26464:4;26445:15;:13;:15::i;:::-;:23;;:47;;;;;26479:13;;26472:4;:20;26445:47;26441:886;;;26513:31;26547:11;:17;26559:4;26547:17;;;;;;;;;;;26513:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26588:9;:16;;;26583:729;;26659:1;26633:28;;:9;:14;;;:28;;;26629:101;;26697:9;26690:16;;;;;;26629:101;27032:261;27039:4;27032:261;;;27072:6;;;;;;;;27117:11;:17;27129:4;27117:17;;;;;;;;;;;27105:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27191:1;27165:28;;:9;:14;;;:28;;;27161:109;;27233:9;27226:16;;;;;;27161:109;27032:261;;;26583:729;26494:833;26441:886;27355:31;;;;;;;;;;;;;;26285:1109;;;;:::o;43984:191::-;44058:16;44077:6;;;;;;;;;;;44058:25;;44103:8;44094:6;;:17;;;;;;;;;;;;;;;;;;44158:8;44127:40;;44148:8;44127:40;;;;;;;;;;;;44047:128;43984:191;:::o;29435:287::-;29546:12;:10;:12::i;:::-;29534:24;;:8;:24;;;29530:54;;;29567:17;;;;;;;;;;;;;;29530:54;29642:8;29597:18;:32;29616:12;:10;:12::i;:::-;29597:32;;;;;;;;;;;;;;;:42;29630:8;29597:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29695:8;29666:48;;29681:12;:10;:12::i;:::-;29666:48;;;29705:8;29666:48;;;;;;:::i;:::-;;;;;;;;29435:287;;:::o;30521:369::-;30688:28;30698:4;30704:2;30708:7;30688:9;:28::i;:::-;30731:15;:2;:13;;;:15::i;:::-;:76;;;;;30751:56;30782:4;30788:2;30792:7;30801:5;30751:30;:56::i;:::-;30750:57;30731:76;30727:156;;;30831:40;;;;;;;;;;;;;;30727:156;30521:369;;;;:::o;53303:97::-;53356:13;53385:9;53378:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53303:97;:::o;492:723::-;548:13;778:1;769:5;:10;765:53;;;796:10;;;;;;;;;;;;;;;;;;;;;765:53;828:12;843:5;828:20;;859:14;884:78;899:1;891:4;:9;884:78;;917:8;;;;;:::i;:::-;;;;948:2;940:10;;;;;:::i;:::-;;;884:78;;;972:19;1004:6;994:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;972:39;;1022:154;1038:1;1029:5;:10;1022:154;;1066:1;1056:11;;;;;:::i;:::-;;;1133:2;1125:5;:10;;;;:::i;:::-;1112:2;:24;;;;:::i;:::-;1099:39;;1082:6;1089;1082:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1162:2;1153:11;;;;;:::i;:::-;;;1022:154;;;1200:6;1186:21;;;;;492:723;;;;:::o;39315:196::-;39457:2;39430:15;:24;39446:7;39430:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39495:7;39491:2;39475:28;;39484:5;39475:28;;;;;;;;;;;;39315:196;;;:::o;34258:2130::-;34373:35;34411:21;34424:7;34411:12;:21::i;:::-;34373:59;;34471:4;34449:26;;:13;:18;;;:26;;;34445:67;;34484:28;;;;;;;;;;;;;;34445:67;34525:22;34567:4;34551:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34588:36;34605:4;34611:12;:10;:12::i;:::-;34588:16;:36::i;:::-;34551:73;:126;;;;34665:12;:10;:12::i;:::-;34641:36;;:20;34653:7;34641:11;:20::i;:::-;:36;;;34551:126;34525:153;;34696:17;34691:66;;34722:35;;;;;;;;;;;;;;34691:66;34786:1;34772:16;;:2;:16;;;34768:52;;;34797:23;;;;;;;;;;;;;;34768:52;34833:43;34855:4;34861:2;34865:7;34874:1;34833:21;:43::i;:::-;34941:35;34958:1;34962:7;34971:4;34941:8;:35::i;:::-;35302:1;35272:12;:18;35285:4;35272:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35346:1;35318:12;:16;35331:2;35318:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35364:31;35398:11;:20;35410:7;35398:20;;;;;;;;;;;35364:54;;35449:2;35433:8;:13;;;:18;;;;;;;;;;;;;;;;;;35499:15;35466:8;:23;;;:49;;;;;;;;;;;;;;;;;;35767:19;35799:1;35789:7;:11;35767:33;;35815:31;35849:11;:24;35861:11;35849:24;;;;;;;;;;;35815:58;;35917:1;35892:27;;:8;:13;;;;;;;;;;;;:27;;;35888:384;;;36102:13;;36087:11;:28;36083:174;;36156:4;36140:8;:13;;;:20;;;;;;;;;;;;;;;;;;36209:13;:28;;;36183:8;:23;;;:54;;;;;;;;;;;;;;;;;;36083:174;35888:384;35247:1036;;;36319:7;36315:2;36300:27;;36309:4;36300:27;;;;;;;;;;;;36338:42;36359:4;36365:2;36369:7;36378:1;36338:20;:42::i;:::-;34362:2026;;34258:2130;;;:::o;31807:163::-;31930:32;31936:2;31940:8;31950:5;31957:4;31930:5;:32::i;:::-;31807:163;;;:::o;4377:326::-;4437:4;4694:1;4672:7;:19;;;:23;4665:30;;4377:326;;;:::o;40003:667::-;40166:4;40203:2;40187:36;;;40224:12;:10;:12::i;:::-;40238:4;40244:7;40253:5;40187:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40183:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40438:1;40421:6;:13;:18;40417:235;;;40467:40;;;;;;;;;;;;;;40417:235;40610:6;40604:13;40595:6;40591:2;40587:15;40580:38;40183:480;40316:45;;;40306:55;;;:6;:55;;;;40299:62;;;40003:667;;;;;;:::o;41318:159::-;;;;;:::o;42136:158::-;;;;;:::o;32229:1775::-;32368:20;32391:13;;32368:36;;32433:1;32419:16;;:2;:16;;;32415:48;;;32444:19;;;;;;;;;;;;;;32415:48;32490:1;32478:8;:13;32474:44;;;32500:18;;;;;;;;;;;;;;32474:44;32531:61;32561:1;32565:2;32569:12;32583:8;32531:21;:61::i;:::-;32904:8;32869:12;:16;32882:2;32869:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32968:8;32928:12;:16;32941:2;32928:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33027:2;32994:11;:25;33006:12;32994:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33094:15;33044:11;:25;33056:12;33044:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33127:20;33150:12;33127:35;;33177:11;33206:8;33191:12;:23;33177:37;;33235:4;:23;;;;;33243:15;:2;:13;;;:15::i;:::-;33235:23;33231:641;;;33279:314;33335:12;33331:2;33310:38;;33327:1;33310:38;;;;;;;;;;;;33376:69;33415:1;33419:2;33423:14;;;;;;33439:5;33376:30;:69::i;:::-;33371:174;;33481:40;;;;;;;;;;;;;;33371:174;33588:3;33572:12;:19;;33279:314;;33674:12;33657:13;;:29;33653:43;;33688:8;;;33653:43;33231:641;;;33737:120;33793:14;;;;;;33789:2;33768:40;;33785:1;33768:40;;;;;;;;;;;;33852:3;33836:12;:19;;33737:120;;33231:641;33902:12;33886:13;:28;;;;32844:1082;;33936:60;33965:1;33969:2;33973:12;33987:8;33936:20;:60::i;:::-;32357:1647;32229:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423: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;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1770:5;1801:6;1795:13;1786:22;;1817:30;1841:5;1817:30;:::i;:::-;1716:137;;;;:::o;1859:::-;1904:5;1942:6;1929:20;1920:29;;1958:32;1984:5;1958:32;:::i;:::-;1859:137;;;;:::o;2002:141::-;2058:5;2089:6;2083:13;2074:22;;2105:32;2131:5;2105:32;:::i;:::-;2002:141;;;;:::o;2162:338::-;2217:5;2266:3;2259:4;2251:6;2247:17;2243:27;2233:122;;2274:79;;:::i;:::-;2233:122;2391:6;2378:20;2416:78;2490:3;2482:6;2475:4;2467:6;2463:17;2416:78;:::i;:::-;2407:87;;2223:277;2162:338;;;;:::o;2520:340::-;2576:5;2625:3;2618:4;2610:6;2606:17;2602:27;2592:122;;2633:79;;:::i;:::-;2592:122;2750:6;2737:20;2775:79;2850:3;2842:6;2835:4;2827:6;2823:17;2775:79;:::i;:::-;2766:88;;2582:278;2520:340;;;;:::o;2866:137::-;2911:5;2949:6;2936:20;2927:29;;2965:32;2991:5;2965:32;:::i;:::-;2866:137;;;;:::o;3009:139::-;3055:5;3093:6;3080:20;3071:29;;3109:33;3136:5;3109:33;:::i;:::-;3009:139;;;;:::o;3154:135::-;3198:5;3236:6;3223:20;3214:29;;3252:31;3277:5;3252:31;:::i;:::-;3154:135;;;;:::o;3295:329::-;3354:6;3403:2;3391:9;3382:7;3378:23;3374:32;3371:119;;;3409:79;;:::i;:::-;3371:119;3529:1;3554:53;3599:7;3590:6;3579:9;3575:22;3554:53;:::i;:::-;3544:63;;3500:117;3295:329;;;;:::o;3630:474::-;3698:6;3706;3755:2;3743:9;3734:7;3730:23;3726:32;3723:119;;;3761:79;;:::i;:::-;3723:119;3881:1;3906:53;3951:7;3942:6;3931:9;3927:22;3906:53;:::i;:::-;3896:63;;3852:117;4008:2;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3979:118;3630:474;;;;;:::o;4110:619::-;4187:6;4195;4203;4252:2;4240:9;4231:7;4227:23;4223:32;4220:119;;;4258:79;;:::i;:::-;4220:119;4378:1;4403:53;4448:7;4439:6;4428:9;4424:22;4403:53;:::i;:::-;4393:63;;4349:117;4505:2;4531:53;4576:7;4567:6;4556:9;4552:22;4531:53;:::i;:::-;4521:63;;4476:118;4633:2;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4604:118;4110:619;;;;;:::o;4735:943::-;4830:6;4838;4846;4854;4903:3;4891:9;4882:7;4878:23;4874:33;4871:120;;;4910:79;;:::i;:::-;4871:120;5030:1;5055:53;5100:7;5091:6;5080:9;5076:22;5055:53;:::i;:::-;5045:63;;5001:117;5157:2;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5128:118;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5441:2;5430:9;5426:18;5413:32;5472:18;5464:6;5461:30;5458:117;;;5494:79;;:::i;:::-;5458:117;5599:62;5653:7;5644:6;5633:9;5629:22;5599:62;:::i;:::-;5589:72;;5384:287;4735:943;;;;;;;:::o;5684:468::-;5749:6;5757;5806:2;5794:9;5785:7;5781:23;5777:32;5774:119;;;5812:79;;:::i;:::-;5774:119;5932:1;5957:53;6002:7;5993:6;5982:9;5978:22;5957:53;:::i;:::-;5947:63;;5903:117;6059:2;6085:50;6127:7;6118:6;6107:9;6103:22;6085:50;:::i;:::-;6075:60;;6030:115;5684:468;;;;;:::o;6158:474::-;6226:6;6234;6283:2;6271:9;6262:7;6258:23;6254:32;6251:119;;;6289:79;;:::i;:::-;6251:119;6409:1;6434:53;6479:7;6470:6;6459:9;6455:22;6434:53;:::i;:::-;6424:63;;6380:117;6536:2;6562:53;6607:7;6598:6;6587:9;6583:22;6562:53;:::i;:::-;6552:63;;6507:118;6158:474;;;;;:::o;6638:345::-;6705:6;6754:2;6742:9;6733:7;6729:23;6725:32;6722:119;;;6760:79;;:::i;:::-;6722:119;6880:1;6905:61;6958:7;6949:6;6938:9;6934:22;6905:61;:::i;:::-;6895:71;;6851:125;6638:345;;;;:::o;6989:327::-;7047:6;7096:2;7084:9;7075:7;7071:23;7067:32;7064:119;;;7102:79;;:::i;:::-;7064:119;7222:1;7247:52;7291:7;7282:6;7271:9;7267:22;7247:52;:::i;:::-;7237:62;;7193:116;6989:327;;;;:::o;7322:349::-;7391:6;7440:2;7428:9;7419:7;7415:23;7411:32;7408:119;;;7446:79;;:::i;:::-;7408:119;7566:1;7591:63;7646:7;7637:6;7626:9;7622:22;7591:63;:::i;:::-;7581:73;;7537:127;7322:349;;;;:::o;7677:509::-;7746:6;7795:2;7783:9;7774:7;7770:23;7766:32;7763:119;;;7801:79;;:::i;:::-;7763:119;7949:1;7938:9;7934:17;7921:31;7979:18;7971:6;7968:30;7965:117;;;8001:79;;:::i;:::-;7965:117;8106:63;8161:7;8152:6;8141:9;8137:22;8106:63;:::i;:::-;8096:73;;7892:287;7677:509;;;;:::o;8192:327::-;8250:6;8299:2;8287:9;8278:7;8274:23;8270:32;8267:119;;;8305:79;;:::i;:::-;8267:119;8425:1;8450:52;8494:7;8485:6;8474:9;8470:22;8450:52;:::i;:::-;8440:62;;8396:116;8192:327;;;;:::o;8525:472::-;8592:6;8600;8649:2;8637:9;8628:7;8624:23;8620:32;8617:119;;;8655:79;;:::i;:::-;8617:119;8775:1;8800:52;8844:7;8835:6;8824:9;8820:22;8800:52;:::i;:::-;8790:62;;8746:116;8901:2;8927:53;8972:7;8963:6;8952:9;8948:22;8927:53;:::i;:::-;8917:63;;8872:118;8525:472;;;;;:::o;9003:329::-;9062:6;9111:2;9099:9;9090:7;9086:23;9082:32;9079:119;;;9117:79;;:::i;:::-;9079:119;9237:1;9262:53;9307:7;9298:6;9287:9;9283:22;9262:53;:::i;:::-;9252:63;;9208:117;9003:329;;;;:::o;9338:325::-;9395:6;9444:2;9432:9;9423:7;9419:23;9415:32;9412:119;;;9450:79;;:::i;:::-;9412:119;9570:1;9595:51;9638:7;9629:6;9618:9;9614:22;9595:51;:::i;:::-;9585:61;;9541:115;9338:325;;;;:::o;9669:700::-;9762:6;9770;9778;9827:2;9815:9;9806:7;9802:23;9798:32;9795:119;;;9833:79;;:::i;:::-;9795:119;9953:1;9978:51;10021:7;10012:6;10001:9;9997:22;9978:51;:::i;:::-;9968:61;;9924:115;10106:2;10095:9;10091:18;10078:32;10137:18;10129:6;10126:30;10123:117;;;10159:79;;:::i;:::-;10123:117;10272:80;10344:7;10335:6;10324:9;10320:22;10272:80;:::i;:::-;10254:98;;;;10049:313;9669:700;;;;;:::o;10375:118::-;10462:24;10480:5;10462:24;:::i;:::-;10457:3;10450:37;10375:118;;:::o;10499:109::-;10580:21;10595:5;10580:21;:::i;:::-;10575:3;10568:34;10499:109;;:::o;10614:360::-;10700:3;10728:38;10760:5;10728:38;:::i;:::-;10782:70;10845:6;10840:3;10782:70;:::i;:::-;10775:77;;10861:52;10906:6;10901:3;10894:4;10887:5;10883:16;10861:52;:::i;:::-;10938:29;10960:6;10938:29;:::i;:::-;10933:3;10929:39;10922:46;;10704:270;10614:360;;;;:::o;10980:195::-;11099:69;11162:5;11099:69;:::i;:::-;11094:3;11087:82;10980:195;;:::o;11181:364::-;11269:3;11297:39;11330:5;11297:39;:::i;:::-;11352:71;11416:6;11411:3;11352:71;:::i;:::-;11345:78;;11432:52;11477:6;11472:3;11465:4;11458:5;11454:16;11432:52;:::i;:::-;11509:29;11531:6;11509:29;:::i;:::-;11504:3;11500:39;11493:46;;11273:272;11181:364;;;;:::o;11551:377::-;11657:3;11685:39;11718:5;11685:39;:::i;:::-;11740:89;11822:6;11817:3;11740:89;:::i;:::-;11733:96;;11838:52;11883:6;11878:3;11871:4;11864:5;11860:16;11838:52;:::i;:::-;11915:6;11910:3;11906:16;11899:23;;11661:267;11551:377;;;;:::o;11958:845::-;12061:3;12098:5;12092:12;12127:36;12153:9;12127:36;:::i;:::-;12179:89;12261:6;12256:3;12179:89;:::i;:::-;12172:96;;12299:1;12288:9;12284:17;12315:1;12310:137;;;;12461:1;12456:341;;;;12277:520;;12310:137;12394:4;12390:9;12379;12375:25;12370:3;12363:38;12430:6;12425:3;12421:16;12414:23;;12310:137;;12456:341;12523:38;12555:5;12523:38;:::i;:::-;12583:1;12597:154;12611:6;12608:1;12605:13;12597:154;;;12685:7;12679:14;12675:1;12670:3;12666:11;12659:35;12735:1;12726:7;12722:15;12711:26;;12633:4;12630:1;12626:12;12621:17;;12597:154;;;12780:6;12775:3;12771:16;12764:23;;12463:334;;12277:520;;12065:738;;11958:845;;;;:::o;12809:366::-;12951:3;12972:67;13036:2;13031:3;12972:67;:::i;:::-;12965:74;;13048:93;13137:3;13048:93;:::i;:::-;13166:2;13161:3;13157:12;13150:19;;12809:366;;;:::o;13181:::-;13323:3;13344:67;13408:2;13403:3;13344:67;:::i;:::-;13337:74;;13420:93;13509:3;13420:93;:::i;:::-;13538:2;13533:3;13529:12;13522:19;;13181:366;;;:::o;13553:::-;13695:3;13716:67;13780:2;13775:3;13716:67;:::i;:::-;13709:74;;13792:93;13881:3;13792:93;:::i;:::-;13910:2;13905:3;13901:12;13894:19;;13553:366;;;:::o;13925:::-;14067:3;14088:67;14152:2;14147:3;14088:67;:::i;:::-;14081:74;;14164:93;14253:3;14164:93;:::i;:::-;14282:2;14277:3;14273:12;14266:19;;13925:366;;;:::o;14297:::-;14439:3;14460:67;14524:2;14519:3;14460:67;:::i;:::-;14453:74;;14536:93;14625:3;14536:93;:::i;:::-;14654:2;14649:3;14645:12;14638:19;;14297:366;;;:::o;14669:::-;14811:3;14832:67;14896:2;14891:3;14832:67;:::i;:::-;14825:74;;14908:93;14997:3;14908:93;:::i;:::-;15026:2;15021:3;15017:12;15010:19;;14669:366;;;:::o;15041:::-;15183:3;15204:67;15268:2;15263:3;15204:67;:::i;:::-;15197:74;;15280:93;15369:3;15280:93;:::i;:::-;15398:2;15393:3;15389:12;15382:19;;15041:366;;;:::o;15413:115::-;15498:23;15515:5;15498:23;:::i;:::-;15493:3;15486:36;15413:115;;:::o;15534:118::-;15621:24;15639:5;15621:24;:::i;:::-;15616:3;15609:37;15534:118;;:::o;15658:112::-;15741:22;15757:5;15741:22;:::i;:::-;15736:3;15729:35;15658:112;;:::o;15776:589::-;16001:3;16023:95;16114:3;16105:6;16023:95;:::i;:::-;16016:102;;16135:95;16226:3;16217:6;16135:95;:::i;:::-;16128:102;;16247:92;16335:3;16326:6;16247:92;:::i;:::-;16240:99;;16356:3;16349:10;;15776:589;;;;;;:::o;16371:222::-;16464:4;16502:2;16491:9;16487:18;16479:26;;16515:71;16583:1;16572:9;16568:17;16559:6;16515:71;:::i;:::-;16371:222;;;;:::o;16599:332::-;16720:4;16758:2;16747:9;16743:18;16735:26;;16771:71;16839:1;16828:9;16824:17;16815:6;16771:71;:::i;:::-;16852:72;16920:2;16909:9;16905:18;16896:6;16852:72;:::i;:::-;16599:332;;;;;:::o;16937:640::-;17132:4;17170:3;17159:9;17155:19;17147:27;;17184:71;17252:1;17241:9;17237:17;17228:6;17184:71;:::i;:::-;17265:72;17333:2;17322:9;17318:18;17309:6;17265:72;:::i;:::-;17347;17415:2;17404:9;17400:18;17391:6;17347:72;:::i;:::-;17466:9;17460:4;17456:20;17451:2;17440:9;17436:18;17429:48;17494:76;17565:4;17556:6;17494:76;:::i;:::-;17486:84;;16937:640;;;;;;;:::o;17583:210::-;17670:4;17708:2;17697:9;17693:18;17685:26;;17721:65;17783:1;17772:9;17768:17;17759:6;17721:65;:::i;:::-;17583:210;;;;:::o;17799:286::-;17924:4;17962:2;17951:9;17947:18;17939:26;;17975:103;18075:1;18064:9;18060:17;18051:6;17975:103;:::i;:::-;17799:286;;;;:::o;18091:313::-;18204:4;18242:2;18231:9;18227:18;18219:26;;18291:9;18285:4;18281:20;18277:1;18266:9;18262:17;18255:47;18319:78;18392:4;18383:6;18319:78;:::i;:::-;18311:86;;18091:313;;;;:::o;18410:419::-;18576:4;18614:2;18603:9;18599:18;18591:26;;18663:9;18657:4;18653:20;18649:1;18638:9;18634:17;18627:47;18691:131;18817:4;18691:131;:::i;:::-;18683:139;;18410:419;;;:::o;18835:::-;19001:4;19039:2;19028:9;19024:18;19016:26;;19088:9;19082:4;19078:20;19074:1;19063:9;19059:17;19052:47;19116:131;19242:4;19116:131;:::i;:::-;19108:139;;18835:419;;;:::o;19260:::-;19426:4;19464:2;19453:9;19449:18;19441:26;;19513:9;19507:4;19503:20;19499:1;19488:9;19484:17;19477:47;19541:131;19667:4;19541:131;:::i;:::-;19533:139;;19260:419;;;:::o;19685:::-;19851:4;19889:2;19878:9;19874:18;19866:26;;19938:9;19932:4;19928:20;19924:1;19913:9;19909:17;19902:47;19966:131;20092:4;19966:131;:::i;:::-;19958:139;;19685:419;;;:::o;20110:::-;20276:4;20314:2;20303:9;20299:18;20291:26;;20363:9;20357:4;20353:20;20349:1;20338:9;20334:17;20327:47;20391:131;20517:4;20391:131;:::i;:::-;20383:139;;20110:419;;;:::o;20535:::-;20701:4;20739:2;20728:9;20724:18;20716:26;;20788:9;20782:4;20778:20;20774:1;20763:9;20759:17;20752:47;20816:131;20942:4;20816:131;:::i;:::-;20808:139;;20535:419;;;:::o;20960:::-;21126:4;21164:2;21153:9;21149:18;21141:26;;21213:9;21207:4;21203:20;21199:1;21188:9;21184:17;21177:47;21241:131;21367:4;21241:131;:::i;:::-;21233:139;;20960:419;;;:::o;21385:218::-;21476:4;21514:2;21503:9;21499:18;21491:26;;21527:69;21593:1;21582:9;21578:17;21569:6;21527:69;:::i;:::-;21385:218;;;;:::o;21609:222::-;21702:4;21740:2;21729:9;21725:18;21717:26;;21753:71;21821:1;21810:9;21806:17;21797:6;21753:71;:::i;:::-;21609:222;;;;:::o;21837:214::-;21926:4;21964:2;21953:9;21949:18;21941:26;;21977:67;22041:1;22030:9;22026:17;22017:6;21977:67;:::i;:::-;21837:214;;;;:::o;22057:129::-;22091:6;22118:20;;:::i;:::-;22108:30;;22147:33;22175:4;22167:6;22147:33;:::i;:::-;22057:129;;;:::o;22192:75::-;22225:6;22258:2;22252:9;22242:19;;22192:75;:::o;22273:307::-;22334:4;22424:18;22416:6;22413:30;22410:56;;;22446:18;;:::i;:::-;22410:56;22484:29;22506:6;22484:29;:::i;:::-;22476:37;;22568:4;22562;22558:15;22550:23;;22273:307;;;:::o;22586:308::-;22648:4;22738:18;22730:6;22727:30;22724:56;;;22760:18;;:::i;:::-;22724:56;22798:29;22820:6;22798:29;:::i;:::-;22790:37;;22882:4;22876;22872:15;22864:23;;22586:308;;;:::o;22900:141::-;22949:4;22972:3;22964:11;;22995:3;22992:1;22985:14;23029:4;23026:1;23016:18;23008:26;;22900:141;;;:::o;23047:98::-;23098:6;23132:5;23126:12;23116:22;;23047:98;;;:::o;23151:99::-;23203:6;23237:5;23231:12;23221:22;;23151:99;;;:::o;23256:168::-;23339:11;23373:6;23368:3;23361:19;23413:4;23408:3;23404:14;23389:29;;23256:168;;;;:::o;23430:169::-;23514:11;23548:6;23543:3;23536:19;23588:4;23583:3;23579:14;23564:29;;23430:169;;;;:::o;23605:148::-;23707:11;23744:3;23729:18;;23605:148;;;;:::o;23759:242::-;23798:3;23817:19;23834:1;23817:19;:::i;:::-;23812:24;;23850:19;23867:1;23850:19;:::i;:::-;23845:24;;23943:1;23935:6;23931:14;23928:1;23925:21;23922:47;;;23949:18;;:::i;:::-;23922:47;23993:1;23990;23986:9;23979:16;;23759:242;;;;:::o;24007:305::-;24047:3;24066:20;24084:1;24066:20;:::i;:::-;24061:25;;24100:20;24118:1;24100:20;:::i;:::-;24095:25;;24254:1;24186:66;24182:74;24179:1;24176:81;24173:107;;;24260:18;;:::i;:::-;24173:107;24304:1;24301;24297:9;24290:16;;24007:305;;;;:::o;24318:237::-;24356:3;24375:18;24391:1;24375:18;:::i;:::-;24370:23;;24407:18;24423:1;24407:18;:::i;:::-;24402:23;;24497:1;24491:4;24487:12;24484:1;24481:19;24478:45;;;24503:18;;:::i;:::-;24478:45;24547:1;24544;24540:9;24533:16;;24318:237;;;;:::o;24561:185::-;24601:1;24618:20;24636:1;24618:20;:::i;:::-;24613:25;;24652:20;24670:1;24652:20;:::i;:::-;24647:25;;24691:1;24681:35;;24696:18;;:::i;:::-;24681:35;24738:1;24735;24731:9;24726:14;;24561:185;;;;:::o;24752:348::-;24792:7;24815:20;24833:1;24815:20;:::i;:::-;24810:25;;24849:20;24867:1;24849:20;:::i;:::-;24844:25;;25037:1;24969:66;24965:74;24962:1;24959:81;24954:1;24947:9;24940:17;24936:105;24933:131;;;25044:18;;:::i;:::-;24933:131;25092:1;25089;25085:9;25074:20;;24752:348;;;;:::o;25106:191::-;25146:4;25166:20;25184:1;25166:20;:::i;:::-;25161:25;;25200:20;25218:1;25200:20;:::i;:::-;25195:25;;25239:1;25236;25233:8;25230:34;;;25244:18;;:::i;:::-;25230:34;25289:1;25286;25282:9;25274:17;;25106:191;;;;:::o;25303:185::-;25341:4;25361:18;25377:1;25361:18;:::i;:::-;25356:23;;25393:18;25409:1;25393:18;:::i;:::-;25388:23;;25430:1;25427;25424:8;25421:34;;;25435:18;;:::i;:::-;25421:34;25480:1;25477;25473:9;25465:17;;25303:185;;;;:::o;25494:96::-;25531:7;25560:24;25578:5;25560:24;:::i;:::-;25549:35;;25494:96;;;:::o;25596:90::-;25630:7;25673:5;25666:13;25659:21;25648:32;;25596:90;;;:::o;25692:149::-;25728:7;25768:66;25761:5;25757:78;25746:89;;25692:149;;;:::o;25847:89::-;25883:7;25923:6;25916:5;25912:18;25901:29;;25847:89;;;:::o;25942:126::-;25979:7;26019:42;26012:5;26008:54;25997:65;;25942:126;;;:::o;26074:77::-;26111:7;26140:5;26129:16;;26074:77;;;:::o;26157:86::-;26192:7;26232:4;26225:5;26221:16;26210:27;;26157:86;;;:::o;26249:158::-;26331:9;26364:37;26395:5;26364:37;:::i;:::-;26351:50;;26249:158;;;:::o;26413:126::-;26463:9;26496:37;26527:5;26496:37;:::i;:::-;26483:50;;26413:126;;;:::o;26545:113::-;26595:9;26628:24;26646:5;26628:24;:::i;:::-;26615:37;;26545:113;;;:::o;26664:154::-;26748:6;26743:3;26738;26725:30;26810:1;26801:6;26796:3;26792:16;26785:27;26664:154;;;:::o;26824:307::-;26892:1;26902:113;26916:6;26913:1;26910:13;26902:113;;;27001:1;26996:3;26992:11;26986:18;26982:1;26977:3;26973:11;26966:39;26938:2;26935:1;26931:10;26926:15;;26902:113;;;27033:6;27030:1;27027:13;27024:101;;;27113:1;27104:6;27099:3;27095:16;27088:27;27024:101;26873:258;26824:307;;;:::o;27137:320::-;27181:6;27218:1;27212:4;27208:12;27198:22;;27265:1;27259:4;27255:12;27286:18;27276:81;;27342:4;27334:6;27330:17;27320:27;;27276:81;27404:2;27396:6;27393:14;27373:18;27370:38;27367:84;;;27423:18;;:::i;:::-;27367:84;27188:269;27137:320;;;:::o;27463:281::-;27546:27;27568:4;27546:27;:::i;:::-;27538:6;27534:40;27676:6;27664:10;27661:22;27640:18;27628:10;27625:34;27622:62;27619:88;;;27687:18;;:::i;:::-;27619:88;27727:10;27723:2;27716:22;27506:238;27463:281;;:::o;27750:233::-;27789:3;27812:24;27830:5;27812:24;:::i;:::-;27803:33;;27858:66;27851:5;27848:77;27845:103;;;27928:18;;:::i;:::-;27845:103;27975:1;27968:5;27964:13;27957:20;;27750:233;;;:::o;27989:176::-;28021:1;28038:20;28056:1;28038:20;:::i;:::-;28033:25;;28072:20;28090:1;28072:20;:::i;:::-;28067:25;;28111:1;28101:35;;28116:18;;:::i;:::-;28101:35;28157:1;28154;28150:9;28145:14;;27989:176;;;;:::o;28171:180::-;28219:77;28216:1;28209:88;28316:4;28313:1;28306:15;28340:4;28337:1;28330:15;28357:180;28405:77;28402:1;28395:88;28502:4;28499:1;28492:15;28526:4;28523:1;28516:15;28543:180;28591:77;28588:1;28581:88;28688:4;28685:1;28678:15;28712:4;28709:1;28702:15;28729:180;28777:77;28774:1;28767:88;28874:4;28871:1;28864:15;28898:4;28895:1;28888:15;28915:180;28963:77;28960:1;28953:88;29060:4;29057:1;29050:15;29084:4;29081:1;29074:15;29101:117;29210:1;29207;29200:12;29224:117;29333:1;29330;29323:12;29347:117;29456:1;29453;29446:12;29470:117;29579:1;29576;29569:12;29593:117;29702:1;29699;29692:12;29716:117;29825:1;29822;29815:12;29839:102;29880:6;29931:2;29927:7;29922:2;29915:5;29911:14;29907:28;29897:38;;29839:102;;;:::o;29947:225::-;30087:34;30083:1;30075:6;30071:14;30064:58;30156:8;30151:2;30143:6;30139:15;30132:33;29947:225;:::o;30178:182::-;30318:34;30314:1;30306:6;30302:14;30295:58;30178:182;:::o;30366:173::-;30506:25;30502:1;30494:6;30490:14;30483:49;30366:173;:::o;30545:234::-;30685:34;30681:1;30673:6;30669:14;30662:58;30754:17;30749:2;30741:6;30737:15;30730:42;30545:234;:::o;30785:169::-;30925:21;30921:1;30913:6;30909:14;30902:45;30785:169;:::o;30960:178::-;31100:30;31096:1;31088:6;31084:14;31077:54;30960:178;:::o;31144:169::-;31284:21;31280:1;31272:6;31268:14;31261:45;31144:169;:::o;31319:122::-;31392:24;31410:5;31392:24;:::i;:::-;31385:5;31382:35;31372:63;;31431:1;31428;31421:12;31372:63;31319:122;:::o;31447:116::-;31517:21;31532:5;31517:21;:::i;:::-;31510:5;31507:32;31497:60;;31553:1;31550;31543:12;31497:60;31447:116;:::o;31569:120::-;31641:23;31658:5;31641:23;:::i;:::-;31634:5;31631:34;31621:62;;31679:1;31676;31669:12;31621:62;31569:120;:::o;31695:::-;31767:23;31784:5;31767:23;:::i;:::-;31760:5;31757:34;31747:62;;31805:1;31802;31795:12;31747:62;31695:120;:::o;31821:122::-;31894:24;31912:5;31894:24;:::i;:::-;31887:5;31884:35;31874:63;;31933:1;31930;31923:12;31874:63;31821:122;:::o;31949:118::-;32020:22;32036:5;32020:22;:::i;:::-;32013:5;32010:33;32000:61;;32057:1;32054;32047:12;32000:61;31949:118;:::o

Swarm Source

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