ETH Price: $3,107.74 (+1.50%)
Gas: 4 Gwei

Token

HelloFirstMiner (HFM)
 

Overview

Max Total Supply

1,000 HFM

Holders

863

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 HFM
0x87980b7babff91f5c5c4e7b50756c5ffa0710443
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:
HelloFirstMiner

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 6 of 13: HiMiner.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";

contract HelloFirstMiner is ERC721, ERC721Enumerable, Ownable {

    event Claimed(uint indexed ID, address indexed owner);

    uint public constant MAX_SUPPLY = 1000;
    uint public ID = 0;
    address receiver = 0x05a56E2D52c817161883f50c441c3228CFe54d9f;
    constructor() ERC721("HelloFirstMiner", "HFM") {}

    function claim(string memory _message) external {
        require(ID < MAX_SUPPLY, "Max supply exceeded.");

        receiver.call(abi.encode(_message));
        _mint(msg.sender, ID);

        emit Claimed(ID, msg.sender);

        ID += 1;
    }

    function _baseURI() internal pure override returns (string memory) {
        return "https://hermitcrabs.mypinata.cloud/ipfs/QmUh238QNqAhNN9uHWzLqYz94BqTToSJViAExzCYdhT4Hr/jsons/";
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 13: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 13: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

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

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

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

    /**
     * @dev 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

File 9 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 10 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_message","type":"string"}],"name":"claim","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"}]

60806040526000600b557305a56e2d52c817161883f50c441c3228cfe54d9f600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006b57600080fd5b506040518060400160405280600f81526020017f48656c6c6f46697273744d696e657200000000000000000000000000000000008152506040518060400160405280600381526020017f48464d00000000000000000000000000000000000000000000000000000000008152508160009081620000e991906200046c565b508060019081620000fb91906200046c565b5050506200011e620001126200012460201b60201c565b6200012c60201b60201c565b62000553565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200027457607f821691505b6020821081036200028a57620002896200022c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002b5565b620003008683620002b5565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200034d62000347620003418462000318565b62000322565b62000318565b9050919050565b6000819050919050565b62000369836200032c565b62000381620003788262000354565b848454620002c2565b825550505050565b600090565b6200039862000389565b620003a58184846200035e565b505050565b5b81811015620003cd57620003c16000826200038e565b600181019050620003ab565b5050565b601f8211156200041c57620003e68162000290565b620003f184620002a5565b8101602085101562000401578190505b620004196200041085620002a5565b830182620003aa565b50505b505050565b600082821c905092915050565b6000620004416000198460080262000421565b1980831691505092915050565b60006200045c83836200042e565b9150826002028217905092915050565b6200047782620001f2565b67ffffffffffffffff811115620004935762000492620001fd565b5b6200049f82546200025b565b620004ac828285620003d1565b600060209050601f831160018114620004e45760008415620004cf578287015190505b620004db85826200044e565b8655506200054b565b601f198416620004f48662000290565b60005b828110156200051e57848901518255600182019150602085019450602081019050620004f7565b868310156200053e57848901516200053a601f8916826200042e565b8355505b6001600288020188555050505b505050505050565b61333980620005636000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063b3cea2171161007c578063b3cea21714610377578063b88d4fde14610395578063c87b56dd146103b1578063e985e9c5146103e1578063f2fde38b14610411578063f3fe12c91461042d57610142565b806370a08231146102e5578063715018a6146103155780638da5cb5b1461031f57806395d89b411461033d578063a22cb4651461035b57610142565b806323b872dd1161010a57806323b872dd146101ff5780632f745c591461021b57806332cb6b0c1461024b57806342842e0e146102695780634f6ccce7146102855780636352211e146102b557610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c919061206e565b610449565b60405161016e91906120b6565b60405180910390f35b61017f61045b565b60405161018c9190612161565b60405180910390f35b6101af60048036038101906101aa91906121b9565b6104ed565b6040516101bc9190612227565b60405180910390f35b6101df60048036038101906101da919061226e565b610533565b005b6101e961064a565b6040516101f691906122bd565b60405180910390f35b610219600480360381019061021491906122d8565b610657565b005b6102356004803603810190610230919061226e565b6106b7565b60405161024291906122bd565b60405180910390f35b61025361075c565b60405161026091906122bd565b60405180910390f35b610283600480360381019061027e91906122d8565b610762565b005b61029f600480360381019061029a91906121b9565b610782565b6040516102ac91906122bd565b60405180910390f35b6102cf60048036038101906102ca91906121b9565b6107f3565b6040516102dc9190612227565b60405180910390f35b6102ff60048036038101906102fa919061232b565b6108a4565b60405161030c91906122bd565b60405180910390f35b61031d61095b565b005b61032761096f565b6040516103349190612227565b60405180910390f35b610345610999565b6040516103529190612161565b60405180910390f35b61037560048036038101906103709190612384565b610a2b565b005b61037f610a41565b60405161038c91906122bd565b60405180910390f35b6103af60048036038101906103aa91906124f9565b610a47565b005b6103cb60048036038101906103c691906121b9565b610aa9565b6040516103d89190612161565b60405180910390f35b6103fb60048036038101906103f6919061257c565b610b11565b60405161040891906120b6565b60405180910390f35b61042b6004803603810190610426919061232b565b610ba5565b005b6104476004803603810190610442919061265d565b610c28565b005b600061045482610d88565b9050919050565b60606000805461046a906126d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610496906126d5565b80156104e35780601f106104b8576101008083540402835291602001916104e3565b820191906000526020600020905b8154815290600101906020018083116104c657829003601f168201915b5050505050905090565b60006104f882610e02565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061053e826107f3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a590612778565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105cd610e4d565b73ffffffffffffffffffffffffffffffffffffffff1614806105fc57506105fb816105f6610e4d565b610b11565b5b61063b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106329061280a565b60405180910390fd5b6106458383610e55565b505050565b6000600880549050905090565b610668610662610e4d565b82610f0e565b6106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e9061289c565b60405180910390fd5b6106b2838383610fa3565b505050565b60006106c2836108a4565b8210610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061292e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6103e881565b61077d83838360405180602001604052806000815250610a47565b505050565b600061078c61064a565b82106107cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c4906129c0565b60405180910390fd5b600882815481106107e1576107e06129e0565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361089b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089290612a5b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90612aed565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610963611209565b61096d6000611287565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546109a8906126d5565b80601f01602080910402602001604051908101604052809291908181526020018280546109d4906126d5565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b610a3d610a36610e4d565b838361134d565b5050565b600b5481565b610a58610a52610e4d565b83610f0e565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e9061289c565b60405180910390fd5b610aa3848484846114b9565b50505050565b6060610ab482610e02565b6000610abe611515565b90506000815111610ade5760405180602001604052806000815250610b09565b80610ae884611535565b604051602001610af9929190612b49565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610bad611209565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390612bdf565b60405180910390fd5b610c2581611287565b50565b6103e8600b5410610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590612c4b565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051602001610cb89190612161565b604051602081830303815290604052604051610cd49190612cb2565b6000604051808303816000865af19150503d8060008114610d11576040519150601f19603f3d011682016040523d82523d6000602084013e610d16565b606091505b505050610d2533600b54611695565b3373ffffffffffffffffffffffffffffffffffffffff16600b547f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a2121260405160405180910390a36001600b6000828254610d7e9190612cf8565b9250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dfb5750610dfa8261186e565b5b9050919050565b610e0b81611950565b610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4190612a5b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610ec8836107f3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f1a836107f3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610f5c5750610f5b8185610b11565b5b80610f9a57508373ffffffffffffffffffffffffffffffffffffffff16610f82846104ed565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610fc3826107f3565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090612d9e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90612e30565b60405180910390fd5b6110938383836119bc565b61109e600082610e55565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ee9190612e50565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111459190612cf8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112048383836119cc565b505050565b611211610e4d565b73ffffffffffffffffffffffffffffffffffffffff1661122f61096f565b73ffffffffffffffffffffffffffffffffffffffff1614611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c90612ed0565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290612f3c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ac91906120b6565b60405180910390a3505050565b6114c4848484610fa3565b6114d0848484846119d1565b61150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690612fce565b60405180910390fd5b50505050565b60606040518060800160405280605d81526020016132a7605d9139905090565b60606000820361157c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611690565b600082905060005b600082146115ae57808061159790612fee565b915050600a826115a79190613065565b9150611584565b60008167ffffffffffffffff8111156115ca576115c96123ce565b5b6040519080825280601f01601f1916602001820160405280156115fc5781602001600182028036833780820191505090505b5090505b60008514611689576001826116159190612e50565b9150600a856116249190613096565b60306116309190612cf8565b60f81b818381518110611646576116456129e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116829190613065565b9450611600565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90613113565b60405180910390fd5b61170d81611950565b1561174d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117449061317f565b60405180910390fd5b611759600083836119bc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a99190612cf8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461186a600083836119cc565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061193957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611949575061194882611b58565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6119c7838383611bc2565b505050565b505050565b60006119f28473ffffffffffffffffffffffffffffffffffffffff16611cd4565b15611b4b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a1b610e4d565b8786866040518563ffffffff1660e01b8152600401611a3d94939291906131e9565b6020604051808303816000875af1925050508015611a7957506040513d601f19601f82011682018060405250810190611a76919061324a565b60015b611afb573d8060008114611aa9576040519150601f19603f3d011682016040523d82523d6000602084013e611aae565b606091505b506000815103611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90612fce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b50565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bcd838383611cf7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c0f57611c0a81611cfc565b611c4e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611c4d57611c4c8382611d45565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c9057611c8b81611eb2565b611ccf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611cce57611ccd8282611f83565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611d52846108a4565b611d5c9190612e50565b9050600060076000848152602001908152602001600020549050818114611e41576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611ec69190612e50565b9050600060096000848152602001908152602001600020549050600060088381548110611ef657611ef56129e0565b5b906000526020600020015490508060088381548110611f1857611f176129e0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611f6757611f66613277565b5b6001900381819060005260206000200160009055905550505050565b6000611f8e836108a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61204b81612016565b811461205657600080fd5b50565b60008135905061206881612042565b92915050565b6000602082840312156120845761208361200c565b5b600061209284828501612059565b91505092915050565b60008115159050919050565b6120b08161209b565b82525050565b60006020820190506120cb60008301846120a7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561210b5780820151818401526020810190506120f0565b60008484015250505050565b6000601f19601f8301169050919050565b6000612133826120d1565b61213d81856120dc565b935061214d8185602086016120ed565b61215681612117565b840191505092915050565b6000602082019050818103600083015261217b8184612128565b905092915050565b6000819050919050565b61219681612183565b81146121a157600080fd5b50565b6000813590506121b38161218d565b92915050565b6000602082840312156121cf576121ce61200c565b5b60006121dd848285016121a4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612211826121e6565b9050919050565b61222181612206565b82525050565b600060208201905061223c6000830184612218565b92915050565b61224b81612206565b811461225657600080fd5b50565b60008135905061226881612242565b92915050565b600080604083850312156122855761228461200c565b5b600061229385828601612259565b92505060206122a4858286016121a4565b9150509250929050565b6122b781612183565b82525050565b60006020820190506122d260008301846122ae565b92915050565b6000806000606084860312156122f1576122f061200c565b5b60006122ff86828701612259565b935050602061231086828701612259565b9250506040612321868287016121a4565b9150509250925092565b6000602082840312156123415761234061200c565b5b600061234f84828501612259565b91505092915050565b6123618161209b565b811461236c57600080fd5b50565b60008135905061237e81612358565b92915050565b6000806040838503121561239b5761239a61200c565b5b60006123a985828601612259565b92505060206123ba8582860161236f565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61240682612117565b810181811067ffffffffffffffff82111715612425576124246123ce565b5b80604052505050565b6000612438612002565b905061244482826123fd565b919050565b600067ffffffffffffffff821115612464576124636123ce565b5b61246d82612117565b9050602081019050919050565b82818337600083830152505050565b600061249c61249784612449565b61242e565b9050828152602081018484840111156124b8576124b76123c9565b5b6124c384828561247a565b509392505050565b600082601f8301126124e0576124df6123c4565b5b81356124f0848260208601612489565b91505092915050565b600080600080608085870312156125135761251261200c565b5b600061252187828801612259565b945050602061253287828801612259565b9350506040612543878288016121a4565b925050606085013567ffffffffffffffff81111561256457612563612011565b5b612570878288016124cb565b91505092959194509250565b600080604083850312156125935761259261200c565b5b60006125a185828601612259565b92505060206125b285828601612259565b9150509250929050565b600067ffffffffffffffff8211156125d7576125d66123ce565b5b6125e082612117565b9050602081019050919050565b60006126006125fb846125bc565b61242e565b90508281526020810184848401111561261c5761261b6123c9565b5b61262784828561247a565b509392505050565b600082601f830112612644576126436123c4565b5b81356126548482602086016125ed565b91505092915050565b6000602082840312156126735761267261200c565b5b600082013567ffffffffffffffff81111561269157612690612011565b5b61269d8482850161262f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126ed57607f821691505b602082108103612700576126ff6126a6565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006127626021836120dc565b915061276d82612706565b604082019050919050565b6000602082019050818103600083015261279181612755565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006127f4603e836120dc565b91506127ff82612798565b604082019050919050565b60006020820190508181036000830152612823816127e7565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612886602e836120dc565b91506128918261282a565b604082019050919050565b600060208201905081810360008301526128b581612879565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612918602b836120dc565b9150612923826128bc565b604082019050919050565b600060208201905081810360008301526129478161290b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006129aa602c836120dc565b91506129b58261294e565b604082019050919050565b600060208201905081810360008301526129d98161299d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612a456018836120dc565b9150612a5082612a0f565b602082019050919050565b60006020820190508181036000830152612a7481612a38565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612ad76029836120dc565b9150612ae282612a7b565b604082019050919050565b60006020820190508181036000830152612b0681612aca565b9050919050565b600081905092915050565b6000612b23826120d1565b612b2d8185612b0d565b9350612b3d8185602086016120ed565b80840191505092915050565b6000612b558285612b18565b9150612b618284612b18565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612bc96026836120dc565b9150612bd482612b6d565b604082019050919050565b60006020820190508181036000830152612bf881612bbc565b9050919050565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b6000612c356014836120dc565b9150612c4082612bff565b602082019050919050565b60006020820190508181036000830152612c6481612c28565b9050919050565b600081519050919050565b600081905092915050565b6000612c8c82612c6b565b612c968185612c76565b9350612ca68185602086016120ed565b80840191505092915050565b6000612cbe8284612c81565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d0382612183565b9150612d0e83612183565b9250828201905080821115612d2657612d25612cc9565b5b92915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612d886025836120dc565b9150612d9382612d2c565b604082019050919050565b60006020820190508181036000830152612db781612d7b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612e1a6024836120dc565b9150612e2582612dbe565b604082019050919050565b60006020820190508181036000830152612e4981612e0d565b9050919050565b6000612e5b82612183565b9150612e6683612183565b9250828203905081811115612e7e57612e7d612cc9565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612eba6020836120dc565b9150612ec582612e84565b602082019050919050565b60006020820190508181036000830152612ee981612ead565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612f266019836120dc565b9150612f3182612ef0565b602082019050919050565b60006020820190508181036000830152612f5581612f19565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612fb86032836120dc565b9150612fc382612f5c565b604082019050919050565b60006020820190508181036000830152612fe781612fab565b9050919050565b6000612ff982612183565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361302b5761302a612cc9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061307082612183565b915061307b83612183565b92508261308b5761308a613036565b5b828204905092915050565b60006130a182612183565b91506130ac83612183565b9250826130bc576130bb613036565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006130fd6020836120dc565b9150613108826130c7565b602082019050919050565b6000602082019050818103600083015261312c816130f0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613169601c836120dc565b915061317482613133565b602082019050919050565b600060208201905081810360008301526131988161315c565b9050919050565b600082825260208201905092915050565b60006131bb82612c6b565b6131c5818561319f565b93506131d58185602086016120ed565b6131de81612117565b840191505092915050565b60006080820190506131fe6000830187612218565b61320b6020830186612218565b61321860408301856122ae565b818103606083015261322a81846131b0565b905095945050505050565b60008151905061324481612042565b92915050565b6000602082840312156132605761325f61200c565b5b600061326e84828501613235565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f6865726d697463726162732e6d7970696e6174612e636c6f75642f697066732f516d5568323338514e7141684e4e397548577a4c71597a3934427154546f534a56694145787a43596468543448722f6a736f6e732fa2646970667358221220fc328f317ce779066d0b0251ad201a0fb429bd58029d007b4098c3e61f0a728764736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063b3cea2171161007c578063b3cea21714610377578063b88d4fde14610395578063c87b56dd146103b1578063e985e9c5146103e1578063f2fde38b14610411578063f3fe12c91461042d57610142565b806370a08231146102e5578063715018a6146103155780638da5cb5b1461031f57806395d89b411461033d578063a22cb4651461035b57610142565b806323b872dd1161010a57806323b872dd146101ff5780632f745c591461021b57806332cb6b0c1461024b57806342842e0e146102695780634f6ccce7146102855780636352211e146102b557610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c919061206e565b610449565b60405161016e91906120b6565b60405180910390f35b61017f61045b565b60405161018c9190612161565b60405180910390f35b6101af60048036038101906101aa91906121b9565b6104ed565b6040516101bc9190612227565b60405180910390f35b6101df60048036038101906101da919061226e565b610533565b005b6101e961064a565b6040516101f691906122bd565b60405180910390f35b610219600480360381019061021491906122d8565b610657565b005b6102356004803603810190610230919061226e565b6106b7565b60405161024291906122bd565b60405180910390f35b61025361075c565b60405161026091906122bd565b60405180910390f35b610283600480360381019061027e91906122d8565b610762565b005b61029f600480360381019061029a91906121b9565b610782565b6040516102ac91906122bd565b60405180910390f35b6102cf60048036038101906102ca91906121b9565b6107f3565b6040516102dc9190612227565b60405180910390f35b6102ff60048036038101906102fa919061232b565b6108a4565b60405161030c91906122bd565b60405180910390f35b61031d61095b565b005b61032761096f565b6040516103349190612227565b60405180910390f35b610345610999565b6040516103529190612161565b60405180910390f35b61037560048036038101906103709190612384565b610a2b565b005b61037f610a41565b60405161038c91906122bd565b60405180910390f35b6103af60048036038101906103aa91906124f9565b610a47565b005b6103cb60048036038101906103c691906121b9565b610aa9565b6040516103d89190612161565b60405180910390f35b6103fb60048036038101906103f6919061257c565b610b11565b60405161040891906120b6565b60405180910390f35b61042b6004803603810190610426919061232b565b610ba5565b005b6104476004803603810190610442919061265d565b610c28565b005b600061045482610d88565b9050919050565b60606000805461046a906126d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610496906126d5565b80156104e35780601f106104b8576101008083540402835291602001916104e3565b820191906000526020600020905b8154815290600101906020018083116104c657829003601f168201915b5050505050905090565b60006104f882610e02565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061053e826107f3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a590612778565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105cd610e4d565b73ffffffffffffffffffffffffffffffffffffffff1614806105fc57506105fb816105f6610e4d565b610b11565b5b61063b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106329061280a565b60405180910390fd5b6106458383610e55565b505050565b6000600880549050905090565b610668610662610e4d565b82610f0e565b6106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e9061289c565b60405180910390fd5b6106b2838383610fa3565b505050565b60006106c2836108a4565b8210610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061292e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6103e881565b61077d83838360405180602001604052806000815250610a47565b505050565b600061078c61064a565b82106107cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c4906129c0565b60405180910390fd5b600882815481106107e1576107e06129e0565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361089b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089290612a5b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90612aed565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610963611209565b61096d6000611287565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546109a8906126d5565b80601f01602080910402602001604051908101604052809291908181526020018280546109d4906126d5565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b610a3d610a36610e4d565b838361134d565b5050565b600b5481565b610a58610a52610e4d565b83610f0e565b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e9061289c565b60405180910390fd5b610aa3848484846114b9565b50505050565b6060610ab482610e02565b6000610abe611515565b90506000815111610ade5760405180602001604052806000815250610b09565b80610ae884611535565b604051602001610af9929190612b49565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610bad611209565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390612bdf565b60405180910390fd5b610c2581611287565b50565b6103e8600b5410610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590612c4b565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051602001610cb89190612161565b604051602081830303815290604052604051610cd49190612cb2565b6000604051808303816000865af19150503d8060008114610d11576040519150601f19603f3d011682016040523d82523d6000602084013e610d16565b606091505b505050610d2533600b54611695565b3373ffffffffffffffffffffffffffffffffffffffff16600b547f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a2121260405160405180910390a36001600b6000828254610d7e9190612cf8565b9250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dfb5750610dfa8261186e565b5b9050919050565b610e0b81611950565b610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4190612a5b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610ec8836107f3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f1a836107f3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610f5c5750610f5b8185610b11565b5b80610f9a57508373ffffffffffffffffffffffffffffffffffffffff16610f82846104ed565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610fc3826107f3565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090612d9e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90612e30565b60405180910390fd5b6110938383836119bc565b61109e600082610e55565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ee9190612e50565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111459190612cf8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112048383836119cc565b505050565b611211610e4d565b73ffffffffffffffffffffffffffffffffffffffff1661122f61096f565b73ffffffffffffffffffffffffffffffffffffffff1614611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c90612ed0565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290612f3c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ac91906120b6565b60405180910390a3505050565b6114c4848484610fa3565b6114d0848484846119d1565b61150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690612fce565b60405180910390fd5b50505050565b60606040518060800160405280605d81526020016132a7605d9139905090565b60606000820361157c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611690565b600082905060005b600082146115ae57808061159790612fee565b915050600a826115a79190613065565b9150611584565b60008167ffffffffffffffff8111156115ca576115c96123ce565b5b6040519080825280601f01601f1916602001820160405280156115fc5781602001600182028036833780820191505090505b5090505b60008514611689576001826116159190612e50565b9150600a856116249190613096565b60306116309190612cf8565b60f81b818381518110611646576116456129e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856116829190613065565b9450611600565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90613113565b60405180910390fd5b61170d81611950565b1561174d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117449061317f565b60405180910390fd5b611759600083836119bc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a99190612cf8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461186a600083836119cc565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061193957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611949575061194882611b58565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6119c7838383611bc2565b505050565b505050565b60006119f28473ffffffffffffffffffffffffffffffffffffffff16611cd4565b15611b4b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a1b610e4d565b8786866040518563ffffffff1660e01b8152600401611a3d94939291906131e9565b6020604051808303816000875af1925050508015611a7957506040513d601f19601f82011682018060405250810190611a76919061324a565b60015b611afb573d8060008114611aa9576040519150601f19603f3d011682016040523d82523d6000602084013e611aae565b606091505b506000815103611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90612fce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b50565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bcd838383611cf7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c0f57611c0a81611cfc565b611c4e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611c4d57611c4c8382611d45565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c9057611c8b81611eb2565b611ccf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611cce57611ccd8282611f83565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611d52846108a4565b611d5c9190612e50565b9050600060076000848152602001908152602001600020549050818114611e41576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611ec69190612e50565b9050600060096000848152602001908152602001600020549050600060088381548110611ef657611ef56129e0565b5b906000526020600020015490508060088381548110611f1857611f176129e0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611f6757611f66613277565b5b6001900381819060005260206000200160009055905550505050565b6000611f8e836108a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61204b81612016565b811461205657600080fd5b50565b60008135905061206881612042565b92915050565b6000602082840312156120845761208361200c565b5b600061209284828501612059565b91505092915050565b60008115159050919050565b6120b08161209b565b82525050565b60006020820190506120cb60008301846120a7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561210b5780820151818401526020810190506120f0565b60008484015250505050565b6000601f19601f8301169050919050565b6000612133826120d1565b61213d81856120dc565b935061214d8185602086016120ed565b61215681612117565b840191505092915050565b6000602082019050818103600083015261217b8184612128565b905092915050565b6000819050919050565b61219681612183565b81146121a157600080fd5b50565b6000813590506121b38161218d565b92915050565b6000602082840312156121cf576121ce61200c565b5b60006121dd848285016121a4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612211826121e6565b9050919050565b61222181612206565b82525050565b600060208201905061223c6000830184612218565b92915050565b61224b81612206565b811461225657600080fd5b50565b60008135905061226881612242565b92915050565b600080604083850312156122855761228461200c565b5b600061229385828601612259565b92505060206122a4858286016121a4565b9150509250929050565b6122b781612183565b82525050565b60006020820190506122d260008301846122ae565b92915050565b6000806000606084860312156122f1576122f061200c565b5b60006122ff86828701612259565b935050602061231086828701612259565b9250506040612321868287016121a4565b9150509250925092565b6000602082840312156123415761234061200c565b5b600061234f84828501612259565b91505092915050565b6123618161209b565b811461236c57600080fd5b50565b60008135905061237e81612358565b92915050565b6000806040838503121561239b5761239a61200c565b5b60006123a985828601612259565b92505060206123ba8582860161236f565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61240682612117565b810181811067ffffffffffffffff82111715612425576124246123ce565b5b80604052505050565b6000612438612002565b905061244482826123fd565b919050565b600067ffffffffffffffff821115612464576124636123ce565b5b61246d82612117565b9050602081019050919050565b82818337600083830152505050565b600061249c61249784612449565b61242e565b9050828152602081018484840111156124b8576124b76123c9565b5b6124c384828561247a565b509392505050565b600082601f8301126124e0576124df6123c4565b5b81356124f0848260208601612489565b91505092915050565b600080600080608085870312156125135761251261200c565b5b600061252187828801612259565b945050602061253287828801612259565b9350506040612543878288016121a4565b925050606085013567ffffffffffffffff81111561256457612563612011565b5b612570878288016124cb565b91505092959194509250565b600080604083850312156125935761259261200c565b5b60006125a185828601612259565b92505060206125b285828601612259565b9150509250929050565b600067ffffffffffffffff8211156125d7576125d66123ce565b5b6125e082612117565b9050602081019050919050565b60006126006125fb846125bc565b61242e565b90508281526020810184848401111561261c5761261b6123c9565b5b61262784828561247a565b509392505050565b600082601f830112612644576126436123c4565b5b81356126548482602086016125ed565b91505092915050565b6000602082840312156126735761267261200c565b5b600082013567ffffffffffffffff81111561269157612690612011565b5b61269d8482850161262f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126ed57607f821691505b602082108103612700576126ff6126a6565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006127626021836120dc565b915061276d82612706565b604082019050919050565b6000602082019050818103600083015261279181612755565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006127f4603e836120dc565b91506127ff82612798565b604082019050919050565b60006020820190508181036000830152612823816127e7565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612886602e836120dc565b91506128918261282a565b604082019050919050565b600060208201905081810360008301526128b581612879565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000612918602b836120dc565b9150612923826128bc565b604082019050919050565b600060208201905081810360008301526129478161290b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006129aa602c836120dc565b91506129b58261294e565b604082019050919050565b600060208201905081810360008301526129d98161299d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612a456018836120dc565b9150612a5082612a0f565b602082019050919050565b60006020820190508181036000830152612a7481612a38565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612ad76029836120dc565b9150612ae282612a7b565b604082019050919050565b60006020820190508181036000830152612b0681612aca565b9050919050565b600081905092915050565b6000612b23826120d1565b612b2d8185612b0d565b9350612b3d8185602086016120ed565b80840191505092915050565b6000612b558285612b18565b9150612b618284612b18565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612bc96026836120dc565b9150612bd482612b6d565b604082019050919050565b60006020820190508181036000830152612bf881612bbc565b9050919050565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b6000612c356014836120dc565b9150612c4082612bff565b602082019050919050565b60006020820190508181036000830152612c6481612c28565b9050919050565b600081519050919050565b600081905092915050565b6000612c8c82612c6b565b612c968185612c76565b9350612ca68185602086016120ed565b80840191505092915050565b6000612cbe8284612c81565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d0382612183565b9150612d0e83612183565b9250828201905080821115612d2657612d25612cc9565b5b92915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612d886025836120dc565b9150612d9382612d2c565b604082019050919050565b60006020820190508181036000830152612db781612d7b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612e1a6024836120dc565b9150612e2582612dbe565b604082019050919050565b60006020820190508181036000830152612e4981612e0d565b9050919050565b6000612e5b82612183565b9150612e6683612183565b9250828203905081811115612e7e57612e7d612cc9565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612eba6020836120dc565b9150612ec582612e84565b602082019050919050565b60006020820190508181036000830152612ee981612ead565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612f266019836120dc565b9150612f3182612ef0565b602082019050919050565b60006020820190508181036000830152612f5581612f19565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612fb86032836120dc565b9150612fc382612f5c565b604082019050919050565b60006020820190508181036000830152612fe781612fab565b9050919050565b6000612ff982612183565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361302b5761302a612cc9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061307082612183565b915061307b83612183565b92508261308b5761308a613036565b5b828204905092915050565b60006130a182612183565b91506130ac83612183565b9250826130bc576130bb613036565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006130fd6020836120dc565b9150613108826130c7565b602082019050919050565b6000602082019050818103600083015261312c816130f0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613169601c836120dc565b915061317482613133565b602082019050919050565b600060208201905081810360008301526131988161315c565b9050919050565b600082825260208201905092915050565b60006131bb82612c6b565b6131c5818561319f565b93506131d58185602086016120ed565b6131de81612117565b840191505092915050565b60006080820190506131fe6000830187612218565b61320b6020830186612218565b61321860408301856122ae565b818103606083015261322a81846131b0565b905095945050505050565b60008151905061324481612042565b92915050565b6000602082840312156132605761325f61200c565b5b600061326e84828501613235565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f6865726d697463726162732e6d7970696e6174612e636c6f75642f697066732f516d5568323338514e7141684e4e397548577a4c71597a3934427154546f534a56694145787a43596468543448722f6a736f6e732fa2646970667358221220fc328f317ce779066d0b0251ad201a0fb429bd58029d007b4098c3e61f0a728764736f6c63430008110033

Deployed Bytecode Sourcemap

145:1285:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1215:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2483:100:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3996:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3513:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1658:113:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4696:336:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1326:256:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;278:38:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5103:185:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1848:233:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2194:222:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1925:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:11;;;:::i;:::-;;1236:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2652:104:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4239:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;323:18:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5359:323:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2827:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4465:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2142:201:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;473:256:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1215:212;1354:4;1383:36;1407:11;1383:23;:36::i;:::-;1376:43;;1215:212;;;:::o;2483:100:3:-;2537:13;2570:5;2563:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2483:100;:::o;3996:171::-;4072:7;4092:23;4107:7;4092:14;:23::i;:::-;4135:15;:24;4151:7;4135:24;;;;;;;;;;;;;;;;;;;;;4128:31;;3996:171;;;:::o;3513:417::-;3594:13;3610:23;3625:7;3610:14;:23::i;:::-;3594:39;;3658:5;3652:11;;:2;:11;;;3644:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3752:5;3736:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3761:37;3778:5;3785:12;:10;:12::i;:::-;3761:16;:37::i;:::-;3736:62;3714:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;3901:21;3910:2;3914:7;3901:8;:21::i;:::-;3583:347;3513:417;;:::o;1658:113:4:-;1719:7;1746:10;:17;;;;1739:24;;1658:113;:::o;4696:336:3:-;4891:41;4910:12;:10;:12::i;:::-;4924:7;4891:18;:41::i;:::-;4883:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4996:28;5006:4;5012:2;5016:7;4996:9;:28::i;:::-;4696:336;;;:::o;1326:256:4:-;1423:7;1459:23;1476:5;1459:16;:23::i;:::-;1451:5;:31;1443:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1548:12;:19;1561:5;1548:19;;;;;;;;;;;;;;;:26;1568:5;1548:26;;;;;;;;;;;;1541:33;;1326:256;;;;:::o;278:38:5:-;312:4;278:38;:::o;5103:185:3:-;5241:39;5258:4;5264:2;5268:7;5241:39;;;;;;;;;;;;:16;:39::i;:::-;5103:185;;;:::o;1848:233:4:-;1923:7;1959:30;:28;:30::i;:::-;1951:5;:38;1943:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2056:10;2067:5;2056:17;;;;;;;;:::i;:::-;;;;;;;;;;2049:24;;1848:233;;;:::o;2194:222:3:-;2266:7;2286:13;2302:7;:16;2310:7;2302:16;;;;;;;;;;;;;;;;;;;;;2286:32;;2354:1;2337:19;;:5;:19;;;2329:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2403:5;2396:12;;;2194:222;;;:::o;1925:207::-;1997:7;2042:1;2025:19;;:5;:19;;;2017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2108:9;:16;2118:5;2108:16;;;;;;;;;;;;;;;;2101:23;;1925:207;;;:::o;1884:103:11:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;1236:87::-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;2652:104:3:-;2708:13;2741:7;2734:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2652:104;:::o;4239:155::-;4334:52;4353:12;:10;:12::i;:::-;4367:8;4377;4334:18;:52::i;:::-;4239:155;;:::o;323:18:5:-;;;;:::o;5359:323:3:-;5533:41;5552:12;:10;:12::i;:::-;5566:7;5533:18;:41::i;:::-;5525:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5636:38;5650:4;5656:2;5660:7;5669:4;5636:13;:38::i;:::-;5359:323;;;;:::o;2827:281::-;2900:13;2926:23;2941:7;2926:14;:23::i;:::-;2962:21;2986:10;:8;:10::i;:::-;2962:34;;3038:1;3020:7;3014:21;:25;:86;;;;;;;;;;;;;;;;;3066:7;3075:18;:7;:16;:18::i;:::-;3049:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3014:86;3007:93;;;2827:281;;;:::o;4465:164::-;4562:4;4586:18;:25;4605:5;4586:25;;;;;;;;;;;;;;;:35;4612:8;4586:35;;;;;;;;;;;;;;;;;;;;;;;;;4579:42;;4465:164;;;;:::o;2142:201:11:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;473:256:5:-;312:4;540:2;;:15;532:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;593:8;;;;;;;;;;;:13;;618:8;607:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;593:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;639:21;645:10;657:2;;639:5;:21::i;:::-;690:10;678:23;;686:2;;678:23;;;;;;;;;;720:1;714:2;;:7;;;;;;;:::i;:::-;;;;;;;;473:256;:::o;1018:224:4:-;1120:4;1159:35;1144:50;;;:11;:50;;;;:90;;;;1198:36;1222:11;1198:23;:36::i;:::-;1144:90;1137:97;;1018:224;;;:::o;11971:135:3:-;12053:16;12061:7;12053;:16::i;:::-;12045:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11971:135;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;11250:174:3:-;11352:2;11325:15;:24;11341:7;11325:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11408:7;11404:2;11370:46;;11379:23;11394:7;11379:14;:23::i;:::-;11370:46;;;;;;;;;;;;11250:174;;:::o;7483:264::-;7576:4;7593:13;7609:23;7624:7;7609:14;:23::i;:::-;7593:39;;7662:5;7651:16;;:7;:16;;;:52;;;;7671:32;7688:5;7695:7;7671:16;:32::i;:::-;7651:52;:87;;;;7731:7;7707:31;;:20;7719:7;7707:11;:20::i;:::-;:31;;;7651:87;7643:96;;;7483:264;;;;:::o;10506:625::-;10665:4;10638:31;;:23;10653:7;10638:14;:23::i;:::-;:31;;;10630:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10744:1;10730:16;;:2;:16;;;10722:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10800:39;10821:4;10827:2;10831:7;10800:20;:39::i;:::-;10904:29;10921:1;10925:7;10904:8;:29::i;:::-;10965:1;10946:9;:15;10956:4;10946:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10994:1;10977:9;:13;10987:2;10977:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11025:2;11006:7;:16;11014:7;11006:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11064:7;11060:2;11045:27;;11054:4;11045:27;;;;;;;;;;;;11085:38;11105:4;11111:2;11115:7;11085:19;:38::i;:::-;10506:625;;;:::o;1401:132:11:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;2503:191::-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;11567:315:3:-;11722:8;11713:17;;:5;:17;;;11705:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11809:8;11771:18;:25;11790:5;11771:25;;;;;;;;;;;;;;;:35;11797:8;11771:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11855:8;11833:41;;11848:5;11833:41;;;11865:8;11833:41;;;;;;:::i;:::-;;;;;;;;11567:315;;;:::o;6563:313::-;6719:28;6729:4;6735:2;6739:7;6719:9;:28::i;:::-;6766:47;6789:4;6795:2;6799:7;6808:4;6766:22;:47::i;:::-;6758:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6563:313;;;;:::o;737:188:5:-;789:13;815:102;;;;;;;;;;;;;;;;;;;737:188;:::o;407:723:12:-;463:13;693:1;684:5;:10;680:53;;711:10;;;;;;;;;;;;;;;;;;;;;680:53;743:12;758:5;743:20;;774:14;799:78;814:1;806:4;:9;799:78;;832:8;;;;;:::i;:::-;;;;863:2;855:10;;;;;:::i;:::-;;;799:78;;;887:19;919:6;909:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;887:39;;937:154;953:1;944:5;:10;937:154;;981:1;971:11;;;;;:::i;:::-;;;1048:2;1040:5;:10;;;;:::i;:::-;1027:2;:24;;;;:::i;:::-;1014:39;;997:6;1004;997:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1077:2;1068:11;;;;;:::i;:::-;;;937:154;;;1115:6;1101:21;;;;;407:723;;;;:::o;9081:439:3:-;9175:1;9161:16;;:2;:16;;;9153:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9234:16;9242:7;9234;:16::i;:::-;9233:17;9225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9296:45;9325:1;9329:2;9333:7;9296:20;:45::i;:::-;9371:1;9354:9;:13;9364:2;9354:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9402:2;9383:7;:16;9391:7;9383:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9447:7;9443:2;9422:33;;9439:1;9422:33;;;;;;;;;;;;9468:44;9496:1;9500:2;9504:7;9468:19;:44::i;:::-;9081:439;;:::o;1556:305::-;1658:4;1710:25;1695:40;;;:11;:40;;;;:105;;;;1767:33;1752:48;;;:11;:48;;;;1695:105;:158;;;;1817:36;1841:11;1817:23;:36::i;:::-;1695:158;1675:178;;1556:305;;;:::o;7189:127::-;7254:4;7306:1;7278:30;;:7;:16;7286:7;7278:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7271:37;;7189:127;;;:::o;1003:204:5:-;1154:45;1181:4;1187:2;1191:7;1154:26;:45::i;:::-;1003:204;;;:::o;14606:125:3:-;;;;:::o;12670:853::-;12824:4;12845:15;:2;:13;;;:15::i;:::-;12841:675;;;12897:2;12881:36;;;12918:12;:10;:12::i;:::-;12932:4;12938:7;12947:4;12881:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12877:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13139:1;13122:6;:13;:18;13118:328;;13165:60;;;;;;;;;;:::i;:::-;;;;;;;;13118:328;13396:6;13390:13;13381:6;13377:2;13373:15;13366:38;12877:584;13013:41;;;13003:51;;;:6;:51;;;;12996:58;;;;;12841:675;13500:4;13493:11;;12670:853;;;;;;;:::o;854:157:2:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;2694:589:4:-;2838:45;2865:4;2871:2;2875:7;2838:26;:45::i;:::-;2916:1;2900:18;;:4;:18;;;2896:187;;2935:40;2967:7;2935:31;:40::i;:::-;2896:187;;;3005:2;2997:10;;:4;:10;;;2993:90;;3024:47;3057:4;3063:7;3024:32;:47::i;:::-;2993:90;2896:187;3111:1;3097:16;;:2;:16;;;3093:183;;3130:45;3167:7;3130:36;:45::i;:::-;3093:183;;;3203:4;3197:10;;:2;:10;;;3193:83;;3224:40;3252:2;3256:7;3224:27;:40::i;:::-;3193:83;3093:183;2694:589;;;:::o;1210:326:0:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;14095:126:3:-;;;;:::o;4006:164:4:-;4110:10;:17;;;;4083:15;:24;4099:7;4083:24;;;;;;;;;;;:44;;;;4138:10;4154:7;4138:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4006:164;:::o;4797:988::-;5063:22;5113:1;5088:22;5105:4;5088:16;:22::i;:::-;:26;;;;:::i;:::-;5063:51;;5125:18;5146:17;:26;5164:7;5146:26;;;;;;;;;;;;5125:47;;5293:14;5279:10;:28;5275:328;;5324:19;5346:12;:18;5359:4;5346:18;;;;;;;;;;;;;;;:34;5365:14;5346:34;;;;;;;;;;;;5324:56;;5430:11;5397:12;:18;5410:4;5397:18;;;;;;;;;;;;;;;:30;5416:10;5397:30;;;;;;;;;;;:44;;;;5547:10;5514:17;:30;5532:11;5514:30;;;;;;;;;;;:43;;;;5309:294;5275:328;5699:17;:26;5717:7;5699:26;;;;;;;;;;;5692:33;;;5743:12;:18;5756:4;5743:18;;;;;;;;;;;;;;;:34;5762:14;5743:34;;;;;;;;;;;5736:41;;;4878:907;;4797:988;;:::o;6080:1079::-;6333:22;6378:1;6358:10;:17;;;;:21;;;;:::i;:::-;6333:46;;6390:18;6411:15;:24;6427:7;6411:24;;;;;;;;;;;;6390:45;;6762:19;6784:10;6795:14;6784:26;;;;;;;;:::i;:::-;;;;;;;;;;6762:48;;6848:11;6823:10;6834;6823:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6959:10;6928:15;:28;6944:11;6928:28;;;;;;;;;;;:41;;;;7100:15;:24;7116:7;7100:24;;;;;;;;;;;7093:31;;;7135:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6151:1008;;;6080:1079;:::o;3584:221::-;3669:14;3686:20;3703:2;3686:16;:20::i;:::-;3669:37;;3744:7;3717:12;:16;3730:2;3717:16;;;;;;;;;;;;;;;:24;3734:6;3717:24;;;;;;;;;;;:34;;;;3791:6;3762:17;:26;3780:7;3762:26;;;;;;;;;;;:35;;;;3658:147;3584:221;;:::o;7:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:116::-;6272:21;6287:5;6272:21;:::i;:::-;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6252:60;6202:116;:::o;6324:133::-;6367:5;6405:6;6392:20;6383:29;;6421:30;6445:5;6421:30;:::i;:::-;6324:133;;;;:::o;6463:468::-;6528:6;6536;6585:2;6573:9;6564:7;6560:23;6556:32;6553:119;;;6591:79;;:::i;:::-;6553:119;6711:1;6736:53;6781:7;6772:6;6761:9;6757:22;6736:53;:::i;:::-;6726:63;;6682:117;6838:2;6864:50;6906:7;6897:6;6886:9;6882:22;6864:50;:::i;:::-;6854:60;;6809:115;6463:468;;;;;:::o;6937:117::-;7046:1;7043;7036:12;7060:117;7169:1;7166;7159:12;7183:180;7231:77;7228:1;7221:88;7328:4;7325:1;7318:15;7352:4;7349:1;7342:15;7369:281;7452:27;7474:4;7452:27;:::i;:::-;7444:6;7440:40;7582:6;7570:10;7567:22;7546:18;7534:10;7531:34;7528:62;7525:88;;;7593:18;;:::i;:::-;7525:88;7633:10;7629:2;7622:22;7412:238;7369:281;;:::o;7656:129::-;7690:6;7717:20;;:::i;:::-;7707:30;;7746:33;7774:4;7766:6;7746:33;:::i;:::-;7656:129;;;:::o;7791:307::-;7852:4;7942:18;7934:6;7931:30;7928:56;;;7964:18;;:::i;:::-;7928:56;8002:29;8024:6;8002:29;:::i;:::-;7994:37;;8086:4;8080;8076:15;8068:23;;7791:307;;;:::o;8104:146::-;8201:6;8196:3;8191;8178:30;8242:1;8233:6;8228:3;8224:16;8217:27;8104:146;;;:::o;8256:423::-;8333:5;8358:65;8374:48;8415:6;8374:48;:::i;:::-;8358:65;:::i;:::-;8349:74;;8446:6;8439:5;8432:21;8484:4;8477:5;8473:16;8522:3;8513:6;8508:3;8504:16;8501:25;8498:112;;;8529:79;;:::i;:::-;8498:112;8619:54;8666:6;8661:3;8656;8619:54;:::i;:::-;8339:340;8256:423;;;;;:::o;8698:338::-;8753:5;8802:3;8795:4;8787:6;8783:17;8779:27;8769:122;;8810:79;;:::i;:::-;8769:122;8927:6;8914:20;8952:78;9026:3;9018:6;9011:4;9003:6;8999:17;8952:78;:::i;:::-;8943:87;;8759:277;8698:338;;;;:::o;9042:943::-;9137:6;9145;9153;9161;9210:3;9198:9;9189:7;9185:23;9181:33;9178:120;;;9217:79;;:::i;:::-;9178:120;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:53;9535:7;9526:6;9515:9;9511:22;9490:53;:::i;:::-;9480:63;;9435:118;9592:2;9618:53;9663:7;9654:6;9643:9;9639:22;9618:53;:::i;:::-;9608:63;;9563:118;9748:2;9737:9;9733:18;9720:32;9779:18;9771:6;9768:30;9765:117;;;9801:79;;:::i;:::-;9765:117;9906:62;9960:7;9951:6;9940:9;9936:22;9906:62;:::i;:::-;9896:72;;9691:287;9042:943;;;;;;;:::o;9991:474::-;10059:6;10067;10116:2;10104:9;10095:7;10091:23;10087:32;10084:119;;;10122:79;;:::i;:::-;10084:119;10242:1;10267:53;10312:7;10303:6;10292:9;10288:22;10267:53;:::i;:::-;10257:63;;10213:117;10369:2;10395:53;10440:7;10431:6;10420:9;10416:22;10395:53;:::i;:::-;10385:63;;10340:118;9991:474;;;;;:::o;10471:308::-;10533:4;10623:18;10615:6;10612:30;10609:56;;;10645:18;;:::i;:::-;10609:56;10683:29;10705:6;10683:29;:::i;:::-;10675:37;;10767:4;10761;10757:15;10749:23;;10471:308;;;:::o;10785:425::-;10863:5;10888:66;10904:49;10946:6;10904:49;:::i;:::-;10888:66;:::i;:::-;10879:75;;10977:6;10970:5;10963:21;11015:4;11008:5;11004:16;11053:3;11044:6;11039:3;11035:16;11032:25;11029:112;;;11060:79;;:::i;:::-;11029:112;11150:54;11197:6;11192:3;11187;11150:54;:::i;:::-;10869:341;10785:425;;;;;:::o;11230:340::-;11286:5;11335:3;11328:4;11320:6;11316:17;11312:27;11302:122;;11343:79;;:::i;:::-;11302:122;11460:6;11447:20;11485:79;11560:3;11552:6;11545:4;11537:6;11533:17;11485:79;:::i;:::-;11476:88;;11292:278;11230:340;;;;:::o;11576:509::-;11645:6;11694:2;11682:9;11673:7;11669:23;11665:32;11662:119;;;11700:79;;:::i;:::-;11662:119;11848:1;11837:9;11833:17;11820:31;11878:18;11870:6;11867:30;11864:117;;;11900:79;;:::i;:::-;11864:117;12005:63;12060:7;12051:6;12040:9;12036:22;12005:63;:::i;:::-;11995:73;;11791:287;11576:509;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:220::-;12743:34;12739:1;12731:6;12727:14;12720:58;12812:3;12807:2;12799:6;12795:15;12788:28;12603:220;:::o;12829:366::-;12971:3;12992:67;13056:2;13051:3;12992:67;:::i;:::-;12985:74;;13068:93;13157:3;13068:93;:::i;:::-;13186:2;13181:3;13177:12;13170:19;;12829:366;;;:::o;13201:419::-;13367:4;13405:2;13394:9;13390:18;13382:26;;13454:9;13448:4;13444:20;13440:1;13429:9;13425:17;13418:47;13482:131;13608:4;13482:131;:::i;:::-;13474:139;;13201:419;;;:::o;13626:249::-;13766:34;13762:1;13754:6;13750:14;13743:58;13835:32;13830:2;13822:6;13818:15;13811:57;13626:249;:::o;13881:366::-;14023:3;14044:67;14108:2;14103:3;14044:67;:::i;:::-;14037:74;;14120:93;14209:3;14120:93;:::i;:::-;14238:2;14233:3;14229:12;14222:19;;13881:366;;;:::o;14253:419::-;14419:4;14457:2;14446:9;14442:18;14434:26;;14506:9;14500:4;14496:20;14492:1;14481:9;14477:17;14470:47;14534:131;14660:4;14534:131;:::i;:::-;14526:139;;14253:419;;;:::o;14678:233::-;14818:34;14814:1;14806:6;14802:14;14795:58;14887:16;14882:2;14874:6;14870:15;14863:41;14678:233;:::o;14917:366::-;15059:3;15080:67;15144:2;15139:3;15080:67;:::i;:::-;15073:74;;15156:93;15245:3;15156:93;:::i;:::-;15274:2;15269:3;15265:12;15258:19;;14917:366;;;:::o;15289:419::-;15455:4;15493:2;15482:9;15478:18;15470:26;;15542:9;15536:4;15532:20;15528:1;15517:9;15513:17;15506:47;15570:131;15696:4;15570:131;:::i;:::-;15562:139;;15289:419;;;:::o;15714:230::-;15854:34;15850:1;15842:6;15838:14;15831:58;15923:13;15918:2;15910:6;15906:15;15899:38;15714:230;:::o;15950:366::-;16092:3;16113:67;16177:2;16172:3;16113:67;:::i;:::-;16106:74;;16189:93;16278:3;16189:93;:::i;:::-;16307:2;16302:3;16298:12;16291:19;;15950:366;;;:::o;16322:419::-;16488:4;16526:2;16515:9;16511:18;16503:26;;16575:9;16569:4;16565:20;16561:1;16550:9;16546:17;16539:47;16603:131;16729:4;16603:131;:::i;:::-;16595:139;;16322:419;;;:::o;16747:231::-;16887:34;16883:1;16875:6;16871:14;16864:58;16956:14;16951:2;16943:6;16939:15;16932:39;16747:231;:::o;16984:366::-;17126:3;17147:67;17211:2;17206:3;17147:67;:::i;:::-;17140:74;;17223:93;17312:3;17223:93;:::i;:::-;17341:2;17336:3;17332:12;17325:19;;16984:366;;;:::o;17356:419::-;17522:4;17560:2;17549:9;17545:18;17537:26;;17609:9;17603:4;17599:20;17595:1;17584:9;17580:17;17573:47;17637:131;17763:4;17637:131;:::i;:::-;17629:139;;17356:419;;;:::o;17781:180::-;17829:77;17826:1;17819:88;17926:4;17923:1;17916:15;17950:4;17947:1;17940:15;17967:174;18107:26;18103:1;18095:6;18091:14;18084:50;17967:174;:::o;18147:366::-;18289:3;18310:67;18374:2;18369:3;18310:67;:::i;:::-;18303:74;;18386:93;18475:3;18386:93;:::i;:::-;18504:2;18499:3;18495:12;18488:19;;18147:366;;;:::o;18519:419::-;18685:4;18723:2;18712:9;18708:18;18700:26;;18772:9;18766:4;18762:20;18758:1;18747:9;18743:17;18736:47;18800:131;18926:4;18800:131;:::i;:::-;18792:139;;18519:419;;;:::o;18944:228::-;19084:34;19080:1;19072:6;19068:14;19061:58;19153:11;19148:2;19140:6;19136:15;19129:36;18944:228;:::o;19178:366::-;19320:3;19341:67;19405:2;19400:3;19341:67;:::i;:::-;19334:74;;19417:93;19506:3;19417:93;:::i;:::-;19535:2;19530:3;19526:12;19519:19;;19178:366;;;:::o;19550:419::-;19716:4;19754:2;19743:9;19739:18;19731:26;;19803:9;19797:4;19793:20;19789:1;19778:9;19774:17;19767:47;19831:131;19957:4;19831:131;:::i;:::-;19823:139;;19550:419;;;:::o;19975:148::-;20077:11;20114:3;20099:18;;19975:148;;;;:::o;20129:390::-;20235:3;20263:39;20296:5;20263:39;:::i;:::-;20318:89;20400:6;20395:3;20318:89;:::i;:::-;20311:96;;20416:65;20474:6;20469:3;20462:4;20455:5;20451:16;20416:65;:::i;:::-;20506:6;20501:3;20497:16;20490:23;;20239:280;20129:390;;;;:::o;20525:435::-;20705:3;20727:95;20818:3;20809:6;20727:95;:::i;:::-;20720:102;;20839:95;20930:3;20921:6;20839:95;:::i;:::-;20832:102;;20951:3;20944:10;;20525:435;;;;;:::o;20966:225::-;21106:34;21102:1;21094:6;21090:14;21083:58;21175:8;21170:2;21162:6;21158:15;21151:33;20966:225;:::o;21197:366::-;21339:3;21360:67;21424:2;21419:3;21360:67;:::i;:::-;21353:74;;21436:93;21525:3;21436:93;:::i;:::-;21554:2;21549:3;21545:12;21538:19;;21197:366;;;:::o;21569:419::-;21735:4;21773:2;21762:9;21758:18;21750:26;;21822:9;21816:4;21812:20;21808:1;21797:9;21793:17;21786:47;21850:131;21976:4;21850:131;:::i;:::-;21842:139;;21569:419;;;:::o;21994:170::-;22134:22;22130:1;22122:6;22118:14;22111:46;21994:170;:::o;22170:366::-;22312:3;22333:67;22397:2;22392:3;22333:67;:::i;:::-;22326:74;;22409:93;22498:3;22409:93;:::i;:::-;22527:2;22522:3;22518:12;22511:19;;22170:366;;;:::o;22542:419::-;22708:4;22746:2;22735:9;22731:18;22723:26;;22795:9;22789:4;22785:20;22781:1;22770:9;22766:17;22759:47;22823:131;22949:4;22823:131;:::i;:::-;22815:139;;22542:419;;;:::o;22967:98::-;23018:6;23052:5;23046:12;23036:22;;22967:98;;;:::o;23071:147::-;23172:11;23209:3;23194:18;;23071:147;;;;:::o;23224:386::-;23328:3;23356:38;23388:5;23356:38;:::i;:::-;23410:88;23491:6;23486:3;23410:88;:::i;:::-;23403:95;;23507:65;23565:6;23560:3;23553:4;23546:5;23542:16;23507:65;:::i;:::-;23597:6;23592:3;23588:16;23581:23;;23332:278;23224:386;;;;:::o;23616:271::-;23746:3;23768:93;23857:3;23848:6;23768:93;:::i;:::-;23761:100;;23878:3;23871:10;;23616:271;;;;:::o;23893:180::-;23941:77;23938:1;23931:88;24038:4;24035:1;24028:15;24062:4;24059:1;24052:15;24079:191;24119:3;24138:20;24156:1;24138:20;:::i;:::-;24133:25;;24172:20;24190:1;24172:20;:::i;:::-;24167:25;;24215:1;24212;24208:9;24201:16;;24236:3;24233:1;24230:10;24227:36;;;24243:18;;:::i;:::-;24227:36;24079:191;;;;:::o;24276:224::-;24416:34;24412:1;24404:6;24400:14;24393:58;24485:7;24480:2;24472:6;24468:15;24461:32;24276:224;:::o;24506:366::-;24648:3;24669:67;24733:2;24728:3;24669:67;:::i;:::-;24662:74;;24745:93;24834:3;24745:93;:::i;:::-;24863:2;24858:3;24854:12;24847:19;;24506:366;;;:::o;24878:419::-;25044:4;25082:2;25071:9;25067:18;25059:26;;25131:9;25125:4;25121:20;25117:1;25106:9;25102:17;25095:47;25159:131;25285:4;25159:131;:::i;:::-;25151:139;;24878:419;;;:::o;25303:223::-;25443:34;25439:1;25431:6;25427:14;25420:58;25512:6;25507:2;25499:6;25495:15;25488:31;25303:223;:::o;25532:366::-;25674:3;25695:67;25759:2;25754:3;25695:67;:::i;:::-;25688:74;;25771:93;25860:3;25771:93;:::i;:::-;25889:2;25884:3;25880:12;25873:19;;25532:366;;;:::o;25904:419::-;26070:4;26108:2;26097:9;26093:18;26085:26;;26157:9;26151:4;26147:20;26143:1;26132:9;26128:17;26121:47;26185:131;26311:4;26185:131;:::i;:::-;26177:139;;25904:419;;;:::o;26329:194::-;26369:4;26389:20;26407:1;26389:20;:::i;:::-;26384:25;;26423:20;26441:1;26423:20;:::i;:::-;26418:25;;26467:1;26464;26460:9;26452:17;;26491:1;26485:4;26482:11;26479:37;;;26496:18;;:::i;:::-;26479:37;26329:194;;;;:::o;26529:182::-;26669:34;26665:1;26657:6;26653:14;26646:58;26529:182;:::o;26717:366::-;26859:3;26880:67;26944:2;26939:3;26880:67;:::i;:::-;26873:74;;26956:93;27045:3;26956:93;:::i;:::-;27074:2;27069:3;27065:12;27058:19;;26717:366;;;:::o;27089:419::-;27255:4;27293:2;27282:9;27278:18;27270:26;;27342:9;27336:4;27332:20;27328:1;27317:9;27313:17;27306:47;27370:131;27496:4;27370:131;:::i;:::-;27362:139;;27089:419;;;:::o;27514:175::-;27654:27;27650:1;27642:6;27638:14;27631:51;27514:175;:::o;27695:366::-;27837:3;27858:67;27922:2;27917:3;27858:67;:::i;:::-;27851:74;;27934:93;28023:3;27934:93;:::i;:::-;28052:2;28047:3;28043:12;28036:19;;27695:366;;;:::o;28067:419::-;28233:4;28271:2;28260:9;28256:18;28248:26;;28320:9;28314:4;28310:20;28306:1;28295:9;28291:17;28284:47;28348:131;28474:4;28348:131;:::i;:::-;28340:139;;28067:419;;;:::o;28492:237::-;28632:34;28628:1;28620:6;28616:14;28609:58;28701:20;28696:2;28688:6;28684:15;28677:45;28492:237;:::o;28735:366::-;28877:3;28898:67;28962:2;28957:3;28898:67;:::i;:::-;28891:74;;28974:93;29063:3;28974:93;:::i;:::-;29092:2;29087:3;29083:12;29076:19;;28735:366;;;:::o;29107:419::-;29273:4;29311:2;29300:9;29296:18;29288:26;;29360:9;29354:4;29350:20;29346:1;29335:9;29331:17;29324:47;29388:131;29514:4;29388:131;:::i;:::-;29380:139;;29107:419;;;:::o;29532:233::-;29571:3;29594:24;29612:5;29594:24;:::i;:::-;29585:33;;29640:66;29633:5;29630:77;29627:103;;29710:18;;:::i;:::-;29627:103;29757:1;29750:5;29746:13;29739:20;;29532:233;;;:::o;29771:180::-;29819:77;29816:1;29809:88;29916:4;29913:1;29906:15;29940:4;29937:1;29930:15;29957:185;29997:1;30014:20;30032:1;30014:20;:::i;:::-;30009:25;;30048:20;30066:1;30048:20;:::i;:::-;30043:25;;30087:1;30077:35;;30092:18;;:::i;:::-;30077:35;30134:1;30131;30127:9;30122:14;;29957:185;;;;:::o;30148:176::-;30180:1;30197:20;30215:1;30197:20;:::i;:::-;30192:25;;30231:20;30249:1;30231:20;:::i;:::-;30226:25;;30270:1;30260:35;;30275:18;;:::i;:::-;30260:35;30316:1;30313;30309:9;30304:14;;30148:176;;;;:::o;30330:182::-;30470:34;30466:1;30458:6;30454:14;30447:58;30330:182;:::o;30518:366::-;30660:3;30681:67;30745:2;30740:3;30681:67;:::i;:::-;30674:74;;30757:93;30846:3;30757:93;:::i;:::-;30875:2;30870:3;30866:12;30859:19;;30518:366;;;:::o;30890:419::-;31056:4;31094:2;31083:9;31079:18;31071:26;;31143:9;31137:4;31133:20;31129:1;31118:9;31114:17;31107:47;31171:131;31297:4;31171:131;:::i;:::-;31163:139;;30890:419;;;:::o;31315:178::-;31455:30;31451:1;31443:6;31439:14;31432:54;31315:178;:::o;31499:366::-;31641:3;31662:67;31726:2;31721:3;31662:67;:::i;:::-;31655:74;;31738:93;31827:3;31738:93;:::i;:::-;31856:2;31851:3;31847:12;31840:19;;31499:366;;;:::o;31871:419::-;32037:4;32075:2;32064:9;32060:18;32052:26;;32124:9;32118:4;32114:20;32110:1;32099:9;32095:17;32088:47;32152:131;32278:4;32152:131;:::i;:::-;32144:139;;31871:419;;;:::o;32296:168::-;32379:11;32413:6;32408:3;32401:19;32453:4;32448:3;32444:14;32429:29;;32296:168;;;;:::o;32470:373::-;32556:3;32584:38;32616:5;32584:38;:::i;:::-;32638:70;32701:6;32696:3;32638:70;:::i;:::-;32631:77;;32717:65;32775:6;32770:3;32763:4;32756:5;32752:16;32717:65;:::i;:::-;32807:29;32829:6;32807:29;:::i;:::-;32802:3;32798:39;32791:46;;32560:283;32470:373;;;;:::o;32849:640::-;33044:4;33082:3;33071:9;33067:19;33059:27;;33096:71;33164:1;33153:9;33149:17;33140:6;33096:71;:::i;:::-;33177:72;33245:2;33234:9;33230:18;33221:6;33177:72;:::i;:::-;33259;33327:2;33316:9;33312:18;33303:6;33259:72;:::i;:::-;33378:9;33372:4;33368:20;33363:2;33352:9;33348:18;33341:48;33406:76;33477:4;33468:6;33406:76;:::i;:::-;33398:84;;32849:640;;;;;;;:::o;33495:141::-;33551:5;33582:6;33576:13;33567:22;;33598:32;33624:5;33598:32;:::i;:::-;33495:141;;;;:::o;33642:349::-;33711:6;33760:2;33748:9;33739:7;33735:23;33731:32;33728:119;;;33766:79;;:::i;:::-;33728:119;33886:1;33911:63;33966:7;33957:6;33946:9;33942:22;33911:63;:::i;:::-;33901:73;;33857:127;33642:349;;;;:::o;33997:180::-;34045:77;34042:1;34035:88;34142:4;34139:1;34132:15;34166:4;34163:1;34156:15

Swarm Source

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