ETH Price: $3,523.47 (+5.04%)

Token

AotuNFT (AOTU)
 

Overview

Max Total Supply

4,526 AOTU

Holders

735

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
19 AOTU
0x3cca194330bb338221d11be92ca2216b05e40141
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:
Aotu

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-29
*/

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

contract Aotu is Ownable, ERC721Enumerable, ReentrancyGuard {
    using Address for address payable;
    using Strings for uint256;

    constructor() ERC721("AotuNFT", "AOTU") {}

    string internal baseURI;
    bytes32 internal _ogMerkleRoot;
    bytes32 internal _wlMerkleRoot;

    string private _blindTokenURI =
        "ipfs://QmZDxF5n2YYX273GnE3ertoULpn9YqSq3QppXogQZmUXa9";

    uint256 constant internal _maxSupply = 8888;
    uint256 constant internal  wlPrice = 60000000000000000;  
    uint256 constant internal publicPrice =   80000000000000000;
    address internal _treasuryAddress = 0x4c21e3a01E4fDB6a50662C676E4533a19a220770;

   
    uint256 internal _ogMintStart=1672905600;
    uint256 internal _wlMintStart=1672920000; 
     uint256 internal _publicMintStart=1673006400;
     uint256 internal _endMint = 1673179200 ;

    mapping (address => uint256) private _fnftMintCount;
    mapping (address => uint256) private _snftMintCount;

    function setPublicMintStart(uint256 publicMintime) public onlyOwner {
        _publicMintStart = publicMintime;
    }
    function setogMintStart(uint256 ogMintime) public onlyOwner {
        _ogMintStart = ogMintime;
    }
    function setwlMintStart(uint256 wlMintime) public onlyOwner {
        _wlMintStart = wlMintime;
    }
    function setEndMint(uint256 endMintime) public onlyOwner {
        _endMint = endMintime;
    }
    

    function setogMerkleRoot(bytes32 ogMerkleroot) external onlyOwner {
        _ogMerkleRoot = ogMerkleroot;
    }
    function setwlMerkleRoot(bytes32 wlMerkleroot) external onlyOwner {
        _wlMerkleRoot = wlMerkleroot;
    }

    function setTreasuryAddress(address payable treasuryAddress ) external onlyOwner {
        _treasuryAddress = treasuryAddress;
    }

    function withdrawFees() external onlyOwner {
        payable(_treasuryAddress).sendValue(address(this).balance);
    }

    function isogWhitelisted(address wallet, bytes32[] calldata proof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(wallet));
        return
            MerkleProof.verify(proof, _ogMerkleRoot, leaf);
    }
    function iswlWhitelisted(address wallet, bytes32[] calldata proof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(wallet));
        return
            MerkleProof.verify(proof, _wlMerkleRoot, leaf);
    }

   /// Check if enough payment was provided to mint `amount` number of tokens
    modifier paymentProvided(uint256 amount, uint256 mintPrice) {
        require(
            msg.value >= amount * mintPrice,
            "Payment too small"
        );
        _;
    } 

    modifier checkBaseURI(){
        require(bytes(baseURI).length == 0,"Not mint");
        _;
    }

    /// Check if public minting is active
    function mintingActive() public view checkBaseURI() returns (bool) {
        return block.timestamp > _publicMintStart;
    }

    /// Check if og minting is active
    function ogActive() public view checkBaseURI() returns (bool)  {
        return block.timestamp > _ogMintStart;
    }

    /// Check if wl minting is active
    function wlActive() public view checkBaseURI() returns (bool)  {
        return block.timestamp > _wlMintStart;
    }

    /// Get the number of tokens still available for minting
    function availableSupply() public view returns (uint256) {
        return
            _maxSupply -
            totalSupply();
    }

    /// @dev Internal function for performing token mints
    function _mintTokens(address to, uint256 amount) internal {
        require(block.timestamp <= _endMint, "Mint is end");
        require(amount <= availableSupply(), "Not enough tokens left");

        // Update totalSupply only once with the total minted amount
        // Mint the required amount of tokens,
        // starting with the highest token ID
        for (uint256 i = 1; i <= amount; i++) {
            uint256 tokenId = _randMod();
            _safeMint(to, tokenId);
        }
    }

    /// Mint tokens
    function mint(uint256 amount) external payable paymentProvided(amount,publicPrice) {
        require(mintingActive(), "Minting has not started yet");   
        // end mint time
        _mintTokens(msg.sender, amount);
    }

    /// Mint tokens if the wallet has been whitelisted
    function ogMint(uint256 amount, bytes32[] calldata proof)
        external
        payable
    {
        require(ogActive(), "OG has not started yet");
        require(block.timestamp < _wlMintStart,"OG is expire");
        require(
            isogWhitelisted(msg.sender, proof),
            "Not whitelisted for OG"
        );
        require(totalSupply()+amount < 889, "Mint would exceed 888 of OG");
        require(_fnftMintCount[msg.sender] + amount <= 1, "Cannot mint above limit");

        _mintTokens(msg.sender, amount);
        _fnftMintCount[msg.sender]++;
    }

     function wlMint(uint256 amount, bytes32[] calldata proof)
        external
        payable
        paymentProvided(amount,wlPrice)
    {
        require(wlActive(), "WL has not started yet");
        require(block.timestamp < _publicMintStart,"WL is expire");
        require(
            iswlWhitelisted(msg.sender, proof),
            "Not whitelisted for WL"
        );
        require(_snftMintCount[msg.sender] + amount <= 2, "Cannot mint above limit");

        _mintTokens(msg.sender, amount);
        _snftMintCount[msg.sender]++;
    }

    function reserveOwn() public onlyOwner {
        require(totalSupply() + 100 <= _maxSupply, "Mint would exceed max supply");    

        uint i;
        for (i = 0; i < 100; i++) {
            uint256 tokenId = _randMod();
            _safeMint(msg.sender, tokenId);
        }
    }

    function setTokenURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }

    /// Get the token metadata URI
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Token does not exist");
        
        return
            bytes(baseURI).length > 0
            ? string(
                abi.encodePacked(baseURI, tokenId.toString(),".json")
            )
            : _blindTokenURI;
        
    }


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

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

    function publicMintStart() public view returns (uint256) {
        return _publicMintStart;
    }

    function ogMintStart() public view returns (uint256) {
        return _ogMintStart;
    }

    function wlMintStart() public view returns (uint256){
        return _wlMintStart;
    }
    
    uint[_maxSupply] internal indices;
    uint nonce;
    function _randMod() internal returns (uint) {
        uint totalSize = _maxSupply - nonce;
        uint index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize;
        uint value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }
 
        if (indices[totalSize - 1] == 0) {
            indices[index] = totalSize - 1;
        } else {
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        return value+1;
    }
}

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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isogWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"iswlWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"ogMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ogMintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveOwn","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":"uint256","name":"endMintime","type":"uint256"}],"name":"setEndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicMintime","type":"uint256"}],"name":"setPublicMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"ogMerkleroot","type":"bytes32"}],"name":"setogMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ogMintime","type":"uint256"}],"name":"setogMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"wlMerkleroot","type":"bytes32"}],"name":"setwlMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wlMintime","type":"uint256"}],"name":"setwlMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlMintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052604051806060016040528060358152602001620059ea60359139600f90805190602001906200003592919062000253565b50734c21e3a01e4fdb6a50662c676e4533a19a220770601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506363b683806011556363b6bbc06012556363b80d406013556363bab040601455348015620000b857600080fd5b506040518060400160405280600781526020017f416f74754e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f414f54550000000000000000000000000000000000000000000000000000000081525062000145620001396200018760201b60201c565b6200018f60201b60201c565b81600190805190602001906200015d92919062000253565b5080600290805190602001906200017692919062000253565b5050506001600b8190555062000368565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002619062000303565b90600052602060002090601f016020900481019282620002855760008555620002d1565b82601f10620002a057805160ff1916838001178555620002d1565b82800160010185558215620002d1579182015b82811115620002d0578251825591602001919060010190620002b3565b5b509050620002e09190620002e4565b5090565b5b80821115620002ff576000816000905550600101620002e5565b5090565b600060028204905060018216806200031c57607f821691505b6020821081141562000333576200033262000339565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61567280620003786000396000f3fe6080604052600436106102465760003560e01c80636605bfda116101395780639eaf167d116100b6578063ba21a9eb1161007a578063ba21a9eb1461082b578063c87b56dd14610868578063cb4a9731146108a5578063e0df5b6f146108ce578063e985e9c5146108f7578063f2fde38b1461093457610246565b80639eaf167d146107695780639f8532c114610792578063a0712d68146107bd578063a22cb465146107d9578063b88d4fde1461080257610246565b80638cfec4c0116100fd5780638cfec4c0146106965780638da5cb5b146106c15780638ebb25ca146106ec5780638fa76a2b1461071557806395d89b411461073e57610246565b80636605bfda146105b157806370a08231146105da578063715018a6146106175780637ecc2b561461062e5780637f9726631461065957610246565b806330066136116101c7578063476343ee1161018b578063476343ee146104ca57806348575bfa146104e15780634f6ccce71461050c578063627711c3146105495780636352211e1461057457610246565b8063300661361461041857806331f9c919146104435780633ef0d36d1461046e57806342842e0e1461048a578063439894e4146104b357610246565b806318160ddd1161020e57806318160ddd146103425780631b6c581a1461036d57806323b872dd146103965780632b314dc6146103bf5780632f745c59146103db57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806311675ccd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613b89565b61095d565b60405161027f9190614436565b60405180910390f35b34801561029457600080fd5b5061029d61096f565b6040516102aa9190614451565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613c2c565b610a01565b6040516102e791906143cf565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613b1c565b610a86565b005b34801561032557600080fd5b50610340600480360381019061033b9190613c2c565b610b9e565b005b34801561034e57600080fd5b50610357610c24565b60405161036491906148b3565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613b5c565b610c31565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906139a6565b610cb7565b005b6103d960048036038101906103d49190613c59565b610d17565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190613b1c565b610f34565b60405161040f91906148b3565b60405180910390f35b34801561042457600080fd5b5061042d610fd9565b60405161043a9190614436565b60405180910390f35b34801561044f57600080fd5b50610458611035565b6040516104659190614436565b60405180910390f35b61048860048036038101906104839190613c59565b611091565b005b34801561049657600080fd5b506104b160048036038101906104ac91906139a6565b6112b1565b005b3480156104bf57600080fd5b506104c86112d1565b005b3480156104d657600080fd5b506104df6113de565b005b3480156104ed57600080fd5b506104f66114a7565b6040516105039190614436565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613c2c565b611503565b60405161054091906148b3565b60405180910390f35b34801561055557600080fd5b5061055e611574565b60405161056b91906148b3565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613c2c565b61157e565b6040516105a891906143cf565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613939565b611630565b005b3480156105e657600080fd5b5061060160048036038101906105fc919061390c565b6116f0565b60405161060e91906148b3565b60405180910390f35b34801561062357600080fd5b5061062c6117a8565b005b34801561063a57600080fd5b50610643611830565b60405161065091906148b3565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613a7c565b61184c565b60405161068d9190614436565b60405180910390f35b3480156106a257600080fd5b506106ab6118d0565b6040516106b891906148b3565b60405180910390f35b3480156106cd57600080fd5b506106d66118da565b6040516106e391906143cf565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613c2c565b611903565b005b34801561072157600080fd5b5061073c60048036038101906107379190613c2c565b611989565b005b34801561074a57600080fd5b50610753611a0f565b6040516107609190614451565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613c2c565b611aa1565b005b34801561079e57600080fd5b506107a7611b27565b6040516107b491906148b3565b60405180910390f35b6107d760048036038101906107d29190613c2c565b611b31565b005b3480156107e557600080fd5b5061080060048036038101906107fb9190613adc565b611bdf565b005b34801561080e57600080fd5b50610829600480360381019061082491906139f9565b611bf5565b005b34801561083757600080fd5b50610852600480360381019061084d9190613a7c565b611c57565b60405161085f9190614436565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190613c2c565b611cdb565b60405161089c9190614451565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190613b5c565b611dfe565b005b3480156108da57600080fd5b506108f560048036038101906108f09190613be3565b611e84565b005b34801561090357600080fd5b5061091e60048036038101906109199190613966565b611f1a565b60405161092b9190614436565b60405180910390f35b34801561094057600080fd5b5061095b6004803603810190610956919061390c565b611fae565b005b6000610968826120a6565b9050919050565b60606001805461097e90614b9f565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90614b9f565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c82612120565b610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290614773565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a918261157e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990614813565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2161218c565b73ffffffffffffffffffffffffffffffffffffffff161480610b505750610b4f81610b4a61218c565b611f1a565b5b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86906146b3565b60405180910390fd5b610b998383612194565b505050565b610ba661218c565b73ffffffffffffffffffffffffffffffffffffffff16610bc46118da565b73ffffffffffffffffffffffffffffffffffffffff1614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c11906147d3565b60405180910390fd5b8060128190555050565b6000600980549050905090565b610c3961218c565b73ffffffffffffffffffffffffffffffffffffffff16610c576118da565b73ffffffffffffffffffffffffffffffffffffffff1614610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca4906147d3565b60405180910390fd5b80600d8190555050565b610cc8610cc261218c565b8261224d565b610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90614853565b60405180910390fd5b610d1283838361232b565b505050565b610d1f610fd9565b610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590614833565b60405180910390fd5b6012544210610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614793565b60405180910390fd5b610dad33838361184c565b610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614553565b60405180910390fd5b61037983610df8610c24565b610e0291906149b8565b10610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3990614673565b60405180910390fd5b600183601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e8f91906149b8565b1115610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790614533565b60405180910390fd5b610eda3384612587565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610f2a90614c02565b9190505550505050565b6000610f3f836116f0565b8210610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f77906144b3565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600c8054610fe990614b9f565b90501461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906147b3565b60405180910390fd5b6011544211905090565b600080600c805461104590614b9f565b905014611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e906147b3565b60405180910390fd5b6013544211905090565b8266d529ae9e86000080826110a69190614a3f565b3410156110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df90614693565b60405180910390fd5b6110f06114a7565b61112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906145d3565b60405180910390fd5b6013544210611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614893565b60405180910390fd5b61117e338585611c57565b6111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490614733565b60405180910390fd5b600285601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461120a91906149b8565b111561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290614533565b60405180910390fd5b6112553386612587565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112a590614c02565b91905055505050505050565b6112cc83838360405180602001604052806000815250611bf5565b505050565b6112d961218c565b73ffffffffffffffffffffffffffffffffffffffff166112f76118da565b73ffffffffffffffffffffffffffffffffffffffff161461134d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611344906147d3565b60405180910390fd5b6122b8606461135a610c24565b61136491906149b8565b11156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c90614473565b60405180910390fd5b60005b60648110156113db5760006113bb612653565b90506113c733826127af565b5080806113d390614c02565b9150506113a8565b50565b6113e661218c565b73ffffffffffffffffffffffffffffffffffffffff166114046118da565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906147d3565b60405180910390fd5b6114a547601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127cd90919063ffffffff16565b565b600080600c80546114b790614b9f565b9050146114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f0906147b3565b60405180910390fd5b6012544211905090565b600061150d610c24565b821061154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614873565b60405180910390fd5b6009828154811061156257611561614d66565b5b90600052602060002001549050919050565b6000601154905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e906146f3565b60405180910390fd5b80915050919050565b61163861218c565b73ffffffffffffffffffffffffffffffffffffffff166116566118da565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906147d3565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611758906146d3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117b061218c565b73ffffffffffffffffffffffffffffffffffffffff166117ce6118da565b73ffffffffffffffffffffffffffffffffffffffff1614611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b906147d3565b60405180910390fd5b61182e60006128c1565b565b600061183a610c24565b6122b86118479190614a99565b905090565b600080846040516020016118609190614322565b6040516020818303038152906040528051906020012090506118c6848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483612985565b9150509392505050565b6000601354905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190b61218c565b73ffffffffffffffffffffffffffffffffffffffff166119296118da565b73ffffffffffffffffffffffffffffffffffffffff161461197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906147d3565b60405180910390fd5b8060138190555050565b61199161218c565b73ffffffffffffffffffffffffffffffffffffffff166119af6118da565b73ffffffffffffffffffffffffffffffffffffffff1614611a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fc906147d3565b60405180910390fd5b8060118190555050565b606060028054611a1e90614b9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4a90614b9f565b8015611a975780601f10611a6c57610100808354040283529160200191611a97565b820191906000526020600020905b815481529060010190602001808311611a7a57829003601f168201915b5050505050905090565b611aa961218c565b73ffffffffffffffffffffffffffffffffffffffff16611ac76118da565b73ffffffffffffffffffffffffffffffffffffffff1614611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b14906147d3565b60405180910390fd5b8060148190555050565b6000601254905090565b8067011c37937e0800008082611b479190614a3f565b341015611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090614693565b60405180910390fd5b611b91611035565b611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614493565b60405180910390fd5b611bda3384612587565b505050565b611bf1611bea61218c565b838361299c565b5050565b611c06611c0061218c565b8361224d565b611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90614853565b60405180910390fd5b611c5184848484612b09565b50505050565b60008084604051602001611c6b9190614322565b604051602081830303815290604052805190602001209050611cd1848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612985565b9150509392505050565b6060611ce682612120565b611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90614613565b60405180910390fd5b6000600c8054611d3490614b9f565b905011611dcb57600f8054611d4890614b9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7490614b9f565b8015611dc15780601f10611d9657610100808354040283529160200191611dc1565b820191906000526020600020905b815481529060010190602001808311611da457829003601f168201915b5050505050611df7565b600c611dd683612b65565b604051602001611de792919061433d565b6040516020818303038152906040525b9050919050565b611e0661218c565b73ffffffffffffffffffffffffffffffffffffffff16611e246118da565b73ffffffffffffffffffffffffffffffffffffffff1614611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906147d3565b60405180910390fd5b80600e8190555050565b611e8c61218c565b73ffffffffffffffffffffffffffffffffffffffff16611eaa6118da565b73ffffffffffffffffffffffffffffffffffffffff1614611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906147d3565b60405180910390fd5b80600c9080519060200190611f169291906136a0565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fb661218c565b73ffffffffffffffffffffffffffffffffffffffff16611fd46118da565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612021906147d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612091906144f3565b60405180910390fd5b6120a3816128c1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612119575061211882612cc6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122078361157e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061225882612120565b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e90614653565b60405180910390fd5b60006122a28361157e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061231157508373ffffffffffffffffffffffffffffffffffffffff166122f984610a01565b73ffffffffffffffffffffffffffffffffffffffff16145b8061232257506123218185611f1a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661234b8261157e565b73ffffffffffffffffffffffffffffffffffffffff16146123a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612398906147f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890614593565b60405180910390fd5b61241c838383612da8565b612427600082612194565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124779190614a99565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ce91906149b8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6014544211156125cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c390614573565b60405180910390fd5b6125d4611830565b811115612616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260d90614713565b60405180910390fd5b6000600190505b81811161264e57600061262e612653565b905061263a84826127af565b50808061264690614c02565b91505061261d565b505050565b6000806122cf546122b86126679190614a99565b90506000816122cf543344426040516020016126869493929190614381565b6040516020818303038152906040528051906020012060001c6126a99190614c79565b90506000806017836122b881106126c3576126c2614d66565b5b0154146126e8576017826122b881106126df576126de614d66565b5b015490506126ec565b8190505b600060176001856126fd9190614a99565b6122b8811061270f5761270e614d66565b5b01541415612743576001836127249190614a99565b6017836122b8811061273957612738614d66565b5b0181905550612781565b60176001846127529190614a99565b6122b8811061276457612763614d66565b5b01546017836122b8811061277b5761277a614d66565b5b01819055505b6122cf600081548092919061279590614c02565b91905055506001816127a791906149b8565b935050505090565b6127c9828260405180602001604052806000815250612db8565b5050565b80471015612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280790614633565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128369061436c565b60006040518083038185875af1925050503d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b50509050806128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906145f3565b60405180910390fd5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826129928584612e13565b1490509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a02906145b3565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612afc9190614436565b60405180910390a3505050565b612b1484848461232b565b612b2084848484612e88565b612b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b56906144d3565b60405180910390fd5b50505050565b60606000821415612bad576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cc1565b600082905060005b60008214612bdf578080612bc890614c02565b915050600a82612bd89190614a0e565b9150612bb5565b60008167ffffffffffffffff811115612bfb57612bfa614d95565b5b6040519080825280601f01601f191660200182016040528015612c2d5781602001600182028036833780820191505090505b5090505b60008514612cba57600182612c469190614a99565b9150600a85612c559190614c79565b6030612c6191906149b8565b60f81b818381518110612c7757612c76614d66565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cb39190614a0e565b9450612c31565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d9157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612da15750612da08261301f565b5b9050919050565b612db3838383613089565b505050565b612dc2838361319d565b612dcf6000848484612e88565b612e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e05906144d3565b60405180910390fd5b505050565b60008082905060005b8451811015612e7d576000858281518110612e3a57612e39614d66565b5b60200260200101519050808311612e5c57612e55838261336b565b9250612e69565b612e66818461336b565b92505b508080612e7590614c02565b915050612e1c565b508091505092915050565b6000612ea98473ffffffffffffffffffffffffffffffffffffffff16613382565b15613012578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ed261218c565b8786866040518563ffffffff1660e01b8152600401612ef494939291906143ea565b602060405180830381600087803b158015612f0e57600080fd5b505af1925050508015612f3f57506040513d601f19601f82011682018060405250810190612f3c9190613bb6565b60015b612fc2573d8060008114612f6f576040519150601f19603f3d011682016040523d82523d6000602084013e612f74565b606091505b50600081511415612fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb1906144d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613017565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613094838383613395565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130d7576130d28161339a565b613116565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131155761311483826133e3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131595761315481613550565b613198565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613197576131968282613621565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320490614753565b60405180910390fd5b61321681612120565b15613256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324d90614513565b60405180910390fd5b61326260008383612da8565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132b291906149b8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600082600052816020526040600020905092915050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133f0846116f0565b6133fa9190614a99565b90506000600860008481526020019081526020016000205490508181146134df576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506135649190614a99565b90506000600a600084815260200190815260200160002054905060006009838154811061359457613593614d66565b5b9060005260206000200154905080600983815481106135b6576135b5614d66565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061360557613604614d37565b5b6001900381819060005260206000200160009055905550505050565b600061362c836116f0565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546136ac90614b9f565b90600052602060002090601f0160209004810192826136ce5760008555613715565b82601f106136e757805160ff1916838001178555613715565b82800160010185558215613715579182015b828111156137145782518255916020019190600101906136f9565b5b5090506137229190613726565b5090565b5b8082111561373f576000816000905550600101613727565b5090565b6000613756613751846148f3565b6148ce565b90508281526020810184848401111561377257613771614dd3565b5b61377d848285614b5d565b509392505050565b600061379861379384614924565b6148ce565b9050828152602081018484840111156137b4576137b3614dd3565b5b6137bf848285614b5d565b509392505050565b6000813590506137d6816155b2565b92915050565b6000813590506137eb816155c9565b92915050565b60008083601f84011261380757613806614dc9565b5b8235905067ffffffffffffffff81111561382457613823614dc4565b5b6020830191508360208202830111156138405761383f614dce565b5b9250929050565b600081359050613856816155e0565b92915050565b60008135905061386b816155f7565b92915050565b6000813590506138808161560e565b92915050565b6000815190506138958161560e565b92915050565b600082601f8301126138b0576138af614dc9565b5b81356138c0848260208601613743565b91505092915050565b600082601f8301126138de576138dd614dc9565b5b81356138ee848260208601613785565b91505092915050565b60008135905061390681615625565b92915050565b60006020828403121561392257613921614ddd565b5b6000613930848285016137c7565b91505092915050565b60006020828403121561394f5761394e614ddd565b5b600061395d848285016137dc565b91505092915050565b6000806040838503121561397d5761397c614ddd565b5b600061398b858286016137c7565b925050602061399c858286016137c7565b9150509250929050565b6000806000606084860312156139bf576139be614ddd565b5b60006139cd868287016137c7565b93505060206139de868287016137c7565b92505060406139ef868287016138f7565b9150509250925092565b60008060008060808587031215613a1357613a12614ddd565b5b6000613a21878288016137c7565b9450506020613a32878288016137c7565b9350506040613a43878288016138f7565b925050606085013567ffffffffffffffff811115613a6457613a63614dd8565b5b613a708782880161389b565b91505092959194509250565b600080600060408486031215613a9557613a94614ddd565b5b6000613aa3868287016137c7565b935050602084013567ffffffffffffffff811115613ac457613ac3614dd8565b5b613ad0868287016137f1565b92509250509250925092565b60008060408385031215613af357613af2614ddd565b5b6000613b01858286016137c7565b9250506020613b1285828601613847565b9150509250929050565b60008060408385031215613b3357613b32614ddd565b5b6000613b41858286016137c7565b9250506020613b52858286016138f7565b9150509250929050565b600060208284031215613b7257613b71614ddd565b5b6000613b808482850161385c565b91505092915050565b600060208284031215613b9f57613b9e614ddd565b5b6000613bad84828501613871565b91505092915050565b600060208284031215613bcc57613bcb614ddd565b5b6000613bda84828501613886565b91505092915050565b600060208284031215613bf957613bf8614ddd565b5b600082013567ffffffffffffffff811115613c1757613c16614dd8565b5b613c23848285016138c9565b91505092915050565b600060208284031215613c4257613c41614ddd565b5b6000613c50848285016138f7565b91505092915050565b600080600060408486031215613c7257613c71614ddd565b5b6000613c80868287016138f7565b935050602084013567ffffffffffffffff811115613ca157613ca0614dd8565b5b613cad868287016137f1565b92509250509250925092565b613cc281614acd565b82525050565b613cd9613cd482614acd565b614c4b565b82525050565b613ce881614af1565b82525050565b6000613cf98261496a565b613d038185614980565b9350613d13818560208601614b6c565b613d1c81614de2565b840191505092915050565b6000613d3282614975565b613d3c818561499c565b9350613d4c818560208601614b6c565b613d5581614de2565b840191505092915050565b6000613d6b82614975565b613d7581856149ad565b9350613d85818560208601614b6c565b80840191505092915050565b60008154613d9e81614b9f565b613da881866149ad565b94506001821660008114613dc35760018114613dd457613e07565b60ff19831686528186019350613e07565b613ddd85614955565b60005b83811015613dff57815481890152600182019150602081019050613de0565b838801955050505b50505092915050565b6000613e1d601c8361499c565b9150613e2882614e00565b602082019050919050565b6000613e40601b8361499c565b9150613e4b82614e29565b602082019050919050565b6000613e63602b8361499c565b9150613e6e82614e52565b604082019050919050565b6000613e8660328361499c565b9150613e9182614ea1565b604082019050919050565b6000613ea960268361499c565b9150613eb482614ef0565b604082019050919050565b6000613ecc601c8361499c565b9150613ed782614f3f565b602082019050919050565b6000613eef60178361499c565b9150613efa82614f68565b602082019050919050565b6000613f1260168361499c565b9150613f1d82614f91565b602082019050919050565b6000613f35600b8361499c565b9150613f4082614fba565b602082019050919050565b6000613f5860248361499c565b9150613f6382614fe3565b604082019050919050565b6000613f7b60198361499c565b9150613f8682615032565b602082019050919050565b6000613f9e60168361499c565b9150613fa98261505b565b602082019050919050565b6000613fc1603a8361499c565b9150613fcc82615084565b604082019050919050565b6000613fe460148361499c565b9150613fef826150d3565b602082019050919050565b6000614007601d8361499c565b9150614012826150fc565b602082019050919050565b600061402a602c8361499c565b915061403582615125565b604082019050919050565b600061404d601b8361499c565b915061405882615174565b602082019050919050565b600061407060118361499c565b915061407b8261519d565b602082019050919050565b600061409360388361499c565b915061409e826151c6565b604082019050919050565b60006140b6602a8361499c565b91506140c182615215565b604082019050919050565b60006140d960298361499c565b91506140e482615264565b604082019050919050565b60006140fc60168361499c565b9150614107826152b3565b602082019050919050565b600061411f60168361499c565b915061412a826152dc565b602082019050919050565b600061414260208361499c565b915061414d82615305565b602082019050919050565b6000614165602c8361499c565b91506141708261532e565b604082019050919050565b6000614188600c8361499c565b91506141938261537d565b602082019050919050565b60006141ab6005836149ad565b91506141b6826153a6565b600582019050919050565b60006141ce60088361499c565b91506141d9826153cf565b602082019050919050565b60006141f160208361499c565b91506141fc826153f8565b602082019050919050565b600061421460298361499c565b915061421f82615421565b604082019050919050565b600061423760218361499c565b915061424282615470565b604082019050919050565b600061425a60168361499c565b9150614265826154bf565b602082019050919050565b600061427d600083614991565b9150614288826154e8565b600082019050919050565b60006142a060318361499c565b91506142ab826154eb565b604082019050919050565b60006142c3602c8361499c565b91506142ce8261553a565b604082019050919050565b60006142e6600c8361499c565b91506142f182615589565b602082019050919050565b61430581614b53565b82525050565b61431c61431782614b53565b614c6f565b82525050565b600061432e8284613cc8565b60148201915081905092915050565b60006143498285613d91565b91506143558284613d60565b91506143608261419e565b91508190509392505050565b600061437782614270565b9150819050919050565b600061438d828761430b565b60208201915061439d8286613cc8565b6014820191506143ad828561430b565b6020820191506143bd828461430b565b60208201915081905095945050505050565b60006020820190506143e46000830184613cb9565b92915050565b60006080820190506143ff6000830187613cb9565b61440c6020830186613cb9565b61441960408301856142fc565b818103606083015261442b8184613cee565b905095945050505050565b600060208201905061444b6000830184613cdf565b92915050565b6000602082019050818103600083015261446b8184613d27565b905092915050565b6000602082019050818103600083015261448c81613e10565b9050919050565b600060208201905081810360008301526144ac81613e33565b9050919050565b600060208201905081810360008301526144cc81613e56565b9050919050565b600060208201905081810360008301526144ec81613e79565b9050919050565b6000602082019050818103600083015261450c81613e9c565b9050919050565b6000602082019050818103600083015261452c81613ebf565b9050919050565b6000602082019050818103600083015261454c81613ee2565b9050919050565b6000602082019050818103600083015261456c81613f05565b9050919050565b6000602082019050818103600083015261458c81613f28565b9050919050565b600060208201905081810360008301526145ac81613f4b565b9050919050565b600060208201905081810360008301526145cc81613f6e565b9050919050565b600060208201905081810360008301526145ec81613f91565b9050919050565b6000602082019050818103600083015261460c81613fb4565b9050919050565b6000602082019050818103600083015261462c81613fd7565b9050919050565b6000602082019050818103600083015261464c81613ffa565b9050919050565b6000602082019050818103600083015261466c8161401d565b9050919050565b6000602082019050818103600083015261468c81614040565b9050919050565b600060208201905081810360008301526146ac81614063565b9050919050565b600060208201905081810360008301526146cc81614086565b9050919050565b600060208201905081810360008301526146ec816140a9565b9050919050565b6000602082019050818103600083015261470c816140cc565b9050919050565b6000602082019050818103600083015261472c816140ef565b9050919050565b6000602082019050818103600083015261474c81614112565b9050919050565b6000602082019050818103600083015261476c81614135565b9050919050565b6000602082019050818103600083015261478c81614158565b9050919050565b600060208201905081810360008301526147ac8161417b565b9050919050565b600060208201905081810360008301526147cc816141c1565b9050919050565b600060208201905081810360008301526147ec816141e4565b9050919050565b6000602082019050818103600083015261480c81614207565b9050919050565b6000602082019050818103600083015261482c8161422a565b9050919050565b6000602082019050818103600083015261484c8161424d565b9050919050565b6000602082019050818103600083015261486c81614293565b9050919050565b6000602082019050818103600083015261488c816142b6565b9050919050565b600060208201905081810360008301526148ac816142d9565b9050919050565b60006020820190506148c860008301846142fc565b92915050565b60006148d86148e9565b90506148e48282614bd1565b919050565b6000604051905090565b600067ffffffffffffffff82111561490e5761490d614d95565b5b61491782614de2565b9050602081019050919050565b600067ffffffffffffffff82111561493f5761493e614d95565b5b61494882614de2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149c382614b53565b91506149ce83614b53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a0357614a02614caa565b5b828201905092915050565b6000614a1982614b53565b9150614a2483614b53565b925082614a3457614a33614cd9565b5b828204905092915050565b6000614a4a82614b53565b9150614a5583614b53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8e57614a8d614caa565b5b828202905092915050565b6000614aa482614b53565b9150614aaf83614b53565b925082821015614ac257614ac1614caa565b5b828203905092915050565b6000614ad882614b33565b9050919050565b6000614aea82614b33565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b8a578082015181840152602081019050614b6f565b83811115614b99576000848401525b50505050565b60006002820490506001821680614bb757607f821691505b60208210811415614bcb57614bca614d08565b5b50919050565b614bda82614de2565b810181811067ffffffffffffffff82111715614bf957614bf8614d95565b5b80604052505050565b6000614c0d82614b53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c4057614c3f614caa565b5b600182019050919050565b6000614c5682614c5d565b9050919050565b6000614c6882614df3565b9050919050565b6000819050919050565b6000614c8482614b53565b9150614c8f83614b53565b925082614c9f57614c9e614cd9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e7420776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f4d696e74696e6720686173206e6f742073746172746564207965740000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000600082015250565b7f4e6f742077686974656c697374656420666f72204f4700000000000000000000600082015250565b7f4d696e7420697320656e64000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f574c20686173206e6f7420737461727465642079657400000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420383838206f66204f470000000000600082015250565b7f5061796d656e7420746f6f20736d616c6c000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4e6f742077686974656c697374656420666f7220574c00000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f47206973206578706972650000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74206d696e74000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f4720686173206e6f7420737461727465642079657400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f574c206973206578706972650000000000000000000000000000000000000000600082015250565b6155bb81614acd565b81146155c657600080fd5b50565b6155d281614adf565b81146155dd57600080fd5b50565b6155e981614af1565b81146155f457600080fd5b50565b61560081614afd565b811461560b57600080fd5b50565b61561781614b07565b811461562257600080fd5b50565b61562e81614b53565b811461563957600080fd5b5056fea26469706673582212203a1e8aadebb892e128b6dffa9e25e564fbbc4e2c92ad1e006c00e316d5891b3864736f6c63430008070033697066733a2f2f516d5a447846356e32595958323733476e45336572746f554c706e395971537133517070586f67515a6d55586139

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636605bfda116101395780639eaf167d116100b6578063ba21a9eb1161007a578063ba21a9eb1461082b578063c87b56dd14610868578063cb4a9731146108a5578063e0df5b6f146108ce578063e985e9c5146108f7578063f2fde38b1461093457610246565b80639eaf167d146107695780639f8532c114610792578063a0712d68146107bd578063a22cb465146107d9578063b88d4fde1461080257610246565b80638cfec4c0116100fd5780638cfec4c0146106965780638da5cb5b146106c15780638ebb25ca146106ec5780638fa76a2b1461071557806395d89b411461073e57610246565b80636605bfda146105b157806370a08231146105da578063715018a6146106175780637ecc2b561461062e5780637f9726631461065957610246565b806330066136116101c7578063476343ee1161018b578063476343ee146104ca57806348575bfa146104e15780634f6ccce71461050c578063627711c3146105495780636352211e1461057457610246565b8063300661361461041857806331f9c919146104435780633ef0d36d1461046e57806342842e0e1461048a578063439894e4146104b357610246565b806318160ddd1161020e57806318160ddd146103425780631b6c581a1461036d57806323b872dd146103965780632b314dc6146103bf5780632f745c59146103db57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806311675ccd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613b89565b61095d565b60405161027f9190614436565b60405180910390f35b34801561029457600080fd5b5061029d61096f565b6040516102aa9190614451565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613c2c565b610a01565b6040516102e791906143cf565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613b1c565b610a86565b005b34801561032557600080fd5b50610340600480360381019061033b9190613c2c565b610b9e565b005b34801561034e57600080fd5b50610357610c24565b60405161036491906148b3565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613b5c565b610c31565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906139a6565b610cb7565b005b6103d960048036038101906103d49190613c59565b610d17565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190613b1c565b610f34565b60405161040f91906148b3565b60405180910390f35b34801561042457600080fd5b5061042d610fd9565b60405161043a9190614436565b60405180910390f35b34801561044f57600080fd5b50610458611035565b6040516104659190614436565b60405180910390f35b61048860048036038101906104839190613c59565b611091565b005b34801561049657600080fd5b506104b160048036038101906104ac91906139a6565b6112b1565b005b3480156104bf57600080fd5b506104c86112d1565b005b3480156104d657600080fd5b506104df6113de565b005b3480156104ed57600080fd5b506104f66114a7565b6040516105039190614436565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613c2c565b611503565b60405161054091906148b3565b60405180910390f35b34801561055557600080fd5b5061055e611574565b60405161056b91906148b3565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613c2c565b61157e565b6040516105a891906143cf565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613939565b611630565b005b3480156105e657600080fd5b5061060160048036038101906105fc919061390c565b6116f0565b60405161060e91906148b3565b60405180910390f35b34801561062357600080fd5b5061062c6117a8565b005b34801561063a57600080fd5b50610643611830565b60405161065091906148b3565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613a7c565b61184c565b60405161068d9190614436565b60405180910390f35b3480156106a257600080fd5b506106ab6118d0565b6040516106b891906148b3565b60405180910390f35b3480156106cd57600080fd5b506106d66118da565b6040516106e391906143cf565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613c2c565b611903565b005b34801561072157600080fd5b5061073c60048036038101906107379190613c2c565b611989565b005b34801561074a57600080fd5b50610753611a0f565b6040516107609190614451565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613c2c565b611aa1565b005b34801561079e57600080fd5b506107a7611b27565b6040516107b491906148b3565b60405180910390f35b6107d760048036038101906107d29190613c2c565b611b31565b005b3480156107e557600080fd5b5061080060048036038101906107fb9190613adc565b611bdf565b005b34801561080e57600080fd5b50610829600480360381019061082491906139f9565b611bf5565b005b34801561083757600080fd5b50610852600480360381019061084d9190613a7c565b611c57565b60405161085f9190614436565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190613c2c565b611cdb565b60405161089c9190614451565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190613b5c565b611dfe565b005b3480156108da57600080fd5b506108f560048036038101906108f09190613be3565b611e84565b005b34801561090357600080fd5b5061091e60048036038101906109199190613966565b611f1a565b60405161092b9190614436565b60405180910390f35b34801561094057600080fd5b5061095b6004803603810190610956919061390c565b611fae565b005b6000610968826120a6565b9050919050565b60606001805461097e90614b9f565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90614b9f565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c82612120565b610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290614773565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a918261157e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990614813565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2161218c565b73ffffffffffffffffffffffffffffffffffffffff161480610b505750610b4f81610b4a61218c565b611f1a565b5b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86906146b3565b60405180910390fd5b610b998383612194565b505050565b610ba661218c565b73ffffffffffffffffffffffffffffffffffffffff16610bc46118da565b73ffffffffffffffffffffffffffffffffffffffff1614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c11906147d3565b60405180910390fd5b8060128190555050565b6000600980549050905090565b610c3961218c565b73ffffffffffffffffffffffffffffffffffffffff16610c576118da565b73ffffffffffffffffffffffffffffffffffffffff1614610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca4906147d3565b60405180910390fd5b80600d8190555050565b610cc8610cc261218c565b8261224d565b610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90614853565b60405180910390fd5b610d1283838361232b565b505050565b610d1f610fd9565b610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590614833565b60405180910390fd5b6012544210610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614793565b60405180910390fd5b610dad33838361184c565b610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614553565b60405180910390fd5b61037983610df8610c24565b610e0291906149b8565b10610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3990614673565b60405180910390fd5b600183601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e8f91906149b8565b1115610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec790614533565b60405180910390fd5b610eda3384612587565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610f2a90614c02565b9190505550505050565b6000610f3f836116f0565b8210610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f77906144b3565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600c8054610fe990614b9f565b90501461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906147b3565b60405180910390fd5b6011544211905090565b600080600c805461104590614b9f565b905014611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e906147b3565b60405180910390fd5b6013544211905090565b8266d529ae9e86000080826110a69190614a3f565b3410156110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df90614693565b60405180910390fd5b6110f06114a7565b61112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906145d3565b60405180910390fd5b6013544210611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614893565b60405180910390fd5b61117e338585611c57565b6111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490614733565b60405180910390fd5b600285601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461120a91906149b8565b111561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290614533565b60405180910390fd5b6112553386612587565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906112a590614c02565b91905055505050505050565b6112cc83838360405180602001604052806000815250611bf5565b505050565b6112d961218c565b73ffffffffffffffffffffffffffffffffffffffff166112f76118da565b73ffffffffffffffffffffffffffffffffffffffff161461134d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611344906147d3565b60405180910390fd5b6122b8606461135a610c24565b61136491906149b8565b11156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c90614473565b60405180910390fd5b60005b60648110156113db5760006113bb612653565b90506113c733826127af565b5080806113d390614c02565b9150506113a8565b50565b6113e661218c565b73ffffffffffffffffffffffffffffffffffffffff166114046118da565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906147d3565b60405180910390fd5b6114a547601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127cd90919063ffffffff16565b565b600080600c80546114b790614b9f565b9050146114f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f0906147b3565b60405180910390fd5b6012544211905090565b600061150d610c24565b821061154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614873565b60405180910390fd5b6009828154811061156257611561614d66565b5b90600052602060002001549050919050565b6000601154905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e906146f3565b60405180910390fd5b80915050919050565b61163861218c565b73ffffffffffffffffffffffffffffffffffffffff166116566118da565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906147d3565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611758906146d3565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117b061218c565b73ffffffffffffffffffffffffffffffffffffffff166117ce6118da565b73ffffffffffffffffffffffffffffffffffffffff1614611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b906147d3565b60405180910390fd5b61182e60006128c1565b565b600061183a610c24565b6122b86118479190614a99565b905090565b600080846040516020016118609190614322565b6040516020818303038152906040528051906020012090506118c6848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483612985565b9150509392505050565b6000601354905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190b61218c565b73ffffffffffffffffffffffffffffffffffffffff166119296118da565b73ffffffffffffffffffffffffffffffffffffffff161461197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906147d3565b60405180910390fd5b8060138190555050565b61199161218c565b73ffffffffffffffffffffffffffffffffffffffff166119af6118da565b73ffffffffffffffffffffffffffffffffffffffff1614611a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fc906147d3565b60405180910390fd5b8060118190555050565b606060028054611a1e90614b9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4a90614b9f565b8015611a975780601f10611a6c57610100808354040283529160200191611a97565b820191906000526020600020905b815481529060010190602001808311611a7a57829003601f168201915b5050505050905090565b611aa961218c565b73ffffffffffffffffffffffffffffffffffffffff16611ac76118da565b73ffffffffffffffffffffffffffffffffffffffff1614611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b14906147d3565b60405180910390fd5b8060148190555050565b6000601254905090565b8067011c37937e0800008082611b479190614a3f565b341015611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090614693565b60405180910390fd5b611b91611035565b611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614493565b60405180910390fd5b611bda3384612587565b505050565b611bf1611bea61218c565b838361299c565b5050565b611c06611c0061218c565b8361224d565b611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90614853565b60405180910390fd5b611c5184848484612b09565b50505050565b60008084604051602001611c6b9190614322565b604051602081830303815290604052805190602001209050611cd1848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612985565b9150509392505050565b6060611ce682612120565b611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90614613565b60405180910390fd5b6000600c8054611d3490614b9f565b905011611dcb57600f8054611d4890614b9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7490614b9f565b8015611dc15780601f10611d9657610100808354040283529160200191611dc1565b820191906000526020600020905b815481529060010190602001808311611da457829003601f168201915b5050505050611df7565b600c611dd683612b65565b604051602001611de792919061433d565b6040516020818303038152906040525b9050919050565b611e0661218c565b73ffffffffffffffffffffffffffffffffffffffff16611e246118da565b73ffffffffffffffffffffffffffffffffffffffff1614611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906147d3565b60405180910390fd5b80600e8190555050565b611e8c61218c565b73ffffffffffffffffffffffffffffffffffffffff16611eaa6118da565b73ffffffffffffffffffffffffffffffffffffffff1614611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906147d3565b60405180910390fd5b80600c9080519060200190611f169291906136a0565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fb661218c565b73ffffffffffffffffffffffffffffffffffffffff16611fd46118da565b73ffffffffffffffffffffffffffffffffffffffff161461202a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612021906147d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612091906144f3565b60405180910390fd5b6120a3816128c1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612119575061211882612cc6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122078361157e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061225882612120565b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e90614653565b60405180910390fd5b60006122a28361157e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061231157508373ffffffffffffffffffffffffffffffffffffffff166122f984610a01565b73ffffffffffffffffffffffffffffffffffffffff16145b8061232257506123218185611f1a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661234b8261157e565b73ffffffffffffffffffffffffffffffffffffffff16146123a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612398906147f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890614593565b60405180910390fd5b61241c838383612da8565b612427600082612194565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124779190614a99565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ce91906149b8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6014544211156125cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c390614573565b60405180910390fd5b6125d4611830565b811115612616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260d90614713565b60405180910390fd5b6000600190505b81811161264e57600061262e612653565b905061263a84826127af565b50808061264690614c02565b91505061261d565b505050565b6000806122cf546122b86126679190614a99565b90506000816122cf543344426040516020016126869493929190614381565b6040516020818303038152906040528051906020012060001c6126a99190614c79565b90506000806017836122b881106126c3576126c2614d66565b5b0154146126e8576017826122b881106126df576126de614d66565b5b015490506126ec565b8190505b600060176001856126fd9190614a99565b6122b8811061270f5761270e614d66565b5b01541415612743576001836127249190614a99565b6017836122b8811061273957612738614d66565b5b0181905550612781565b60176001846127529190614a99565b6122b8811061276457612763614d66565b5b01546017836122b8811061277b5761277a614d66565b5b01819055505b6122cf600081548092919061279590614c02565b91905055506001816127a791906149b8565b935050505090565b6127c9828260405180602001604052806000815250612db8565b5050565b80471015612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280790614633565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128369061436c565b60006040518083038185875af1925050503d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b50509050806128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906145f3565b60405180910390fd5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826129928584612e13565b1490509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a02906145b3565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612afc9190614436565b60405180910390a3505050565b612b1484848461232b565b612b2084848484612e88565b612b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b56906144d3565b60405180910390fd5b50505050565b60606000821415612bad576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cc1565b600082905060005b60008214612bdf578080612bc890614c02565b915050600a82612bd89190614a0e565b9150612bb5565b60008167ffffffffffffffff811115612bfb57612bfa614d95565b5b6040519080825280601f01601f191660200182016040528015612c2d5781602001600182028036833780820191505090505b5090505b60008514612cba57600182612c469190614a99565b9150600a85612c559190614c79565b6030612c6191906149b8565b60f81b818381518110612c7757612c76614d66565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cb39190614a0e565b9450612c31565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d9157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612da15750612da08261301f565b5b9050919050565b612db3838383613089565b505050565b612dc2838361319d565b612dcf6000848484612e88565b612e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e05906144d3565b60405180910390fd5b505050565b60008082905060005b8451811015612e7d576000858281518110612e3a57612e39614d66565b5b60200260200101519050808311612e5c57612e55838261336b565b9250612e69565b612e66818461336b565b92505b508080612e7590614c02565b915050612e1c565b508091505092915050565b6000612ea98473ffffffffffffffffffffffffffffffffffffffff16613382565b15613012578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ed261218c565b8786866040518563ffffffff1660e01b8152600401612ef494939291906143ea565b602060405180830381600087803b158015612f0e57600080fd5b505af1925050508015612f3f57506040513d601f19601f82011682018060405250810190612f3c9190613bb6565b60015b612fc2573d8060008114612f6f576040519150601f19603f3d011682016040523d82523d6000602084013e612f74565b606091505b50600081511415612fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb1906144d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613017565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613094838383613395565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130d7576130d28161339a565b613116565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131155761311483826133e3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131595761315481613550565b613198565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613197576131968282613621565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320490614753565b60405180910390fd5b61321681612120565b15613256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324d90614513565b60405180910390fd5b61326260008383612da8565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132b291906149b8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600082600052816020526040600020905092915050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133f0846116f0565b6133fa9190614a99565b90506000600860008481526020019081526020016000205490508181146134df576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506135649190614a99565b90506000600a600084815260200190815260200160002054905060006009838154811061359457613593614d66565b5b9060005260206000200154905080600983815481106135b6576135b5614d66565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061360557613604614d37565b5b6001900381819060005260206000200160009055905550505050565b600061362c836116f0565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546136ac90614b9f565b90600052602060002090601f0160209004810192826136ce5760008555613715565b82601f106136e757805160ff1916838001178555613715565b82800160010185558215613715579182015b828111156137145782518255916020019190600101906136f9565b5b5090506137229190613726565b5090565b5b8082111561373f576000816000905550600101613727565b5090565b6000613756613751846148f3565b6148ce565b90508281526020810184848401111561377257613771614dd3565b5b61377d848285614b5d565b509392505050565b600061379861379384614924565b6148ce565b9050828152602081018484840111156137b4576137b3614dd3565b5b6137bf848285614b5d565b509392505050565b6000813590506137d6816155b2565b92915050565b6000813590506137eb816155c9565b92915050565b60008083601f84011261380757613806614dc9565b5b8235905067ffffffffffffffff81111561382457613823614dc4565b5b6020830191508360208202830111156138405761383f614dce565b5b9250929050565b600081359050613856816155e0565b92915050565b60008135905061386b816155f7565b92915050565b6000813590506138808161560e565b92915050565b6000815190506138958161560e565b92915050565b600082601f8301126138b0576138af614dc9565b5b81356138c0848260208601613743565b91505092915050565b600082601f8301126138de576138dd614dc9565b5b81356138ee848260208601613785565b91505092915050565b60008135905061390681615625565b92915050565b60006020828403121561392257613921614ddd565b5b6000613930848285016137c7565b91505092915050565b60006020828403121561394f5761394e614ddd565b5b600061395d848285016137dc565b91505092915050565b6000806040838503121561397d5761397c614ddd565b5b600061398b858286016137c7565b925050602061399c858286016137c7565b9150509250929050565b6000806000606084860312156139bf576139be614ddd565b5b60006139cd868287016137c7565b93505060206139de868287016137c7565b92505060406139ef868287016138f7565b9150509250925092565b60008060008060808587031215613a1357613a12614ddd565b5b6000613a21878288016137c7565b9450506020613a32878288016137c7565b9350506040613a43878288016138f7565b925050606085013567ffffffffffffffff811115613a6457613a63614dd8565b5b613a708782880161389b565b91505092959194509250565b600080600060408486031215613a9557613a94614ddd565b5b6000613aa3868287016137c7565b935050602084013567ffffffffffffffff811115613ac457613ac3614dd8565b5b613ad0868287016137f1565b92509250509250925092565b60008060408385031215613af357613af2614ddd565b5b6000613b01858286016137c7565b9250506020613b1285828601613847565b9150509250929050565b60008060408385031215613b3357613b32614ddd565b5b6000613b41858286016137c7565b9250506020613b52858286016138f7565b9150509250929050565b600060208284031215613b7257613b71614ddd565b5b6000613b808482850161385c565b91505092915050565b600060208284031215613b9f57613b9e614ddd565b5b6000613bad84828501613871565b91505092915050565b600060208284031215613bcc57613bcb614ddd565b5b6000613bda84828501613886565b91505092915050565b600060208284031215613bf957613bf8614ddd565b5b600082013567ffffffffffffffff811115613c1757613c16614dd8565b5b613c23848285016138c9565b91505092915050565b600060208284031215613c4257613c41614ddd565b5b6000613c50848285016138f7565b91505092915050565b600080600060408486031215613c7257613c71614ddd565b5b6000613c80868287016138f7565b935050602084013567ffffffffffffffff811115613ca157613ca0614dd8565b5b613cad868287016137f1565b92509250509250925092565b613cc281614acd565b82525050565b613cd9613cd482614acd565b614c4b565b82525050565b613ce881614af1565b82525050565b6000613cf98261496a565b613d038185614980565b9350613d13818560208601614b6c565b613d1c81614de2565b840191505092915050565b6000613d3282614975565b613d3c818561499c565b9350613d4c818560208601614b6c565b613d5581614de2565b840191505092915050565b6000613d6b82614975565b613d7581856149ad565b9350613d85818560208601614b6c565b80840191505092915050565b60008154613d9e81614b9f565b613da881866149ad565b94506001821660008114613dc35760018114613dd457613e07565b60ff19831686528186019350613e07565b613ddd85614955565b60005b83811015613dff57815481890152600182019150602081019050613de0565b838801955050505b50505092915050565b6000613e1d601c8361499c565b9150613e2882614e00565b602082019050919050565b6000613e40601b8361499c565b9150613e4b82614e29565b602082019050919050565b6000613e63602b8361499c565b9150613e6e82614e52565b604082019050919050565b6000613e8660328361499c565b9150613e9182614ea1565b604082019050919050565b6000613ea960268361499c565b9150613eb482614ef0565b604082019050919050565b6000613ecc601c8361499c565b9150613ed782614f3f565b602082019050919050565b6000613eef60178361499c565b9150613efa82614f68565b602082019050919050565b6000613f1260168361499c565b9150613f1d82614f91565b602082019050919050565b6000613f35600b8361499c565b9150613f4082614fba565b602082019050919050565b6000613f5860248361499c565b9150613f6382614fe3565b604082019050919050565b6000613f7b60198361499c565b9150613f8682615032565b602082019050919050565b6000613f9e60168361499c565b9150613fa98261505b565b602082019050919050565b6000613fc1603a8361499c565b9150613fcc82615084565b604082019050919050565b6000613fe460148361499c565b9150613fef826150d3565b602082019050919050565b6000614007601d8361499c565b9150614012826150fc565b602082019050919050565b600061402a602c8361499c565b915061403582615125565b604082019050919050565b600061404d601b8361499c565b915061405882615174565b602082019050919050565b600061407060118361499c565b915061407b8261519d565b602082019050919050565b600061409360388361499c565b915061409e826151c6565b604082019050919050565b60006140b6602a8361499c565b91506140c182615215565b604082019050919050565b60006140d960298361499c565b91506140e482615264565b604082019050919050565b60006140fc60168361499c565b9150614107826152b3565b602082019050919050565b600061411f60168361499c565b915061412a826152dc565b602082019050919050565b600061414260208361499c565b915061414d82615305565b602082019050919050565b6000614165602c8361499c565b91506141708261532e565b604082019050919050565b6000614188600c8361499c565b91506141938261537d565b602082019050919050565b60006141ab6005836149ad565b91506141b6826153a6565b600582019050919050565b60006141ce60088361499c565b91506141d9826153cf565b602082019050919050565b60006141f160208361499c565b91506141fc826153f8565b602082019050919050565b600061421460298361499c565b915061421f82615421565b604082019050919050565b600061423760218361499c565b915061424282615470565b604082019050919050565b600061425a60168361499c565b9150614265826154bf565b602082019050919050565b600061427d600083614991565b9150614288826154e8565b600082019050919050565b60006142a060318361499c565b91506142ab826154eb565b604082019050919050565b60006142c3602c8361499c565b91506142ce8261553a565b604082019050919050565b60006142e6600c8361499c565b91506142f182615589565b602082019050919050565b61430581614b53565b82525050565b61431c61431782614b53565b614c6f565b82525050565b600061432e8284613cc8565b60148201915081905092915050565b60006143498285613d91565b91506143558284613d60565b91506143608261419e565b91508190509392505050565b600061437782614270565b9150819050919050565b600061438d828761430b565b60208201915061439d8286613cc8565b6014820191506143ad828561430b565b6020820191506143bd828461430b565b60208201915081905095945050505050565b60006020820190506143e46000830184613cb9565b92915050565b60006080820190506143ff6000830187613cb9565b61440c6020830186613cb9565b61441960408301856142fc565b818103606083015261442b8184613cee565b905095945050505050565b600060208201905061444b6000830184613cdf565b92915050565b6000602082019050818103600083015261446b8184613d27565b905092915050565b6000602082019050818103600083015261448c81613e10565b9050919050565b600060208201905081810360008301526144ac81613e33565b9050919050565b600060208201905081810360008301526144cc81613e56565b9050919050565b600060208201905081810360008301526144ec81613e79565b9050919050565b6000602082019050818103600083015261450c81613e9c565b9050919050565b6000602082019050818103600083015261452c81613ebf565b9050919050565b6000602082019050818103600083015261454c81613ee2565b9050919050565b6000602082019050818103600083015261456c81613f05565b9050919050565b6000602082019050818103600083015261458c81613f28565b9050919050565b600060208201905081810360008301526145ac81613f4b565b9050919050565b600060208201905081810360008301526145cc81613f6e565b9050919050565b600060208201905081810360008301526145ec81613f91565b9050919050565b6000602082019050818103600083015261460c81613fb4565b9050919050565b6000602082019050818103600083015261462c81613fd7565b9050919050565b6000602082019050818103600083015261464c81613ffa565b9050919050565b6000602082019050818103600083015261466c8161401d565b9050919050565b6000602082019050818103600083015261468c81614040565b9050919050565b600060208201905081810360008301526146ac81614063565b9050919050565b600060208201905081810360008301526146cc81614086565b9050919050565b600060208201905081810360008301526146ec816140a9565b9050919050565b6000602082019050818103600083015261470c816140cc565b9050919050565b6000602082019050818103600083015261472c816140ef565b9050919050565b6000602082019050818103600083015261474c81614112565b9050919050565b6000602082019050818103600083015261476c81614135565b9050919050565b6000602082019050818103600083015261478c81614158565b9050919050565b600060208201905081810360008301526147ac8161417b565b9050919050565b600060208201905081810360008301526147cc816141c1565b9050919050565b600060208201905081810360008301526147ec816141e4565b9050919050565b6000602082019050818103600083015261480c81614207565b9050919050565b6000602082019050818103600083015261482c8161422a565b9050919050565b6000602082019050818103600083015261484c8161424d565b9050919050565b6000602082019050818103600083015261486c81614293565b9050919050565b6000602082019050818103600083015261488c816142b6565b9050919050565b600060208201905081810360008301526148ac816142d9565b9050919050565b60006020820190506148c860008301846142fc565b92915050565b60006148d86148e9565b90506148e48282614bd1565b919050565b6000604051905090565b600067ffffffffffffffff82111561490e5761490d614d95565b5b61491782614de2565b9050602081019050919050565b600067ffffffffffffffff82111561493f5761493e614d95565b5b61494882614de2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149c382614b53565b91506149ce83614b53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a0357614a02614caa565b5b828201905092915050565b6000614a1982614b53565b9150614a2483614b53565b925082614a3457614a33614cd9565b5b828204905092915050565b6000614a4a82614b53565b9150614a5583614b53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8e57614a8d614caa565b5b828202905092915050565b6000614aa482614b53565b9150614aaf83614b53565b925082821015614ac257614ac1614caa565b5b828203905092915050565b6000614ad882614b33565b9050919050565b6000614aea82614b33565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b8a578082015181840152602081019050614b6f565b83811115614b99576000848401525b50505050565b60006002820490506001821680614bb757607f821691505b60208210811415614bcb57614bca614d08565b5b50919050565b614bda82614de2565b810181811067ffffffffffffffff82111715614bf957614bf8614d95565b5b80604052505050565b6000614c0d82614b53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c4057614c3f614caa565b5b600182019050919050565b6000614c5682614c5d565b9050919050565b6000614c6882614df3565b9050919050565b6000819050919050565b6000614c8482614b53565b9150614c8f83614b53565b925082614c9f57614c9e614cd9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e7420776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f4d696e74696e6720686173206e6f742073746172746564207965740000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000600082015250565b7f4e6f742077686974656c697374656420666f72204f4700000000000000000000600082015250565b7f4d696e7420697320656e64000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f574c20686173206e6f7420737461727465642079657400000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420383838206f66204f470000000000600082015250565b7f5061796d656e7420746f6f20736d616c6c000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4e6f742077686974656c697374656420666f7220574c00000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f47206973206578706972650000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74206d696e74000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f4720686173206e6f7420737461727465642079657400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f574c206973206578706972650000000000000000000000000000000000000000600082015250565b6155bb81614acd565b81146155c657600080fd5b50565b6155d281614adf565b81146155dd57600080fd5b50565b6155e981614af1565b81146155f457600080fd5b50565b61560081614afd565b811461560b57600080fd5b50565b61561781614b07565b811461562257600080fd5b50565b61562e81614b53565b811461563957600080fd5b5056fea26469706673582212203a1e8aadebb892e128b6dffa9e25e564fbbc4e2c92ad1e006c00e316d5891b3864736f6c63430008070033

Deployed Bytecode Sourcemap

47307:7892:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54025:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24051:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25610:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25133:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48528:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37000:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48748;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26360:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51804:591;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36668:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50418:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50244:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52404:559;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26770:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52971:291;;;;;;;;;;;;;:::i;:::-;;49130:120;;;;;;;;;;;;;:::i;:::-;;50584:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37190:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54344:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23745:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48988:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23475:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21058:103;;;;;;;;;;;;;:::i;:::-;;50773:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49258:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54237:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20407:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48294:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48419:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24220:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48637:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54443:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51512:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25903:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27026:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49536:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53407:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48867:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53270:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26129:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21316:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54025:204;54156:4;54185:36;54209:11;54185:23;:36::i;:::-;54178:43;;54025:204;;;:::o;24051:100::-;24105:13;24138:5;24131:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24051:100;:::o;25610:221::-;25686:7;25714:16;25722:7;25714;:16::i;:::-;25706:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25799:15;:24;25815:7;25799:24;;;;;;;;;;;;;;;;;;;;;25792:31;;25610:221;;;:::o;25133:411::-;25214:13;25230:23;25245:7;25230:14;:23::i;:::-;25214:39;;25278:5;25272:11;;:2;:11;;;;25264:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25372:5;25356:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25381:37;25398:5;25405:12;:10;:12::i;:::-;25381:16;:37::i;:::-;25356:62;25334:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25515:21;25524:2;25528:7;25515:8;:21::i;:::-;25203:341;25133:411;;:::o;48528:103::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48614:9:::1;48599:12;:24;;;;48528:103:::0;:::o;37000:113::-;37061:7;37088:10;:17;;;;37081:24;;37000:113;:::o;48748:::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48841:12:::1;48825:13;:28;;;;48748:113:::0;:::o;26360:339::-;26555:41;26574:12;:10;:12::i;:::-;26588:7;26555:18;:41::i;:::-;26547:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26663:28;26673:4;26679:2;26683:7;26663:9;:28::i;:::-;26360:339;;;:::o;51804:591::-;51921:10;:8;:10::i;:::-;51913:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51995:12;;51977:15;:30;51969:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;52056:34;52072:10;52084:5;;52056:15;:34::i;:::-;52034:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;52182:3;52173:6;52159:13;:11;:13::i;:::-;:20;;;;:::i;:::-;:26;52151:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52275:1;52265:6;52236:14;:26;52251:10;52236:26;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:40;;52228:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52317:31;52329:10;52341:6;52317:11;:31::i;:::-;52359:14;:26;52374:10;52359:26;;;;;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;;51804:591;;;:::o;36668:256::-;36765:7;36801:23;36818:5;36801:16;:23::i;:::-;36793:5;:31;36785:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36890:12;:19;36903:5;36890:19;;;;;;;;;;;;;;;:26;36910:5;36890:26;;;;;;;;;;;;36883:33;;36668:256;;;;:::o;50418:119::-;50474:4;50160:1;50141:7;50135:21;;;;;:::i;:::-;;;:26;50127:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50517:12:::1;;50499:15;:30;50492:37;;50418:119:::0;:::o;50244:127::-;50305:4;50160:1;50141:7;50135:21;;;;;:::i;:::-;;;:26;50127:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50347:16:::1;;50329:15;:34;50322:41;;50244:127:::0;:::o;52404:559::-;52522:6;47796:17;50010:9;50001:6;:18;;;;:::i;:::-;49988:9;:31;;49966:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;52562:10:::1;:8;:10::i;:::-;52554:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;52636:16;;52618:15;:34;52610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52701:34;52717:10;52729:5;;52701:15;:34::i;:::-;52679:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;52843:1;52833:6;52804:14;:26;52819:10;52804:26;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:40;;52796:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52885:31;52897:10;52909:6;52885:11;:31::i;:::-;52927:14;:26;52942:10;52927:26;;;;;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;;52404:559:::0;;;;;:::o;26770:185::-;26908:39;26925:4;26931:2;26935:7;26908:39;;;;;;;;;;;;:16;:39::i;:::-;26770:185;;;:::o;52971:291::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47748:4:::1;53045:3;53029:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:33;;53021:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53112:6;53129:126;53145:3;53141:1;:7;53129:126;;;53170:15;53188:10;:8;:10::i;:::-;53170:28;;53213:30;53223:10;53235:7;53213:9;:30::i;:::-;53155:100;53150:3;;;;;:::i;:::-;;;;53129:126;;;53010:252;52971:291::o:0;49130:120::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49184:58:::1;49220:21;49192:16;;;;;;;;;;;49184:35;;;;:58;;;;:::i;:::-;49130:120::o:0;50584:119::-;50640:4;50160:1;50141:7;50135:21;;;;;:::i;:::-;;;:26;50127:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50683:12:::1;;50665:15;:30;50658:37;;50584:119:::0;:::o;37190:233::-;37265:7;37301:30;:28;:30::i;:::-;37293:5;:38;37285:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37398:10;37409:5;37398:17;;;;;;;;:::i;:::-;;;;;;;;;;37391:24;;37190:233;;;:::o;54344:91::-;54388:7;54415:12;;54408:19;;54344:91;:::o;23745:239::-;23817:7;23837:13;23853:7;:16;23861:7;23853:16;;;;;;;;;;;;;;;;;;;;;23837:32;;23905:1;23888:19;;:5;:19;;;;23880:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23971:5;23964:12;;;23745:239;;;:::o;48988:134::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49099:15:::1;49080:16;;:34;;;;;;;;;;;;;;;;;;48988:134:::0;:::o;23475:208::-;23547:7;23592:1;23575:19;;:5;:19;;;;23567:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23659:9;:16;23669:5;23659:16;;;;;;;;;;;;;;;;23652:23;;23475:208;;;:::o;21058:103::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21123:30:::1;21150:1;21123:18;:30::i;:::-;21058:103::o:0;50773:135::-;50821:7;50887:13;:11;:13::i;:::-;47748:4;50861:39;;;;:::i;:::-;50841:59;;50773:135;:::o;49258:272::-;49373:4;49395:12;49437:6;49420:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;49410:35;;;;;;49395:50;;49476:46;49495:5;;49476:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49502:13;;49517:4;49476:18;:46::i;:::-;49456:66;;;49258:272;;;;;:::o;54237:99::-;54285:7;54312:16;;54305:23;;54237:99;:::o;20407:87::-;20453:7;20480:6;;;;;;;;;;;20473:13;;20407:87;:::o;48294:119::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48392:13:::1;48373:16;:32;;;;48294:119:::0;:::o;48419:103::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48505:9:::1;48490:12;:24;;;;48419:103:::0;:::o;24220:104::-;24276:13;24309:7;24302:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24220:104;:::o;48637:97::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48716:10:::1;48705:8;:21;;;;48637:97:::0;:::o;54443:90::-;54487:7;54513:12;;54506:19;;54443:90;:::o;51512:228::-;51575:6;47864:17;50010:9;50001:6;:18;;;;:::i;:::-;49988:9;:31;;49966:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;51614:15:::1;:13;:15::i;:::-;51606:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51701:31;51713:10;51725:6;51701:11;:31::i;:::-;51512:228:::0;;;:::o;25903:155::-;25998:52;26017:12;:10;:12::i;:::-;26031:8;26041;25998:18;:52::i;:::-;25903:155;;:::o;27026:328::-;27201:41;27220:12;:10;:12::i;:::-;27234:7;27201:18;:41::i;:::-;27193:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27307:39;27321:4;27327:2;27331:7;27340:5;27307:13;:39::i;:::-;27026:328;;;;:::o;49536:272::-;49651:4;49673:12;49715:6;49698:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;49688:35;;;;;;49673:50;;49754:46;49773:5;;49754:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49780:13;;49795:4;49754:18;:46::i;:::-;49734:66;;;49536:272;;;;;:::o;53407:404::-;53508:13;53547:16;53555:7;53547;:16::i;:::-;53539:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;53653:1;53635:7;53629:21;;;;;:::i;:::-;;;:25;:164;;53779:14;53629:164;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53712:7;53721:18;:7;:16;:18::i;:::-;53695:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53629:164;53609:184;;53407:404;;;:::o;48867:113::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48960:12:::1;48944:13;:28;;;;48867:113:::0;:::o;53270:93::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53351:4:::1;53341:7;:14;;;;;;;;;;;;:::i;:::-;;53270:93:::0;:::o;26129:164::-;26226:4;26250:18;:25;26269:5;26250:25;;;;;;;;;;;;;;;:35;26276:8;26250:35;;;;;;;;;;;;;;;;;;;;;;;;;26243:42;;26129:164;;;;:::o;21316:201::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21425:1:::1;21405:22;;:8;:22;;;;21397:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21481:28;21500:8;21481:18;:28::i;:::-;21316:201:::0;:::o;36360:224::-;36462:4;36501:35;36486:50;;;:11;:50;;;;:90;;;;36540:36;36564:11;36540:23;:36::i;:::-;36486:90;36479:97;;36360:224;;;:::o;28864:127::-;28929:4;28981:1;28953:30;;:7;:16;28961:7;28953:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28946:37;;28864:127;;;:::o;17289:98::-;17342:7;17369:10;17362:17;;17289:98;:::o;32846:174::-;32948:2;32921:15;:24;32937:7;32921:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33004:7;33000:2;32966:46;;32975:23;32990:7;32975:14;:23::i;:::-;32966:46;;;;;;;;;;;;32846:174;;:::o;29158:348::-;29251:4;29276:16;29284:7;29276;:16::i;:::-;29268:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29352:13;29368:23;29383:7;29368:14;:23::i;:::-;29352:39;;29421:5;29410:16;;:7;:16;;;:51;;;;29454:7;29430:31;;:20;29442:7;29430:11;:20::i;:::-;:31;;;29410:51;:87;;;;29465:32;29482:5;29489:7;29465:16;:32::i;:::-;29410:87;29402:96;;;29158:348;;;;:::o;32150:578::-;32309:4;32282:31;;:23;32297:7;32282:14;:23::i;:::-;:31;;;32274:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32392:1;32378:16;;:2;:16;;;;32370:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32448:39;32469:4;32475:2;32479:7;32448:20;:39::i;:::-;32552:29;32569:1;32573:7;32552:8;:29::i;:::-;32613:1;32594:9;:15;32604:4;32594:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32642:1;32625:9;:13;32635:2;32625:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32673:2;32654:7;:16;32662:7;32654:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32712:7;32708:2;32693:27;;32702:4;32693:27;;;;;;;;;;;;32150:578;;;:::o;50975:508::-;51071:8;;51052:15;:27;;51044:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51124:17;:15;:17::i;:::-;51114:6;:27;;51106:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51351:9;51363:1;51351:13;;51346:130;51371:6;51366:1;:11;51346:130;;51399:15;51417:10;:8;:10::i;:::-;51399:28;;51442:22;51452:2;51456:7;51442:9;:22::i;:::-;51384:92;51379:3;;;;;:::i;:::-;;;;51346:130;;;;50975:508;;:::o;54602:594::-;54640:4;54657:14;54687:5;;47748:4;54674:18;;;;:::i;:::-;54657:35;;54703:10;54806:9;54748:5;;54755:10;54767:16;54785:15;54731:70;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54721:81;;;;;;54716:87;;:99;;;;:::i;:::-;54703:112;;54826:10;54873:1;54855:7;54863:5;54855:14;;;;;;;:::i;:::-;;;;:19;54851:120;;54899:7;54907:5;54899:14;;;;;;;:::i;:::-;;;;54891:22;;54851:120;;;54954:5;54946:13;;54851:120;55014:1;54988:7;55008:1;54996:9;:13;;;;:::i;:::-;54988:22;;;;;;;:::i;:::-;;;;:27;54984:162;;;55061:1;55049:9;:13;;;;:::i;:::-;55032:7;55040:5;55032:14;;;;;;;:::i;:::-;;;:30;;;;54984:162;;;55112:7;55132:1;55120:9;:13;;;;:::i;:::-;55112:22;;;;;;;:::i;:::-;;;;55095:7;55103:5;55095:14;;;;;;;:::i;:::-;;;:39;;;;54984:162;55156:5;;:7;;;;;;;;;:::i;:::-;;;;;;55187:1;55181:5;:7;;;;:::i;:::-;55174:14;;;;;54602:594;:::o;29848:110::-;29924:26;29934:2;29938:7;29924:26;;;;;;;;;;;;:9;:26::i;:::-;29848:110;;:::o;10740:317::-;10855:6;10830:21;:31;;10822:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10909:12;10927:9;:14;;10949:6;10927:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10908:52;;;10979:7;10971:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10811:246;10740:317;;:::o;21677:191::-;21751:16;21770:6;;;;;;;;;;;21751:25;;21796:8;21787:6;;:17;;;;;;;;;;;;;;;;;;21851:8;21820:40;;21841:8;21820:40;;;;;;;;;;;;21740:128;21677:191;:::o;45841:190::-;45966:4;46019;45990:25;46003:5;46010:4;45990:12;:25::i;:::-;:33;45983:40;;45841:190;;;;;:::o;33162:315::-;33317:8;33308:17;;:5;:17;;;;33300:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33404:8;33366:18;:25;33385:5;33366:25;;;;;;;;;;;;;;;:35;33392:8;33366:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33450:8;33428:41;;33443:5;33428:41;;;33460:8;33428:41;;;;;;:::i;:::-;;;;;;;;33162:315;;;:::o;28236:::-;28393:28;28403:4;28409:2;28413:7;28393:9;:28::i;:::-;28440:48;28463:4;28469:2;28473:7;28482:5;28440:22;:48::i;:::-;28432:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28236:315;;;;:::o;17729:723::-;17785:13;18015:1;18006:5;:10;18002:53;;;18033:10;;;;;;;;;;;;;;;;;;;;;18002:53;18065:12;18080:5;18065:20;;18096:14;18121:78;18136:1;18128:4;:9;18121:78;;18154:8;;;;;:::i;:::-;;;;18185:2;18177:10;;;;;:::i;:::-;;;18121:78;;;18209:19;18241:6;18231:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18209:39;;18259:154;18275:1;18266:5;:10;18259:154;;18303:1;18293:11;;;;;:::i;:::-;;;18370:2;18362:5;:10;;;;:::i;:::-;18349:2;:24;;;;:::i;:::-;18336:39;;18319:6;18326;18319:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18399:2;18390:11;;;;;:::i;:::-;;;18259:154;;;18437:6;18423:21;;;;;17729:723;;;;:::o;23106:305::-;23208:4;23260:25;23245:40;;;:11;:40;;;;:105;;;;23317:33;23302:48;;;:11;:48;;;;23245:105;:158;;;;23367:36;23391:11;23367:23;:36::i;:::-;23245:158;23225:178;;23106:305;;;:::o;53821:196::-;53964:45;53991:4;53997:2;54001:7;53964:26;:45::i;:::-;53821:196;;;:::o;30185:321::-;30315:18;30321:2;30325:7;30315:5;:18::i;:::-;30366:54;30397:1;30401:2;30405:7;30414:5;30366:22;:54::i;:::-;30344:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30185:321;;;:::o;46393:675::-;46476:7;46496:20;46519:4;46496:27;;46539:9;46534:497;46558:5;:12;46554:1;:16;46534:497;;;46592:20;46615:5;46621:1;46615:8;;;;;;;;:::i;:::-;;;;;;;;46592:31;;46658:12;46642;:28;46638:382;;46785:42;46800:12;46814;46785:14;:42::i;:::-;46770:57;;46638:382;;;46962:42;46977:12;46991;46962:14;:42::i;:::-;46947:57;;46638:382;46577:454;46572:3;;;;;:::i;:::-;;;;46534:497;;;;47048:12;47041:19;;;46393:675;;;;:::o;34042:799::-;34197:4;34218:15;:2;:13;;;:15::i;:::-;34214:620;;;34270:2;34254:36;;;34291:12;:10;:12::i;:::-;34305:4;34311:7;34320:5;34254:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34250:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34513:1;34496:6;:13;:18;34492:272;;;34539:60;;;;;;;;;;:::i;:::-;;;;;;;;34492:272;34714:6;34708:13;34699:6;34695:2;34691:15;34684:38;34250:529;34387:41;;;34377:51;;;:6;:51;;;;34370:58;;;;;34214:620;34818:4;34811:11;;34042:799;;;;;;;:::o;7091:157::-;7176:4;7215:25;7200:40;;;:11;:40;;;;7193:47;;7091:157;;;:::o;38036:589::-;38180:45;38207:4;38213:2;38217:7;38180:26;:45::i;:::-;38258:1;38242:18;;:4;:18;;;38238:187;;;38277:40;38309:7;38277:31;:40::i;:::-;38238:187;;;38347:2;38339:10;;:4;:10;;;38335:90;;38366:47;38399:4;38405:7;38366:32;:47::i;:::-;38335:90;38238:187;38453:1;38439:16;;:2;:16;;;38435:183;;;38472:45;38509:7;38472:36;:45::i;:::-;38435:183;;;38545:4;38539:10;;:2;:10;;;38535:83;;38566:40;38594:2;38598:7;38566:27;:40::i;:::-;38535:83;38435:183;38036:589;;;:::o;30842:382::-;30936:1;30922:16;;:2;:16;;;;30914:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30995:16;31003:7;30995;:16::i;:::-;30994:17;30986:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31057:45;31086:1;31090:2;31094:7;31057:20;:45::i;:::-;31132:1;31115:9;:13;31125:2;31115:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31163:2;31144:7;:16;31152:7;31144:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31208:7;31204:2;31183:33;;31200:1;31183:33;;;;;;;;;;;;30842:382;;:::o;47076:224::-;47144:13;47207:1;47201:4;47194:15;47236:1;47230:4;47223:15;47277:4;47271;47261:21;47252:30;;47076:224;;;;:::o;9418:387::-;9478:4;9686:12;9753:7;9741:20;9733:28;;9796:1;9789:4;:8;9782:15;;;9418:387;;;:::o;35413:126::-;;;;:::o;39348:164::-;39452:10;:17;;;;39425:15;:24;39441:7;39425:24;;;;;;;;;;;:44;;;;39480:10;39496:7;39480:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39348:164;:::o;40139:988::-;40405:22;40455:1;40430:22;40447:4;40430:16;:22::i;:::-;:26;;;;:::i;:::-;40405:51;;40467:18;40488:17;:26;40506:7;40488:26;;;;;;;;;;;;40467:47;;40635:14;40621:10;:28;40617:328;;40666:19;40688:12;:18;40701:4;40688:18;;;;;;;;;;;;;;;:34;40707:14;40688:34;;;;;;;;;;;;40666:56;;40772:11;40739:12;:18;40752:4;40739:18;;;;;;;;;;;;;;;:30;40758:10;40739:30;;;;;;;;;;;:44;;;;40889:10;40856:17;:30;40874:11;40856:30;;;;;;;;;;;:43;;;;40651:294;40617:328;41041:17;:26;41059:7;41041:26;;;;;;;;;;;41034:33;;;41085:12;:18;41098:4;41085:18;;;;;;;;;;;;;;;:34;41104:14;41085:34;;;;;;;;;;;41078:41;;;40220:907;;40139:988;;:::o;41422:1079::-;41675:22;41720:1;41700:10;:17;;;;:21;;;;:::i;:::-;41675:46;;41732:18;41753:15;:24;41769:7;41753:24;;;;;;;;;;;;41732:45;;42104:19;42126:10;42137:14;42126:26;;;;;;;;:::i;:::-;;;;;;;;;;42104:48;;42190:11;42165:10;42176;42165:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42301:10;42270:15;:28;42286:11;42270:28;;;;;;;;;;;:41;;;;42442:15;:24;42458:7;42442:24;;;;;;;;;;;42435:31;;;42477:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41493:1008;;;41422:1079;:::o;38926:221::-;39011:14;39028:20;39045:2;39028:16;:20::i;:::-;39011:37;;39086:7;39059:12;:16;39072:2;39059:16;;;;;;;;;;;;;;;:24;39076:6;39059:24;;;;;;;;;;;:34;;;;39133:6;39104:17;:26;39122:7;39104:26;;;;;;;;;;;:35;;;;39000:147;38926:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1164:568::-;1237:8;1247:6;1297:3;1290:4;1282:6;1278:17;1274:27;1264:122;;1305:79;;:::i;:::-;1264:122;1418:6;1405:20;1395:30;;1448:18;1440:6;1437:30;1434:117;;;1470:79;;:::i;:::-;1434:117;1584:4;1576:6;1572:17;1560:29;;1638:3;1630:4;1622:6;1618:17;1608:8;1604:32;1601:41;1598:128;;;1645:79;;:::i;:::-;1598:128;1164:568;;;;;:::o;1738:133::-;1781:5;1819:6;1806:20;1797:29;;1835:30;1859:5;1835:30;:::i;:::-;1738:133;;;;:::o;1877:139::-;1923:5;1961:6;1948:20;1939:29;;1977:33;2004:5;1977:33;:::i;:::-;1877:139;;;;:::o;2022:137::-;2067:5;2105:6;2092:20;2083:29;;2121:32;2147:5;2121:32;:::i;:::-;2022:137;;;;:::o;2165:141::-;2221:5;2252:6;2246:13;2237:22;;2268:32;2294:5;2268:32;:::i;:::-;2165:141;;;;:::o;2325:338::-;2380:5;2429:3;2422:4;2414:6;2410:17;2406:27;2396:122;;2437:79;;:::i;:::-;2396:122;2554:6;2541:20;2579:78;2653:3;2645:6;2638:4;2630:6;2626:17;2579:78;:::i;:::-;2570:87;;2386:277;2325:338;;;;:::o;2683:340::-;2739:5;2788:3;2781:4;2773:6;2769:17;2765:27;2755:122;;2796:79;;:::i;:::-;2755:122;2913:6;2900:20;2938:79;3013:3;3005:6;2998:4;2990:6;2986:17;2938:79;:::i;:::-;2929:88;;2745:278;2683:340;;;;:::o;3029:139::-;3075:5;3113:6;3100:20;3091:29;;3129:33;3156:5;3129:33;:::i;:::-;3029:139;;;;:::o;3174:329::-;3233:6;3282:2;3270:9;3261:7;3257:23;3253:32;3250:119;;;3288:79;;:::i;:::-;3250:119;3408:1;3433:53;3478:7;3469:6;3458:9;3454:22;3433:53;:::i;:::-;3423:63;;3379:117;3174:329;;;;:::o;3509:345::-;3576:6;3625:2;3613:9;3604:7;3600:23;3596:32;3593:119;;;3631:79;;:::i;:::-;3593:119;3751:1;3776:61;3829:7;3820:6;3809:9;3805:22;3776:61;:::i;:::-;3766:71;;3722:125;3509:345;;;;:::o;3860:474::-;3928:6;3936;3985:2;3973:9;3964:7;3960:23;3956:32;3953:119;;;3991:79;;:::i;:::-;3953:119;4111:1;4136:53;4181:7;4172:6;4161:9;4157:22;4136:53;:::i;:::-;4126:63;;4082:117;4238:2;4264:53;4309:7;4300:6;4289:9;4285:22;4264:53;:::i;:::-;4254:63;;4209:118;3860:474;;;;;:::o;4340:619::-;4417:6;4425;4433;4482:2;4470:9;4461:7;4457:23;4453:32;4450:119;;;4488:79;;:::i;:::-;4450:119;4608:1;4633:53;4678:7;4669:6;4658:9;4654:22;4633:53;:::i;:::-;4623:63;;4579:117;4735:2;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4706:118;4863:2;4889:53;4934:7;4925:6;4914:9;4910:22;4889:53;:::i;:::-;4879:63;;4834:118;4340:619;;;;;:::o;4965:943::-;5060:6;5068;5076;5084;5133:3;5121:9;5112:7;5108:23;5104:33;5101:120;;;5140:79;;:::i;:::-;5101:120;5260:1;5285:53;5330:7;5321:6;5310:9;5306:22;5285:53;:::i;:::-;5275:63;;5231:117;5387:2;5413:53;5458:7;5449:6;5438:9;5434:22;5413:53;:::i;:::-;5403:63;;5358:118;5515:2;5541:53;5586:7;5577:6;5566:9;5562:22;5541:53;:::i;:::-;5531:63;;5486:118;5671:2;5660:9;5656:18;5643:32;5702:18;5694:6;5691:30;5688:117;;;5724:79;;:::i;:::-;5688:117;5829:62;5883:7;5874:6;5863:9;5859:22;5829:62;:::i;:::-;5819:72;;5614:287;4965:943;;;;;;;:::o;5914:704::-;6009:6;6017;6025;6074:2;6062:9;6053:7;6049:23;6045:32;6042:119;;;6080:79;;:::i;:::-;6042:119;6200:1;6225:53;6270:7;6261:6;6250:9;6246:22;6225:53;:::i;:::-;6215:63;;6171:117;6355:2;6344:9;6340:18;6327:32;6386:18;6378:6;6375:30;6372:117;;;6408:79;;:::i;:::-;6372:117;6521:80;6593:7;6584:6;6573:9;6569:22;6521:80;:::i;:::-;6503:98;;;;6298:313;5914:704;;;;;:::o;6624:468::-;6689:6;6697;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6999:2;7025:50;7067:7;7058:6;7047:9;7043:22;7025:50;:::i;:::-;7015:60;;6970:115;6624:468;;;;;:::o;7098:474::-;7166:6;7174;7223:2;7211:9;7202:7;7198:23;7194:32;7191:119;;;7229:79;;:::i;:::-;7191:119;7349:1;7374:53;7419:7;7410:6;7399:9;7395:22;7374:53;:::i;:::-;7364:63;;7320:117;7476:2;7502:53;7547:7;7538:6;7527:9;7523:22;7502:53;:::i;:::-;7492:63;;7447:118;7098:474;;;;;:::o;7578:329::-;7637:6;7686:2;7674:9;7665:7;7661:23;7657:32;7654:119;;;7692:79;;:::i;:::-;7654:119;7812:1;7837:53;7882:7;7873:6;7862:9;7858:22;7837:53;:::i;:::-;7827:63;;7783:117;7578:329;;;;:::o;7913:327::-;7971:6;8020:2;8008:9;7999:7;7995:23;7991:32;7988:119;;;8026:79;;:::i;:::-;7988:119;8146:1;8171:52;8215:7;8206:6;8195:9;8191:22;8171:52;:::i;:::-;8161:62;;8117:116;7913:327;;;;:::o;8246:349::-;8315:6;8364:2;8352:9;8343:7;8339:23;8335:32;8332:119;;;8370:79;;:::i;:::-;8332:119;8490:1;8515:63;8570:7;8561:6;8550:9;8546:22;8515:63;:::i;:::-;8505:73;;8461:127;8246:349;;;;:::o;8601:509::-;8670:6;8719:2;8707:9;8698:7;8694:23;8690:32;8687:119;;;8725:79;;:::i;:::-;8687:119;8873:1;8862:9;8858:17;8845:31;8903:18;8895:6;8892:30;8889:117;;;8925:79;;:::i;:::-;8889:117;9030:63;9085:7;9076:6;9065:9;9061:22;9030:63;:::i;:::-;9020:73;;8816:287;8601:509;;;;:::o;9116:329::-;9175:6;9224:2;9212:9;9203:7;9199:23;9195:32;9192:119;;;9230:79;;:::i;:::-;9192:119;9350:1;9375:53;9420:7;9411:6;9400:9;9396:22;9375:53;:::i;:::-;9365:63;;9321:117;9116:329;;;;:::o;9451:704::-;9546:6;9554;9562;9611:2;9599:9;9590:7;9586:23;9582:32;9579:119;;;9617:79;;:::i;:::-;9579:119;9737:1;9762:53;9807:7;9798:6;9787:9;9783:22;9762:53;:::i;:::-;9752:63;;9708:117;9892:2;9881:9;9877:18;9864:32;9923:18;9915:6;9912:30;9909:117;;;9945:79;;:::i;:::-;9909:117;10058:80;10130:7;10121:6;10110:9;10106:22;10058:80;:::i;:::-;10040:98;;;;9835:313;9451:704;;;;;:::o;10161:118::-;10248:24;10266:5;10248:24;:::i;:::-;10243:3;10236:37;10161:118;;:::o;10285:157::-;10390:45;10410:24;10428:5;10410:24;:::i;:::-;10390:45;:::i;:::-;10385:3;10378:58;10285:157;;:::o;10448:109::-;10529:21;10544:5;10529:21;:::i;:::-;10524:3;10517:34;10448:109;;:::o;10563:360::-;10649:3;10677:38;10709:5;10677:38;:::i;:::-;10731:70;10794:6;10789:3;10731:70;:::i;:::-;10724:77;;10810:52;10855:6;10850:3;10843:4;10836:5;10832:16;10810:52;:::i;:::-;10887:29;10909:6;10887:29;:::i;:::-;10882:3;10878:39;10871:46;;10653:270;10563:360;;;;:::o;10929:364::-;11017:3;11045:39;11078:5;11045:39;:::i;:::-;11100:71;11164:6;11159:3;11100:71;:::i;:::-;11093:78;;11180:52;11225:6;11220:3;11213:4;11206:5;11202:16;11180:52;:::i;:::-;11257:29;11279:6;11257:29;:::i;:::-;11252:3;11248:39;11241:46;;11021:272;10929:364;;;;:::o;11299:377::-;11405:3;11433:39;11466:5;11433:39;:::i;:::-;11488:89;11570:6;11565:3;11488:89;:::i;:::-;11481:96;;11586:52;11631:6;11626:3;11619:4;11612:5;11608:16;11586:52;:::i;:::-;11663:6;11658:3;11654:16;11647:23;;11409:267;11299:377;;;;:::o;11706:845::-;11809:3;11846:5;11840:12;11875:36;11901:9;11875:36;:::i;:::-;11927:89;12009:6;12004:3;11927:89;:::i;:::-;11920:96;;12047:1;12036:9;12032:17;12063:1;12058:137;;;;12209:1;12204:341;;;;12025:520;;12058:137;12142:4;12138:9;12127;12123:25;12118:3;12111:38;12178:6;12173:3;12169:16;12162:23;;12058:137;;12204:341;12271:38;12303:5;12271:38;:::i;:::-;12331:1;12345:154;12359:6;12356:1;12353:13;12345:154;;;12433:7;12427:14;12423:1;12418:3;12414:11;12407:35;12483:1;12474:7;12470:15;12459:26;;12381:4;12378:1;12374:12;12369:17;;12345:154;;;12528:6;12523:3;12519:16;12512:23;;12211:334;;12025:520;;11813:738;;11706:845;;;;:::o;12557:366::-;12699:3;12720:67;12784:2;12779:3;12720:67;:::i;:::-;12713:74;;12796:93;12885:3;12796:93;:::i;:::-;12914:2;12909:3;12905:12;12898:19;;12557:366;;;:::o;12929:::-;13071:3;13092:67;13156:2;13151:3;13092:67;:::i;:::-;13085:74;;13168:93;13257:3;13168:93;:::i;:::-;13286:2;13281:3;13277:12;13270:19;;12929:366;;;:::o;13301:::-;13443:3;13464:67;13528:2;13523:3;13464:67;:::i;:::-;13457:74;;13540:93;13629:3;13540:93;:::i;:::-;13658:2;13653:3;13649:12;13642:19;;13301:366;;;:::o;13673:::-;13815:3;13836:67;13900:2;13895:3;13836:67;:::i;:::-;13829:74;;13912:93;14001:3;13912:93;:::i;:::-;14030:2;14025:3;14021:12;14014:19;;13673:366;;;:::o;14045:::-;14187:3;14208:67;14272:2;14267:3;14208:67;:::i;:::-;14201:74;;14284:93;14373:3;14284:93;:::i;:::-;14402:2;14397:3;14393:12;14386:19;;14045:366;;;:::o;14417:::-;14559:3;14580:67;14644:2;14639:3;14580:67;:::i;:::-;14573:74;;14656:93;14745:3;14656:93;:::i;:::-;14774:2;14769:3;14765:12;14758:19;;14417:366;;;:::o;14789:::-;14931:3;14952:67;15016:2;15011:3;14952:67;:::i;:::-;14945:74;;15028:93;15117:3;15028:93;:::i;:::-;15146:2;15141:3;15137:12;15130:19;;14789:366;;;:::o;15161:::-;15303:3;15324:67;15388:2;15383:3;15324:67;:::i;:::-;15317:74;;15400:93;15489:3;15400:93;:::i;:::-;15518:2;15513:3;15509:12;15502:19;;15161:366;;;:::o;15533:::-;15675:3;15696:67;15760:2;15755:3;15696:67;:::i;:::-;15689:74;;15772:93;15861:3;15772:93;:::i;:::-;15890:2;15885:3;15881:12;15874:19;;15533:366;;;:::o;15905:::-;16047:3;16068:67;16132:2;16127:3;16068:67;:::i;:::-;16061:74;;16144:93;16233:3;16144:93;:::i;:::-;16262:2;16257:3;16253:12;16246:19;;15905:366;;;:::o;16277:::-;16419:3;16440:67;16504:2;16499:3;16440:67;:::i;:::-;16433:74;;16516:93;16605:3;16516:93;:::i;:::-;16634:2;16629:3;16625:12;16618:19;;16277:366;;;:::o;16649:::-;16791:3;16812:67;16876:2;16871:3;16812:67;:::i;:::-;16805:74;;16888:93;16977:3;16888:93;:::i;:::-;17006:2;17001:3;16997:12;16990:19;;16649:366;;;:::o;17021:::-;17163:3;17184:67;17248:2;17243:3;17184:67;:::i;:::-;17177:74;;17260:93;17349:3;17260:93;:::i;:::-;17378:2;17373:3;17369:12;17362:19;;17021:366;;;:::o;17393:::-;17535:3;17556:67;17620:2;17615:3;17556:67;:::i;:::-;17549:74;;17632:93;17721:3;17632:93;:::i;:::-;17750:2;17745:3;17741:12;17734:19;;17393:366;;;:::o;17765:::-;17907:3;17928:67;17992:2;17987:3;17928:67;:::i;:::-;17921:74;;18004:93;18093:3;18004:93;:::i;:::-;18122:2;18117:3;18113:12;18106:19;;17765:366;;;:::o;18137:::-;18279:3;18300:67;18364:2;18359:3;18300:67;:::i;:::-;18293:74;;18376:93;18465:3;18376:93;:::i;:::-;18494:2;18489:3;18485:12;18478:19;;18137:366;;;:::o;18509:::-;18651:3;18672:67;18736:2;18731:3;18672:67;:::i;:::-;18665:74;;18748:93;18837:3;18748:93;:::i;:::-;18866:2;18861:3;18857:12;18850:19;;18509:366;;;:::o;18881:::-;19023:3;19044:67;19108:2;19103:3;19044:67;:::i;:::-;19037:74;;19120:93;19209:3;19120:93;:::i;:::-;19238:2;19233:3;19229:12;19222:19;;18881:366;;;:::o;19253:::-;19395:3;19416:67;19480:2;19475:3;19416:67;:::i;:::-;19409:74;;19492:93;19581:3;19492:93;:::i;:::-;19610:2;19605:3;19601:12;19594:19;;19253:366;;;:::o;19625:::-;19767:3;19788:67;19852:2;19847:3;19788:67;:::i;:::-;19781:74;;19864:93;19953:3;19864:93;:::i;:::-;19982:2;19977:3;19973:12;19966:19;;19625:366;;;:::o;19997:::-;20139:3;20160:67;20224:2;20219:3;20160:67;:::i;:::-;20153:74;;20236:93;20325:3;20236:93;:::i;:::-;20354:2;20349:3;20345:12;20338:19;;19997:366;;;:::o;20369:::-;20511:3;20532:67;20596:2;20591:3;20532:67;:::i;:::-;20525:74;;20608:93;20697:3;20608:93;:::i;:::-;20726:2;20721:3;20717:12;20710:19;;20369:366;;;:::o;20741:::-;20883:3;20904:67;20968:2;20963:3;20904:67;:::i;:::-;20897:74;;20980:93;21069:3;20980:93;:::i;:::-;21098:2;21093:3;21089:12;21082:19;;20741:366;;;:::o;21113:::-;21255:3;21276:67;21340:2;21335:3;21276:67;:::i;:::-;21269:74;;21352:93;21441:3;21352:93;:::i;:::-;21470:2;21465:3;21461:12;21454:19;;21113:366;;;:::o;21485:::-;21627:3;21648:67;21712:2;21707:3;21648:67;:::i;:::-;21641:74;;21724:93;21813:3;21724:93;:::i;:::-;21842:2;21837:3;21833:12;21826:19;;21485:366;;;:::o;21857:::-;21999:3;22020:67;22084:2;22079:3;22020:67;:::i;:::-;22013:74;;22096:93;22185:3;22096:93;:::i;:::-;22214:2;22209:3;22205:12;22198:19;;21857:366;;;:::o;22229:400::-;22389:3;22410:84;22492:1;22487:3;22410:84;:::i;:::-;22403:91;;22503:93;22592:3;22503:93;:::i;:::-;22621:1;22616:3;22612:11;22605:18;;22229:400;;;:::o;22635:365::-;22777:3;22798:66;22862:1;22857:3;22798:66;:::i;:::-;22791:73;;22873:93;22962:3;22873:93;:::i;:::-;22991:2;22986:3;22982:12;22975:19;;22635:365;;;:::o;23006:366::-;23148:3;23169:67;23233:2;23228:3;23169:67;:::i;:::-;23162:74;;23245:93;23334:3;23245:93;:::i;:::-;23363:2;23358:3;23354:12;23347:19;;23006:366;;;:::o;23378:::-;23520:3;23541:67;23605:2;23600:3;23541:67;:::i;:::-;23534:74;;23617:93;23706:3;23617:93;:::i;:::-;23735:2;23730:3;23726:12;23719:19;;23378:366;;;:::o;23750:::-;23892:3;23913:67;23977:2;23972:3;23913:67;:::i;:::-;23906:74;;23989:93;24078:3;23989:93;:::i;:::-;24107:2;24102:3;24098:12;24091:19;;23750:366;;;:::o;24122:::-;24264:3;24285:67;24349:2;24344:3;24285:67;:::i;:::-;24278:74;;24361:93;24450:3;24361:93;:::i;:::-;24479:2;24474:3;24470:12;24463:19;;24122:366;;;:::o;24494:398::-;24653:3;24674:83;24755:1;24750:3;24674:83;:::i;:::-;24667:90;;24766:93;24855:3;24766:93;:::i;:::-;24884:1;24879:3;24875:11;24868:18;;24494:398;;;:::o;24898:366::-;25040:3;25061:67;25125:2;25120:3;25061:67;:::i;:::-;25054:74;;25137:93;25226:3;25137:93;:::i;:::-;25255:2;25250:3;25246:12;25239:19;;24898:366;;;:::o;25270:::-;25412:3;25433:67;25497:2;25492:3;25433:67;:::i;:::-;25426:74;;25509:93;25598:3;25509:93;:::i;:::-;25627:2;25622:3;25618:12;25611:19;;25270:366;;;:::o;25642:::-;25784:3;25805:67;25869:2;25864:3;25805:67;:::i;:::-;25798:74;;25881:93;25970:3;25881:93;:::i;:::-;25999:2;25994:3;25990:12;25983:19;;25642:366;;;:::o;26014:118::-;26101:24;26119:5;26101:24;:::i;:::-;26096:3;26089:37;26014:118;;:::o;26138:157::-;26243:45;26263:24;26281:5;26263:24;:::i;:::-;26243:45;:::i;:::-;26238:3;26231:58;26138:157;;:::o;26301:256::-;26413:3;26428:75;26499:3;26490:6;26428:75;:::i;:::-;26528:2;26523:3;26519:12;26512:19;;26548:3;26541:10;;26301:256;;;;:::o;26563:695::-;26841:3;26863:92;26951:3;26942:6;26863:92;:::i;:::-;26856:99;;26972:95;27063:3;27054:6;26972:95;:::i;:::-;26965:102;;27084:148;27228:3;27084:148;:::i;:::-;27077:155;;27249:3;27242:10;;26563:695;;;;;:::o;27264:379::-;27448:3;27470:147;27613:3;27470:147;:::i;:::-;27463:154;;27634:3;27627:10;;27264:379;;;:::o;27649:679::-;27845:3;27860:75;27931:3;27922:6;27860:75;:::i;:::-;27960:2;27955:3;27951:12;27944:19;;27973:75;28044:3;28035:6;27973:75;:::i;:::-;28073:2;28068:3;28064:12;28057:19;;28086:75;28157:3;28148:6;28086:75;:::i;:::-;28186:2;28181:3;28177:12;28170:19;;28199:75;28270:3;28261:6;28199:75;:::i;:::-;28299:2;28294:3;28290:12;28283:19;;28319:3;28312:10;;27649:679;;;;;;;:::o;28334:222::-;28427:4;28465:2;28454:9;28450:18;28442:26;;28478:71;28546:1;28535:9;28531:17;28522:6;28478:71;:::i;:::-;28334:222;;;;:::o;28562:640::-;28757:4;28795:3;28784:9;28780:19;28772:27;;28809:71;28877:1;28866:9;28862:17;28853:6;28809:71;:::i;:::-;28890:72;28958:2;28947:9;28943:18;28934:6;28890:72;:::i;:::-;28972;29040:2;29029:9;29025:18;29016:6;28972:72;:::i;:::-;29091:9;29085:4;29081:20;29076:2;29065:9;29061:18;29054:48;29119:76;29190:4;29181:6;29119:76;:::i;:::-;29111:84;;28562:640;;;;;;;:::o;29208:210::-;29295:4;29333:2;29322:9;29318:18;29310:26;;29346:65;29408:1;29397:9;29393:17;29384:6;29346:65;:::i;:::-;29208:210;;;;:::o;29424:313::-;29537:4;29575:2;29564:9;29560:18;29552:26;;29624:9;29618:4;29614:20;29610:1;29599:9;29595:17;29588:47;29652:78;29725:4;29716:6;29652:78;:::i;:::-;29644:86;;29424:313;;;;:::o;29743:419::-;29909:4;29947:2;29936:9;29932:18;29924:26;;29996:9;29990:4;29986:20;29982:1;29971:9;29967:17;29960:47;30024:131;30150:4;30024:131;:::i;:::-;30016:139;;29743:419;;;:::o;30168:::-;30334:4;30372:2;30361:9;30357:18;30349:26;;30421:9;30415:4;30411:20;30407:1;30396:9;30392:17;30385:47;30449:131;30575:4;30449:131;:::i;:::-;30441:139;;30168:419;;;:::o;30593:::-;30759:4;30797:2;30786:9;30782:18;30774:26;;30846:9;30840:4;30836:20;30832:1;30821:9;30817:17;30810:47;30874:131;31000:4;30874:131;:::i;:::-;30866:139;;30593:419;;;:::o;31018:::-;31184:4;31222:2;31211:9;31207:18;31199:26;;31271:9;31265:4;31261:20;31257:1;31246:9;31242:17;31235:47;31299:131;31425:4;31299:131;:::i;:::-;31291:139;;31018:419;;;:::o;31443:::-;31609:4;31647:2;31636:9;31632:18;31624:26;;31696:9;31690:4;31686:20;31682:1;31671:9;31667:17;31660:47;31724:131;31850:4;31724:131;:::i;:::-;31716:139;;31443:419;;;:::o;31868:::-;32034:4;32072:2;32061:9;32057:18;32049:26;;32121:9;32115:4;32111:20;32107:1;32096:9;32092:17;32085:47;32149:131;32275:4;32149:131;:::i;:::-;32141:139;;31868:419;;;:::o;32293:::-;32459:4;32497:2;32486:9;32482:18;32474:26;;32546:9;32540:4;32536:20;32532:1;32521:9;32517:17;32510:47;32574:131;32700:4;32574:131;:::i;:::-;32566:139;;32293:419;;;:::o;32718:::-;32884:4;32922:2;32911:9;32907:18;32899:26;;32971:9;32965:4;32961:20;32957:1;32946:9;32942:17;32935:47;32999:131;33125:4;32999:131;:::i;:::-;32991:139;;32718:419;;;:::o;33143:::-;33309:4;33347:2;33336:9;33332:18;33324:26;;33396:9;33390:4;33386:20;33382:1;33371:9;33367:17;33360:47;33424:131;33550:4;33424:131;:::i;:::-;33416:139;;33143:419;;;:::o;33568:::-;33734:4;33772:2;33761:9;33757:18;33749:26;;33821:9;33815:4;33811:20;33807:1;33796:9;33792:17;33785:47;33849:131;33975:4;33849:131;:::i;:::-;33841:139;;33568:419;;;:::o;33993:::-;34159:4;34197:2;34186:9;34182:18;34174:26;;34246:9;34240:4;34236:20;34232:1;34221:9;34217:17;34210:47;34274:131;34400:4;34274:131;:::i;:::-;34266:139;;33993:419;;;:::o;34418:::-;34584:4;34622:2;34611:9;34607:18;34599:26;;34671:9;34665:4;34661:20;34657:1;34646:9;34642:17;34635:47;34699:131;34825:4;34699:131;:::i;:::-;34691:139;;34418:419;;;:::o;34843:::-;35009:4;35047:2;35036:9;35032:18;35024:26;;35096:9;35090:4;35086:20;35082:1;35071:9;35067:17;35060:47;35124:131;35250:4;35124:131;:::i;:::-;35116:139;;34843:419;;;:::o;35268:::-;35434:4;35472:2;35461:9;35457:18;35449:26;;35521:9;35515:4;35511:20;35507:1;35496:9;35492:17;35485:47;35549:131;35675:4;35549:131;:::i;:::-;35541:139;;35268:419;;;:::o;35693:::-;35859:4;35897:2;35886:9;35882:18;35874:26;;35946:9;35940:4;35936:20;35932:1;35921:9;35917:17;35910:47;35974:131;36100:4;35974:131;:::i;:::-;35966:139;;35693:419;;;:::o;36118:::-;36284:4;36322:2;36311:9;36307:18;36299:26;;36371:9;36365:4;36361:20;36357:1;36346:9;36342:17;36335:47;36399:131;36525:4;36399:131;:::i;:::-;36391:139;;36118:419;;;:::o;36543:::-;36709:4;36747:2;36736:9;36732:18;36724:26;;36796:9;36790:4;36786:20;36782:1;36771:9;36767:17;36760:47;36824:131;36950:4;36824:131;:::i;:::-;36816:139;;36543:419;;;:::o;36968:::-;37134:4;37172:2;37161:9;37157:18;37149:26;;37221:9;37215:4;37211:20;37207:1;37196:9;37192:17;37185:47;37249:131;37375:4;37249:131;:::i;:::-;37241:139;;36968:419;;;:::o;37393:::-;37559:4;37597:2;37586:9;37582:18;37574:26;;37646:9;37640:4;37636:20;37632:1;37621:9;37617:17;37610:47;37674:131;37800:4;37674:131;:::i;:::-;37666:139;;37393:419;;;:::o;37818:::-;37984:4;38022:2;38011:9;38007:18;37999:26;;38071:9;38065:4;38061:20;38057:1;38046:9;38042:17;38035:47;38099:131;38225:4;38099:131;:::i;:::-;38091:139;;37818:419;;;:::o;38243:::-;38409:4;38447:2;38436:9;38432:18;38424:26;;38496:9;38490:4;38486:20;38482:1;38471:9;38467:17;38460:47;38524:131;38650:4;38524:131;:::i;:::-;38516:139;;38243:419;;;:::o;38668:::-;38834:4;38872:2;38861:9;38857:18;38849:26;;38921:9;38915:4;38911:20;38907:1;38896:9;38892:17;38885:47;38949:131;39075:4;38949:131;:::i;:::-;38941:139;;38668:419;;;:::o;39093:::-;39259:4;39297:2;39286:9;39282:18;39274:26;;39346:9;39340:4;39336:20;39332:1;39321:9;39317:17;39310:47;39374:131;39500:4;39374:131;:::i;:::-;39366:139;;39093:419;;;:::o;39518:::-;39684:4;39722:2;39711:9;39707:18;39699:26;;39771:9;39765:4;39761:20;39757:1;39746:9;39742:17;39735:47;39799:131;39925:4;39799:131;:::i;:::-;39791:139;;39518:419;;;:::o;39943:::-;40109:4;40147:2;40136:9;40132:18;40124:26;;40196:9;40190:4;40186:20;40182:1;40171:9;40167:17;40160:47;40224:131;40350:4;40224:131;:::i;:::-;40216:139;;39943:419;;;:::o;40368:::-;40534:4;40572:2;40561:9;40557:18;40549:26;;40621:9;40615:4;40611:20;40607:1;40596:9;40592:17;40585:47;40649:131;40775:4;40649:131;:::i;:::-;40641:139;;40368:419;;;:::o;40793:::-;40959:4;40997:2;40986:9;40982:18;40974:26;;41046:9;41040:4;41036:20;41032:1;41021:9;41017:17;41010:47;41074:131;41200:4;41074:131;:::i;:::-;41066:139;;40793:419;;;:::o;41218:::-;41384:4;41422:2;41411:9;41407:18;41399:26;;41471:9;41465:4;41461:20;41457:1;41446:9;41442:17;41435:47;41499:131;41625:4;41499:131;:::i;:::-;41491:139;;41218:419;;;:::o;41643:::-;41809:4;41847:2;41836:9;41832:18;41824:26;;41896:9;41890:4;41886:20;41882:1;41871:9;41867:17;41860:47;41924:131;42050:4;41924:131;:::i;:::-;41916:139;;41643:419;;;:::o;42068:::-;42234:4;42272:2;42261:9;42257:18;42249:26;;42321:9;42315:4;42311:20;42307:1;42296:9;42292:17;42285:47;42349:131;42475:4;42349:131;:::i;:::-;42341:139;;42068:419;;;:::o;42493:::-;42659:4;42697:2;42686:9;42682:18;42674:26;;42746:9;42740:4;42736:20;42732:1;42721:9;42717:17;42710:47;42774:131;42900:4;42774:131;:::i;:::-;42766:139;;42493:419;;;:::o;42918:::-;43084:4;43122:2;43111:9;43107:18;43099:26;;43171:9;43165:4;43161:20;43157:1;43146:9;43142:17;43135:47;43199:131;43325:4;43199:131;:::i;:::-;43191:139;;42918:419;;;:::o;43343:::-;43509:4;43547:2;43536:9;43532:18;43524:26;;43596:9;43590:4;43586:20;43582:1;43571:9;43567:17;43560:47;43624:131;43750:4;43624:131;:::i;:::-;43616:139;;43343:419;;;:::o;43768:::-;43934:4;43972:2;43961:9;43957:18;43949:26;;44021:9;44015:4;44011:20;44007:1;43996:9;43992:17;43985:47;44049:131;44175:4;44049:131;:::i;:::-;44041:139;;43768:419;;;:::o;44193:222::-;44286:4;44324:2;44313:9;44309:18;44301:26;;44337:71;44405:1;44394:9;44390:17;44381:6;44337:71;:::i;:::-;44193:222;;;;:::o;44421:129::-;44455:6;44482:20;;:::i;:::-;44472:30;;44511:33;44539:4;44531:6;44511:33;:::i;:::-;44421:129;;;:::o;44556:75::-;44589:6;44622:2;44616:9;44606:19;;44556:75;:::o;44637:307::-;44698:4;44788:18;44780:6;44777:30;44774:56;;;44810:18;;:::i;:::-;44774:56;44848:29;44870:6;44848:29;:::i;:::-;44840:37;;44932:4;44926;44922:15;44914:23;;44637:307;;;:::o;44950:308::-;45012:4;45102:18;45094:6;45091:30;45088:56;;;45124:18;;:::i;:::-;45088:56;45162:29;45184:6;45162:29;:::i;:::-;45154:37;;45246:4;45240;45236:15;45228:23;;44950:308;;;:::o;45264:141::-;45313:4;45336:3;45328:11;;45359:3;45356:1;45349:14;45393:4;45390:1;45380:18;45372:26;;45264:141;;;:::o;45411:98::-;45462:6;45496:5;45490:12;45480:22;;45411:98;;;:::o;45515:99::-;45567:6;45601:5;45595:12;45585:22;;45515:99;;;:::o;45620:168::-;45703:11;45737:6;45732:3;45725:19;45777:4;45772:3;45768:14;45753:29;;45620:168;;;;:::o;45794:147::-;45895:11;45932:3;45917:18;;45794:147;;;;:::o;45947:169::-;46031:11;46065:6;46060:3;46053:19;46105:4;46100:3;46096:14;46081:29;;45947:169;;;;:::o;46122:148::-;46224:11;46261:3;46246:18;;46122:148;;;;:::o;46276:305::-;46316:3;46335:20;46353:1;46335:20;:::i;:::-;46330:25;;46369:20;46387:1;46369:20;:::i;:::-;46364:25;;46523:1;46455:66;46451:74;46448:1;46445:81;46442:107;;;46529:18;;:::i;:::-;46442:107;46573:1;46570;46566:9;46559:16;;46276:305;;;;:::o;46587:185::-;46627:1;46644:20;46662:1;46644:20;:::i;:::-;46639:25;;46678:20;46696:1;46678:20;:::i;:::-;46673:25;;46717:1;46707:35;;46722:18;;:::i;:::-;46707:35;46764:1;46761;46757:9;46752:14;;46587:185;;;;:::o;46778:348::-;46818:7;46841:20;46859:1;46841:20;:::i;:::-;46836:25;;46875:20;46893:1;46875:20;:::i;:::-;46870:25;;47063:1;46995:66;46991:74;46988:1;46985:81;46980:1;46973:9;46966:17;46962:105;46959:131;;;47070:18;;:::i;:::-;46959:131;47118:1;47115;47111:9;47100:20;;46778:348;;;;:::o;47132:191::-;47172:4;47192:20;47210:1;47192:20;:::i;:::-;47187:25;;47226:20;47244:1;47226:20;:::i;:::-;47221:25;;47265:1;47262;47259:8;47256:34;;;47270:18;;:::i;:::-;47256:34;47315:1;47312;47308:9;47300:17;;47132:191;;;;:::o;47329:96::-;47366:7;47395:24;47413:5;47395:24;:::i;:::-;47384:35;;47329:96;;;:::o;47431:104::-;47476:7;47505:24;47523:5;47505:24;:::i;:::-;47494:35;;47431:104;;;:::o;47541:90::-;47575:7;47618:5;47611:13;47604:21;47593:32;;47541:90;;;:::o;47637:77::-;47674:7;47703:5;47692:16;;47637:77;;;:::o;47720:149::-;47756:7;47796:66;47789:5;47785:78;47774:89;;47720:149;;;:::o;47875:126::-;47912:7;47952:42;47945:5;47941:54;47930:65;;47875:126;;;:::o;48007:77::-;48044:7;48073:5;48062:16;;48007:77;;;:::o;48090:154::-;48174:6;48169:3;48164;48151:30;48236:1;48227:6;48222:3;48218:16;48211:27;48090:154;;;:::o;48250:307::-;48318:1;48328:113;48342:6;48339:1;48336:13;48328:113;;;48427:1;48422:3;48418:11;48412:18;48408:1;48403:3;48399:11;48392:39;48364:2;48361:1;48357:10;48352:15;;48328:113;;;48459:6;48456:1;48453:13;48450:101;;;48539:1;48530:6;48525:3;48521:16;48514:27;48450:101;48299:258;48250:307;;;:::o;48563:320::-;48607:6;48644:1;48638:4;48634:12;48624:22;;48691:1;48685:4;48681:12;48712:18;48702:81;;48768:4;48760:6;48756:17;48746:27;;48702:81;48830:2;48822:6;48819:14;48799:18;48796:38;48793:84;;;48849:18;;:::i;:::-;48793:84;48614:269;48563:320;;;:::o;48889:281::-;48972:27;48994:4;48972:27;:::i;:::-;48964:6;48960:40;49102:6;49090:10;49087:22;49066:18;49054:10;49051:34;49048:62;49045:88;;;49113:18;;:::i;:::-;49045:88;49153:10;49149:2;49142:22;48932:238;48889:281;;:::o;49176:233::-;49215:3;49238:24;49256:5;49238:24;:::i;:::-;49229:33;;49284:66;49277:5;49274:77;49271:103;;;49354:18;;:::i;:::-;49271:103;49401:1;49394:5;49390:13;49383:20;;49176:233;;;:::o;49415:100::-;49454:7;49483:26;49503:5;49483:26;:::i;:::-;49472:37;;49415:100;;;:::o;49521:94::-;49560:7;49589:20;49603:5;49589:20;:::i;:::-;49578:31;;49521:94;;;:::o;49621:79::-;49660:7;49689:5;49678:16;;49621:79;;;:::o;49706:176::-;49738:1;49755:20;49773:1;49755:20;:::i;:::-;49750:25;;49789:20;49807:1;49789:20;:::i;:::-;49784:25;;49828:1;49818:35;;49833:18;;:::i;:::-;49818:35;49874:1;49871;49867:9;49862:14;;49706:176;;;;:::o;49888:180::-;49936:77;49933:1;49926:88;50033:4;50030:1;50023:15;50057:4;50054:1;50047:15;50074:180;50122:77;50119:1;50112:88;50219:4;50216:1;50209:15;50243:4;50240:1;50233:15;50260:180;50308:77;50305:1;50298:88;50405:4;50402:1;50395:15;50429:4;50426:1;50419:15;50446:180;50494:77;50491:1;50484:88;50591:4;50588:1;50581:15;50615:4;50612:1;50605:15;50632:180;50680:77;50677:1;50670:88;50777:4;50774:1;50767:15;50801:4;50798:1;50791:15;50818:180;50866:77;50863:1;50856:88;50963:4;50960:1;50953:15;50987:4;50984:1;50977:15;51004:117;51113:1;51110;51103:12;51127:117;51236:1;51233;51226:12;51250:117;51359:1;51356;51349:12;51373:117;51482:1;51479;51472:12;51496:117;51605:1;51602;51595:12;51619:117;51728:1;51725;51718:12;51742:102;51783:6;51834:2;51830:7;51825:2;51818:5;51814:14;51810:28;51800:38;;51742:102;;;:::o;51850:94::-;51883:8;51931:5;51927:2;51923:14;51902:35;;51850:94;;;:::o;51950:178::-;52090:30;52086:1;52078:6;52074:14;52067:54;51950:178;:::o;52134:177::-;52274:29;52270:1;52262:6;52258:14;52251:53;52134:177;:::o;52317:230::-;52457:34;52453:1;52445:6;52441:14;52434:58;52526:13;52521:2;52513:6;52509:15;52502:38;52317:230;:::o;52553:237::-;52693:34;52689:1;52681:6;52677:14;52670:58;52762:20;52757:2;52749:6;52745:15;52738:45;52553:237;:::o;52796:225::-;52936:34;52932:1;52924:6;52920:14;52913:58;53005:8;53000:2;52992:6;52988:15;52981:33;52796:225;:::o;53027:178::-;53167:30;53163:1;53155:6;53151:14;53144:54;53027:178;:::o;53211:173::-;53351:25;53347:1;53339:6;53335:14;53328:49;53211:173;:::o;53390:172::-;53530:24;53526:1;53518:6;53514:14;53507:48;53390:172;:::o;53568:161::-;53708:13;53704:1;53696:6;53692:14;53685:37;53568:161;:::o;53735:223::-;53875:34;53871:1;53863:6;53859:14;53852:58;53944:6;53939:2;53931:6;53927:15;53920:31;53735:223;:::o;53964:175::-;54104:27;54100:1;54092:6;54088:14;54081:51;53964:175;:::o;54145:172::-;54285:24;54281:1;54273:6;54269:14;54262:48;54145:172;:::o;54323:245::-;54463:34;54459:1;54451:6;54447:14;54440:58;54532:28;54527:2;54519:6;54515:15;54508:53;54323:245;:::o;54574:170::-;54714:22;54710:1;54702:6;54698:14;54691:46;54574:170;:::o;54750:179::-;54890:31;54886:1;54878:6;54874:14;54867:55;54750:179;:::o;54935:231::-;55075:34;55071:1;55063:6;55059:14;55052:58;55144:14;55139:2;55131:6;55127:15;55120:39;54935:231;:::o;55172:177::-;55312:29;55308:1;55300:6;55296:14;55289:53;55172:177;:::o;55355:167::-;55495:19;55491:1;55483:6;55479:14;55472:43;55355:167;:::o;55528:243::-;55668:34;55664:1;55656:6;55652:14;55645:58;55737:26;55732:2;55724:6;55720:15;55713:51;55528:243;:::o;55777:229::-;55917:34;55913:1;55905:6;55901:14;55894:58;55986:12;55981:2;55973:6;55969:15;55962:37;55777:229;:::o;56012:228::-;56152:34;56148:1;56140:6;56136:14;56129:58;56221:11;56216:2;56208:6;56204:15;56197:36;56012:228;:::o;56246:172::-;56386:24;56382:1;56374:6;56370:14;56363:48;56246:172;:::o;56424:::-;56564:24;56560:1;56552:6;56548:14;56541:48;56424:172;:::o;56602:182::-;56742:34;56738:1;56730:6;56726:14;56719:58;56602:182;:::o;56790:231::-;56930:34;56926:1;56918:6;56914:14;56907:58;56999:14;56994:2;56986:6;56982:15;56975:39;56790:231;:::o;57027:162::-;57167:14;57163:1;57155:6;57151:14;57144:38;57027:162;:::o;57195:155::-;57335:7;57331:1;57323:6;57319:14;57312:31;57195:155;:::o;57356:158::-;57496:10;57492:1;57484:6;57480:14;57473:34;57356:158;:::o;57520:182::-;57660:34;57656:1;57648:6;57644:14;57637:58;57520:182;:::o;57708:228::-;57848:34;57844:1;57836:6;57832:14;57825:58;57917:11;57912:2;57904:6;57900:15;57893:36;57708:228;:::o;57942:220::-;58082:34;58078:1;58070:6;58066:14;58059:58;58151:3;58146:2;58138:6;58134:15;58127:28;57942:220;:::o;58168:172::-;58308:24;58304:1;58296:6;58292:14;58285:48;58168:172;:::o;58346:114::-;;:::o;58466:236::-;58606:34;58602:1;58594:6;58590:14;58583:58;58675:19;58670:2;58662:6;58658:15;58651:44;58466:236;:::o;58708:231::-;58848:34;58844:1;58836:6;58832:14;58825:58;58917:14;58912:2;58904:6;58900:15;58893:39;58708:231;:::o;58945:162::-;59085:14;59081:1;59073:6;59069:14;59062:38;58945:162;:::o;59113:122::-;59186:24;59204:5;59186:24;:::i;:::-;59179:5;59176:35;59166:63;;59225:1;59222;59215:12;59166:63;59113:122;:::o;59241:138::-;59322:32;59348:5;59322:32;:::i;:::-;59315:5;59312:43;59302:71;;59369:1;59366;59359:12;59302:71;59241:138;:::o;59385:116::-;59455:21;59470:5;59455:21;:::i;:::-;59448:5;59445:32;59435:60;;59491:1;59488;59481:12;59435:60;59385:116;:::o;59507:122::-;59580:24;59598:5;59580:24;:::i;:::-;59573:5;59570:35;59560:63;;59619:1;59616;59609:12;59560:63;59507:122;:::o;59635:120::-;59707:23;59724:5;59707:23;:::i;:::-;59700:5;59697:34;59687:62;;59745:1;59742;59735:12;59687:62;59635:120;:::o;59761:122::-;59834:24;59852:5;59834:24;:::i;:::-;59827:5;59824:35;59814:63;;59873:1;59870;59863:12;59814:63;59761:122;:::o

Swarm Source

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