ETH Price: $3,237.87 (-0.51%)
Gas: 1 Gwei

Token

Ghostie (GHE)
 

Overview

Max Total Supply

500 GHE

Holders

198

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 GHE
0x393fa0fcd95f5556fa04de624f4b1c0f9b4b9148
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:
GhostIE

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2022-09-21
*/

/**
╭━━━┳╮╱╭┳━━━┳━━━┳━━━━┳━━┳━━━╮
┃╭━╮┃┃╱┃┃╭━╮┃╭━╮┃╭╮╭╮┣┫┣┫╭━━╯
┃┃╱╰┫╰━╯┃┃╱┃┃╰━━╋╯┃┃╰╯┃┃┃╰━━╮
┃┃╭━┫╭━╮┃┃╱┃┣━━╮┃╱┃┃╱╱┃┃┃╭━━╯
┃╰┻━┃┃╱┃┃╰━╯┃╰━╯┃╱┃┃╱╭┫┣┫╰━━╮
╰━━━┻╯╱╰┻━━━┻━━━╯╱╰╯╱╰━━┻━━━╯
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Counters {
    struct Counter {

        uint256 _value; // default: 0
    }

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

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

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

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


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

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


pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


pragma solidity ^0.8.4;


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

    string private baseURI;

    string public hiddenMetadataUri;

    // uint256 public price = 0 ether;
    uint256 public price;

    uint256 public maxMintPerWallet = 1;

    uint256 public totalPublicSale = 400;

    uint256 public currentPublicSale = 0;

    uint256 public maxSupply = 500;

    uint public nextId = 0;

    bool public mintEnabled;

    bool public revealed;

    mapping(address => uint256) private _mintedFreeAmount;

    constructor() ERC721A("Ghostie", "GHE") {
        setHiddenMetadataUri("");
    }

    function mint(uint256 count) external payable {
        require(mintEnabled, "Minting is not live yet");
        require(msg.value >= count * price, "Please send the exact amount.");
        require(totalSupply() + count <= maxSupply, "No more GhostIE");
        require(currentPublicSale + count <= totalPublicSale, "Insufficient free credits");
        require(count <= maxMintPerWallet, "Max per TX reached.");
        require(_mintedFreeAmount[msg.sender] + count <= maxMintPerWallet, "More than the number of wallets per");

        _safeMint(msg.sender, count);
        _mintedFreeAmount[msg.sender] += count;
        currentPublicSale += count;
        nextId += count;
    }

    function canMint(address _addr) external view returns(bool){
        return  _mintedFreeAmount[_addr] < maxMintPerWallet;
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
         return string(abi.encodePacked(hiddenMetadataUri));
        }
    
        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
     hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setFreeAmount(uint256 amount) external onlyOwner {
        totalPublicSale = amount;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setMaxMintPerWallet(uint256 _num) external onlyOwner {
        maxMintPerWallet = _num;
    }

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

    function flipSale() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function getNextId() public view returns(uint){
     return nextId;
    }

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }

    function airdrop(address to, uint256 quantity)public onlyOwner{
        require(totalSupply() + quantity <= maxSupply, "reached max supply");
        _safeMint(to, quantity);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","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":"maxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","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":"totalPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040526001600c55610190600d556000600e556101f4600f5560006010553480156200002c57600080fd5b506040518060400160405280600781526020017f47686f73746965000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f47484500000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b1929190620002d5565b508060039080519060200190620000ca929190620002d5565b50620000db6200012960201b60201c565b600081905550505062000103620000f76200013260201b60201c565b6200013a60201b60201c565b62000123604051806020016040528060008152506200020060201b60201c565b6200046d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002106200013260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000236620002ab60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200028f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028690620003ac565b60405180910390fd5b80600a9080519060200190620002a7929190620002d5565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002e390620003df565b90600052602060002090601f01602090048101928262000307576000855562000353565b82601f106200032257805160ff191683800117855562000353565b8280016001018555821562000353579182015b828111156200035257825182559160200191906001019062000335565b5b50905062000362919062000366565b5090565b5b808211156200038157600081600090555060010162000367565b5090565b600062000394602083620003ce565b9150620003a18262000444565b602082019050919050565b60006020820190508181036000830152620003c78162000385565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620003f857607f821691505b602082108114156200040f576200040e62000415565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613e5e806200047d6000396000f3fe6080604052600436106102255760003560e01c806391b7f5ed11610123578063b228d925116100ab578063d12397301161006f578063d1239730146107ac578063d5abeb01146107d7578063e66e995d14610802578063e985e9c51461082d578063f2fde38b1461086a57610225565b8063b228d925146106b3578063b88d4fde146106de578063bc96832614610707578063c2ba474414610732578063c87b56dd1461076f57610225565b8063a0712d68116100f2578063a0712d68146105ef578063a22cb4651461060b578063a323bdb414610634578063a45ba8e71461065f578063afdf61341461068a57610225565b806391b7f5ed1461054757806392910eec1461057057806395d89b4114610599578063a035b1fe146105c457610225565b80634fdd43cb116101b157806370a082311161017557806370a0823114610488578063715018a6146104c55780637ba5e621146104dc5780638ba4cc3c146104f35780638da5cb5b1461051c57610225565b80634fdd43cb146103a357806351830227146103cc57806355f804b3146103f757806361b8ce8c146104205780636352211e1461044b57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780633bd649681461034c5780633ccfd60b1461036357806342842e0e1461037a57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130c0565b610893565b60405161025e9190613554565b60405180910390f35b34801561027357600080fd5b5061027c610975565b604051610289919061356f565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613153565b610a07565b6040516102c691906134ed565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613084565b610a83565b005b34801561030457600080fd5b5061030d610b8e565b60405161031a91906136f1565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190612f7e565b610ba5565b005b34801561035857600080fd5b50610361610bb5565b005b34801561036f57600080fd5b50610378610c5d565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612f7e565b610d88565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613112565b610da8565b005b3480156103d857600080fd5b506103e1610e3e565b6040516103ee9190613554565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613112565b610e51565b005b34801561042c57600080fd5b50610435610ee7565b60405161044291906136f1565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190613153565b610eed565b60405161047f91906134ed565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612f19565b610f03565b6040516104bc91906136f1565b60405180910390f35b3480156104d157600080fd5b506104da610fd3565b005b3480156104e857600080fd5b506104f161105b565b005b3480156104ff57600080fd5b5061051a60048036038101906105159190613084565b611103565b005b34801561052857600080fd5b506105316111e4565b60405161053e91906134ed565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613153565b61120e565b005b34801561057c57600080fd5b5061059760048036038101906105929190613153565b611294565b005b3480156105a557600080fd5b506105ae61131a565b6040516105bb919061356f565b60405180910390f35b3480156105d057600080fd5b506105d96113ac565b6040516105e691906136f1565b60405180910390f35b61060960048036038101906106049190613153565b6113b2565b005b34801561061757600080fd5b50610632600480360381019061062d9190613048565b611663565b005b34801561064057600080fd5b506106496117db565b60405161065691906136f1565b60405180910390f35b34801561066b57600080fd5b506106746117e1565b604051610681919061356f565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190613153565b61186f565b005b3480156106bf57600080fd5b506106c86118f5565b6040516106d591906136f1565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190612fcd565b6118fb565b005b34801561071357600080fd5b5061071c611977565b60405161072991906136f1565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190612f19565b611981565b6040516107669190613554565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190613153565b6119ce565b6040516107a3919061356f565b60405180910390f35b3480156107b857600080fd5b506107c1611a8f565b6040516107ce9190613554565b60405180910390f35b3480156107e357600080fd5b506107ec611aa2565b6040516107f991906136f1565b60405180910390f35b34801561080e57600080fd5b50610817611aa8565b60405161082491906136f1565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190612f42565b611aae565b6040516108619190613554565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190612f19565b611b42565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061096e575061096d82611c3a565b5b9050919050565b606060028054610984906139c1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b0906139c1565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b5050505050905090565b6000610a1282611ca4565b610a48576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8e82610eed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b15611cf2565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b475750610b4581610b40611cf2565b611aae565b155b15610b7e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b89838383611cfa565b505050565b6000610b98611dac565b6001546000540303905090565b610bb0838383611db5565b505050565b610bbd611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610bdb6111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2890613611565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b610c65611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610c836111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090613611565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610cff906134d8565b60006040518083038185875af1925050503d8060008114610d3c576040519150601f19603f3d011682016040523d82523d6000602084013e610d41565b606091505b5050905080610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c906136b1565b60405180910390fd5b50565b610da3838383604051806020016040528060008152506118fb565b505050565b610db0611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610dce6111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613611565b60405180910390fd5b80600a9080519060200190610e3a929190612cfa565b5050565b601160019054906101000a900460ff1681565b610e59611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610e776111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec490613611565b60405180910390fd5b8060099080519060200190610ee3929190612cfa565b5050565b60105481565b6000610ef88261226b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fdb611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610ff96111e4565b73ffffffffffffffffffffffffffffffffffffffff161461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690613611565b60405180910390fd5b61105960006124fa565b565b611063611cf2565b73ffffffffffffffffffffffffffffffffffffffff166110816111e4565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90613611565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b61110b611cf2565b73ffffffffffffffffffffffffffffffffffffffff166111296111e4565b73ffffffffffffffffffffffffffffffffffffffff161461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690613611565b60405180910390fd5b600f548161118b610b8e565b61119591906137f6565b11156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd906135f1565b60405180910390fd5b6111e082826125c0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611216611cf2565b73ffffffffffffffffffffffffffffffffffffffff166112346111e4565b73ffffffffffffffffffffffffffffffffffffffff161461128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613611565b60405180910390fd5b80600b8190555050565b61129c611cf2565b73ffffffffffffffffffffffffffffffffffffffff166112ba6111e4565b73ffffffffffffffffffffffffffffffffffffffff1614611310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130790613611565b60405180910390fd5b80600d8190555050565b606060038054611329906139c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611355906139c1565b80156113a25780601f10611377576101008083540402835291602001916113a2565b820191906000526020600020905b81548152906001019060200180831161138557829003601f168201915b5050505050905090565b600b5481565b601160009054906101000a900460ff16611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613591565b60405180910390fd5b600b548161140f919061387d565b341015611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890613671565b60405180910390fd5b600f548161145d610b8e565b61146791906137f6565b11156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90613651565b60405180910390fd5b600d5481600e546114b991906137f6565b11156114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190613691565b60405180910390fd5b600c5481111561153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906136d1565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461158d91906137f6565b11156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906135d1565b60405180910390fd5b6115d833826125c0565b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162791906137f6565b9250508190555080600e600082825461164091906137f6565b92505081905550806010600082825461165991906137f6565b9250508190555050565b61166b611cf2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116d0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116dd611cf2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661178a611cf2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117cf9190613554565b60405180910390a35050565b600e5481565b600a80546117ee906139c1565b80601f016020809104026020016040519081016040528092919081815260200182805461181a906139c1565b80156118675780601f1061183c57610100808354040283529160200191611867565b820191906000526020600020905b81548152906001019060200180831161184a57829003601f168201915b505050505081565b611877611cf2565b73ffffffffffffffffffffffffffffffffffffffff166118956111e4565b73ffffffffffffffffffffffffffffffffffffffff16146118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613611565b60405180910390fd5b80600c8190555050565b600c5481565b611906848484611db5565b6119258373ffffffffffffffffffffffffffffffffffffffff166125de565b801561193a575061193884848484612601565b155b15611971576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000601054905090565b6000600c54601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054109050919050565b60606119d982611ca4565b611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90613631565b60405180910390fd5b60001515601160019054906101000a900460ff1615151415611a5c57600a604051602001611a469190613492565b6040516020818303038152906040529050611a8a565b6009611a6783612761565b604051602001611a789291906134a9565b60405160208183030381529060405290505b919050565b601160009054906101000a900460ff1681565b600f5481565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b4a611cf2565b73ffffffffffffffffffffffffffffffffffffffff16611b686111e4565b73ffffffffffffffffffffffffffffffffffffffff1614611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590613611565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c25906135b1565b60405180910390fd5b611c37816124fa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611caf611dac565b11158015611cbe575060005482105b8015611ceb575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611dc08261226b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e2b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e4c611cf2565b73ffffffffffffffffffffffffffffffffffffffff161480611e7b5750611e7a85611e75611cf2565b611aae565b5b80611ec05750611e89611cf2565b73ffffffffffffffffffffffffffffffffffffffff16611ea884610a07565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ef9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f60576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f6d858585600161290e565b611f7960008487611cfa565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121f95760005482146121f857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122648585856001612914565b5050505050565b612273612d80565b600082905080612281611dac565b11158015612290575060005481105b156124c3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124c157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123a55780925050506124f5565b5b6001156124c057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124bb5780925050506124f5565b6123a6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125da82826040518060200160405280600081525061291a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612627611cf2565b8786866040518563ffffffff1660e01b81526004016126499493929190613508565b602060405180830381600087803b15801561266357600080fd5b505af192505050801561269457506040513d601f19601f8201168201806040525081019061269191906130e9565b60015b61270e573d80600081146126c4576040519150601f19603f3d011682016040523d82523d6000602084013e6126c9565b606091505b50600081511415612706576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156127a9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612909565b600082905060005b600082146127db5780806127c490613a24565b915050600a826127d4919061384c565b91506127b1565b60008167ffffffffffffffff81111561281d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561284f5781602001600182028036833780820191505090505b5090505b600085146129025760018261286891906138d7565b9150600a856128779190613a6d565b603061288391906137f6565b60f81b8183815181106128bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128fb919061384c565b9450612853565b8093505050505b919050565b50505050565b50505050565b612927838383600161292c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612999576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156129d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129e1600086838761290e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612bab5750612baa8773ffffffffffffffffffffffffffffffffffffffff166125de565b5b15612c71575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c206000888480600101955088612601565b612c56576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612bb1578260005414612c6c57600080fd5b612cdd565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612c72575b816000819055505050612cf36000868387612914565b5050505050565b828054612d06906139c1565b90600052602060002090601f016020900481019282612d285760008555612d6f565b82601f10612d4157805160ff1916838001178555612d6f565b82800160010185558215612d6f579182015b82811115612d6e578251825591602001919060010190612d53565b5b509050612d7c9190612dc3565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ddc576000816000905550600101612dc4565b5090565b6000612df3612dee84613731565b61370c565b905082815260208101848484011115612e0b57600080fd5b612e1684828561397f565b509392505050565b6000612e31612e2c84613762565b61370c565b905082815260208101848484011115612e4957600080fd5b612e5484828561397f565b509392505050565b600081359050612e6b81613dcc565b92915050565b600081359050612e8081613de3565b92915050565b600081359050612e9581613dfa565b92915050565b600081519050612eaa81613dfa565b92915050565b600082601f830112612ec157600080fd5b8135612ed1848260208601612de0565b91505092915050565b600082601f830112612eeb57600080fd5b8135612efb848260208601612e1e565b91505092915050565b600081359050612f1381613e11565b92915050565b600060208284031215612f2b57600080fd5b6000612f3984828501612e5c565b91505092915050565b60008060408385031215612f5557600080fd5b6000612f6385828601612e5c565b9250506020612f7485828601612e5c565b9150509250929050565b600080600060608486031215612f9357600080fd5b6000612fa186828701612e5c565b9350506020612fb286828701612e5c565b9250506040612fc386828701612f04565b9150509250925092565b60008060008060808587031215612fe357600080fd5b6000612ff187828801612e5c565b945050602061300287828801612e5c565b935050604061301387828801612f04565b925050606085013567ffffffffffffffff81111561303057600080fd5b61303c87828801612eb0565b91505092959194509250565b6000806040838503121561305b57600080fd5b600061306985828601612e5c565b925050602061307a85828601612e71565b9150509250929050565b6000806040838503121561309757600080fd5b60006130a585828601612e5c565b92505060206130b685828601612f04565b9150509250929050565b6000602082840312156130d257600080fd5b60006130e084828501612e86565b91505092915050565b6000602082840312156130fb57600080fd5b600061310984828501612e9b565b91505092915050565b60006020828403121561312457600080fd5b600082013567ffffffffffffffff81111561313e57600080fd5b61314a84828501612eda565b91505092915050565b60006020828403121561316557600080fd5b600061317384828501612f04565b91505092915050565b6131858161390b565b82525050565b6131948161391d565b82525050565b60006131a5826137a8565b6131af81856137be565b93506131bf81856020860161398e565b6131c881613b5a565b840191505092915050565b60006131de826137b3565b6131e881856137da565b93506131f881856020860161398e565b61320181613b5a565b840191505092915050565b6000613217826137b3565b61322181856137eb565b935061323181856020860161398e565b80840191505092915050565b6000815461324a816139c1565b61325481866137eb565b9450600182166000811461326f5760018114613280576132b3565b60ff198316865281860193506132b3565b61328985613793565b60005b838110156132ab5781548189015260018201915060208101905061328c565b838801955050505b50505092915050565b60006132c96017836137da565b91506132d482613b6b565b602082019050919050565b60006132ec6026836137da565b91506132f782613b94565b604082019050919050565b600061330f6023836137da565b915061331a82613be3565b604082019050919050565b60006133326012836137da565b915061333d82613c32565b602082019050919050565b60006133556005836137eb565b915061336082613c5b565b600582019050919050565b60006133786020836137da565b915061338382613c84565b602082019050919050565b600061339b602f836137da565b91506133a682613cad565b604082019050919050565b60006133be600f836137da565b91506133c982613cfc565b602082019050919050565b60006133e1601d836137da565b91506133ec82613d25565b602082019050919050565b60006134046000836137cf565b915061340f82613d4e565b600082019050919050565b60006134276019836137da565b915061343282613d51565b602082019050919050565b600061344a6010836137da565b915061345582613d7a565b602082019050919050565b600061346d6013836137da565b915061347882613da3565b602082019050919050565b61348c81613975565b82525050565b600061349e828461323d565b915081905092915050565b60006134b5828561323d565b91506134c1828461320c565b91506134cc82613348565b91508190509392505050565b60006134e3826133f7565b9150819050919050565b6000602082019050613502600083018461317c565b92915050565b600060808201905061351d600083018761317c565b61352a602083018661317c565b6135376040830185613483565b8181036060830152613549818461319a565b905095945050505050565b6000602082019050613569600083018461318b565b92915050565b6000602082019050818103600083015261358981846131d3565b905092915050565b600060208201905081810360008301526135aa816132bc565b9050919050565b600060208201905081810360008301526135ca816132df565b9050919050565b600060208201905081810360008301526135ea81613302565b9050919050565b6000602082019050818103600083015261360a81613325565b9050919050565b6000602082019050818103600083015261362a8161336b565b9050919050565b6000602082019050818103600083015261364a8161338e565b9050919050565b6000602082019050818103600083015261366a816133b1565b9050919050565b6000602082019050818103600083015261368a816133d4565b9050919050565b600060208201905081810360008301526136aa8161341a565b9050919050565b600060208201905081810360008301526136ca8161343d565b9050919050565b600060208201905081810360008301526136ea81613460565b9050919050565b60006020820190506137066000830184613483565b92915050565b6000613716613727565b905061372282826139f3565b919050565b6000604051905090565b600067ffffffffffffffff82111561374c5761374b613b2b565b5b61375582613b5a565b9050602081019050919050565b600067ffffffffffffffff82111561377d5761377c613b2b565b5b61378682613b5a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061380182613975565b915061380c83613975565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384157613840613a9e565b5b828201905092915050565b600061385782613975565b915061386283613975565b92508261387257613871613acd565b5b828204905092915050565b600061388882613975565b915061389383613975565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138cc576138cb613a9e565b5b828202905092915050565b60006138e282613975565b91506138ed83613975565b925082821015613900576138ff613a9e565b5b828203905092915050565b600061391682613955565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139ac578082015181840152602081019050613991565b838111156139bb576000848401525b50505050565b600060028204905060018216806139d957607f821691505b602082108114156139ed576139ec613afc565b5b50919050565b6139fc82613b5a565b810181811067ffffffffffffffff82111715613a1b57613a1a613b2b565b5b80604052505050565b6000613a2f82613975565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a6257613a61613a9e565b5b600182019050919050565b6000613a7882613975565b9150613a8383613975565b925082613a9357613a92613acd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4d696e74696e67206973206e6f74206c69766520796574000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f7265207468616e20746865206e756d626572206f662077616c6c6574732060008201527f7065720000000000000000000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f206d6f72652047686f737449450000000000000000000000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f496e73756666696369656e742066726565206372656469747300000000000000600082015250565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b613dd58161390b565b8114613de057600080fd5b50565b613dec8161391d565b8114613df757600080fd5b50565b613e0381613929565b8114613e0e57600080fd5b50565b613e1a81613975565b8114613e2557600080fd5b5056fea26469706673582212203cdb0efb41fda03a72c4d2f47664ba0d4d76a821562edb87a0a232dd8553df6b64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102255760003560e01c806391b7f5ed11610123578063b228d925116100ab578063d12397301161006f578063d1239730146107ac578063d5abeb01146107d7578063e66e995d14610802578063e985e9c51461082d578063f2fde38b1461086a57610225565b8063b228d925146106b3578063b88d4fde146106de578063bc96832614610707578063c2ba474414610732578063c87b56dd1461076f57610225565b8063a0712d68116100f2578063a0712d68146105ef578063a22cb4651461060b578063a323bdb414610634578063a45ba8e71461065f578063afdf61341461068a57610225565b806391b7f5ed1461054757806392910eec1461057057806395d89b4114610599578063a035b1fe146105c457610225565b80634fdd43cb116101b157806370a082311161017557806370a0823114610488578063715018a6146104c55780637ba5e621146104dc5780638ba4cc3c146104f35780638da5cb5b1461051c57610225565b80634fdd43cb146103a357806351830227146103cc57806355f804b3146103f757806361b8ce8c146104205780636352211e1461044b57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780633bd649681461034c5780633ccfd60b1461036357806342842e0e1461037a57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130c0565b610893565b60405161025e9190613554565b60405180910390f35b34801561027357600080fd5b5061027c610975565b604051610289919061356f565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613153565b610a07565b6040516102c691906134ed565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613084565b610a83565b005b34801561030457600080fd5b5061030d610b8e565b60405161031a91906136f1565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190612f7e565b610ba5565b005b34801561035857600080fd5b50610361610bb5565b005b34801561036f57600080fd5b50610378610c5d565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612f7e565b610d88565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613112565b610da8565b005b3480156103d857600080fd5b506103e1610e3e565b6040516103ee9190613554565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613112565b610e51565b005b34801561042c57600080fd5b50610435610ee7565b60405161044291906136f1565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190613153565b610eed565b60405161047f91906134ed565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612f19565b610f03565b6040516104bc91906136f1565b60405180910390f35b3480156104d157600080fd5b506104da610fd3565b005b3480156104e857600080fd5b506104f161105b565b005b3480156104ff57600080fd5b5061051a60048036038101906105159190613084565b611103565b005b34801561052857600080fd5b506105316111e4565b60405161053e91906134ed565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613153565b61120e565b005b34801561057c57600080fd5b5061059760048036038101906105929190613153565b611294565b005b3480156105a557600080fd5b506105ae61131a565b6040516105bb919061356f565b60405180910390f35b3480156105d057600080fd5b506105d96113ac565b6040516105e691906136f1565b60405180910390f35b61060960048036038101906106049190613153565b6113b2565b005b34801561061757600080fd5b50610632600480360381019061062d9190613048565b611663565b005b34801561064057600080fd5b506106496117db565b60405161065691906136f1565b60405180910390f35b34801561066b57600080fd5b506106746117e1565b604051610681919061356f565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190613153565b61186f565b005b3480156106bf57600080fd5b506106c86118f5565b6040516106d591906136f1565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190612fcd565b6118fb565b005b34801561071357600080fd5b5061071c611977565b60405161072991906136f1565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190612f19565b611981565b6040516107669190613554565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190613153565b6119ce565b6040516107a3919061356f565b60405180910390f35b3480156107b857600080fd5b506107c1611a8f565b6040516107ce9190613554565b60405180910390f35b3480156107e357600080fd5b506107ec611aa2565b6040516107f991906136f1565b60405180910390f35b34801561080e57600080fd5b50610817611aa8565b60405161082491906136f1565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190612f42565b611aae565b6040516108619190613554565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190612f19565b611b42565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061096e575061096d82611c3a565b5b9050919050565b606060028054610984906139c1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b0906139c1565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b5050505050905090565b6000610a1282611ca4565b610a48576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8e82610eed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b15611cf2565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b475750610b4581610b40611cf2565b611aae565b155b15610b7e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b89838383611cfa565b505050565b6000610b98611dac565b6001546000540303905090565b610bb0838383611db5565b505050565b610bbd611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610bdb6111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2890613611565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b610c65611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610c836111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090613611565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610cff906134d8565b60006040518083038185875af1925050503d8060008114610d3c576040519150601f19603f3d011682016040523d82523d6000602084013e610d41565b606091505b5050905080610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c906136b1565b60405180910390fd5b50565b610da3838383604051806020016040528060008152506118fb565b505050565b610db0611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610dce6111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613611565b60405180910390fd5b80600a9080519060200190610e3a929190612cfa565b5050565b601160019054906101000a900460ff1681565b610e59611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610e776111e4565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec490613611565b60405180910390fd5b8060099080519060200190610ee3929190612cfa565b5050565b60105481565b6000610ef88261226b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fdb611cf2565b73ffffffffffffffffffffffffffffffffffffffff16610ff96111e4565b73ffffffffffffffffffffffffffffffffffffffff161461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690613611565b60405180910390fd5b61105960006124fa565b565b611063611cf2565b73ffffffffffffffffffffffffffffffffffffffff166110816111e4565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90613611565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b61110b611cf2565b73ffffffffffffffffffffffffffffffffffffffff166111296111e4565b73ffffffffffffffffffffffffffffffffffffffff161461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690613611565b60405180910390fd5b600f548161118b610b8e565b61119591906137f6565b11156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd906135f1565b60405180910390fd5b6111e082826125c0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611216611cf2565b73ffffffffffffffffffffffffffffffffffffffff166112346111e4565b73ffffffffffffffffffffffffffffffffffffffff161461128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613611565b60405180910390fd5b80600b8190555050565b61129c611cf2565b73ffffffffffffffffffffffffffffffffffffffff166112ba6111e4565b73ffffffffffffffffffffffffffffffffffffffff1614611310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130790613611565b60405180910390fd5b80600d8190555050565b606060038054611329906139c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611355906139c1565b80156113a25780601f10611377576101008083540402835291602001916113a2565b820191906000526020600020905b81548152906001019060200180831161138557829003601f168201915b5050505050905090565b600b5481565b601160009054906101000a900460ff16611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613591565b60405180910390fd5b600b548161140f919061387d565b341015611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890613671565b60405180910390fd5b600f548161145d610b8e565b61146791906137f6565b11156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90613651565b60405180910390fd5b600d5481600e546114b991906137f6565b11156114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190613691565b60405180910390fd5b600c5481111561153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906136d1565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461158d91906137f6565b11156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906135d1565b60405180910390fd5b6115d833826125c0565b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162791906137f6565b9250508190555080600e600082825461164091906137f6565b92505081905550806010600082825461165991906137f6565b9250508190555050565b61166b611cf2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116d0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116dd611cf2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661178a611cf2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117cf9190613554565b60405180910390a35050565b600e5481565b600a80546117ee906139c1565b80601f016020809104026020016040519081016040528092919081815260200182805461181a906139c1565b80156118675780601f1061183c57610100808354040283529160200191611867565b820191906000526020600020905b81548152906001019060200180831161184a57829003601f168201915b505050505081565b611877611cf2565b73ffffffffffffffffffffffffffffffffffffffff166118956111e4565b73ffffffffffffffffffffffffffffffffffffffff16146118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290613611565b60405180910390fd5b80600c8190555050565b600c5481565b611906848484611db5565b6119258373ffffffffffffffffffffffffffffffffffffffff166125de565b801561193a575061193884848484612601565b155b15611971576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000601054905090565b6000600c54601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054109050919050565b60606119d982611ca4565b611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90613631565b60405180910390fd5b60001515601160019054906101000a900460ff1615151415611a5c57600a604051602001611a469190613492565b6040516020818303038152906040529050611a8a565b6009611a6783612761565b604051602001611a789291906134a9565b60405160208183030381529060405290505b919050565b601160009054906101000a900460ff1681565b600f5481565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b4a611cf2565b73ffffffffffffffffffffffffffffffffffffffff16611b686111e4565b73ffffffffffffffffffffffffffffffffffffffff1614611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590613611565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c25906135b1565b60405180910390fd5b611c37816124fa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611caf611dac565b11158015611cbe575060005482105b8015611ceb575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611dc08261226b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e2b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e4c611cf2565b73ffffffffffffffffffffffffffffffffffffffff161480611e7b5750611e7a85611e75611cf2565b611aae565b5b80611ec05750611e89611cf2565b73ffffffffffffffffffffffffffffffffffffffff16611ea884610a07565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ef9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f60576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f6d858585600161290e565b611f7960008487611cfa565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121f95760005482146121f857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122648585856001612914565b5050505050565b612273612d80565b600082905080612281611dac565b11158015612290575060005481105b156124c3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124c157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123a55780925050506124f5565b5b6001156124c057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124bb5780925050506124f5565b6123a6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125da82826040518060200160405280600081525061291a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612627611cf2565b8786866040518563ffffffff1660e01b81526004016126499493929190613508565b602060405180830381600087803b15801561266357600080fd5b505af192505050801561269457506040513d601f19601f8201168201806040525081019061269191906130e9565b60015b61270e573d80600081146126c4576040519150601f19603f3d011682016040523d82523d6000602084013e6126c9565b606091505b50600081511415612706576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156127a9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612909565b600082905060005b600082146127db5780806127c490613a24565b915050600a826127d4919061384c565b91506127b1565b60008167ffffffffffffffff81111561281d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561284f5781602001600182028036833780820191505090505b5090505b600085146129025760018261286891906138d7565b9150600a856128779190613a6d565b603061288391906137f6565b60f81b8183815181106128bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128fb919061384c565b9450612853565b8093505050505b919050565b50505050565b50505050565b612927838383600161292c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612999576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156129d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129e1600086838761290e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612bab5750612baa8773ffffffffffffffffffffffffffffffffffffffff166125de565b5b15612c71575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c206000888480600101955088612601565b612c56576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612bb1578260005414612c6c57600080fd5b612cdd565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612c72575b816000819055505050612cf36000868387612914565b5050505050565b828054612d06906139c1565b90600052602060002090601f016020900481019282612d285760008555612d6f565b82601f10612d4157805160ff1916838001178555612d6f565b82800160010185558215612d6f579182015b82811115612d6e578251825591602001919060010190612d53565b5b509050612d7c9190612dc3565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ddc576000816000905550600101612dc4565b5090565b6000612df3612dee84613731565b61370c565b905082815260208101848484011115612e0b57600080fd5b612e1684828561397f565b509392505050565b6000612e31612e2c84613762565b61370c565b905082815260208101848484011115612e4957600080fd5b612e5484828561397f565b509392505050565b600081359050612e6b81613dcc565b92915050565b600081359050612e8081613de3565b92915050565b600081359050612e9581613dfa565b92915050565b600081519050612eaa81613dfa565b92915050565b600082601f830112612ec157600080fd5b8135612ed1848260208601612de0565b91505092915050565b600082601f830112612eeb57600080fd5b8135612efb848260208601612e1e565b91505092915050565b600081359050612f1381613e11565b92915050565b600060208284031215612f2b57600080fd5b6000612f3984828501612e5c565b91505092915050565b60008060408385031215612f5557600080fd5b6000612f6385828601612e5c565b9250506020612f7485828601612e5c565b9150509250929050565b600080600060608486031215612f9357600080fd5b6000612fa186828701612e5c565b9350506020612fb286828701612e5c565b9250506040612fc386828701612f04565b9150509250925092565b60008060008060808587031215612fe357600080fd5b6000612ff187828801612e5c565b945050602061300287828801612e5c565b935050604061301387828801612f04565b925050606085013567ffffffffffffffff81111561303057600080fd5b61303c87828801612eb0565b91505092959194509250565b6000806040838503121561305b57600080fd5b600061306985828601612e5c565b925050602061307a85828601612e71565b9150509250929050565b6000806040838503121561309757600080fd5b60006130a585828601612e5c565b92505060206130b685828601612f04565b9150509250929050565b6000602082840312156130d257600080fd5b60006130e084828501612e86565b91505092915050565b6000602082840312156130fb57600080fd5b600061310984828501612e9b565b91505092915050565b60006020828403121561312457600080fd5b600082013567ffffffffffffffff81111561313e57600080fd5b61314a84828501612eda565b91505092915050565b60006020828403121561316557600080fd5b600061317384828501612f04565b91505092915050565b6131858161390b565b82525050565b6131948161391d565b82525050565b60006131a5826137a8565b6131af81856137be565b93506131bf81856020860161398e565b6131c881613b5a565b840191505092915050565b60006131de826137b3565b6131e881856137da565b93506131f881856020860161398e565b61320181613b5a565b840191505092915050565b6000613217826137b3565b61322181856137eb565b935061323181856020860161398e565b80840191505092915050565b6000815461324a816139c1565b61325481866137eb565b9450600182166000811461326f5760018114613280576132b3565b60ff198316865281860193506132b3565b61328985613793565b60005b838110156132ab5781548189015260018201915060208101905061328c565b838801955050505b50505092915050565b60006132c96017836137da565b91506132d482613b6b565b602082019050919050565b60006132ec6026836137da565b91506132f782613b94565b604082019050919050565b600061330f6023836137da565b915061331a82613be3565b604082019050919050565b60006133326012836137da565b915061333d82613c32565b602082019050919050565b60006133556005836137eb565b915061336082613c5b565b600582019050919050565b60006133786020836137da565b915061338382613c84565b602082019050919050565b600061339b602f836137da565b91506133a682613cad565b604082019050919050565b60006133be600f836137da565b91506133c982613cfc565b602082019050919050565b60006133e1601d836137da565b91506133ec82613d25565b602082019050919050565b60006134046000836137cf565b915061340f82613d4e565b600082019050919050565b60006134276019836137da565b915061343282613d51565b602082019050919050565b600061344a6010836137da565b915061345582613d7a565b602082019050919050565b600061346d6013836137da565b915061347882613da3565b602082019050919050565b61348c81613975565b82525050565b600061349e828461323d565b915081905092915050565b60006134b5828561323d565b91506134c1828461320c565b91506134cc82613348565b91508190509392505050565b60006134e3826133f7565b9150819050919050565b6000602082019050613502600083018461317c565b92915050565b600060808201905061351d600083018761317c565b61352a602083018661317c565b6135376040830185613483565b8181036060830152613549818461319a565b905095945050505050565b6000602082019050613569600083018461318b565b92915050565b6000602082019050818103600083015261358981846131d3565b905092915050565b600060208201905081810360008301526135aa816132bc565b9050919050565b600060208201905081810360008301526135ca816132df565b9050919050565b600060208201905081810360008301526135ea81613302565b9050919050565b6000602082019050818103600083015261360a81613325565b9050919050565b6000602082019050818103600083015261362a8161336b565b9050919050565b6000602082019050818103600083015261364a8161338e565b9050919050565b6000602082019050818103600083015261366a816133b1565b9050919050565b6000602082019050818103600083015261368a816133d4565b9050919050565b600060208201905081810360008301526136aa8161341a565b9050919050565b600060208201905081810360008301526136ca8161343d565b9050919050565b600060208201905081810360008301526136ea81613460565b9050919050565b60006020820190506137066000830184613483565b92915050565b6000613716613727565b905061372282826139f3565b919050565b6000604051905090565b600067ffffffffffffffff82111561374c5761374b613b2b565b5b61375582613b5a565b9050602081019050919050565b600067ffffffffffffffff82111561377d5761377c613b2b565b5b61378682613b5a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061380182613975565b915061380c83613975565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384157613840613a9e565b5b828201905092915050565b600061385782613975565b915061386283613975565b92508261387257613871613acd565b5b828204905092915050565b600061388882613975565b915061389383613975565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138cc576138cb613a9e565b5b828202905092915050565b60006138e282613975565b91506138ed83613975565b925082821015613900576138ff613a9e565b5b828203905092915050565b600061391682613955565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139ac578082015181840152602081019050613991565b838111156139bb576000848401525b50505050565b600060028204905060018216806139d957607f821691505b602082108114156139ed576139ec613afc565b5b50919050565b6139fc82613b5a565b810181811067ffffffffffffffff82111715613a1b57613a1a613b2b565b5b80604052505050565b6000613a2f82613975565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a6257613a61613a9e565b5b600182019050919050565b6000613a7882613975565b9150613a8383613975565b925082613a9357613a92613acd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4d696e74696e67206973206e6f74206c69766520796574000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f7265207468616e20746865206e756d626572206f662077616c6c6574732060008201527f7065720000000000000000000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f206d6f72652047686f737449450000000000000000000000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f496e73756666696369656e742066726565206372656469747300000000000000600082015250565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b613dd58161390b565b8114613de057600080fd5b50565b613dec8161391d565b8114613df757600080fd5b50565b613e0381613929565b8114613e0e57600080fd5b50565b613e1a81613975565b8114613e2557600080fd5b5056fea26469706673582212203cdb0efb41fda03a72c4d2f47664ba0d4d76a821562edb87a0a232dd8553df6b64736f6c63430008040033

Deployed Bytecode Sourcemap

41007:3386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24768:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27881:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29384:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28947:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24017:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30249:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43631:78;;;;;;;;;;;;;:::i;:::-;;43993:206;;;;;;;;;;;;;:::i;:::-;;30490:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43167:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41461:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43071:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41398:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27689:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25137:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5253:103;;;;;;;;;;;;;:::i;:::-;;43717:84;;;;;;;;;;;;;:::i;:::-;;44207:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4602:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43419:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43310:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28050:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41196:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41643:694;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29660:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41314:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41116:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43519:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41225:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30746:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43809:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42345:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42598:465;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41429:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41359:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41269:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30018:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5511:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24768:305;24870:4;24922:25;24907:40;;;:11;:40;;;;:105;;;;24979:33;24964:48;;;:11;:48;;;;24907:105;:158;;;;25029:36;25053:11;25029:23;:36::i;:::-;24907:158;24887:178;;24768:305;;;:::o;27881:100::-;27935:13;27968:5;27961:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27881:100;:::o;29384:204::-;29452:7;29477:16;29485:7;29477;:16::i;:::-;29472:64;;29502:34;;;;;;;;;;;;;;29472:64;29556:15;:24;29572:7;29556:24;;;;;;;;;;;;;;;;;;;;;29549:31;;29384:204;;;:::o;28947:371::-;29020:13;29036:24;29052:7;29036:15;:24::i;:::-;29020:40;;29081:5;29075:11;;:2;:11;;;29071:48;;;29095:24;;;;;;;;;;;;;;29071:48;29152:5;29136:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29162:37;29179:5;29186:12;:10;:12::i;:::-;29162:16;:37::i;:::-;29161:38;29136:63;29132:138;;;29223:35;;;;;;;;;;;;;;29132:138;29282:28;29291:2;29295:7;29304:5;29282:8;:28::i;:::-;28947:371;;;:::o;24017:303::-;24061:7;24286:15;:13;:15::i;:::-;24271:12;;24255:13;;:28;:46;24248:53;;24017:303;:::o;30249:170::-;30383:28;30393:4;30399:2;30403:7;30383:9;:28::i;:::-;30249:170;;;:::o;43631:78::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43693:8:::1;;;;;;;;;;;43692:9;43681:8;;:20;;;;;;;;;;;;;;;;;;43631:78::o:0;43993:206::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44044:12:::1;44070:10;44062:24;;44108:21;44062:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44043:101;;;44163:7;44155:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4893:1;43993:206::o:0;30490:185::-;30628:39;30645:4;30651:2;30655:7;30628:39;;;;;;;;;;;;:16;:39::i;:::-;30490:185;;;:::o;43167:135::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43276:18:::1;43256:17;:38;;;;;;;;;;;;:::i;:::-;;43167:135:::0;:::o;41461:20::-;;;;;;;;;;;;;:::o;43071:88::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43148:3:::1;43138:7;:13;;;;;;;;;;;;:::i;:::-;;43071:88:::0;:::o;41398:22::-;;;;:::o;27689:125::-;27753:7;27780:21;27793:7;27780:12;:21::i;:::-;:26;;;27773:33;;27689:125;;;:::o;25137:206::-;25201:7;25242:1;25225:19;;:5;:19;;;25221:60;;;25253:28;;;;;;;;;;;;;;25221:60;25307:12;:19;25320:5;25307:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25299:36;;25292:43;;25137:206;;;:::o;5253:103::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5318:30:::1;5345:1;5318:18;:30::i;:::-;5253:103::o:0;43717:84::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43782:11:::1;;;;;;;;;;;43781:12;43767:11;;:26;;;;;;;;;;;;;;;;;;43717:84::o:0;44207:183::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44316:9:::1;;44304:8;44288:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;44280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44359:23;44369:2;44373:8;44359:9;:23::i;:::-;44207:183:::0;;:::o;4602:87::-;4648:7;4675:6;;;;;;;;;;;4668:13;;4602:87;:::o;43419:92::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43494:9:::1;43486:5;:17;;;;43419:92:::0;:::o;43310:101::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43397:6:::1;43379:15;:24;;;;43310:101:::0;:::o;28050:104::-;28106:13;28139:7;28132:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28050:104;:::o;41196:20::-;;;;:::o;41643:694::-;41708:11;;;;;;;;;;;41700:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;41787:5;;41779;:13;;;;:::i;:::-;41766:9;:26;;41758:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41870:9;;41861:5;41845:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;41837:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41947:15;;41938:5;41918:17;;:25;;;;:::i;:::-;:44;;41910:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;42020:16;;42011:5;:25;;42003:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42120:16;;42111:5;42079:17;:29;42097:10;42079:29;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:57;;42071:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;42189:28;42199:10;42211:5;42189:9;:28::i;:::-;42261:5;42228:17;:29;42246:10;42228:29;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;42298:5;42277:17;;:26;;;;;;;:::i;:::-;;;;;;;;42324:5;42314:6;;:15;;;;;;;:::i;:::-;;;;;;;;41643:694;:::o;29660:287::-;29771:12;:10;:12::i;:::-;29759:24;;:8;:24;;;29755:54;;;29792:17;;;;;;;;;;;;;;29755:54;29867:8;29822:18;:32;29841:12;:10;:12::i;:::-;29822:32;;;;;;;;;;;;;;;:42;29855:8;29822:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29920:8;29891:48;;29906:12;:10;:12::i;:::-;29891:48;;;29930:8;29891:48;;;;;;:::i;:::-;;;;;;;;29660:287;;:::o;41314:36::-;;;;:::o;41116:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43519:104::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43611:4:::1;43592:16;:23;;;;43519:104:::0;:::o;41225:35::-;;;;:::o;30746:369::-;30913:28;30923:4;30929:2;30933:7;30913:9;:28::i;:::-;30956:15;:2;:13;;;:15::i;:::-;:76;;;;;30976:56;31007:4;31013:2;31017:7;31026:5;30976:30;:56::i;:::-;30975:57;30956:76;30952:156;;;31056:40;;;;;;;;;;;;;;30952:156;30746:369;;;;:::o;43809:75::-;43850:4;43870:6;;43863:13;;43809:75;:::o;42345:129::-;42399:4;42450:16;;42423:17;:24;42441:5;42423:24;;;;;;;;;;;;;;;;:43;42415:51;;42345:129;;;:::o;42598:465::-;42716:13;42769:16;42777:7;42769;:16::i;:::-;42747:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;42889:5;42877:17;;:8;;;;;;;;;;;:17;;;42873:97;;;42939:17;42922:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;42908:50;;;;42873:97;43017:7;43026:18;:7;:16;:18::i;:::-;43000:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42986:69;;42598:465;;;;:::o;41429:23::-;;;;;;;;;;;;;:::o;41359:30::-;;;;:::o;41269:36::-;;;;:::o;30018:164::-;30115:4;30139:18;:25;30158:5;30139:25;;;;;;;;;;;;;;;:35;30165:8;30139:35;;;;;;;;;;;;;;;;;;;;;;;;;30132:42;;30018:164;;;;:::o;5511:201::-;4833:12;:10;:12::i;:::-;4822:23;;:7;:5;:7::i;:::-;:23;;;4814:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5620:1:::1;5600:22;;:8;:22;;;;5592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5676:28;5695:8;5676:18;:28::i;:::-;5511:201:::0;:::o;16246:157::-;16331:4;16370:25;16355:40;;;:11;:40;;;;16348:47;;16246:157;;;:::o;31370:174::-;31427:4;31470:7;31451:15;:13;:15::i;:::-;:26;;:53;;;;;31491:13;;31481:7;:23;31451:53;:85;;;;;31509:11;:20;31521:7;31509:20;;;;;;;;;;;:27;;;;;;;;;;;;31508:28;31451:85;31444:92;;31370:174;;;:::o;3947:98::-;4000:7;4027:10;4020:17;;3947:98;:::o;39281:196::-;39423:2;39396:15;:24;39412:7;39396:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39461:7;39457:2;39441:28;;39450:5;39441:28;;;;;;;;;;;;39281:196;;;:::o;43892:93::-;43949:7;43976:1;43969:8;;43892:93;:::o;34224:2130::-;34339:35;34377:21;34390:7;34377:12;:21::i;:::-;34339:59;;34437:4;34415:26;;:13;:18;;;:26;;;34411:67;;34450:28;;;;;;;;;;;;;;34411:67;34491:22;34533:4;34517:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34554:36;34571:4;34577:12;:10;:12::i;:::-;34554:16;:36::i;:::-;34517:73;:126;;;;34631:12;:10;:12::i;:::-;34607:36;;:20;34619:7;34607:11;:20::i;:::-;:36;;;34517:126;34491:153;;34662:17;34657:66;;34688:35;;;;;;;;;;;;;;34657:66;34752:1;34738:16;;:2;:16;;;34734:52;;;34763:23;;;;;;;;;;;;;;34734:52;34799:43;34821:4;34827:2;34831:7;34840:1;34799:21;:43::i;:::-;34907:35;34924:1;34928:7;34937:4;34907:8;:35::i;:::-;35268:1;35238:12;:18;35251:4;35238:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35312:1;35284:12;:16;35297:2;35284:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35330:31;35364:11;:20;35376:7;35364:20;;;;;;;;;;;35330:54;;35415:2;35399:8;:13;;;:18;;;;;;;;;;;;;;;;;;35465:15;35432:8;:23;;;:49;;;;;;;;;;;;;;;;;;35733:19;35765:1;35755:7;:11;35733:33;;35781:31;35815:11;:24;35827:11;35815:24;;;;;;;;;;;35781:58;;35883:1;35858:27;;:8;:13;;;;;;;;;;;;:27;;;35854:384;;;36068:13;;36053:11;:28;36049:174;;36122:4;36106:8;:13;;;:20;;;;;;;;;;;;;;;;;;36175:13;:28;;;36149:8;:23;;;:54;;;;;;;;;;;;;;;;;;36049:174;35854:384;34224:2130;;;36285:7;36281:2;36266:27;;36275:4;36266:27;;;;;;;;;;;;36304:42;36325:4;36331:2;36335:7;36344:1;36304:20;:42::i;:::-;34224:2130;;;;;:::o;26518:1109::-;26580:21;;:::i;:::-;26614:12;26629:7;26614:22;;26697:4;26678:15;:13;:15::i;:::-;:23;;:47;;;;;26712:13;;26705:4;:20;26678:47;26674:886;;;26746:31;26780:11;:17;26792:4;26780:17;;;;;;;;;;;26746:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26821:9;:16;;;26816:729;;26892:1;26866:28;;:9;:14;;;:28;;;26862:101;;26930:9;26923:16;;;;;;26862:101;27265:261;27272:4;27265:261;;;27305:6;;;;;;;;27350:11;:17;27362:4;27350:17;;;;;;;;;;;27338:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27424:1;27398:28;;:9;:14;;;:28;;;27394:109;;27466:9;27459:16;;;;;;27394:109;27265:261;;;26816:729;26674:886;;27588:31;;;;;;;;;;;;;;26518:1109;;;;:::o;5872:191::-;5946:16;5965:6;;;;;;;;;;;5946:25;;5991:8;5982:6;;:17;;;;;;;;;;;;;;;;;;6046:8;6015:40;;6036:8;6015:40;;;;;;;;;;;;5872:191;;:::o;31552:104::-;31621:27;31631:2;31635:8;31621:27;;;;;;;;;;;;:9;:27::i;:::-;31552:104;;:::o;7176:326::-;7236:4;7493:1;7471:7;:19;;;:23;7464:30;;7176:326;;;:::o;39969:667::-;40132:4;40169:2;40153:36;;;40190:12;:10;:12::i;:::-;40204:4;40210:7;40219:5;40153:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40149:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40404:1;40387:6;:13;:18;40383:235;;;40433:40;;;;;;;;;;;;;;40383:235;40576:6;40570:13;40561:6;40557:2;40553:15;40546:38;40149:480;40282:45;;;40272:55;;;:6;:55;;;;40265:62;;;39969:667;;;;;;:::o;1621:723::-;1677:13;1907:1;1898:5;:10;1894:53;;;1925:10;;;;;;;;;;;;;;;;;;;;;1894:53;1957:12;1972:5;1957:20;;1988:14;2013:78;2028:1;2020:4;:9;2013:78;;2046:8;;;;;:::i;:::-;;;;2077:2;2069:10;;;;;:::i;:::-;;;2013:78;;;2101:19;2133:6;2123:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2101:39;;2151:154;2167:1;2158:5;:10;2151:154;;2195:1;2185:11;;;;;:::i;:::-;;;2262:2;2254:5;:10;;;;:::i;:::-;2241:2;:24;;;;:::i;:::-;2228:39;;2211:6;2218;2211:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2291:2;2282:11;;;;;:::i;:::-;;;2151:154;;;2329:6;2315:21;;;;;1621:723;;;;:::o;40644:159::-;;;;;:::o;40811:158::-;;;;;:::o;32019:163::-;32142:32;32148:2;32152:8;32162:5;32169:4;32142:5;:32::i;:::-;32019:163;;;:::o;32441:1775::-;32580:20;32603:13;;32580:36;;32645:1;32631:16;;:2;:16;;;32627:48;;;32656:19;;;;;;;;;;;;;;32627:48;32702:1;32690:8;:13;32686:44;;;32712:18;;;;;;;;;;;;;;32686:44;32743:61;32773:1;32777:2;32781:12;32795:8;32743:21;:61::i;:::-;33116:8;33081:12;:16;33094:2;33081:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33180:8;33140:12;:16;33153:2;33140:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33239:2;33206:11;:25;33218:12;33206:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33306:15;33256:11;:25;33268:12;33256:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33339:20;33362:12;33339:35;;33389:11;33418:8;33403:12;:23;33389:37;;33447:4;:23;;;;;33455:15;:2;:13;;;:15::i;:::-;33447:23;33443:641;;;33491:314;33547:12;33543:2;33522:38;;33539:1;33522:38;;;;;;;;;;;;33588:69;33627:1;33631:2;33635:14;;;;;;33651:5;33588:30;:69::i;:::-;33583:174;;33693:40;;;;;;;;;;;;;;33583:174;33800:3;33784:12;:19;;33491:314;;33886:12;33869:13;;:29;33865:43;;33900:8;;;33865:43;33443:641;;;33949:120;34005:14;;;;;;34001:2;33980:40;;33997:1;33980:40;;;;;;;;;;;;34064:3;34048:12;:19;;33949:120;;33443:641;34114:12;34098:13;:28;;;;32441:1775;;34148:60;34177:1;34181:2;34185:12;34199:8;34148:20;:60::i;:::-;32441:1775;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;6411:3;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;6779:3;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;7167:3;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7468:845::-;7571:3;7608:5;7602:12;7637:36;7663:9;7637:36;:::i;:::-;7689:89;7771:6;7766:3;7689:89;:::i;:::-;7682:96;;7809:1;7798:9;7794:17;7825:1;7820:137;;;;7971:1;7966:341;;;;7787:520;;7820:137;7904:4;7900:9;7889;7885:25;7880:3;7873:38;7940:6;7935:3;7931:16;7924:23;;7820:137;;7966:341;8033:38;8065:5;8033:38;:::i;:::-;8093:1;8107:154;8121:6;8118:1;8115:13;8107:154;;;8195:7;8189:14;8185:1;8180:3;8176:11;8169:35;8245:1;8236:7;8232:15;8221:26;;8143:4;8140:1;8136:12;8131:17;;8107:154;;;8290:6;8285:3;8281:16;8274:23;;7973:334;;7787:520;;7575:738;;;;;;:::o;8319:366::-;8461:3;8482:67;8546:2;8541:3;8482:67;:::i;:::-;8475:74;;8558:93;8647:3;8558:93;:::i;:::-;8676:2;8671:3;8667:12;8660:19;;8465:220;;;:::o;8691:366::-;8833:3;8854:67;8918:2;8913:3;8854:67;:::i;:::-;8847:74;;8930:93;9019:3;8930:93;:::i;:::-;9048:2;9043:3;9039:12;9032:19;;8837:220;;;:::o;9063:366::-;9205:3;9226:67;9290:2;9285:3;9226:67;:::i;:::-;9219:74;;9302:93;9391:3;9302:93;:::i;:::-;9420:2;9415:3;9411:12;9404:19;;9209:220;;;:::o;9435:366::-;9577:3;9598:67;9662:2;9657:3;9598:67;:::i;:::-;9591:74;;9674:93;9763:3;9674:93;:::i;:::-;9792:2;9787:3;9783:12;9776:19;;9581:220;;;:::o;9807:400::-;9967:3;9988:84;10070:1;10065:3;9988:84;:::i;:::-;9981:91;;10081:93;10170:3;10081:93;:::i;:::-;10199:1;10194:3;10190:11;10183:18;;9971:236;;;:::o;10213:366::-;10355:3;10376:67;10440:2;10435:3;10376:67;:::i;:::-;10369:74;;10452:93;10541:3;10452:93;:::i;:::-;10570:2;10565:3;10561:12;10554:19;;10359:220;;;:::o;10585:366::-;10727:3;10748:67;10812:2;10807:3;10748:67;:::i;:::-;10741:74;;10824:93;10913:3;10824:93;:::i;:::-;10942:2;10937:3;10933:12;10926:19;;10731:220;;;:::o;10957:366::-;11099:3;11120:67;11184:2;11179:3;11120:67;:::i;:::-;11113:74;;11196:93;11285:3;11196:93;:::i;:::-;11314:2;11309:3;11305:12;11298:19;;11103:220;;;:::o;11329:366::-;11471:3;11492:67;11556:2;11551:3;11492:67;:::i;:::-;11485:74;;11568:93;11657:3;11568:93;:::i;:::-;11686:2;11681:3;11677:12;11670:19;;11475:220;;;:::o;11701:398::-;11860:3;11881:83;11962:1;11957:3;11881:83;:::i;:::-;11874:90;;11973:93;12062:3;11973:93;:::i;:::-;12091:1;12086:3;12082:11;12075:18;;11864:235;;;:::o;12105:366::-;12247:3;12268:67;12332:2;12327:3;12268:67;:::i;:::-;12261:74;;12344:93;12433:3;12344:93;:::i;:::-;12462:2;12457:3;12453:12;12446:19;;12251:220;;;:::o;12477:366::-;12619:3;12640:67;12704:2;12699:3;12640:67;:::i;:::-;12633:74;;12716:93;12805:3;12716:93;:::i;:::-;12834:2;12829:3;12825:12;12818:19;;12623:220;;;:::o;12849:366::-;12991:3;13012:67;13076:2;13071:3;13012:67;:::i;:::-;13005:74;;13088:93;13177:3;13088:93;:::i;:::-;13206:2;13201:3;13197:12;13190:19;;12995:220;;;:::o;13221:118::-;13308:24;13326:5;13308:24;:::i;:::-;13303:3;13296:37;13286:53;;:::o;13345:269::-;13474:3;13496:92;13584:3;13575:6;13496:92;:::i;:::-;13489:99;;13605:3;13598:10;;13478:136;;;;:::o;13620:695::-;13898:3;13920:92;14008:3;13999:6;13920:92;:::i;:::-;13913:99;;14029:95;14120:3;14111:6;14029:95;:::i;:::-;14022:102;;14141:148;14285:3;14141:148;:::i;:::-;14134:155;;14306:3;14299:10;;13902:413;;;;;:::o;14321:379::-;14505:3;14527:147;14670:3;14527:147;:::i;:::-;14520:154;;14691:3;14684:10;;14509:191;;;:::o;14706:222::-;14799:4;14837:2;14826:9;14822:18;14814:26;;14850:71;14918:1;14907:9;14903:17;14894:6;14850:71;:::i;:::-;14804:124;;;;:::o;14934:640::-;15129:4;15167:3;15156:9;15152:19;15144:27;;15181:71;15249:1;15238:9;15234:17;15225:6;15181:71;:::i;:::-;15262:72;15330:2;15319:9;15315:18;15306:6;15262:72;:::i;:::-;15344;15412:2;15401:9;15397:18;15388:6;15344:72;:::i;:::-;15463:9;15457:4;15453:20;15448:2;15437:9;15433:18;15426:48;15491:76;15562:4;15553:6;15491:76;:::i;:::-;15483:84;;15134:440;;;;;;;:::o;15580:210::-;15667:4;15705:2;15694:9;15690:18;15682:26;;15718:65;15780:1;15769:9;15765:17;15756:6;15718:65;:::i;:::-;15672:118;;;;:::o;15796:313::-;15909:4;15947:2;15936:9;15932:18;15924:26;;15996:9;15990:4;15986:20;15982:1;15971:9;15967:17;15960:47;16024:78;16097:4;16088:6;16024:78;:::i;:::-;16016:86;;15914:195;;;;:::o;16115:419::-;16281:4;16319:2;16308:9;16304:18;16296:26;;16368:9;16362:4;16358:20;16354:1;16343:9;16339:17;16332:47;16396:131;16522:4;16396:131;:::i;:::-;16388:139;;16286:248;;;:::o;16540:419::-;16706:4;16744:2;16733:9;16729:18;16721:26;;16793:9;16787:4;16783:20;16779:1;16768:9;16764:17;16757:47;16821:131;16947:4;16821:131;:::i;:::-;16813:139;;16711:248;;;:::o;16965:419::-;17131:4;17169:2;17158:9;17154:18;17146:26;;17218:9;17212:4;17208:20;17204:1;17193:9;17189:17;17182:47;17246:131;17372:4;17246:131;:::i;:::-;17238:139;;17136:248;;;:::o;17390:419::-;17556:4;17594:2;17583:9;17579:18;17571:26;;17643:9;17637:4;17633:20;17629:1;17618:9;17614:17;17607:47;17671:131;17797:4;17671:131;:::i;:::-;17663:139;;17561:248;;;:::o;17815:419::-;17981:4;18019:2;18008:9;18004:18;17996:26;;18068:9;18062:4;18058:20;18054:1;18043:9;18039:17;18032:47;18096:131;18222:4;18096:131;:::i;:::-;18088:139;;17986:248;;;:::o;18240:419::-;18406:4;18444:2;18433:9;18429:18;18421:26;;18493:9;18487:4;18483:20;18479:1;18468:9;18464:17;18457:47;18521:131;18647:4;18521:131;:::i;:::-;18513:139;;18411:248;;;:::o;18665:419::-;18831:4;18869:2;18858:9;18854:18;18846:26;;18918:9;18912:4;18908:20;18904:1;18893:9;18889:17;18882:47;18946:131;19072:4;18946:131;:::i;:::-;18938:139;;18836:248;;;:::o;19090:419::-;19256:4;19294:2;19283:9;19279:18;19271:26;;19343:9;19337:4;19333:20;19329:1;19318:9;19314:17;19307:47;19371:131;19497:4;19371:131;:::i;:::-;19363:139;;19261:248;;;:::o;19515:419::-;19681:4;19719:2;19708:9;19704:18;19696:26;;19768:9;19762:4;19758:20;19754:1;19743:9;19739:17;19732:47;19796:131;19922:4;19796:131;:::i;:::-;19788:139;;19686:248;;;:::o;19940:419::-;20106:4;20144:2;20133:9;20129:18;20121:26;;20193:9;20187:4;20183:20;20179:1;20168:9;20164:17;20157:47;20221:131;20347:4;20221:131;:::i;:::-;20213:139;;20111:248;;;:::o;20365:419::-;20531:4;20569:2;20558:9;20554:18;20546:26;;20618:9;20612:4;20608:20;20604:1;20593:9;20589:17;20582:47;20646:131;20772:4;20646:131;:::i;:::-;20638:139;;20536:248;;;:::o;20790:222::-;20883:4;20921:2;20910:9;20906:18;20898:26;;20934:71;21002:1;20991:9;20987:17;20978:6;20934:71;:::i;:::-;20888:124;;;;:::o;21018:129::-;21052:6;21079:20;;:::i;:::-;21069:30;;21108:33;21136:4;21128:6;21108:33;:::i;:::-;21059:88;;;:::o;21153:75::-;21186:6;21219:2;21213:9;21203:19;;21193:35;:::o;21234:307::-;21295:4;21385:18;21377:6;21374:30;21371:2;;;21407:18;;:::i;:::-;21371:2;21445:29;21467:6;21445:29;:::i;:::-;21437:37;;21529:4;21523;21519:15;21511:23;;21300:241;;;:::o;21547:308::-;21609:4;21699:18;21691:6;21688:30;21685:2;;;21721:18;;:::i;:::-;21685:2;21759:29;21781:6;21759:29;:::i;:::-;21751:37;;21843:4;21837;21833:15;21825:23;;21614:241;;;:::o;21861:141::-;21910:4;21933:3;21925:11;;21956:3;21953:1;21946:14;21990:4;21987:1;21977:18;21969:26;;21915:87;;;:::o;22008:98::-;22059:6;22093:5;22087:12;22077:22;;22066:40;;;:::o;22112:99::-;22164:6;22198:5;22192:12;22182:22;;22171:40;;;:::o;22217:168::-;22300:11;22334:6;22329:3;22322:19;22374:4;22369:3;22365:14;22350:29;;22312:73;;;;:::o;22391:147::-;22492:11;22529:3;22514:18;;22504:34;;;;:::o;22544:169::-;22628:11;22662:6;22657:3;22650:19;22702:4;22697:3;22693:14;22678:29;;22640:73;;;;:::o;22719:148::-;22821:11;22858:3;22843:18;;22833:34;;;;:::o;22873:305::-;22913:3;22932:20;22950:1;22932:20;:::i;:::-;22927:25;;22966:20;22984:1;22966:20;:::i;:::-;22961:25;;23120:1;23052:66;23048:74;23045:1;23042:81;23039:2;;;23126:18;;:::i;:::-;23039:2;23170:1;23167;23163:9;23156:16;;22917:261;;;;:::o;23184:185::-;23224:1;23241:20;23259:1;23241:20;:::i;:::-;23236:25;;23275:20;23293:1;23275:20;:::i;:::-;23270:25;;23314:1;23304:2;;23319:18;;:::i;:::-;23304:2;23361:1;23358;23354:9;23349:14;;23226:143;;;;:::o;23375:348::-;23415:7;23438:20;23456:1;23438:20;:::i;:::-;23433:25;;23472:20;23490:1;23472:20;:::i;:::-;23467:25;;23660:1;23592:66;23588:74;23585:1;23582:81;23577:1;23570:9;23563:17;23559:105;23556:2;;;23667:18;;:::i;:::-;23556:2;23715:1;23712;23708:9;23697:20;;23423:300;;;;:::o;23729:191::-;23769:4;23789:20;23807:1;23789:20;:::i;:::-;23784:25;;23823:20;23841:1;23823:20;:::i;:::-;23818:25;;23862:1;23859;23856:8;23853:2;;;23867:18;;:::i;:::-;23853:2;23912:1;23909;23905:9;23897:17;;23774:146;;;;:::o;23926:96::-;23963:7;23992:24;24010:5;23992:24;:::i;:::-;23981:35;;23971:51;;;:::o;24028:90::-;24062:7;24105:5;24098:13;24091:21;24080:32;;24070:48;;;:::o;24124:149::-;24160:7;24200:66;24193:5;24189:78;24178:89;;24168:105;;;:::o;24279:126::-;24316:7;24356:42;24349:5;24345:54;24334:65;;24324:81;;;:::o;24411:77::-;24448:7;24477:5;24466:16;;24456:32;;;:::o;24494:154::-;24578:6;24573:3;24568;24555:30;24640:1;24631:6;24626:3;24622:16;24615:27;24545:103;;;:::o;24654:307::-;24722:1;24732:113;24746:6;24743:1;24740:13;24732:113;;;24831:1;24826:3;24822:11;24816:18;24812:1;24807:3;24803:11;24796:39;24768:2;24765:1;24761:10;24756:15;;24732:113;;;24863:6;24860:1;24857:13;24854:2;;;24943:1;24934:6;24929:3;24925:16;24918:27;24854:2;24703:258;;;;:::o;24967:320::-;25011:6;25048:1;25042:4;25038:12;25028:22;;25095:1;25089:4;25085:12;25116:18;25106:2;;25172:4;25164:6;25160:17;25150:27;;25106:2;25234;25226:6;25223:14;25203:18;25200:38;25197:2;;;25253:18;;:::i;:::-;25197:2;25018:269;;;;:::o;25293:281::-;25376:27;25398:4;25376:27;:::i;:::-;25368:6;25364:40;25506:6;25494:10;25491:22;25470:18;25458:10;25455:34;25452:62;25449:2;;;25517:18;;:::i;:::-;25449:2;25557:10;25553:2;25546:22;25336:238;;;:::o;25580:233::-;25619:3;25642:24;25660:5;25642:24;:::i;:::-;25633:33;;25688:66;25681:5;25678:77;25675:2;;;25758:18;;:::i;:::-;25675:2;25805:1;25798:5;25794:13;25787:20;;25623:190;;;:::o;25819:176::-;25851:1;25868:20;25886:1;25868:20;:::i;:::-;25863:25;;25902:20;25920:1;25902:20;:::i;:::-;25897:25;;25941:1;25931:2;;25946:18;;:::i;:::-;25931:2;25987:1;25984;25980:9;25975:14;;25853:142;;;;:::o;26001:180::-;26049:77;26046:1;26039:88;26146:4;26143:1;26136:15;26170:4;26167:1;26160:15;26187:180;26235:77;26232:1;26225:88;26332:4;26329:1;26322:15;26356:4;26353:1;26346:15;26373:180;26421:77;26418:1;26411:88;26518:4;26515:1;26508:15;26542:4;26539:1;26532:15;26559:180;26607:77;26604:1;26597:88;26704:4;26701:1;26694:15;26728:4;26725:1;26718:15;26745:102;26786:6;26837:2;26833:7;26828:2;26821:5;26817:14;26813:28;26803:38;;26793:54;;;:::o;26853:173::-;26993:25;26989:1;26981:6;26977:14;26970:49;26959:67;:::o;27032:225::-;27172:34;27168:1;27160:6;27156:14;27149:58;27241:8;27236:2;27228:6;27224:15;27217:33;27138:119;:::o;27263:222::-;27403:34;27399:1;27391:6;27387:14;27380:58;27472:5;27467:2;27459:6;27455:15;27448:30;27369:116;:::o;27491:168::-;27631:20;27627:1;27619:6;27615:14;27608:44;27597:62;:::o;27665:155::-;27805:7;27801:1;27793:6;27789:14;27782:31;27771:49;:::o;27826:182::-;27966:34;27962:1;27954:6;27950:14;27943:58;27932:76;:::o;28014:234::-;28154:34;28150:1;28142:6;28138:14;28131:58;28223:17;28218:2;28210:6;28206:15;28199:42;28120:128;:::o;28254:165::-;28394:17;28390:1;28382:6;28378:14;28371:41;28360:59;:::o;28425:179::-;28565:31;28561:1;28553:6;28549:14;28542:55;28531:73;:::o;28610:114::-;28716:8;:::o;28730:175::-;28870:27;28866:1;28858:6;28854:14;28847:51;28836:69;:::o;28911:166::-;29051:18;29047:1;29039:6;29035:14;29028:42;29017:60;:::o;29083:169::-;29223:21;29219:1;29211:6;29207:14;29200:45;29189:63;:::o;29258:122::-;29331:24;29349:5;29331:24;:::i;:::-;29324:5;29321:35;29311:2;;29370:1;29367;29360:12;29311:2;29301:79;:::o;29386:116::-;29456:21;29471:5;29456:21;:::i;:::-;29449:5;29446:32;29436:2;;29492:1;29489;29482:12;29436:2;29426:76;:::o;29508:120::-;29580:23;29597:5;29580:23;:::i;:::-;29573:5;29570:34;29560:2;;29618:1;29615;29608:12;29560:2;29550:78;:::o;29634:122::-;29707:24;29725:5;29707:24;:::i;:::-;29700:5;29697:35;29687:2;;29746:1;29743;29736:12;29687:2;29677:79;:::o

Swarm Source

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