ETH Price: $2,530.27 (+2.66%)

Token

GreenHomies (GH)
 

Overview

Max Total Supply

751 GH

Holders

147

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 GH
0xF610E4B9DDb52a1d12052861A8B8ceA733f20496
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:
GreenHomies

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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

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

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

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



pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;



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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


pragma solidity ^0.8.2;

contract GreenHomies is ERC721, ERC721Enumerable, Ownable {
    uint16 private greenyIndex = 0;
    bool public active = false;
    bool public activeBooth = false;
    string public baseURIextended;
    mapping(uint256 => string) public greenyBg;
    mapping(uint256 => string) public greenyName;
    mapping (address => uint) public giveaway;
    
    constructor() ERC721("GreenHomies", "GH") {}

    function contractURI() public view returns (string memory)
    {
        return string(abi.encodePacked(_baseURI(), "contract"));
    }


    // Mise à jour de l'url de base
    // @param string url - Url de base pour tous les tokens
    function setBaseURI(string memory url) public onlyOwner()
    {
        baseURIextended = url;
    }
 

    // Retourne l'url de base
    // @return string     
    function _baseURI() internal view override returns (string memory)
    {
        return baseURIextended;
    }


    // Mise à jour de la vente pour la stoper ou non 
    function changeActive() public onlyOwner
    {
        active = !active;
    }


    // Mise à jour de la Booth Machine pour la stoper ou non
    function changeBoothActive() public onlyOwner {
        activeBooth = !activeBooth;
    }


    // Retourne la liste des tokens d'une personne
    // @param address recipient - Address du wallet de la personne
    // @return array uint - Retourne un tableau de tokens   
    function tokensOfOwner(address recipient) public view returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(recipient);
        
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            for (uint256 index; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(recipient, index);
            }
            return result;
        }
    }


    // Définit le prix de la transaction, hors frais
    // @param uint quantity - Quantité de tokens à mint
    // @return uint - Retourne le prix en wei    
    function getPrice(uint quantity) public view returns (uint256)
    {
        uint256 price = 0.015 ether;
        
        if(greenyIndex >= 500 && greenyIndex < 1000) {
            price = 0.025 ether;
        } else if(greenyIndex >= 1000 && greenyIndex < 1500) {
            price = 0.035 ether;
        } else if(greenyIndex >= 1500 && greenyIndex < 2000) {
            price = 0.045 ether;
        } else if(greenyIndex >= 2000 && greenyIndex < 2500) {
            price = 0.055 ether;
        } else if(greenyIndex >= 2500 && greenyIndex < 3000) {
            price = 0.065 ether;
        } else if(greenyIndex >= 3000) {
            price = 0.075 ether;
        } 

        price = price * quantity;

        return price;
    }


    // Mint le token si les conditions sont remplies
    // @param uint quantity - Nombre de token à mint
    function checkNFT(uint quantity) public payable
    {
        require(active,                                         "The sale must be active to allow this action.");
        require(quantity <= 5,                                  "Can only mint 5 tokens at a time.");
        require(msg.value >= getPrice(quantity),                "Please, send the correct amount.");

        for (uint256 index = 0; index < quantity; index++) {
            _safeMint(msg.sender, greenyIndex);
            greenyIndex++;
        }
    }


    // Mint le token pour un membre listé sur le giveaway
    function giveawayNFT() public
    {
        require(active,                                         "The sale must be active to allow this action.");
        require(giveaway[msg.sender] > 0,                       "You must be in the giveaway list to have a free greeny.");
        require(msg.sender == tx.origin,                        "You must be the direct owner to buy a greeny.");

        uint256 qty = giveaway[msg.sender];

        for (uint256 index = 0; index < qty; index++) {
            _safeMint(msg.sender, greenyIndex);
            greenyIndex++;
        }

        giveaway[msg.sender] = 0;
    }


    // Fusionne 2 Greenies entre eux
    // @param uint firstTokenId - Premier token à burn
    // @param uint secondTokenId - Second token à burn
    // @param string name - Nom du greeny
    // @param string bg - Fond qui sera appliqué
    function mixGreenies(uint256 firstTokenId, uint256 secondTokenId, string memory name, string memory bg) public
    {
        require(msg.sender == ownerOf(firstTokenId),            "You are not the owner of this token. Bad Guy.");
        require(msg.sender == ownerOf(secondTokenId),           "This is not your token. Bad Guy.");
        require(activeBooth,                                    "The Booth must be active to allow this action.");

        runBooth(firstTokenId, name, bg);
        _burn(secondTokenId);
    }

   
    // Défini le nom associé à un NFT et son bg
    // @param uint tokenId - Numéro du token
    // @param string name - Nom du greeny
    // @param string bg - Nom du background
    function runBooth(uint256 tokenId, string memory name, string memory bg) public {
        require(activeBooth,                                   "The Booth must be active to allow this action.");
        require(msg.sender == ownerOf(tokenId),                "You are not the owner of this token. Bad Guy.");
        greenyName[tokenId] = name;
        greenyBg[tokenId] = bg;
    }
    
    // Vérifier si le greeny a déjà été minté ou non
    // @param unit tokenId - Numéro du token
    // @return bool
    function greenyExists(uint256 tokenId) public view returns (bool)
    {
        return _exists(tokenId);
    }


    // Retourne le nom du greeny
    // @param unit tokenId - Numéro du token
    // @return string
    function getName(uint256 tokenId) public view returns (string memory) {
        return greenyName[tokenId];
    }


    // Vérifier si un greeny existe déjà
    // @param unit tokenId - Numéro du token
    // @return bool
    function checkName(string memory name) public view returns (bool) {
        for (uint256 index; index < greenyIndex; index++) {
            if(keccak256(bytes(greenyName[index])) == keccak256(bytes(name))) {
                return true;
            }
        }
        return false;
    }


    // Retourne le fond attribué à un greeny
    // @param unit tokenId - Numéro du token
    // @return bool
    function getBackground(uint256 tokenId) public view returns (string memory)
    {
        return greenyBg[tokenId];
    }


    // Ajoute une personne aux giveaays
    // @param array of address wallet - Adresse du wallet
    function setGiveaway(address[] memory wallets) public onlyOwner
    {
        for (uint256 index; index < wallets.length; index++) {
            giveaway[wallets[index]]++;
        }
    }
 
    
    // Transfère de fonds vers le compte propriétaire ou autre
    // @param address recipient - Adresse où transférer les fonds
    function withdraw(address payable recipient) public onlyOwner
    {
        uint256 balance = address(this).balance;
        recipient.transfer(balance);
    }
    

    // Depuis la version > 0.8 de solidity et la version 4 de openzeppelin
    // Il est nécessaire d'override certaines fonctions
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable)
    {
        require(active,                                         "The sale must be active to allow this action.");
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeBooth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeBoothActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"checkNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"checkName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBackground","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"giveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"greenyBg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"greenyExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"greenyName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"firstTokenId","type":"uint256"},{"internalType":"uint256","name":"secondTokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"bg","type":"string"}],"name":"mixGreenies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"bg","type":"string"}],"name":"runBooth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"setGiveaway","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":[{"internalType":"address","name":"recipient","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548161ffff021916908361ffff1602179055506000600a60166101000a81548160ff0219169083151502179055506000600a60176101000a81548160ff0219169083151502179055503480156200006557600080fd5b506040518060400160405280600b81526020017f477265656e486f6d6965730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f47480000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ea929190620001fa565b50806001908051906020019062000103929190620001fa565b505050620001266200011a6200012c60201b60201c565b6200013460201b60201c565b6200030f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020890620002aa565b90600052602060002090601f0160209004810192826200022c576000855562000278565b82601f106200024757805160ff191683800117855562000278565b8280016001018555821562000278579182015b82811115620002775782518255916020019190600101906200025a565b5b5090506200028791906200028b565b5090565b5b80821115620002a65760008160009055506001016200028c565b5090565b60006002820490506001821680620002c357607f821691505b60208210811415620002da57620002d9620002e0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615705806200031f6000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063a5d75f73116100b6578063e75722301161007a578063e7572230146108b7578063e8a3d485146108f4578063e8d887d31461091f578063e985e9c51461095c578063f2fde38b14610999578063fdb996c0146109c257610246565b8063a5d75f73146107d4578063b4ac0dfc146107fd578063b88d4fde14610814578063c87b56dd1461083d578063dfd233dd1461087a57610246565b80638da5cb5b116100fd5780638da5cb5b146106ef5780638e18a2491461071a57806395d89b4114610757578063972d3dd514610782578063a22cb465146107ab57610246565b806370a082311461060a578063715018a6146106475780637b886be51461065e5780637f1c4e46146106755780638462151c146106b257610246565b806333695797116101c75780634f6ccce71161018b5780634f6ccce71461050157806351cff8d91461053e57806355f804b3146105675780636352211e146105905780636b8ff574146105cd57610246565b8063336957971461043d57806339812651146104545780633ea158991461047f57806342842e0e1461049b5780634e6b7351146104c457610246565b80630d449db01161020e5780630d449db0146103445780631400d1e41461036f57806318160ddd146103ac57806323b872dd146103d75780632f745c591461040057610246565b806301ffc9a71461024b57806302fb0c5e1461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613e31565b6109eb565b60405161027f919061466a565b60405180910390f35b34801561029457600080fd5b5061029d6109fd565b6040516102aa919061466a565b60405180910390f35b3480156102bf57600080fd5b506102c8610a10565b6040516102d59190614685565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613ec4565b610aa2565b60405161031291906145e1565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613db4565b610b27565b005b34801561035057600080fd5b50610359610c3f565b6040516103669190614685565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613e83565b610ccd565b6040516103a3919061466a565b60405180910390f35b3480156103b857600080fd5b506103c1610d4b565b6040516103ce91906149e7565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613cae565b610d58565b005b34801561040c57600080fd5b5061042760048036038101906104229190613db4565b610db8565b60405161043491906149e7565b60405180910390f35b34801561044957600080fd5b50610452610e5d565b005b34801561046057600080fd5b506104696110a0565b604051610476919061466a565b60405180910390f35b61049960048036038101906104949190613ec4565b6110b3565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613cae565b61120c565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613ec4565b61122c565b6040516104f89190614685565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613ec4565b6112cc565b60405161053591906149e7565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613c49565b611363565b005b34801561057357600080fd5b5061058e60048036038101906105899190613e83565b61142f565b005b34801561059c57600080fd5b506105b760048036038101906105b29190613ec4565b6114c5565b6040516105c491906145e1565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190613ec4565b611577565b6040516106019190614685565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c9190613c20565b61161c565b60405161063e91906149e7565b60405180910390f35b34801561065357600080fd5b5061065c6116d4565b005b34801561066a57600080fd5b5061067361175c565b005b34801561068157600080fd5b5061069c60048036038101906106979190613ec4565b611804565b6040516106a99190614685565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613c20565b6118a4565b6040516106e69190614648565b60405180910390f35b3480156106fb57600080fd5b50610704611a20565b60405161071191906145e1565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190613ec4565b611a4a565b60405161074e919061466a565b60405180910390f35b34801561076357600080fd5b5061076c611a5c565b6040516107799190614685565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613f6c565b611aee565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613d78565b611c43565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613df0565b611c59565b005b34801561080957600080fd5b50610812611d8d565b005b34801561082057600080fd5b5061083b60048036038101906108369190613cfd565b611e35565b005b34801561084957600080fd5b50610864600480360381019061085f9190613ec4565b611e97565b6040516108719190614685565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c9190613c20565b611f3e565b6040516108ae91906149e7565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613ec4565b611f56565b6040516108eb91906149e7565b60405180910390f35b34801561090057600080fd5b50610909612133565b6040516109169190614685565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190613ec4565b612161565b6040516109539190614685565b60405180910390f35b34801561096857600080fd5b50610983600480360381019061097e9190613c72565b612206565b604051610990919061466a565b60405180910390f35b3480156109a557600080fd5b506109c060048036038101906109bb9190613c20565b61229a565b005b3480156109ce57600080fd5b506109e960048036038101906109e49190613eed565b612392565b005b60006109f6826124ac565b9050919050565b600a60169054906101000a900460ff1681565b606060008054610a1f90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4b90614d3c565b8015610a985780601f10610a6d57610100808354040283529160200191610a98565b820191906000526020600020905b815481529060010190602001808311610a7b57829003601f168201915b5050505050905090565b6000610aad82612526565b610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390614887565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b32826114c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90614927565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc2612592565b73ffffffffffffffffffffffffffffffffffffffff161480610bf15750610bf081610beb612592565b612206565b5b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790614807565b60405180910390fd5b610c3a838361259a565b505050565b600b8054610c4c90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7890614d3c565b8015610cc55780601f10610c9a57610100808354040283529160200191610cc5565b820191906000526020600020905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b6000805b600a60149054906101000a900461ffff1661ffff16811015610d40578280519060200120600d6000838152602001908152602001600020604051610d159190614584565b60405180910390201415610d2d576001915050610d46565b8080610d3890614dca565b915050610cd1565b50600090505b919050565b6000600880549050905090565b610d69610d63612592565b82612653565b610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90614967565b60405180910390fd5b610db3838383612731565b505050565b6000610dc38361161c565b8210610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb906146c7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60169054906101000a900460ff16610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614947565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906146a7565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f93906149a7565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b818110156110575761100933600a60149054906101000a900461ffff1661ffff1661298d565b600a601481819054906101000a900461ffff168092919061102990614d9f565b91906101000a81548161ffff021916908361ffff16021790555050808061104f90614dca565b915050610fe3565b506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600a60179054906101000a900460ff1681565b600a60169054906101000a900460ff16611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614947565b60405180910390fd5b6005811115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90614767565b60405180910390fd5b61114f81611f56565b341015611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890614747565b60405180910390fd5b60005b81811015611208576111ba33600a60149054906101000a900461ffff1661ffff1661298d565b600a601481819054906101000a900461ffff16809291906111da90614d9f565b91906101000a81548161ffff021916908361ffff16021790555050808061120090614dca565b915050611194565b5050565b61122783838360405180602001604052806000815250611e35565b505050565b600d602052806000526040600020600091509050805461124b90614d3c565b80601f016020809104026020016040519081016040528092919081815260200182805461127790614d3c565b80156112c45780601f10611299576101008083540402835291602001916112c4565b820191906000526020600020905b8154815290600101906020018083116112a757829003601f168201915b505050505081565b60006112d6610d4b565b8210611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e90614987565b60405180910390fd5b60088281548110611351577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61136b612592565b73ffffffffffffffffffffffffffffffffffffffff16611389611a20565b73ffffffffffffffffffffffffffffffffffffffff16146113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d6906148a7565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561142a573d6000803e3d6000fd5b505050565b611437612592565b73ffffffffffffffffffffffffffffffffffffffff16611455611a20565b73ffffffffffffffffffffffffffffffffffffffff16146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a2906148a7565b60405180910390fd5b80600b90805190602001906114c1929190613999565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590614847565b60405180910390fd5b80915050919050565b6060600d6000838152602001908152602001600020805461159790614d3c565b80601f01602080910402602001604051908101604052809291908181526020018280546115c390614d3c565b80156116105780601f106115e557610100808354040283529160200191611610565b820191906000526020600020905b8154815290600101906020018083116115f357829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490614827565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116dc612592565b73ffffffffffffffffffffffffffffffffffffffff166116fa611a20565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611747906148a7565b60405180910390fd5b61175a60006129ab565b565b611764612592565b73ffffffffffffffffffffffffffffffffffffffff16611782611a20565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906148a7565b60405180910390fd5b600a60179054906101000a900460ff1615600a60176101000a81548160ff021916908315150217905550565b600c602052806000526040600020600091509050805461182390614d3c565b80601f016020809104026020016040519081016040528092919081815260200182805461184f90614d3c565b801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505050505081565b606060006118b18361161c565b9050600081141561193457600067ffffffffffffffff8111156118fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561192b5781602001602082028036833780820191505090505b50915050611a1b565b60008167ffffffffffffffff811115611976577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119a45781602001602082028036833780820191505090505b50905060005b82811015611a14576119bc8582610db8565b8282815181106119f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a0c90614dca565b9150506119aa565b5080925050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611a5582612526565b9050919050565b606060018054611a6b90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9790614d3c565b8015611ae45780601f10611ab957610100808354040283529160200191611ae4565b820191906000526020600020905b815481529060010190602001808311611ac757829003601f168201915b5050505050905090565b611af7846114c5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906148e7565b60405180910390fd5b611b6d836114c5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd1906147e7565b60405180910390fd5b600a60179054906101000a900460ff16611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c20906149c7565b60405180910390fd5b611c34848383612392565b611c3d83612a71565b50505050565b611c55611c4e612592565b8383612b82565b5050565b611c61612592565b73ffffffffffffffffffffffffffffffffffffffff16611c7f611a20565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc906148a7565b60405180910390fd5b60005b8151811015611d8957600e6000838381518110611d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d7190614dca565b91905055508080611d8190614dca565b915050611cd8565b5050565b611d95612592565b73ffffffffffffffffffffffffffffffffffffffff16611db3611a20565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e00906148a7565b60405180910390fd5b600a60169054906101000a900460ff1615600a60166101000a81548160ff021916908315150217905550565b611e46611e40612592565b83612653565b611e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7c90614967565b60405180910390fd5b611e9184848484612cef565b50505050565b6060611ea282612526565b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614907565b60405180910390fd5b6000611eeb612d4b565b90506000815111611f0b5760405180602001604052806000815250611f36565b80611f1584612ddd565b604051602001611f2692919061459b565b6040516020818303038152906040525b915050919050565b600e6020528060005260406000206000915090505481565b60008066354a6ba7a1800090506101f4600a60149054906101000a900461ffff1661ffff1610158015611f9e57506103e8600a60149054906101000a900461ffff1661ffff16105b15611fb2576658d15e17628000905061211c565b6103e8600a60149054906101000a900461ffff1661ffff1610158015611fed57506105dc600a60149054906101000a900461ffff1661ffff16105b1561200157667c585087238000905061211b565b6105dc600a60149054906101000a900461ffff1661ffff161015801561203c57506107d0600a60149054906101000a900461ffff1661ffff16105b1561205057669fdf42f6e48000905061211a565b6107d0600a60149054906101000a900461ffff1661ffff161015801561208b57506109c4600a60149054906101000a900461ffff1661ffff16105b1561209f5766c3663566a580009050612119565b6109c4600a60149054906101000a900461ffff1661ffff16101580156120da5750610bb8600a60149054906101000a900461ffff1661ffff16105b156120ee5766e6ed27d66680009050612118565b610bb8600a60149054906101000a900461ffff1661ffff16106121175767010a741a4627800090505b5b5b5b5b5b82816121289190614bd8565b905080915050919050565b606061213d612d4b565b60405160200161214d91906145bf565b604051602081830303815290604052905090565b6060600c6000838152602001908152602001600020805461218190614d3c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ad90614d3c565b80156121fa5780601f106121cf576101008083540402835291602001916121fa565b820191906000526020600020905b8154815290600101906020018083116121dd57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122a2612592565b73ffffffffffffffffffffffffffffffffffffffff166122c0611a20565b73ffffffffffffffffffffffffffffffffffffffff1614612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d906148a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614707565b60405180910390fd5b61238f816129ab565b50565b600a60179054906101000a900460ff166123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d8906149c7565b60405180910390fd5b6123ea836114c5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e906148e7565b60405180910390fd5b81600d6000858152602001908152602001600020908051906020019061247e929190613999565b5080600c600085815260200190815260200160002090805190602001906124a6929190613999565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251f575061251e82612f8a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661260d836114c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265e82612526565b61269d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612694906147c7565b60405180910390fd5b60006126a8836114c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061271757508373ffffffffffffffffffffffffffffffffffffffff166126ff84610aa2565b73ffffffffffffffffffffffffffffffffffffffff16145b8061272857506127278185612206565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612751826114c5565b73ffffffffffffffffffffffffffffffffffffffff16146127a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279e906148c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e90614787565b60405180910390fd5b61282283838361306c565b61282d60008261259a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287d9190614c32565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d49190614b51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129a78282604051806020016040528060008152506130cb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612a7c826114c5565b9050612a8a8160008461306c565b612a9560008361259a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ae59190614c32565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be8906147a7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ce2919061466a565b60405180910390a3505050565b612cfa848484612731565b612d0684848484613126565b612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906146e7565b60405180910390fd5b50505050565b6060600b8054612d5a90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054612d8690614d3c565b8015612dd35780601f10612da857610100808354040283529160200191612dd3565b820191906000526020600020905b815481529060010190602001808311612db657829003601f168201915b5050505050905090565b60606000821415612e25576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f85565b600082905060005b60008214612e57578080612e4090614dca565b915050600a82612e509190614ba7565b9150612e2d565b60008167ffffffffffffffff811115612e99577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ecb5781602001600182028036833780820191505090505b5090505b60008514612f7e57600182612ee49190614c32565b9150600a85612ef39190614e13565b6030612eff9190614b51565b60f81b818381518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f779190614ba7565b9450612ecf565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061305557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806130655750613064826132bd565b5b9050919050565b600a60169054906101000a900460ff166130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b290614947565b60405180910390fd5b6130c6838383613327565b505050565b6130d5838361343b565b6130e26000848484613126565b613121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613118906146e7565b60405180910390fd5b505050565b60006131478473ffffffffffffffffffffffffffffffffffffffff16613609565b156132b0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613170612592565b8786866040518563ffffffff1660e01b815260040161319294939291906145fc565b602060405180830381600087803b1580156131ac57600080fd5b505af19250505080156131dd57506040513d601f19601f820116820180604052508101906131da9190613e5a565b60015b613260573d806000811461320d576040519150601f19603f3d011682016040523d82523d6000602084013e613212565b606091505b50600081511415613258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324f906146e7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b5565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61333283838361361c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133755761337081613621565b6133b4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133b3576133b2838261366a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133f7576133f2816137d7565b613436565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461343557613434828261391a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a290614867565b60405180910390fd5b6134b481612526565b156134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134eb90614727565b60405180910390fd5b6135006000838361306c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135509190614b51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136778461161c565b6136819190614c32565b9050600060076000848152602001908152602001600020549050818114613766576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137eb9190614c32565b9050600060096000848152602001908152602001600020549050600060088381548110613841577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613889577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006139258361161c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546139a590614d3c565b90600052602060002090601f0160209004810192826139c75760008555613a0e565b82601f106139e057805160ff1916838001178555613a0e565b82800160010185558215613a0e579182015b82811115613a0d5782518255916020019190600101906139f2565b5b509050613a1b9190613a1f565b5090565b5b80821115613a38576000816000905550600101613a20565b5090565b6000613a4f613a4a84614a27565b614a02565b90508083825260208201905082856020860282011115613a6e57600080fd5b60005b85811015613a9e5781613a848882613b24565b845260208401935060208301925050600181019050613a71565b5050509392505050565b6000613abb613ab684614a53565b614a02565b905082815260208101848484011115613ad357600080fd5b613ade848285614cfa565b509392505050565b6000613af9613af484614a84565b614a02565b905082815260208101848484011115613b1157600080fd5b613b1c848285614cfa565b509392505050565b600081359050613b338161565c565b92915050565b600081359050613b4881615673565b92915050565b600082601f830112613b5f57600080fd5b8135613b6f848260208601613a3c565b91505092915050565b600081359050613b878161568a565b92915050565b600081359050613b9c816156a1565b92915050565b600081519050613bb1816156a1565b92915050565b600082601f830112613bc857600080fd5b8135613bd8848260208601613aa8565b91505092915050565b600082601f830112613bf257600080fd5b8135613c02848260208601613ae6565b91505092915050565b600081359050613c1a816156b8565b92915050565b600060208284031215613c3257600080fd5b6000613c4084828501613b24565b91505092915050565b600060208284031215613c5b57600080fd5b6000613c6984828501613b39565b91505092915050565b60008060408385031215613c8557600080fd5b6000613c9385828601613b24565b9250506020613ca485828601613b24565b9150509250929050565b600080600060608486031215613cc357600080fd5b6000613cd186828701613b24565b9350506020613ce286828701613b24565b9250506040613cf386828701613c0b565b9150509250925092565b60008060008060808587031215613d1357600080fd5b6000613d2187828801613b24565b9450506020613d3287828801613b24565b9350506040613d4387828801613c0b565b925050606085013567ffffffffffffffff811115613d6057600080fd5b613d6c87828801613bb7565b91505092959194509250565b60008060408385031215613d8b57600080fd5b6000613d9985828601613b24565b9250506020613daa85828601613b78565b9150509250929050565b60008060408385031215613dc757600080fd5b6000613dd585828601613b24565b9250506020613de685828601613c0b565b9150509250929050565b600060208284031215613e0257600080fd5b600082013567ffffffffffffffff811115613e1c57600080fd5b613e2884828501613b4e565b91505092915050565b600060208284031215613e4357600080fd5b6000613e5184828501613b8d565b91505092915050565b600060208284031215613e6c57600080fd5b6000613e7a84828501613ba2565b91505092915050565b600060208284031215613e9557600080fd5b600082013567ffffffffffffffff811115613eaf57600080fd5b613ebb84828501613be1565b91505092915050565b600060208284031215613ed657600080fd5b6000613ee484828501613c0b565b91505092915050565b600080600060608486031215613f0257600080fd5b6000613f1086828701613c0b565b935050602084013567ffffffffffffffff811115613f2d57600080fd5b613f3986828701613be1565b925050604084013567ffffffffffffffff811115613f5657600080fd5b613f6286828701613be1565b9150509250925092565b60008060008060808587031215613f8257600080fd5b6000613f9087828801613c0b565b9450506020613fa187828801613c0b565b935050604085013567ffffffffffffffff811115613fbe57600080fd5b613fca87828801613be1565b925050606085013567ffffffffffffffff811115613fe757600080fd5b613ff387828801613be1565b91505092959194509250565b600061400b8383614566565b60208301905092915050565b61402081614c66565b82525050565b600061403182614ada565b61403b8185614b08565b935061404683614ab5565b8060005b8381101561407757815161405e8882613fff565b975061406983614afb565b92505060018101905061404a565b5085935050505092915050565b61408d81614c8a565b82525050565b600061409e82614ae5565b6140a88185614b19565b93506140b8818560208601614d09565b6140c181614f00565b840191505092915050565b600081546140d981614d3c565b6140e38186614b2a565b945060018216600081146140fe576001811461410f57614142565b60ff19831686528186019350614142565b61411885614ac5565b60005b8381101561413a5781548189015260018201915060208101905061411b565b838801955050505b50505092915050565b600061415682614af0565b6141608185614b35565b9350614170818560208601614d09565b61417981614f00565b840191505092915050565b600061418f82614af0565b6141998185614b46565b93506141a9818560208601614d09565b80840191505092915050565b60006141c2603783614b35565b91506141cd82614f11565b604082019050919050565b60006141e5602b83614b35565b91506141f082614f60565b604082019050919050565b6000614208603283614b35565b915061421382614faf565b604082019050919050565b600061422b602683614b35565b915061423682614ffe565b604082019050919050565b600061424e601c83614b35565b91506142598261504d565b602082019050919050565b6000614271602083614b35565b915061427c82615076565b602082019050919050565b6000614294602183614b35565b915061429f8261509f565b604082019050919050565b60006142b7602483614b35565b91506142c2826150ee565b604082019050919050565b60006142da601983614b35565b91506142e58261513d565b602082019050919050565b60006142fd602c83614b35565b915061430882615166565b604082019050919050565b6000614320602083614b35565b915061432b826151b5565b602082019050919050565b6000614343603883614b35565b915061434e826151de565b604082019050919050565b6000614366602a83614b35565b91506143718261522d565b604082019050919050565b6000614389602983614b35565b91506143948261527c565b604082019050919050565b60006143ac600883614b46565b91506143b7826152cb565b600882019050919050565b60006143cf602083614b35565b91506143da826152f4565b602082019050919050565b60006143f2602c83614b35565b91506143fd8261531d565b604082019050919050565b6000614415602083614b35565b91506144208261536c565b602082019050919050565b6000614438602983614b35565b915061444382615395565b604082019050919050565b600061445b602d83614b35565b9150614466826153e4565b604082019050919050565b600061447e602f83614b35565b915061448982615433565b604082019050919050565b60006144a1602183614b35565b91506144ac82615482565b604082019050919050565b60006144c4602d83614b35565b91506144cf826154d1565b604082019050919050565b60006144e7603183614b35565b91506144f282615520565b604082019050919050565b600061450a602c83614b35565b91506145158261556f565b604082019050919050565b600061452d602d83614b35565b9150614538826155be565b604082019050919050565b6000614550602e83614b35565b915061455b8261560d565b604082019050919050565b61456f81614cf0565b82525050565b61457e81614cf0565b82525050565b600061459082846140cc565b915081905092915050565b60006145a78285614184565b91506145b38284614184565b91508190509392505050565b60006145cb8284614184565b91506145d68261439f565b915081905092915050565b60006020820190506145f66000830184614017565b92915050565b60006080820190506146116000830187614017565b61461e6020830186614017565b61462b6040830185614575565b818103606083015261463d8184614093565b905095945050505050565b600060208201905081810360008301526146628184614026565b905092915050565b600060208201905061467f6000830184614084565b92915050565b6000602082019050818103600083015261469f818461414b565b905092915050565b600060208201905081810360008301526146c0816141b5565b9050919050565b600060208201905081810360008301526146e0816141d8565b9050919050565b60006020820190508181036000830152614700816141fb565b9050919050565b600060208201905081810360008301526147208161421e565b9050919050565b6000602082019050818103600083015261474081614241565b9050919050565b6000602082019050818103600083015261476081614264565b9050919050565b6000602082019050818103600083015261478081614287565b9050919050565b600060208201905081810360008301526147a0816142aa565b9050919050565b600060208201905081810360008301526147c0816142cd565b9050919050565b600060208201905081810360008301526147e0816142f0565b9050919050565b6000602082019050818103600083015261480081614313565b9050919050565b6000602082019050818103600083015261482081614336565b9050919050565b6000602082019050818103600083015261484081614359565b9050919050565b600060208201905081810360008301526148608161437c565b9050919050565b60006020820190508181036000830152614880816143c2565b9050919050565b600060208201905081810360008301526148a0816143e5565b9050919050565b600060208201905081810360008301526148c081614408565b9050919050565b600060208201905081810360008301526148e08161442b565b9050919050565b600060208201905081810360008301526149008161444e565b9050919050565b6000602082019050818103600083015261492081614471565b9050919050565b6000602082019050818103600083015261494081614494565b9050919050565b60006020820190508181036000830152614960816144b7565b9050919050565b60006020820190508181036000830152614980816144da565b9050919050565b600060208201905081810360008301526149a0816144fd565b9050919050565b600060208201905081810360008301526149c081614520565b9050919050565b600060208201905081810360008301526149e081614543565b9050919050565b60006020820190506149fc6000830184614575565b92915050565b6000614a0c614a1d565b9050614a188282614d6e565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4257614a41614ed1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a6e57614a6d614ed1565b5b614a7782614f00565b9050602081019050919050565b600067ffffffffffffffff821115614a9f57614a9e614ed1565b5b614aa882614f00565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b5c82614cf0565b9150614b6783614cf0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b9c57614b9b614e44565b5b828201905092915050565b6000614bb282614cf0565b9150614bbd83614cf0565b925082614bcd57614bcc614e73565b5b828204905092915050565b6000614be382614cf0565b9150614bee83614cf0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c2757614c26614e44565b5b828202905092915050565b6000614c3d82614cf0565b9150614c4883614cf0565b925082821015614c5b57614c5a614e44565b5b828203905092915050565b6000614c7182614cd0565b9050919050565b6000614c8382614cd0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d27578082015181840152602081019050614d0c565b83811115614d36576000848401525b50505050565b60006002820490506001821680614d5457607f821691505b60208210811415614d6857614d67614ea2565b5b50919050565b614d7782614f00565b810181811067ffffffffffffffff82111715614d9657614d95614ed1565b5b80604052505050565b6000614daa82614cc2565b915061ffff821415614dbf57614dbe614e44565b5b600182019050919050565b6000614dd582614cf0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e0857614e07614e44565b5b600182019050919050565b6000614e1e82614cf0565b9150614e2983614cf0565b925082614e3957614e38614e73565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f75206d75737420626520696e20746865206769766561776179206c69737460008201527f20746f20686176652061206672656520677265656e792e000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f506c656173652c2073656e642074686520636f727265637420616d6f756e742e600082015250565b7f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f54686973206973206e6f7420796f757220746f6b656e2e20426164204775792e600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60008201527f6b656e2e20426164204775792e00000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468652073616c65206d7573742062652061637469766520746f20616c6c6f7760008201527f207468697320616374696f6e2e00000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75206d7573742062652074686520646972656374206f776e657220746f2060008201527f627579206120677265656e792e00000000000000000000000000000000000000602082015250565b7f54686520426f6f7468206d7573742062652061637469766520746f20616c6c6f60008201527f77207468697320616374696f6e2e000000000000000000000000000000000000602082015250565b61566581614c66565b811461567057600080fd5b50565b61567c81614c78565b811461568757600080fd5b50565b61569381614c8a565b811461569e57600080fd5b50565b6156aa81614c96565b81146156b557600080fd5b50565b6156c181614cf0565b81146156cc57600080fd5b5056fea26469706673582212208eaea2771fe0611a92d9c50131efcba878bbf2aebe6b88a6c94a752b184e93f864736f6c63430008020033

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063a5d75f73116100b6578063e75722301161007a578063e7572230146108b7578063e8a3d485146108f4578063e8d887d31461091f578063e985e9c51461095c578063f2fde38b14610999578063fdb996c0146109c257610246565b8063a5d75f73146107d4578063b4ac0dfc146107fd578063b88d4fde14610814578063c87b56dd1461083d578063dfd233dd1461087a57610246565b80638da5cb5b116100fd5780638da5cb5b146106ef5780638e18a2491461071a57806395d89b4114610757578063972d3dd514610782578063a22cb465146107ab57610246565b806370a082311461060a578063715018a6146106475780637b886be51461065e5780637f1c4e46146106755780638462151c146106b257610246565b806333695797116101c75780634f6ccce71161018b5780634f6ccce71461050157806351cff8d91461053e57806355f804b3146105675780636352211e146105905780636b8ff574146105cd57610246565b8063336957971461043d57806339812651146104545780633ea158991461047f57806342842e0e1461049b5780634e6b7351146104c457610246565b80630d449db01161020e5780630d449db0146103445780631400d1e41461036f57806318160ddd146103ac57806323b872dd146103d75780632f745c591461040057610246565b806301ffc9a71461024b57806302fb0c5e1461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613e31565b6109eb565b60405161027f919061466a565b60405180910390f35b34801561029457600080fd5b5061029d6109fd565b6040516102aa919061466a565b60405180910390f35b3480156102bf57600080fd5b506102c8610a10565b6040516102d59190614685565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613ec4565b610aa2565b60405161031291906145e1565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613db4565b610b27565b005b34801561035057600080fd5b50610359610c3f565b6040516103669190614685565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613e83565b610ccd565b6040516103a3919061466a565b60405180910390f35b3480156103b857600080fd5b506103c1610d4b565b6040516103ce91906149e7565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613cae565b610d58565b005b34801561040c57600080fd5b5061042760048036038101906104229190613db4565b610db8565b60405161043491906149e7565b60405180910390f35b34801561044957600080fd5b50610452610e5d565b005b34801561046057600080fd5b506104696110a0565b604051610476919061466a565b60405180910390f35b61049960048036038101906104949190613ec4565b6110b3565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613cae565b61120c565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613ec4565b61122c565b6040516104f89190614685565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613ec4565b6112cc565b60405161053591906149e7565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613c49565b611363565b005b34801561057357600080fd5b5061058e60048036038101906105899190613e83565b61142f565b005b34801561059c57600080fd5b506105b760048036038101906105b29190613ec4565b6114c5565b6040516105c491906145e1565b60405180910390f35b3480156105d957600080fd5b506105f460048036038101906105ef9190613ec4565b611577565b6040516106019190614685565b60405180910390f35b34801561061657600080fd5b50610631600480360381019061062c9190613c20565b61161c565b60405161063e91906149e7565b60405180910390f35b34801561065357600080fd5b5061065c6116d4565b005b34801561066a57600080fd5b5061067361175c565b005b34801561068157600080fd5b5061069c60048036038101906106979190613ec4565b611804565b6040516106a99190614685565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613c20565b6118a4565b6040516106e69190614648565b60405180910390f35b3480156106fb57600080fd5b50610704611a20565b60405161071191906145e1565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190613ec4565b611a4a565b60405161074e919061466a565b60405180910390f35b34801561076357600080fd5b5061076c611a5c565b6040516107799190614685565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613f6c565b611aee565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613d78565b611c43565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613df0565b611c59565b005b34801561080957600080fd5b50610812611d8d565b005b34801561082057600080fd5b5061083b60048036038101906108369190613cfd565b611e35565b005b34801561084957600080fd5b50610864600480360381019061085f9190613ec4565b611e97565b6040516108719190614685565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c9190613c20565b611f3e565b6040516108ae91906149e7565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613ec4565b611f56565b6040516108eb91906149e7565b60405180910390f35b34801561090057600080fd5b50610909612133565b6040516109169190614685565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190613ec4565b612161565b6040516109539190614685565b60405180910390f35b34801561096857600080fd5b50610983600480360381019061097e9190613c72565b612206565b604051610990919061466a565b60405180910390f35b3480156109a557600080fd5b506109c060048036038101906109bb9190613c20565b61229a565b005b3480156109ce57600080fd5b506109e960048036038101906109e49190613eed565b612392565b005b60006109f6826124ac565b9050919050565b600a60169054906101000a900460ff1681565b606060008054610a1f90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4b90614d3c565b8015610a985780601f10610a6d57610100808354040283529160200191610a98565b820191906000526020600020905b815481529060010190602001808311610a7b57829003601f168201915b5050505050905090565b6000610aad82612526565b610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390614887565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b32826114c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90614927565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc2612592565b73ffffffffffffffffffffffffffffffffffffffff161480610bf15750610bf081610beb612592565b612206565b5b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790614807565b60405180910390fd5b610c3a838361259a565b505050565b600b8054610c4c90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7890614d3c565b8015610cc55780601f10610c9a57610100808354040283529160200191610cc5565b820191906000526020600020905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b6000805b600a60149054906101000a900461ffff1661ffff16811015610d40578280519060200120600d6000838152602001908152602001600020604051610d159190614584565b60405180910390201415610d2d576001915050610d46565b8080610d3890614dca565b915050610cd1565b50600090505b919050565b6000600880549050905090565b610d69610d63612592565b82612653565b610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90614967565b60405180910390fd5b610db3838383612731565b505050565b6000610dc38361161c565b8210610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb906146c7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600a60169054906101000a900460ff16610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614947565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906146a7565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f93906149a7565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b818110156110575761100933600a60149054906101000a900461ffff1661ffff1661298d565b600a601481819054906101000a900461ffff168092919061102990614d9f565b91906101000a81548161ffff021916908361ffff16021790555050808061104f90614dca565b915050610fe3565b506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600a60179054906101000a900460ff1681565b600a60169054906101000a900460ff16611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614947565b60405180910390fd5b6005811115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90614767565b60405180910390fd5b61114f81611f56565b341015611191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118890614747565b60405180910390fd5b60005b81811015611208576111ba33600a60149054906101000a900461ffff1661ffff1661298d565b600a601481819054906101000a900461ffff16809291906111da90614d9f565b91906101000a81548161ffff021916908361ffff16021790555050808061120090614dca565b915050611194565b5050565b61122783838360405180602001604052806000815250611e35565b505050565b600d602052806000526040600020600091509050805461124b90614d3c565b80601f016020809104026020016040519081016040528092919081815260200182805461127790614d3c565b80156112c45780601f10611299576101008083540402835291602001916112c4565b820191906000526020600020905b8154815290600101906020018083116112a757829003601f168201915b505050505081565b60006112d6610d4b565b8210611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e90614987565b60405180910390fd5b60088281548110611351577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61136b612592565b73ffffffffffffffffffffffffffffffffffffffff16611389611a20565b73ffffffffffffffffffffffffffffffffffffffff16146113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d6906148a7565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561142a573d6000803e3d6000fd5b505050565b611437612592565b73ffffffffffffffffffffffffffffffffffffffff16611455611a20565b73ffffffffffffffffffffffffffffffffffffffff16146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a2906148a7565b60405180910390fd5b80600b90805190602001906114c1929190613999565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590614847565b60405180910390fd5b80915050919050565b6060600d6000838152602001908152602001600020805461159790614d3c565b80601f01602080910402602001604051908101604052809291908181526020018280546115c390614d3c565b80156116105780601f106115e557610100808354040283529160200191611610565b820191906000526020600020905b8154815290600101906020018083116115f357829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490614827565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116dc612592565b73ffffffffffffffffffffffffffffffffffffffff166116fa611a20565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611747906148a7565b60405180910390fd5b61175a60006129ab565b565b611764612592565b73ffffffffffffffffffffffffffffffffffffffff16611782611a20565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906148a7565b60405180910390fd5b600a60179054906101000a900460ff1615600a60176101000a81548160ff021916908315150217905550565b600c602052806000526040600020600091509050805461182390614d3c565b80601f016020809104026020016040519081016040528092919081815260200182805461184f90614d3c565b801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505050505081565b606060006118b18361161c565b9050600081141561193457600067ffffffffffffffff8111156118fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561192b5781602001602082028036833780820191505090505b50915050611a1b565b60008167ffffffffffffffff811115611976577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119a45781602001602082028036833780820191505090505b50905060005b82811015611a14576119bc8582610db8565b8282815181106119f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a0c90614dca565b9150506119aa565b5080925050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611a5582612526565b9050919050565b606060018054611a6b90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9790614d3c565b8015611ae45780601f10611ab957610100808354040283529160200191611ae4565b820191906000526020600020905b815481529060010190602001808311611ac757829003601f168201915b5050505050905090565b611af7846114c5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906148e7565b60405180910390fd5b611b6d836114c5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd1906147e7565b60405180910390fd5b600a60179054906101000a900460ff16611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c20906149c7565b60405180910390fd5b611c34848383612392565b611c3d83612a71565b50505050565b611c55611c4e612592565b8383612b82565b5050565b611c61612592565b73ffffffffffffffffffffffffffffffffffffffff16611c7f611a20565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc906148a7565b60405180910390fd5b60005b8151811015611d8957600e6000838381518110611d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d7190614dca565b91905055508080611d8190614dca565b915050611cd8565b5050565b611d95612592565b73ffffffffffffffffffffffffffffffffffffffff16611db3611a20565b73ffffffffffffffffffffffffffffffffffffffff1614611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e00906148a7565b60405180910390fd5b600a60169054906101000a900460ff1615600a60166101000a81548160ff021916908315150217905550565b611e46611e40612592565b83612653565b611e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7c90614967565b60405180910390fd5b611e9184848484612cef565b50505050565b6060611ea282612526565b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614907565b60405180910390fd5b6000611eeb612d4b565b90506000815111611f0b5760405180602001604052806000815250611f36565b80611f1584612ddd565b604051602001611f2692919061459b565b6040516020818303038152906040525b915050919050565b600e6020528060005260406000206000915090505481565b60008066354a6ba7a1800090506101f4600a60149054906101000a900461ffff1661ffff1610158015611f9e57506103e8600a60149054906101000a900461ffff1661ffff16105b15611fb2576658d15e17628000905061211c565b6103e8600a60149054906101000a900461ffff1661ffff1610158015611fed57506105dc600a60149054906101000a900461ffff1661ffff16105b1561200157667c585087238000905061211b565b6105dc600a60149054906101000a900461ffff1661ffff161015801561203c57506107d0600a60149054906101000a900461ffff1661ffff16105b1561205057669fdf42f6e48000905061211a565b6107d0600a60149054906101000a900461ffff1661ffff161015801561208b57506109c4600a60149054906101000a900461ffff1661ffff16105b1561209f5766c3663566a580009050612119565b6109c4600a60149054906101000a900461ffff1661ffff16101580156120da5750610bb8600a60149054906101000a900461ffff1661ffff16105b156120ee5766e6ed27d66680009050612118565b610bb8600a60149054906101000a900461ffff1661ffff16106121175767010a741a4627800090505b5b5b5b5b5b82816121289190614bd8565b905080915050919050565b606061213d612d4b565b60405160200161214d91906145bf565b604051602081830303815290604052905090565b6060600c6000838152602001908152602001600020805461218190614d3c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ad90614d3c565b80156121fa5780601f106121cf576101008083540402835291602001916121fa565b820191906000526020600020905b8154815290600101906020018083116121dd57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122a2612592565b73ffffffffffffffffffffffffffffffffffffffff166122c0611a20565b73ffffffffffffffffffffffffffffffffffffffff1614612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d906148a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614707565b60405180910390fd5b61238f816129ab565b50565b600a60179054906101000a900460ff166123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d8906149c7565b60405180910390fd5b6123ea836114c5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e906148e7565b60405180910390fd5b81600d6000858152602001908152602001600020908051906020019061247e929190613999565b5080600c600085815260200190815260200160002090805190602001906124a6929190613999565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251f575061251e82612f8a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661260d836114c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265e82612526565b61269d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612694906147c7565b60405180910390fd5b60006126a8836114c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061271757508373ffffffffffffffffffffffffffffffffffffffff166126ff84610aa2565b73ffffffffffffffffffffffffffffffffffffffff16145b8061272857506127278185612206565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612751826114c5565b73ffffffffffffffffffffffffffffffffffffffff16146127a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279e906148c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e90614787565b60405180910390fd5b61282283838361306c565b61282d60008261259a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287d9190614c32565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d49190614b51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129a78282604051806020016040528060008152506130cb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612a7c826114c5565b9050612a8a8160008461306c565b612a9560008361259a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ae59190614c32565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be8906147a7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ce2919061466a565b60405180910390a3505050565b612cfa848484612731565b612d0684848484613126565b612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906146e7565b60405180910390fd5b50505050565b6060600b8054612d5a90614d3c565b80601f0160208091040260200160405190810160405280929190818152602001828054612d8690614d3c565b8015612dd35780601f10612da857610100808354040283529160200191612dd3565b820191906000526020600020905b815481529060010190602001808311612db657829003601f168201915b5050505050905090565b60606000821415612e25576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f85565b600082905060005b60008214612e57578080612e4090614dca565b915050600a82612e509190614ba7565b9150612e2d565b60008167ffffffffffffffff811115612e99577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ecb5781602001600182028036833780820191505090505b5090505b60008514612f7e57600182612ee49190614c32565b9150600a85612ef39190614e13565b6030612eff9190614b51565b60f81b818381518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f779190614ba7565b9450612ecf565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061305557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806130655750613064826132bd565b5b9050919050565b600a60169054906101000a900460ff166130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b290614947565b60405180910390fd5b6130c6838383613327565b505050565b6130d5838361343b565b6130e26000848484613126565b613121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613118906146e7565b60405180910390fd5b505050565b60006131478473ffffffffffffffffffffffffffffffffffffffff16613609565b156132b0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613170612592565b8786866040518563ffffffff1660e01b815260040161319294939291906145fc565b602060405180830381600087803b1580156131ac57600080fd5b505af19250505080156131dd57506040513d601f19601f820116820180604052508101906131da9190613e5a565b60015b613260573d806000811461320d576040519150601f19603f3d011682016040523d82523d6000602084013e613212565b606091505b50600081511415613258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324f906146e7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b5565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61333283838361361c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133755761337081613621565b6133b4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133b3576133b2838261366a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133f7576133f2816137d7565b613436565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461343557613434828261391a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a290614867565b60405180910390fd5b6134b481612526565b156134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134eb90614727565b60405180910390fd5b6135006000838361306c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135509190614b51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136778461161c565b6136819190614c32565b9050600060076000848152602001908152602001600020549050818114613766576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137eb9190614c32565b9050600060096000848152602001908152602001600020549050600060088381548110613841577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613889577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006139258361161c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546139a590614d3c565b90600052602060002090601f0160209004810192826139c75760008555613a0e565b82601f106139e057805160ff1916838001178555613a0e565b82800160010185558215613a0e579182015b82811115613a0d5782518255916020019190600101906139f2565b5b509050613a1b9190613a1f565b5090565b5b80821115613a38576000816000905550600101613a20565b5090565b6000613a4f613a4a84614a27565b614a02565b90508083825260208201905082856020860282011115613a6e57600080fd5b60005b85811015613a9e5781613a848882613b24565b845260208401935060208301925050600181019050613a71565b5050509392505050565b6000613abb613ab684614a53565b614a02565b905082815260208101848484011115613ad357600080fd5b613ade848285614cfa565b509392505050565b6000613af9613af484614a84565b614a02565b905082815260208101848484011115613b1157600080fd5b613b1c848285614cfa565b509392505050565b600081359050613b338161565c565b92915050565b600081359050613b4881615673565b92915050565b600082601f830112613b5f57600080fd5b8135613b6f848260208601613a3c565b91505092915050565b600081359050613b878161568a565b92915050565b600081359050613b9c816156a1565b92915050565b600081519050613bb1816156a1565b92915050565b600082601f830112613bc857600080fd5b8135613bd8848260208601613aa8565b91505092915050565b600082601f830112613bf257600080fd5b8135613c02848260208601613ae6565b91505092915050565b600081359050613c1a816156b8565b92915050565b600060208284031215613c3257600080fd5b6000613c4084828501613b24565b91505092915050565b600060208284031215613c5b57600080fd5b6000613c6984828501613b39565b91505092915050565b60008060408385031215613c8557600080fd5b6000613c9385828601613b24565b9250506020613ca485828601613b24565b9150509250929050565b600080600060608486031215613cc357600080fd5b6000613cd186828701613b24565b9350506020613ce286828701613b24565b9250506040613cf386828701613c0b565b9150509250925092565b60008060008060808587031215613d1357600080fd5b6000613d2187828801613b24565b9450506020613d3287828801613b24565b9350506040613d4387828801613c0b565b925050606085013567ffffffffffffffff811115613d6057600080fd5b613d6c87828801613bb7565b91505092959194509250565b60008060408385031215613d8b57600080fd5b6000613d9985828601613b24565b9250506020613daa85828601613b78565b9150509250929050565b60008060408385031215613dc757600080fd5b6000613dd585828601613b24565b9250506020613de685828601613c0b565b9150509250929050565b600060208284031215613e0257600080fd5b600082013567ffffffffffffffff811115613e1c57600080fd5b613e2884828501613b4e565b91505092915050565b600060208284031215613e4357600080fd5b6000613e5184828501613b8d565b91505092915050565b600060208284031215613e6c57600080fd5b6000613e7a84828501613ba2565b91505092915050565b600060208284031215613e9557600080fd5b600082013567ffffffffffffffff811115613eaf57600080fd5b613ebb84828501613be1565b91505092915050565b600060208284031215613ed657600080fd5b6000613ee484828501613c0b565b91505092915050565b600080600060608486031215613f0257600080fd5b6000613f1086828701613c0b565b935050602084013567ffffffffffffffff811115613f2d57600080fd5b613f3986828701613be1565b925050604084013567ffffffffffffffff811115613f5657600080fd5b613f6286828701613be1565b9150509250925092565b60008060008060808587031215613f8257600080fd5b6000613f9087828801613c0b565b9450506020613fa187828801613c0b565b935050604085013567ffffffffffffffff811115613fbe57600080fd5b613fca87828801613be1565b925050606085013567ffffffffffffffff811115613fe757600080fd5b613ff387828801613be1565b91505092959194509250565b600061400b8383614566565b60208301905092915050565b61402081614c66565b82525050565b600061403182614ada565b61403b8185614b08565b935061404683614ab5565b8060005b8381101561407757815161405e8882613fff565b975061406983614afb565b92505060018101905061404a565b5085935050505092915050565b61408d81614c8a565b82525050565b600061409e82614ae5565b6140a88185614b19565b93506140b8818560208601614d09565b6140c181614f00565b840191505092915050565b600081546140d981614d3c565b6140e38186614b2a565b945060018216600081146140fe576001811461410f57614142565b60ff19831686528186019350614142565b61411885614ac5565b60005b8381101561413a5781548189015260018201915060208101905061411b565b838801955050505b50505092915050565b600061415682614af0565b6141608185614b35565b9350614170818560208601614d09565b61417981614f00565b840191505092915050565b600061418f82614af0565b6141998185614b46565b93506141a9818560208601614d09565b80840191505092915050565b60006141c2603783614b35565b91506141cd82614f11565b604082019050919050565b60006141e5602b83614b35565b91506141f082614f60565b604082019050919050565b6000614208603283614b35565b915061421382614faf565b604082019050919050565b600061422b602683614b35565b915061423682614ffe565b604082019050919050565b600061424e601c83614b35565b91506142598261504d565b602082019050919050565b6000614271602083614b35565b915061427c82615076565b602082019050919050565b6000614294602183614b35565b915061429f8261509f565b604082019050919050565b60006142b7602483614b35565b91506142c2826150ee565b604082019050919050565b60006142da601983614b35565b91506142e58261513d565b602082019050919050565b60006142fd602c83614b35565b915061430882615166565b604082019050919050565b6000614320602083614b35565b915061432b826151b5565b602082019050919050565b6000614343603883614b35565b915061434e826151de565b604082019050919050565b6000614366602a83614b35565b91506143718261522d565b604082019050919050565b6000614389602983614b35565b91506143948261527c565b604082019050919050565b60006143ac600883614b46565b91506143b7826152cb565b600882019050919050565b60006143cf602083614b35565b91506143da826152f4565b602082019050919050565b60006143f2602c83614b35565b91506143fd8261531d565b604082019050919050565b6000614415602083614b35565b91506144208261536c565b602082019050919050565b6000614438602983614b35565b915061444382615395565b604082019050919050565b600061445b602d83614b35565b9150614466826153e4565b604082019050919050565b600061447e602f83614b35565b915061448982615433565b604082019050919050565b60006144a1602183614b35565b91506144ac82615482565b604082019050919050565b60006144c4602d83614b35565b91506144cf826154d1565b604082019050919050565b60006144e7603183614b35565b91506144f282615520565b604082019050919050565b600061450a602c83614b35565b91506145158261556f565b604082019050919050565b600061452d602d83614b35565b9150614538826155be565b604082019050919050565b6000614550602e83614b35565b915061455b8261560d565b604082019050919050565b61456f81614cf0565b82525050565b61457e81614cf0565b82525050565b600061459082846140cc565b915081905092915050565b60006145a78285614184565b91506145b38284614184565b91508190509392505050565b60006145cb8284614184565b91506145d68261439f565b915081905092915050565b60006020820190506145f66000830184614017565b92915050565b60006080820190506146116000830187614017565b61461e6020830186614017565b61462b6040830185614575565b818103606083015261463d8184614093565b905095945050505050565b600060208201905081810360008301526146628184614026565b905092915050565b600060208201905061467f6000830184614084565b92915050565b6000602082019050818103600083015261469f818461414b565b905092915050565b600060208201905081810360008301526146c0816141b5565b9050919050565b600060208201905081810360008301526146e0816141d8565b9050919050565b60006020820190508181036000830152614700816141fb565b9050919050565b600060208201905081810360008301526147208161421e565b9050919050565b6000602082019050818103600083015261474081614241565b9050919050565b6000602082019050818103600083015261476081614264565b9050919050565b6000602082019050818103600083015261478081614287565b9050919050565b600060208201905081810360008301526147a0816142aa565b9050919050565b600060208201905081810360008301526147c0816142cd565b9050919050565b600060208201905081810360008301526147e0816142f0565b9050919050565b6000602082019050818103600083015261480081614313565b9050919050565b6000602082019050818103600083015261482081614336565b9050919050565b6000602082019050818103600083015261484081614359565b9050919050565b600060208201905081810360008301526148608161437c565b9050919050565b60006020820190508181036000830152614880816143c2565b9050919050565b600060208201905081810360008301526148a0816143e5565b9050919050565b600060208201905081810360008301526148c081614408565b9050919050565b600060208201905081810360008301526148e08161442b565b9050919050565b600060208201905081810360008301526149008161444e565b9050919050565b6000602082019050818103600083015261492081614471565b9050919050565b6000602082019050818103600083015261494081614494565b9050919050565b60006020820190508181036000830152614960816144b7565b9050919050565b60006020820190508181036000830152614980816144da565b9050919050565b600060208201905081810360008301526149a0816144fd565b9050919050565b600060208201905081810360008301526149c081614520565b9050919050565b600060208201905081810360008301526149e081614543565b9050919050565b60006020820190506149fc6000830184614575565b92915050565b6000614a0c614a1d565b9050614a188282614d6e565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4257614a41614ed1565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a6e57614a6d614ed1565b5b614a7782614f00565b9050602081019050919050565b600067ffffffffffffffff821115614a9f57614a9e614ed1565b5b614aa882614f00565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b5c82614cf0565b9150614b6783614cf0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b9c57614b9b614e44565b5b828201905092915050565b6000614bb282614cf0565b9150614bbd83614cf0565b925082614bcd57614bcc614e73565b5b828204905092915050565b6000614be382614cf0565b9150614bee83614cf0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c2757614c26614e44565b5b828202905092915050565b6000614c3d82614cf0565b9150614c4883614cf0565b925082821015614c5b57614c5a614e44565b5b828203905092915050565b6000614c7182614cd0565b9050919050565b6000614c8382614cd0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d27578082015181840152602081019050614d0c565b83811115614d36576000848401525b50505050565b60006002820490506001821680614d5457607f821691505b60208210811415614d6857614d67614ea2565b5b50919050565b614d7782614f00565b810181811067ffffffffffffffff82111715614d9657614d95614ed1565b5b80604052505050565b6000614daa82614cc2565b915061ffff821415614dbf57614dbe614e44565b5b600182019050919050565b6000614dd582614cf0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e0857614e07614e44565b5b600182019050919050565b6000614e1e82614cf0565b9150614e2983614cf0565b925082614e3957614e38614e73565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f75206d75737420626520696e20746865206769766561776179206c69737460008201527f20746f20686176652061206672656520677265656e792e000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f506c656173652c2073656e642074686520636f727265637420616d6f756e742e600082015250565b7f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f54686973206973206e6f7420796f757220746f6b656e2e20426164204775792e600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60008201527f6b656e2e20426164204775792e00000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468652073616c65206d7573742062652061637469766520746f20616c6c6f7760008201527f207468697320616374696f6e2e00000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75206d7573742062652074686520646972656374206f776e657220746f2060008201527f627579206120677265656e792e00000000000000000000000000000000000000602082015250565b7f54686520426f6f7468206d7573742062652061637469766520746f20616c6c6f60008201527f77207468697320616374696f6e2e000000000000000000000000000000000000602082015250565b61566581614c66565b811461567057600080fd5b50565b61567c81614c78565b811461568757600080fd5b50565b61569381614c8a565b811461569e57600080fd5b50565b6156aa81614c96565b81146156b557600080fd5b50565b6156c181614cf0565b81146156cc57600080fd5b5056fea26469706673582212208eaea2771fe0611a92d9c50131efcba878bbf2aebe6b88a6c94a752b184e93f864736f6c63430008020033

Deployed Bytecode Sourcemap

42864:8011:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50696:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42966:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21026:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22585:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22108:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43037:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49078:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34911:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23335:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34579:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46468:629;;;;;;;;;;;;;:::i;:::-;;42999:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45865:533;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23745:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43122:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35101:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50076:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43526:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20720:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48840:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20450:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42018:103;;;;;;;;;;;;;:::i;:::-;;44032:91;;;;;;;;;;;;;:::i;:::-;;43073:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44315:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41367:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48613:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21195:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47353:533;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22878:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49733:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43878:81;;;;;;;;;;;;;:::i;:::-;;24001:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21370:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43173:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44990:756;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43279:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49499:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42276:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48086:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50696:176;50799:4;50828:36;50852:11;50828:23;:36::i;:::-;50821:43;;50696:176;;;:::o;42966:26::-;;;;;;;;;;;;;:::o;21026:100::-;21080:13;21113:5;21106:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21026:100;:::o;22585:221::-;22661:7;22689:16;22697:7;22689;:16::i;:::-;22681:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22774:15;:24;22790:7;22774:24;;;;;;;;;;;;;;;;;;;;;22767:31;;22585:221;;;:::o;22108:411::-;22189:13;22205:23;22220:7;22205:14;:23::i;:::-;22189:39;;22253:5;22247:11;;:2;:11;;;;22239:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22347:5;22331:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22356:37;22373:5;22380:12;:10;:12::i;:::-;22356:16;:37::i;:::-;22331:62;22309:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22490:21;22499:2;22503:7;22490:8;:21::i;:::-;22108:411;;;:::o;43037:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49078:295::-;49138:4;49160:13;49155:188;49183:11;;;;;;;;;;;49175:19;;:5;:19;49155:188;;;49278:4;49262:22;;;;;;49239:10;:17;49250:5;49239:17;;;;;;;;;;;49223:35;;;;;;:::i;:::-;;;;;;;;:61;49220:112;;;49312:4;49305:11;;;;;49220:112;49196:7;;;;;:::i;:::-;;;;49155:188;;;;49360:5;49353:12;;49078:295;;;;:::o;34911:113::-;34972:7;34999:10;:17;;;;34992:24;;34911:113;:::o;23335:339::-;23530:41;23549:12;:10;:12::i;:::-;23563:7;23530:18;:41::i;:::-;23522:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23638:28;23648:4;23654:2;23658:7;23638:9;:28::i;:::-;23335:339;;;:::o;34579:256::-;34676:7;34712:23;34729:5;34712:16;:23::i;:::-;34704:5;:31;34696:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34801:12;:19;34814:5;34801:19;;;;;;;;;;;;;;;:26;34821:5;34801:26;;;;;;;;;;;;34794:33;;34579:256;;;;:::o;46468:629::-;46522:6;;;;;;;;;;;46514:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;46660:1;46637:8;:20;46646:10;46637:20;;;;;;;;;;;;;;;;:24;46629:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;46776:9;46762:23;;:10;:23;;;46754:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;46871:11;46885:8;:20;46894:10;46885:20;;;;;;;;;;;;;;;;46871:34;;46923:13;46918:135;46950:3;46942:5;:11;46918:135;;;46979:34;46989:10;47001:11;;;;;;;;;;;46979:34;;:9;:34::i;:::-;47028:11;;:13;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;46955:7;;;;;:::i;:::-;;;;46918:135;;;;47088:1;47065:8;:20;47074:10;47065:20;;;;;;;;;;;;;;;:24;;;;46468:629;:::o;42999:31::-;;;;;;;;;;;;;:::o;45865:533::-;45937:6;;;;;;;;;;;45929:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;46064:1;46052:8;:13;;46044:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;46168:18;46177:8;46168;:18::i;:::-;46155:9;:31;;46147:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;46256:13;46251:140;46283:8;46275:5;:16;46251:140;;;46317:34;46327:10;46339:11;;;;;;;;;;;46317:34;;:9;:34::i;:::-;46366:11;;:13;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;46293:7;;;;;:::i;:::-;;;;46251:140;;;;45865:533;:::o;23745:185::-;23883:39;23900:4;23906:2;23910:7;23883:39;;;;;;;;;;;;:16;:39::i;:::-;23745:185;;;:::o;43122:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35101:233::-;35176:7;35212:30;:28;:30::i;:::-;35204:5;:38;35196:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35309:10;35320:5;35309:17;;;;;;;;;;;;;;;;;;;;;;;;35302:24;;35101:233;;;:::o;50076:163::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50154:15:::1;50172:21;50154:39;;50204:9;:18;;:27;50223:7;50204:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41658:1;50076:163:::0;:::o;43526:103::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43618:3:::1;43600:15;:21;;;;;;;;;;;;:::i;:::-;;43526:103:::0;:::o;20720:239::-;20792:7;20812:13;20828:7;:16;20836:7;20828:16;;;;;;;;;;;;;;;;;;;;;20812:32;;20880:1;20863:19;;:5;:19;;;;20855:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20946:5;20939:12;;;20720:239;;;:::o;48840:115::-;48895:13;48928:10;:19;48939:7;48928:19;;;;;;;;;;;48921:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48840:115;;;:::o;20450:208::-;20522:7;20567:1;20550:19;;:5;:19;;;;20542:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20634:9;:16;20644:5;20634:16;;;;;;;;;;;;;;;;20627:23;;20450:208;;;:::o;42018:103::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42083:30:::1;42110:1;42083:18;:30::i;:::-;42018:103::o:0;44032:91::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44104:11:::1;;;;;;;;;;;44103:12;44089:11;;:26;;;;;;;;;;;;;;;;;;44032:91::o:0;43073:42::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44315:500::-;44378:16;44412:18;44433:20;44443:9;44433;:20::i;:::-;44412:41;;44492:1;44478:10;:15;44474:334;;;44531:1;44517:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44510:23;;;;;44474:334;44566:23;44606:10;44592:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44566:51;;44637:13;44632:137;44660:10;44652:5;:18;44632:137;;;44716:37;44736:9;44747:5;44716:19;:37::i;:::-;44700:6;44707:5;44700:13;;;;;;;;;;;;;;;;;;;;;:53;;;;;44672:7;;;;;:::i;:::-;;;;44632:137;;;;44790:6;44783:13;;;;44315:500;;;;:::o;41367:87::-;41413:7;41440:6;;;;;;;;;;;41433:13;;41367:87;:::o;48613:113::-;48673:4;48702:16;48710:7;48702;:16::i;:::-;48695:23;;48613:113;;;:::o;21195:104::-;21251:13;21284:7;21277:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21195:104;:::o;47353:533::-;47502:21;47510:12;47502:7;:21::i;:::-;47488:35;;:10;:35;;;47480:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;47617:22;47625:13;47617:7;:22::i;:::-;47603:36;;:10;:36;;;47595:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;47705:11;;;;;;;;;;;47697:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;47815:32;47824:12;47838:4;47844:2;47815:8;:32::i;:::-;47858:20;47864:13;47858:5;:20::i;:::-;47353:533;;;;:::o;22878:155::-;22973:52;22992:12;:10;:12::i;:::-;23006:8;23016;22973:18;:52::i;:::-;22878:155;;:::o;49733:193::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49818:13:::1;49813:106;49841:7;:14;49833:5;:22;49813:106;;;49881:8;:24;49890:7;49898:5;49890:14;;;;;;;;;;;;;;;;;;;;;;49881:24;;;;;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;49857:7;;;;;:::i;:::-;;;;49813:106;;;;49733:193:::0;:::o;43878:81::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43945:6:::1;;;;;;;;;;;43944:7;43935:6;;:16;;;;;;;;;;;;;;;;;;43878:81::o:0;24001:328::-;24176:41;24195:12;:10;:12::i;:::-;24209:7;24176:18;:41::i;:::-;24168:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24282:39;24296:4;24302:2;24306:7;24315:5;24282:13;:39::i;:::-;24001:328;;;;:::o;21370:334::-;21443:13;21477:16;21485:7;21477;:16::i;:::-;21469:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21558:21;21582:10;:8;:10::i;:::-;21558:34;;21634:1;21616:7;21610:21;:25;:86;;;;;;;;;;;;;;;;;21662:7;21671:18;:7;:16;:18::i;:::-;21645:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21610:86;21603:93;;;21370:334;;;:::o;43173:41::-;;;;;;;;;;;;;;;;;:::o;44990:756::-;45044:7;45069:13;45085:11;45069:27;;45135:3;45120:11;;;;;;;;;;;:18;;;;:40;;;;;45156:4;45142:11;;;;;;;;;;;:18;;;45120:40;45117:559;;;45185:11;45177:19;;45117:559;;;45232:4;45217:11;;;;;;;;;;;:19;;;;:41;;;;;45254:4;45240:11;;;;;;;;;;;:18;;;45217:41;45214:462;;;45283:11;45275:19;;45214:462;;;45330:4;45315:11;;;;;;;;;;;:19;;;;:41;;;;;45352:4;45338:11;;;;;;;;;;;:18;;;45315:41;45312:364;;;45381:11;45373:19;;45312:364;;;45428:4;45413:11;;;;;;;;;;;:19;;;;:41;;;;;45450:4;45436:11;;;;;;;;;;;:18;;;45413:41;45410:266;;;45479:11;45471:19;;45410:266;;;45526:4;45511:11;;;;;;;;;;;:19;;;;:41;;;;;45548:4;45534:11;;;;;;;;;;;:18;;;45511:41;45508:168;;;45577:11;45569:19;;45508:168;;;45624:4;45609:11;;;;;;;;;;;:19;;;45606:70;;45653:11;45645:19;;45606:70;45508:168;45410:266;45312:364;45214:462;45117:559;45705:8;45697:5;:16;;;;:::i;:::-;45689:24;;45733:5;45726:12;;;44990:756;;;:::o;43279:138::-;43323:13;43385:10;:8;:10::i;:::-;43368:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;43354:55;;43279:138;:::o;49499:124::-;49560:13;49598:8;:17;49607:7;49598:17;;;;;;;;;;;49591:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49499:124;;;:::o;23104:164::-;23201:4;23225:18;:25;23244:5;23225:25;;;;;;;;;;;;;;;:35;23251:8;23225:35;;;;;;;;;;;;;;;;;;;;;;;;;23218:42;;23104:164;;;;:::o;42276:201::-;41598:12;:10;:12::i;:::-;41587:23;;:7;:5;:7::i;:::-;:23;;;41579:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42385:1:::1;42365:22;;:8;:22;;;;42357:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42441:28;42460:8;42441:18;:28::i;:::-;42276:201:::0;:::o;48086:387::-;48185:11;;;;;;;;;;;48177:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;48314:16;48322:7;48314;:16::i;:::-;48300:30;;:10;:30;;;48292:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;48428:4;48406:10;:19;48417:7;48406:19;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;48463:2;48443:8;:17;48452:7;48443:17;;;;;;;;;;;:22;;;;;;;;;;;;:::i;:::-;;48086:387;;;:::o;34271:224::-;34373:4;34412:35;34397:50;;;:11;:50;;;;:90;;;;34451:36;34475:11;34451:23;:36::i;:::-;34397:90;34390:97;;34271:224;;;:::o;25839:127::-;25904:4;25956:1;25928:30;;:7;:16;25936:7;25928:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25921:37;;25839:127;;;:::o;15698:98::-;15751:7;15778:10;15771:17;;15698:98;:::o;29821:174::-;29923:2;29896:15;:24;29912:7;29896:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29979:7;29975:2;29941:46;;29950:23;29965:7;29950:14;:23::i;:::-;29941:46;;;;;;;;;;;;29821:174;;:::o;26133:348::-;26226:4;26251:16;26259:7;26251;:16::i;:::-;26243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26327:13;26343:23;26358:7;26343:14;:23::i;:::-;26327:39;;26396:5;26385:16;;:7;:16;;;:51;;;;26429:7;26405:31;;:20;26417:7;26405:11;:20::i;:::-;:31;;;26385:51;:87;;;;26440:32;26457:5;26464:7;26440:16;:32::i;:::-;26385:87;26377:96;;;26133:348;;;;:::o;29125:578::-;29284:4;29257:31;;:23;29272:7;29257:14;:23::i;:::-;:31;;;29249:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29367:1;29353:16;;:2;:16;;;;29345:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29423:39;29444:4;29450:2;29454:7;29423:20;:39::i;:::-;29527:29;29544:1;29548:7;29527:8;:29::i;:::-;29588:1;29569:9;:15;29579:4;29569:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29617:1;29600:9;:13;29610:2;29600:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29648:2;29629:7;:16;29637:7;29629:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29687:7;29683:2;29668:27;;29677:4;29668:27;;;;;;;;;;;;29125:578;;;:::o;26823:110::-;26899:26;26909:2;26913:7;26899:26;;;;;;;;;;;;:9;:26::i;:::-;26823:110;;:::o;42637:191::-;42711:16;42730:6;;;;;;;;;;;42711:25;;42756:8;42747:6;;:17;;;;;;;;;;;;;;;;;;42811:8;42780:40;;42801:8;42780:40;;;;;;;;;;;;42637:191;;:::o;28428:360::-;28488:13;28504:23;28519:7;28504:14;:23::i;:::-;28488:39;;28540:48;28561:5;28576:1;28580:7;28540:20;:48::i;:::-;28629:29;28646:1;28650:7;28629:8;:29::i;:::-;28691:1;28671:9;:16;28681:5;28671:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28710:7;:16;28718:7;28710:16;;;;;;;;;;;;28703:23;;;;;;;;;;;28772:7;28768:1;28744:36;;28753:5;28744:36;;;;;;;;;;;;28428:360;;:::o;30137:315::-;30292:8;30283:17;;:5;:17;;;;30275:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30379:8;30341:18;:25;30360:5;30341:25;;;;;;;;;;;;;;;:35;30367:8;30341:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30425:8;30403:41;;30418:5;30403:41;;;30435:8;30403:41;;;;;;:::i;:::-;;;;;;;;30137:315;;;:::o;25211:::-;25368:28;25378:4;25384:2;25388:7;25368:9;:28::i;:::-;25415:48;25438:4;25444:2;25448:7;25457:5;25415:22;:48::i;:::-;25407:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25211:315;;;;:::o;43699:113::-;43751:13;43789:15;43782:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43699:113;:::o;16169:723::-;16225:13;16455:1;16446:5;:10;16442:53;;;16473:10;;;;;;;;;;;;;;;;;;;;;16442:53;16505:12;16520:5;16505:20;;16536:14;16561:78;16576:1;16568:4;:9;16561:78;;16594:8;;;;;:::i;:::-;;;;16625:2;16617:10;;;;;:::i;:::-;;;16561:78;;;16649:19;16681:6;16671:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16649:39;;16699:154;16715:1;16706:5;:10;16699:154;;16743:1;16733:11;;;;;:::i;:::-;;;16810:2;16802:5;:10;;;;:::i;:::-;16789:2;:24;;;;:::i;:::-;16776:39;;16759:6;16766;16759:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16839:2;16830:11;;;;;:::i;:::-;;;16699:154;;;16877:6;16863:21;;;;;16169:723;;;;:::o;20081:305::-;20183:4;20235:25;20220:40;;;:11;:40;;;;:105;;;;20292:33;20277:48;;;:11;:48;;;;20220:105;:158;;;;20342:36;20366:11;20342:23;:36::i;:::-;20220:158;20200:178;;20081:305;;;:::o;50387:301::-;50528:6;;;;;;;;;;;50520:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;50635:45;50662:4;50668:2;50672:7;50635:26;:45::i;:::-;50387:301;;;:::o;27160:321::-;27290:18;27296:2;27300:7;27290:5;:18::i;:::-;27341:54;27372:1;27376:2;27380:7;27389:5;27341:22;:54::i;:::-;27319:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27160:321;;;:::o;31017:799::-;31172:4;31193:15;:2;:13;;;:15::i;:::-;31189:620;;;31245:2;31229:36;;;31266:12;:10;:12::i;:::-;31280:4;31286:7;31295:5;31229:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31225:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31488:1;31471:6;:13;:18;31467:272;;;31514:60;;;;;;;;;;:::i;:::-;;;;;;;;31467:272;31689:6;31683:13;31674:6;31670:2;31666:15;31659:38;31225:529;31362:41;;;31352:51;;;:6;:51;;;;31345:58;;;;;31189:620;31793:4;31786:11;;31017:799;;;;;;;:::o;18657:157::-;18742:4;18781:25;18766:40;;;:11;:40;;;;18759:47;;18657:157;;;:::o;35947:589::-;36091:45;36118:4;36124:2;36128:7;36091:26;:45::i;:::-;36169:1;36153:18;;:4;:18;;;36149:187;;;36188:40;36220:7;36188:31;:40::i;:::-;36149:187;;;36258:2;36250:10;;:4;:10;;;36246:90;;36277:47;36310:4;36316:7;36277:32;:47::i;:::-;36246:90;36149:187;36364:1;36350:16;;:2;:16;;;36346:183;;;36383:45;36420:7;36383:36;:45::i;:::-;36346:183;;;36456:4;36450:10;;:2;:10;;;36446:83;;36477:40;36505:2;36509:7;36477:27;:40::i;:::-;36446:83;36346:183;35947:589;;;:::o;27817:382::-;27911:1;27897:16;;:2;:16;;;;27889:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27970:16;27978:7;27970;:16::i;:::-;27969:17;27961:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28032:45;28061:1;28065:2;28069:7;28032:20;:45::i;:::-;28107:1;28090:9;:13;28100:2;28090:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28138:2;28119:7;:16;28127:7;28119:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28183:7;28179:2;28158:33;;28175:1;28158:33;;;;;;;;;;;;27817:382;;:::o;7798:387::-;7858:4;8066:12;8133:7;8121:20;8113:28;;8176:1;8169:4;:8;8162:15;;;7798:387;;;:::o;32388:126::-;;;;:::o;37259:164::-;37363:10;:17;;;;37336:15;:24;37352:7;37336:24;;;;;;;;;;;:44;;;;37391:10;37407:7;37391:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37259:164;:::o;38050:988::-;38316:22;38366:1;38341:22;38358:4;38341:16;:22::i;:::-;:26;;;;:::i;:::-;38316:51;;38378:18;38399:17;:26;38417:7;38399:26;;;;;;;;;;;;38378:47;;38546:14;38532:10;:28;38528:328;;38577:19;38599:12;:18;38612:4;38599:18;;;;;;;;;;;;;;;:34;38618:14;38599:34;;;;;;;;;;;;38577:56;;38683:11;38650:12;:18;38663:4;38650:18;;;;;;;;;;;;;;;:30;38669:10;38650:30;;;;;;;;;;;:44;;;;38800:10;38767:17;:30;38785:11;38767:30;;;;;;;;;;;:43;;;;38528:328;;38952:17;:26;38970:7;38952:26;;;;;;;;;;;38945:33;;;38996:12;:18;39009:4;38996:18;;;;;;;;;;;;;;;:34;39015:14;38996:34;;;;;;;;;;;38989:41;;;38050:988;;;;:::o;39333:1079::-;39586:22;39631:1;39611:10;:17;;;;:21;;;;:::i;:::-;39586:46;;39643:18;39664:15;:24;39680:7;39664:24;;;;;;;;;;;;39643:45;;40015:19;40037:10;40048:14;40037:26;;;;;;;;;;;;;;;;;;;;;;;;40015:48;;40101:11;40076:10;40087;40076:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40212:10;40181:15;:28;40197:11;40181:28;;;;;;;;;;;:41;;;;40353:15;:24;40369:7;40353:24;;;;;;;;;;;40346:31;;;40388:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39333:1079;;;;:::o;36837:221::-;36922:14;36939:20;36956:2;36939:16;:20::i;:::-;36922:37;;36997:7;36970:12;:16;36983:2;36970:16;;;;;;;;;;;;;;;:24;36987:6;36970:24;;;;;;;;;;;:34;;;;37044:6;37015:17;:26;37033:7;37015:26;;;;;;;;;;;:35;;;;36837:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1498:155::-;;1590:6;1577:20;1568:29;;1606:41;1641:5;1606:41;:::i;:::-;1558:95;;;;:::o;1676:303::-;;1796:3;1789:4;1781:6;1777:17;1773:27;1763:2;;1814:1;1811;1804:12;1763:2;1854:6;1841:20;1879:94;1969:3;1961:6;1954:4;1946:6;1942:17;1879:94;:::i;:::-;1870:103;;1753:226;;;;;:::o;1985:133::-;;2066:6;2053:20;2044:29;;2082:30;2106:5;2082:30;:::i;:::-;2034:84;;;;:::o;2124:137::-;;2207:6;2194:20;2185:29;;2223:32;2249:5;2223:32;:::i;:::-;2175:86;;;;:::o;2267:141::-;;2354:6;2348:13;2339:22;;2370:32;2396:5;2370:32;:::i;:::-;2329:79;;;;:::o;2427:271::-;;2531:3;2524:4;2516:6;2512:17;2508:27;2498:2;;2549:1;2546;2539:12;2498:2;2589:6;2576:20;2614:78;2688:3;2680:6;2673:4;2665:6;2661:17;2614:78;:::i;:::-;2605:87;;2488:210;;;;;:::o;2718:273::-;;2823:3;2816:4;2808:6;2804:17;2800:27;2790:2;;2841:1;2838;2831:12;2790:2;2881:6;2868:20;2906:79;2981:3;2973:6;2966:4;2958:6;2954:17;2906:79;:::i;:::-;2897:88;;2780:211;;;;;:::o;2997:139::-;;3081:6;3068:20;3059:29;;3097:33;3124:5;3097:33;:::i;:::-;3049:87;;;;:::o;3142:262::-;;3250:2;3238:9;3229:7;3225:23;3221:32;3218:2;;;3266:1;3263;3256:12;3218:2;3309:1;3334:53;3379:7;3370:6;3359:9;3355:22;3334:53;:::i;:::-;3324:63;;3280:117;3208:196;;;;:::o;3410:278::-;;3526:2;3514:9;3505:7;3501:23;3497:32;3494:2;;;3542:1;3539;3532:12;3494:2;3585:1;3610:61;3663:7;3654:6;3643:9;3639:22;3610:61;:::i;:::-;3600:71;;3556:125;3484:204;;;;:::o;3694:407::-;;;3819:2;3807:9;3798:7;3794:23;3790:32;3787:2;;;3835:1;3832;3825:12;3787:2;3878:1;3903:53;3948:7;3939:6;3928:9;3924:22;3903:53;:::i;:::-;3893:63;;3849:117;4005:2;4031:53;4076:7;4067:6;4056:9;4052:22;4031:53;:::i;:::-;4021:63;;3976:118;3777:324;;;;;:::o;4107:552::-;;;;4249:2;4237:9;4228:7;4224:23;4220:32;4217:2;;;4265:1;4262;4255:12;4217:2;4308:1;4333:53;4378:7;4369:6;4358:9;4354:22;4333:53;:::i;:::-;4323:63;;4279:117;4435:2;4461:53;4506:7;4497:6;4486:9;4482:22;4461:53;:::i;:::-;4451:63;;4406:118;4563:2;4589:53;4634:7;4625:6;4614:9;4610:22;4589:53;:::i;:::-;4579:63;;4534:118;4207:452;;;;;:::o;4665:809::-;;;;;4833:3;4821:9;4812:7;4808:23;4804:33;4801:2;;;4850:1;4847;4840:12;4801:2;4893:1;4918:53;4963:7;4954:6;4943:9;4939:22;4918:53;:::i;:::-;4908:63;;4864:117;5020:2;5046:53;5091:7;5082:6;5071:9;5067:22;5046:53;:::i;:::-;5036:63;;4991:118;5148:2;5174:53;5219:7;5210:6;5199:9;5195:22;5174:53;:::i;:::-;5164:63;;5119:118;5304:2;5293:9;5289:18;5276:32;5335:18;5327:6;5324:30;5321:2;;;5367:1;5364;5357:12;5321:2;5395:62;5449:7;5440:6;5429:9;5425:22;5395:62;:::i;:::-;5385:72;;5247:220;4791:683;;;;;;;:::o;5480:401::-;;;5602:2;5590:9;5581:7;5577:23;5573:32;5570:2;;;5618:1;5615;5608:12;5570:2;5661:1;5686:53;5731:7;5722:6;5711:9;5707:22;5686:53;:::i;:::-;5676:63;;5632:117;5788:2;5814:50;5856:7;5847:6;5836:9;5832:22;5814:50;:::i;:::-;5804:60;;5759:115;5560:321;;;;;:::o;5887:407::-;;;6012:2;6000:9;5991:7;5987:23;5983:32;5980:2;;;6028:1;6025;6018:12;5980:2;6071:1;6096:53;6141:7;6132:6;6121:9;6117:22;6096:53;:::i;:::-;6086:63;;6042:117;6198:2;6224:53;6269:7;6260:6;6249:9;6245:22;6224:53;:::i;:::-;6214:63;;6169:118;5970:324;;;;;:::o;6300:405::-;;6433:2;6421:9;6412:7;6408:23;6404:32;6401:2;;;6449:1;6446;6439:12;6401:2;6520:1;6509:9;6505:17;6492:31;6550:18;6542:6;6539:30;6536:2;;;6582:1;6579;6572:12;6536:2;6610:78;6680:7;6671:6;6660:9;6656:22;6610:78;:::i;:::-;6600:88;;6463:235;6391:314;;;;:::o;6711:260::-;;6818:2;6806:9;6797:7;6793:23;6789:32;6786:2;;;6834:1;6831;6824:12;6786:2;6877:1;6902:52;6946:7;6937:6;6926:9;6922:22;6902:52;:::i;:::-;6892:62;;6848:116;6776:195;;;;:::o;6977:282::-;;7095:2;7083:9;7074:7;7070:23;7066:32;7063:2;;;7111:1;7108;7101:12;7063:2;7154:1;7179:63;7234:7;7225:6;7214:9;7210:22;7179:63;:::i;:::-;7169:73;;7125:127;7053:206;;;;:::o;7265:375::-;;7383:2;7371:9;7362:7;7358:23;7354:32;7351:2;;;7399:1;7396;7389:12;7351:2;7470:1;7459:9;7455:17;7442:31;7500:18;7492:6;7489:30;7486:2;;;7532:1;7529;7522:12;7486:2;7560:63;7615:7;7606:6;7595:9;7591:22;7560:63;:::i;:::-;7550:73;;7413:220;7341:299;;;;:::o;7646:262::-;;7754:2;7742:9;7733:7;7729:23;7725:32;7722:2;;;7770:1;7767;7760:12;7722:2;7813:1;7838:53;7883:7;7874:6;7863:9;7859:22;7838:53;:::i;:::-;7828:63;;7784:117;7712:196;;;;:::o;7914:778::-;;;;8076:2;8064:9;8055:7;8051:23;8047:32;8044:2;;;8092:1;8089;8082:12;8044:2;8135:1;8160:53;8205:7;8196:6;8185:9;8181:22;8160:53;:::i;:::-;8150:63;;8106:117;8290:2;8279:9;8275:18;8262:32;8321:18;8313:6;8310:30;8307:2;;;8353:1;8350;8343:12;8307:2;8381:63;8436:7;8427:6;8416:9;8412:22;8381:63;:::i;:::-;8371:73;;8233:221;8521:2;8510:9;8506:18;8493:32;8552:18;8544:6;8541:30;8538:2;;;8584:1;8581;8574:12;8538:2;8612:63;8667:7;8658:6;8647:9;8643:22;8612:63;:::i;:::-;8602:73;;8464:221;8034:658;;;;;:::o;8698:924::-;;;;;8877:3;8865:9;8856:7;8852:23;8848:33;8845:2;;;8894:1;8891;8884:12;8845:2;8937:1;8962:53;9007:7;8998:6;8987:9;8983:22;8962:53;:::i;:::-;8952:63;;8908:117;9064:2;9090:53;9135:7;9126:6;9115:9;9111:22;9090:53;:::i;:::-;9080:63;;9035:118;9220:2;9209:9;9205:18;9192:32;9251:18;9243:6;9240:30;9237:2;;;9283:1;9280;9273:12;9237:2;9311:63;9366:7;9357:6;9346:9;9342:22;9311:63;:::i;:::-;9301:73;;9163:221;9451:2;9440:9;9436:18;9423:32;9482:18;9474:6;9471:30;9468:2;;;9514:1;9511;9504:12;9468:2;9542:63;9597:7;9588:6;9577:9;9573:22;9542:63;:::i;:::-;9532:73;;9394:221;8835:787;;;;;;;:::o;9628:179::-;;9718:46;9760:3;9752:6;9718:46;:::i;:::-;9796:4;9791:3;9787:14;9773:28;;9708:99;;;;:::o;9813:118::-;9900:24;9918:5;9900:24;:::i;:::-;9895:3;9888:37;9878:53;;:::o;9967:732::-;;10115:54;10163:5;10115:54;:::i;:::-;10185:86;10264:6;10259:3;10185:86;:::i;:::-;10178:93;;10295:56;10345:5;10295:56;:::i;:::-;10374:7;10405:1;10390:284;10415:6;10412:1;10409:13;10390:284;;;10491:6;10485:13;10518:63;10577:3;10562:13;10518:63;:::i;:::-;10511:70;;10604:60;10657:6;10604:60;:::i;:::-;10594:70;;10450:224;10437:1;10434;10430:9;10425:14;;10390:284;;;10394:14;10690:3;10683:10;;10091:608;;;;;;;:::o;10705:109::-;10786:21;10801:5;10786:21;:::i;:::-;10781:3;10774:34;10764:50;;:::o;10820:360::-;;10934:38;10966:5;10934:38;:::i;:::-;10988:70;11051:6;11046:3;10988:70;:::i;:::-;10981:77;;11067:52;11112:6;11107:3;11100:4;11093:5;11089:16;11067:52;:::i;:::-;11144:29;11166:6;11144:29;:::i;:::-;11139:3;11135:39;11128:46;;10910:270;;;;;:::o;11208:849::-;;11350:5;11344:12;11379:36;11405:9;11379:36;:::i;:::-;11431:88;11512:6;11507:3;11431:88;:::i;:::-;11424:95;;11550:1;11539:9;11535:17;11566:1;11561:137;;;;11712:1;11707:344;;;;11528:523;;11561:137;11645:4;11641:9;11630;11626:25;11621:3;11614:38;11681:6;11676:3;11672:16;11665:23;;11561:137;;11707:344;11774:41;11809:5;11774:41;:::i;:::-;11837:1;11851:154;11865:6;11862:1;11859:13;11851:154;;;11939:7;11933:14;11929:1;11924:3;11920:11;11913:35;11989:1;11980:7;11976:15;11965:26;;11887:4;11884:1;11880:12;11875:17;;11851:154;;;12034:6;12029:3;12025:16;12018:23;;11714:337;;11528:523;;11317:740;;;;;;:::o;12063:364::-;;12179:39;12212:5;12179:39;:::i;:::-;12234:71;12298:6;12293:3;12234:71;:::i;:::-;12227:78;;12314:52;12359:6;12354:3;12347:4;12340:5;12336:16;12314:52;:::i;:::-;12391:29;12413:6;12391:29;:::i;:::-;12386:3;12382:39;12375:46;;12155:272;;;;;:::o;12433:377::-;;12567:39;12600:5;12567:39;:::i;:::-;12622:89;12704:6;12699:3;12622:89;:::i;:::-;12615:96;;12720:52;12765:6;12760:3;12753:4;12746:5;12742:16;12720:52;:::i;:::-;12797:6;12792:3;12788:16;12781:23;;12543:267;;;;;:::o;12816:366::-;;12979:67;13043:2;13038:3;12979:67;:::i;:::-;12972:74;;13055:93;13144:3;13055:93;:::i;:::-;13173:2;13168:3;13164:12;13157:19;;12962:220;;;:::o;13188:366::-;;13351:67;13415:2;13410:3;13351:67;:::i;:::-;13344:74;;13427:93;13516:3;13427:93;:::i;:::-;13545:2;13540:3;13536:12;13529:19;;13334:220;;;:::o;13560:366::-;;13723:67;13787:2;13782:3;13723:67;:::i;:::-;13716:74;;13799:93;13888:3;13799:93;:::i;:::-;13917:2;13912:3;13908:12;13901:19;;13706:220;;;:::o;13932:366::-;;14095:67;14159:2;14154:3;14095:67;:::i;:::-;14088:74;;14171:93;14260:3;14171:93;:::i;:::-;14289:2;14284:3;14280:12;14273:19;;14078:220;;;:::o;14304:366::-;;14467:67;14531:2;14526:3;14467:67;:::i;:::-;14460:74;;14543:93;14632:3;14543:93;:::i;:::-;14661:2;14656:3;14652:12;14645:19;;14450:220;;;:::o;14676:366::-;;14839:67;14903:2;14898:3;14839:67;:::i;:::-;14832:74;;14915:93;15004:3;14915:93;:::i;:::-;15033:2;15028:3;15024:12;15017:19;;14822:220;;;:::o;15048:366::-;;15211:67;15275:2;15270:3;15211:67;:::i;:::-;15204:74;;15287:93;15376:3;15287:93;:::i;:::-;15405:2;15400:3;15396:12;15389:19;;15194:220;;;:::o;15420:366::-;;15583:67;15647:2;15642:3;15583:67;:::i;:::-;15576:74;;15659:93;15748:3;15659:93;:::i;:::-;15777:2;15772:3;15768:12;15761:19;;15566:220;;;:::o;15792:366::-;;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16031:93;16120:3;16031:93;:::i;:::-;16149:2;16144:3;16140:12;16133:19;;15938:220;;;:::o;16164:366::-;;16327:67;16391:2;16386:3;16327:67;:::i;:::-;16320:74;;16403:93;16492:3;16403:93;:::i;:::-;16521:2;16516:3;16512:12;16505:19;;16310:220;;;:::o;16536:366::-;;16699:67;16763:2;16758:3;16699:67;:::i;:::-;16692:74;;16775:93;16864:3;16775:93;:::i;:::-;16893:2;16888:3;16884:12;16877:19;;16682:220;;;:::o;16908:366::-;;17071:67;17135:2;17130:3;17071:67;:::i;:::-;17064:74;;17147:93;17236:3;17147:93;:::i;:::-;17265:2;17260:3;17256:12;17249:19;;17054:220;;;:::o;17280:366::-;;17443:67;17507:2;17502:3;17443:67;:::i;:::-;17436:74;;17519:93;17608:3;17519:93;:::i;:::-;17637:2;17632:3;17628:12;17621:19;;17426:220;;;:::o;17652:366::-;;17815:67;17879:2;17874:3;17815:67;:::i;:::-;17808:74;;17891:93;17980:3;17891:93;:::i;:::-;18009:2;18004:3;18000:12;17993:19;;17798:220;;;:::o;18024:400::-;;18205:84;18287:1;18282:3;18205:84;:::i;:::-;18198:91;;18298:93;18387:3;18298:93;:::i;:::-;18416:1;18411:3;18407:11;18400:18;;18188:236;;;:::o;18430:366::-;;18593:67;18657:2;18652:3;18593:67;:::i;:::-;18586:74;;18669:93;18758:3;18669:93;:::i;:::-;18787:2;18782:3;18778:12;18771:19;;18576:220;;;:::o;18802:366::-;;18965:67;19029:2;19024:3;18965:67;:::i;:::-;18958:74;;19041:93;19130:3;19041:93;:::i;:::-;19159:2;19154:3;19150:12;19143:19;;18948:220;;;:::o;19174:366::-;;19337:67;19401:2;19396:3;19337:67;:::i;:::-;19330:74;;19413:93;19502:3;19413:93;:::i;:::-;19531:2;19526:3;19522:12;19515:19;;19320:220;;;:::o;19546:366::-;;19709:67;19773:2;19768:3;19709:67;:::i;:::-;19702:74;;19785:93;19874:3;19785:93;:::i;:::-;19903:2;19898:3;19894:12;19887:19;;19692:220;;;:::o;19918:366::-;;20081:67;20145:2;20140:3;20081:67;:::i;:::-;20074:74;;20157:93;20246:3;20157:93;:::i;:::-;20275:2;20270:3;20266:12;20259:19;;20064:220;;;:::o;20290:366::-;;20453:67;20517:2;20512:3;20453:67;:::i;:::-;20446:74;;20529:93;20618:3;20529:93;:::i;:::-;20647:2;20642:3;20638:12;20631:19;;20436:220;;;:::o;20662:366::-;;20825:67;20889:2;20884:3;20825:67;:::i;:::-;20818:74;;20901:93;20990:3;20901:93;:::i;:::-;21019:2;21014:3;21010:12;21003:19;;20808:220;;;:::o;21034:366::-;;21197:67;21261:2;21256:3;21197:67;:::i;:::-;21190:74;;21273:93;21362:3;21273:93;:::i;:::-;21391:2;21386:3;21382:12;21375:19;;21180:220;;;:::o;21406:366::-;;21569:67;21633:2;21628:3;21569:67;:::i;:::-;21562:74;;21645:93;21734:3;21645:93;:::i;:::-;21763:2;21758:3;21754:12;21747:19;;21552:220;;;:::o;21778:366::-;;21941:67;22005:2;22000:3;21941:67;:::i;:::-;21934:74;;22017:93;22106:3;22017:93;:::i;:::-;22135:2;22130:3;22126:12;22119:19;;21924:220;;;:::o;22150:366::-;;22313:67;22377:2;22372:3;22313:67;:::i;:::-;22306:74;;22389:93;22478:3;22389:93;:::i;:::-;22507:2;22502:3;22498:12;22491:19;;22296:220;;;:::o;22522:366::-;;22685:67;22749:2;22744:3;22685:67;:::i;:::-;22678:74;;22761:93;22850:3;22761:93;:::i;:::-;22879:2;22874:3;22870:12;22863:19;;22668:220;;;:::o;22894:108::-;22971:24;22989:5;22971:24;:::i;:::-;22966:3;22959:37;22949:53;;:::o;23008:118::-;23095:24;23113:5;23095:24;:::i;:::-;23090:3;23083:37;23073:53;;:::o;23132:273::-;;23285:94;23375:3;23366:6;23285:94;:::i;:::-;23278:101;;23396:3;23389:10;;23267:138;;;;:::o;23411:435::-;;23613:95;23704:3;23695:6;23613:95;:::i;:::-;23606:102;;23725:95;23816:3;23807:6;23725:95;:::i;:::-;23718:102;;23837:3;23830:10;;23595:251;;;;;:::o;23852:541::-;;24107:95;24198:3;24189:6;24107:95;:::i;:::-;24100:102;;24219:148;24363:3;24219:148;:::i;:::-;24212:155;;24384:3;24377:10;;24089:304;;;;:::o;24399:222::-;;24530:2;24519:9;24515:18;24507:26;;24543:71;24611:1;24600:9;24596:17;24587:6;24543:71;:::i;:::-;24497:124;;;;:::o;24627:640::-;;24860:3;24849:9;24845:19;24837:27;;24874:71;24942:1;24931:9;24927:17;24918:6;24874:71;:::i;:::-;24955:72;25023:2;25012:9;25008:18;24999:6;24955:72;:::i;:::-;25037;25105:2;25094:9;25090:18;25081:6;25037:72;:::i;:::-;25156:9;25150:4;25146:20;25141:2;25130:9;25126:18;25119:48;25184:76;25255:4;25246:6;25184:76;:::i;:::-;25176:84;;24827:440;;;;;;;:::o;25273:373::-;;25454:2;25443:9;25439:18;25431:26;;25503:9;25497:4;25493:20;25489:1;25478:9;25474:17;25467:47;25531:108;25634:4;25625:6;25531:108;:::i;:::-;25523:116;;25421:225;;;;:::o;25652:210::-;;25777:2;25766:9;25762:18;25754:26;;25790:65;25852:1;25841:9;25837:17;25828:6;25790:65;:::i;:::-;25744:118;;;;:::o;25868:313::-;;26019:2;26008:9;26004:18;25996:26;;26068:9;26062:4;26058:20;26054:1;26043:9;26039:17;26032:47;26096:78;26169:4;26160:6;26096:78;:::i;:::-;26088:86;;25986:195;;;;:::o;26187:419::-;;26391:2;26380:9;26376:18;26368:26;;26440:9;26434:4;26430:20;26426:1;26415:9;26411:17;26404:47;26468:131;26594:4;26468:131;:::i;:::-;26460:139;;26358:248;;;:::o;26612:419::-;;26816:2;26805:9;26801:18;26793:26;;26865:9;26859:4;26855:20;26851:1;26840:9;26836:17;26829:47;26893:131;27019:4;26893:131;:::i;:::-;26885:139;;26783:248;;;:::o;27037:419::-;;27241:2;27230:9;27226:18;27218:26;;27290:9;27284:4;27280:20;27276:1;27265:9;27261:17;27254:47;27318:131;27444:4;27318:131;:::i;:::-;27310:139;;27208:248;;;:::o;27462:419::-;;27666:2;27655:9;27651:18;27643:26;;27715:9;27709:4;27705:20;27701:1;27690:9;27686:17;27679:47;27743:131;27869:4;27743:131;:::i;:::-;27735:139;;27633:248;;;:::o;27887:419::-;;28091:2;28080:9;28076:18;28068:26;;28140:9;28134:4;28130:20;28126:1;28115:9;28111:17;28104:47;28168:131;28294:4;28168:131;:::i;:::-;28160:139;;28058:248;;;:::o;28312:419::-;;28516:2;28505:9;28501:18;28493:26;;28565:9;28559:4;28555:20;28551:1;28540:9;28536:17;28529:47;28593:131;28719:4;28593:131;:::i;:::-;28585:139;;28483:248;;;:::o;28737:419::-;;28941:2;28930:9;28926:18;28918:26;;28990:9;28984:4;28980:20;28976:1;28965:9;28961:17;28954:47;29018:131;29144:4;29018:131;:::i;:::-;29010:139;;28908:248;;;:::o;29162:419::-;;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29333:248;;;:::o;29587:419::-;;29791:2;29780:9;29776:18;29768:26;;29840:9;29834:4;29830:20;29826:1;29815:9;29811:17;29804:47;29868:131;29994:4;29868:131;:::i;:::-;29860:139;;29758:248;;;:::o;30012:419::-;;30216:2;30205:9;30201:18;30193:26;;30265:9;30259:4;30255:20;30251:1;30240:9;30236:17;30229:47;30293:131;30419:4;30293:131;:::i;:::-;30285:139;;30183:248;;;:::o;30437:419::-;;30641:2;30630:9;30626:18;30618:26;;30690:9;30684:4;30680:20;30676:1;30665:9;30661:17;30654:47;30718:131;30844:4;30718:131;:::i;:::-;30710:139;;30608:248;;;:::o;30862:419::-;;31066:2;31055:9;31051:18;31043:26;;31115:9;31109:4;31105:20;31101:1;31090:9;31086:17;31079:47;31143:131;31269:4;31143:131;:::i;:::-;31135:139;;31033:248;;;:::o;31287:419::-;;31491:2;31480:9;31476:18;31468:26;;31540:9;31534:4;31530:20;31526:1;31515:9;31511:17;31504:47;31568:131;31694:4;31568:131;:::i;:::-;31560:139;;31458:248;;;:::o;31712:419::-;;31916:2;31905:9;31901:18;31893:26;;31965:9;31959:4;31955:20;31951:1;31940:9;31936:17;31929:47;31993:131;32119:4;31993:131;:::i;:::-;31985:139;;31883:248;;;:::o;32137:419::-;;32341:2;32330:9;32326:18;32318:26;;32390:9;32384:4;32380:20;32376:1;32365:9;32361:17;32354:47;32418:131;32544:4;32418:131;:::i;:::-;32410:139;;32308:248;;;:::o;32562:419::-;;32766:2;32755:9;32751:18;32743:26;;32815:9;32809:4;32805:20;32801:1;32790:9;32786:17;32779:47;32843:131;32969:4;32843:131;:::i;:::-;32835:139;;32733:248;;;:::o;32987:419::-;;33191:2;33180:9;33176:18;33168:26;;33240:9;33234:4;33230:20;33226:1;33215:9;33211:17;33204:47;33268:131;33394:4;33268:131;:::i;:::-;33260:139;;33158:248;;;:::o;33412:419::-;;33616:2;33605:9;33601:18;33593:26;;33665:9;33659:4;33655:20;33651:1;33640:9;33636:17;33629:47;33693:131;33819:4;33693:131;:::i;:::-;33685:139;;33583:248;;;:::o;33837:419::-;;34041:2;34030:9;34026:18;34018:26;;34090:9;34084:4;34080:20;34076:1;34065:9;34061:17;34054:47;34118:131;34244:4;34118:131;:::i;:::-;34110:139;;34008:248;;;:::o;34262:419::-;;34466:2;34455:9;34451:18;34443:26;;34515:9;34509:4;34505:20;34501:1;34490:9;34486:17;34479:47;34543:131;34669:4;34543:131;:::i;:::-;34535:139;;34433:248;;;:::o;34687:419::-;;34891:2;34880:9;34876:18;34868:26;;34940:9;34934:4;34930:20;34926:1;34915:9;34911:17;34904:47;34968:131;35094:4;34968:131;:::i;:::-;34960:139;;34858:248;;;:::o;35112:419::-;;35316:2;35305:9;35301:18;35293:26;;35365:9;35359:4;35355:20;35351:1;35340:9;35336:17;35329:47;35393:131;35519:4;35393:131;:::i;:::-;35385:139;;35283:248;;;:::o;35537:419::-;;35741:2;35730:9;35726:18;35718:26;;35790:9;35784:4;35780:20;35776:1;35765:9;35761:17;35754:47;35818:131;35944:4;35818:131;:::i;:::-;35810:139;;35708:248;;;:::o;35962:419::-;;36166:2;36155:9;36151:18;36143:26;;36215:9;36209:4;36205:20;36201:1;36190:9;36186:17;36179:47;36243:131;36369:4;36243:131;:::i;:::-;36235:139;;36133:248;;;:::o;36387:419::-;;36591:2;36580:9;36576:18;36568:26;;36640:9;36634:4;36630:20;36626:1;36615:9;36611:17;36604:47;36668:131;36794:4;36668:131;:::i;:::-;36660:139;;36558:248;;;:::o;36812:419::-;;37016:2;37005:9;37001:18;36993:26;;37065:9;37059:4;37055:20;37051:1;37040:9;37036:17;37029:47;37093:131;37219:4;37093:131;:::i;:::-;37085:139;;36983:248;;;:::o;37237:222::-;;37368:2;37357:9;37353:18;37345:26;;37381:71;37449:1;37438:9;37434:17;37425:6;37381:71;:::i;:::-;37335:124;;;;:::o;37465:129::-;;37526:20;;:::i;:::-;37516:30;;37555:33;37583:4;37575:6;37555:33;:::i;:::-;37506:88;;;:::o;37600:75::-;;37666:2;37660:9;37650:19;;37640:35;:::o;37681:311::-;;37848:18;37840:6;37837:30;37834:2;;;37870:18;;:::i;:::-;37834:2;37920:4;37912:6;37908:17;37900:25;;37980:4;37974;37970:15;37962:23;;37763:229;;;:::o;37998:307::-;;38149:18;38141:6;38138:30;38135:2;;;38171:18;;:::i;:::-;38135:2;38209:29;38231:6;38209:29;:::i;:::-;38201:37;;38293:4;38287;38283:15;38275:23;;38064:241;;;:::o;38311:308::-;;38463:18;38455:6;38452:30;38449:2;;;38485:18;;:::i;:::-;38449:2;38523:29;38545:6;38523:29;:::i;:::-;38515:37;;38607:4;38601;38597:15;38589:23;;38378:241;;;:::o;38625:132::-;;38715:3;38707:11;;38745:4;38740:3;38736:14;38728:22;;38697:60;;;:::o;38763:144::-;;38838:3;38830:11;;38861:3;38858:1;38851:14;38895:4;38892:1;38882:18;38874:26;;38820:87;;;:::o;38913:114::-;;39014:5;39008:12;38998:22;;38987:40;;;:::o;39033:98::-;;39118:5;39112:12;39102:22;;39091:40;;;:::o;39137:99::-;;39223:5;39217:12;39207:22;;39196:40;;;:::o;39242:113::-;;39344:4;39339:3;39335:14;39327:22;;39317:38;;;:::o;39361:184::-;;39494:6;39489:3;39482:19;39534:4;39529:3;39525:14;39510:29;;39472:73;;;;:::o;39551:168::-;;39668:6;39663:3;39656:19;39708:4;39703:3;39699:14;39684:29;;39646:73;;;;:::o;39725:147::-;;39863:3;39848:18;;39838:34;;;;:::o;39878:169::-;;39996:6;39991:3;39984:19;40036:4;40031:3;40027:14;40012:29;;39974:73;;;;:::o;40053:148::-;;40192:3;40177:18;;40167:34;;;;:::o;40207:305::-;;40266:20;40284:1;40266:20;:::i;:::-;40261:25;;40300:20;40318:1;40300:20;:::i;:::-;40295:25;;40454:1;40386:66;40382:74;40379:1;40376:81;40373:2;;;40460:18;;:::i;:::-;40373:2;40504:1;40501;40497:9;40490:16;;40251:261;;;;:::o;40518:185::-;;40575:20;40593:1;40575:20;:::i;:::-;40570:25;;40609:20;40627:1;40609:20;:::i;:::-;40604:25;;40648:1;40638:2;;40653:18;;:::i;:::-;40638:2;40695:1;40692;40688:9;40683:14;;40560:143;;;;:::o;40709:348::-;;40772:20;40790:1;40772:20;:::i;:::-;40767:25;;40806:20;40824:1;40806:20;:::i;:::-;40801:25;;40994:1;40926:66;40922:74;40919:1;40916:81;40911:1;40904:9;40897:17;40893:105;40890:2;;;41001:18;;:::i;:::-;40890:2;41049:1;41046;41042:9;41031:20;;40757:300;;;;:::o;41063:191::-;;41123:20;41141:1;41123:20;:::i;:::-;41118:25;;41157:20;41175:1;41157:20;:::i;:::-;41152:25;;41196:1;41193;41190:8;41187:2;;;41201:18;;:::i;:::-;41187:2;41246:1;41243;41239:9;41231:17;;41108:146;;;;:::o;41260:96::-;;41326:24;41344:5;41326:24;:::i;:::-;41315:35;;41305:51;;;:::o;41362:104::-;;41436:24;41454:5;41436:24;:::i;:::-;41425:35;;41415:51;;;:::o;41472:90::-;;41549:5;41542:13;41535:21;41524:32;;41514:48;;;:::o;41568:149::-;;41644:66;41637:5;41633:78;41622:89;;41612:105;;;:::o;41723:89::-;;41799:6;41792:5;41788:18;41777:29;;41767:45;;;:::o;41818:126::-;;41895:42;41888:5;41884:54;41873:65;;41863:81;;;:::o;41950:77::-;;42016:5;42005:16;;41995:32;;;:::o;42033:154::-;42117:6;42112:3;42107;42094:30;42179:1;42170:6;42165:3;42161:16;42154:27;42084:103;;;:::o;42193:307::-;42261:1;42271:113;42285:6;42282:1;42279:13;42271:113;;;42370:1;42365:3;42361:11;42355:18;42351:1;42346:3;42342:11;42335:39;42307:2;42304:1;42300:10;42295:15;;42271:113;;;42402:6;42399:1;42396:13;42393:2;;;42482:1;42473:6;42468:3;42464:16;42457:27;42393:2;42242:258;;;;:::o;42506:320::-;;42587:1;42581:4;42577:12;42567:22;;42634:1;42628:4;42624:12;42655:18;42645:2;;42711:4;42703:6;42699:17;42689:27;;42645:2;42773;42765:6;42762:14;42742:18;42739:38;42736:2;;;42792:18;;:::i;:::-;42736:2;42557:269;;;;:::o;42832:281::-;42915:27;42937:4;42915:27;:::i;:::-;42907:6;42903:40;43045:6;43033:10;43030:22;43009:18;42997:10;42994:34;42991:62;42988:2;;;43056:18;;:::i;:::-;42988:2;43096:10;43092:2;43085:22;42875:238;;;:::o;43119:171::-;;43180:23;43197:5;43180:23;:::i;:::-;43171:32;;43225:6;43218:5;43215:17;43212:2;;;43235:18;;:::i;:::-;43212:2;43282:1;43275:5;43271:13;43264:20;;43161:129;;;:::o;43296:233::-;;43358:24;43376:5;43358:24;:::i;:::-;43349:33;;43404:66;43397:5;43394:77;43391:2;;;43474:18;;:::i;:::-;43391:2;43521:1;43514:5;43510:13;43503:20;;43339:190;;;:::o;43535:176::-;;43584:20;43602:1;43584:20;:::i;:::-;43579:25;;43618:20;43636:1;43618:20;:::i;:::-;43613:25;;43657:1;43647:2;;43662:18;;:::i;:::-;43647:2;43703:1;43700;43696:9;43691:14;;43569:142;;;;:::o;43717:180::-;43765:77;43762:1;43755:88;43862:4;43859:1;43852:15;43886:4;43883:1;43876:15;43903:180;43951:77;43948:1;43941:88;44048:4;44045:1;44038:15;44072:4;44069:1;44062:15;44089:180;44137:77;44134:1;44127:88;44234:4;44231:1;44224:15;44258:4;44255:1;44248:15;44275:180;44323:77;44320:1;44313:88;44420:4;44417:1;44410:15;44444:4;44441:1;44434:15;44461:102;;44553:2;44549:7;44544:2;44537:5;44533:14;44529:28;44519:38;;44509:54;;;:::o;44569:242::-;44709:34;44705:1;44697:6;44693:14;44686:58;44778:25;44773:2;44765:6;44761:15;44754:50;44675:136;:::o;44817:230::-;44957:34;44953:1;44945:6;44941:14;44934:58;45026:13;45021:2;45013:6;45009:15;45002:38;44923:124;:::o;45053:237::-;45193:34;45189:1;45181:6;45177:14;45170:58;45262:20;45257:2;45249:6;45245:15;45238:45;45159:131;:::o;45296:225::-;45436:34;45432:1;45424:6;45420:14;45413:58;45505:8;45500:2;45492:6;45488:15;45481:33;45402:119;:::o;45527:178::-;45667:30;45663:1;45655:6;45651:14;45644:54;45633:72;:::o;45711:182::-;45851:34;45847:1;45839:6;45835:14;45828:58;45817:76;:::o;45899:220::-;46039:34;46035:1;46027:6;46023:14;46016:58;46108:3;46103:2;46095:6;46091:15;46084:28;46005:114;:::o;46125:223::-;46265:34;46261:1;46253:6;46249:14;46242:58;46334:6;46329:2;46321:6;46317:15;46310:31;46231:117;:::o;46354:175::-;46494:27;46490:1;46482:6;46478:14;46471:51;46460:69;:::o;46535:231::-;46675:34;46671:1;46663:6;46659:14;46652:58;46744:14;46739:2;46731:6;46727:15;46720:39;46641:125;:::o;46772:182::-;46912:34;46908:1;46900:6;46896:14;46889:58;46878:76;:::o;46960:243::-;47100:34;47096:1;47088:6;47084:14;47077:58;47169:26;47164:2;47156:6;47152:15;47145:51;47066:137;:::o;47209:229::-;47349:34;47345:1;47337:6;47333:14;47326:58;47418:12;47413:2;47405:6;47401:15;47394:37;47315:123;:::o;47444:228::-;47584:34;47580:1;47572:6;47568:14;47561:58;47653:11;47648:2;47640:6;47636:15;47629:36;47550:122;:::o;47678:158::-;47818:10;47814:1;47806:6;47802:14;47795:34;47784:52;:::o;47842:182::-;47982:34;47978:1;47970:6;47966:14;47959:58;47948:76;:::o;48030:231::-;48170:34;48166:1;48158:6;48154:14;48147:58;48239:14;48234:2;48226:6;48222:15;48215:39;48136:125;:::o;48267:182::-;48407:34;48403:1;48395:6;48391:14;48384:58;48373:76;:::o;48455:228::-;48595:34;48591:1;48583:6;48579:14;48572:58;48664:11;48659:2;48651:6;48647:15;48640:36;48561:122;:::o;48689:232::-;48829:34;48825:1;48817:6;48813:14;48806:58;48898:15;48893:2;48885:6;48881:15;48874:40;48795:126;:::o;48927:234::-;49067:34;49063:1;49055:6;49051:14;49044:58;49136:17;49131:2;49123:6;49119:15;49112:42;49033:128;:::o;49167:220::-;49307:34;49303:1;49295:6;49291:14;49284:58;49376:3;49371:2;49363:6;49359:15;49352:28;49273:114;:::o;49393:232::-;49533:34;49529:1;49521:6;49517:14;49510:58;49602:15;49597:2;49589:6;49585:15;49578:40;49499:126;:::o;49631:236::-;49771:34;49767:1;49759:6;49755:14;49748:58;49840:19;49835:2;49827:6;49823:15;49816:44;49737:130;:::o;49873:231::-;50013:34;50009:1;50001:6;49997:14;49990:58;50082:14;50077:2;50069:6;50065:15;50058:39;49979:125;:::o;50110:232::-;50250:34;50246:1;50238:6;50234:14;50227:58;50319:15;50314:2;50306:6;50302:15;50295:40;50216:126;:::o;50348:233::-;50488:34;50484:1;50476:6;50472:14;50465:58;50557:16;50552:2;50544:6;50540:15;50533:41;50454:127;:::o;50587:122::-;50660:24;50678:5;50660:24;:::i;:::-;50653:5;50650:35;50640:2;;50699:1;50696;50689:12;50640:2;50630:79;:::o;50715:138::-;50796:32;50822:5;50796:32;:::i;:::-;50789:5;50786:43;50776:2;;50843:1;50840;50833:12;50776:2;50766:87;:::o;50859:116::-;50929:21;50944:5;50929:21;:::i;:::-;50922:5;50919:32;50909:2;;50965:1;50962;50955:12;50909:2;50899:76;:::o;50981:120::-;51053:23;51070:5;51053:23;:::i;:::-;51046:5;51043:34;51033:2;;51091:1;51088;51081:12;51033:2;51023:78;:::o;51107:122::-;51180:24;51198:5;51180:24;:::i;:::-;51173:5;51170:35;51160:2;;51219:1;51216;51209:12;51160:2;51150:79;:::o

Swarm Source

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