ETH Price: $2,521.40 (-0.12%)

Token

Original Clones (T-404)
 

Overview

Max Total Supply

188 T-404

Holders

88

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 T-404
0xE361af6C334dC55D6B416E8d3cEe4f52ca4fF1A1
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:
Error404

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-02
*/

// SPDX-License-Identifier: MIT OR Apache-2.0

// File: openzeppelin-contracts\contracts\utils\introspection\IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: openzeppelin-contracts\contracts\token\ERC721\IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

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

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

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

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

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

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

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

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

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

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

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

// File: openzeppelin-contracts\contracts\token\ERC721\IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: openzeppelin-contracts\contracts\token\ERC721\extensions\IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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

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

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

// File: openzeppelin-contracts\contracts\utils\Address.sol

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: openzeppelin-contracts\contracts\utils\Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: openzeppelin-contracts\contracts\utils\Strings.sol

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: openzeppelin-contracts\contracts\utils\introspection\ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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

// File: openzeppelin-contracts\contracts\token\ERC721\ERC721.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

// File: openzeppelin-contracts\contracts\access\Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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

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

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

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

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

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

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

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

// File: openzeppelin-contracts\contracts\token\ERC721\extensions\IERC721Enumerable.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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

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

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

// File: openzeppelin-contracts\contracts\token\ERC721\extensions\ERC721Enumerable.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: openzeppelin-contracts\contracts\token\ERC20\IERC20.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-contracts\contracts\token\ERC20\utils\SafeERC20.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: openzeppelin-contracts\contracts\utils\cryptography\MerkleProof.sol

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

pragma solidity ^0.8.0;

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

// File: src\contracts\Error404.sol

pragma solidity ^0.8.0;
contract Error404 is ERC721, ERC721Enumerable, Ownable {
    string public PROVENANCE;
    string private _baseURIextended = "ipfs://QmVCw35AYoReBLA9hufWq1Joe9ecvc2gMrpRE7yjhRvMev/";

    bool public saleIsActive = false;
    bool public isAllowListActive = false;
    bool public revealed = false;

    uint256 public MAX_SUPPLY = 4444;
    uint256 public MAX_PUBLIC_MINT = 5;
    uint256 public MAX_WHITELIST_MINT = 2;
    uint256 public PRICE_PER_TOKEN = 0.08 ether;
    uint256 public CLAIMABLE_AMOUNT_RATIO = 1;

    mapping(uint256 => uint256) private _claimTime;
    mapping(address => uint8) private _whitelistClaimed;

    address public claimableTokenAddress;

    bytes32 public merkleRoot; 

    constructor()
        ERC721("Original Clones", "T-404") {
    }

    // PUBLIC VIEW
    function amountOfTokensToClaim() public view returns(uint256) {
      uint256[] memory ids = walletOfOwner(msg.sender);
      uint256 claimableAmount;
      for(uint256 i = 0; i < ids.length; i++) {
        uint256 _days = ( block.timestamp - _claimTime[ids[i]] ) / 1 days;
        claimableAmount += _days * CLAIMABLE_AMOUNT_RATIO;
       }
       return claimableAmount;
    }
    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i = 0; i < tokenCount; i++){
          tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        
        return tokensId;
    }
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
      if(revealed == false) {
        return _baseURI();
      }
      return super.tokenURI(tokenId);
    }
    function numAvailableToMint(address addr) external view returns (uint256) {
        return (MAX_WHITELIST_MINT - _whitelistClaimed[addr]);
    } 
    // INTERNAL VIEW
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    // PUBLIC FUNCTIONS
    function mint(uint numberOfTokens) public payable {
        uint256 ts = totalSupply();
        require(saleIsActive, "Sale must be active to mint tokens");
        require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
            _claimTime[ts + i] = block.timestamp;
        }
    }
    function claimTokens(uint256 _amount) external {
      IERC20 token = IERC20(claimableTokenAddress);
      uint256 tokenBalance = token.balanceOf(address(this));
      require(tokenBalance >= _amount, "Insufficient tokens in pool.");
      require(amountOfTokensToClaim() == _amount, "Incorrect claimable amount.");

      uint256[] memory ids = walletOfOwner(msg.sender);
      for(uint256 i = 0; i < ids.length; i++){
        uint256 _days = ( block.timestamp - _claimTime[ids[i]] ) / 1 days;
        if(_days >= 1) {
          _claimTime[ids[i]] = block.timestamp;
        }
       }

      token.transfer(msg.sender, _amount);
    }
    function mintAllowList(bytes32[] calldata _merkleProof, uint8 numberOfTokens) external payable {
        uint256 ts = totalSupply();
        require(isAllowListActive, "Allow list is not active");
        require(_whitelistClaimed[msg.sender] + numberOfTokens <= MAX_WHITELIST_MINT, "Exceeded max available to purchase");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent is not correct");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof.");
        
        _whitelistClaimed[msg.sender] += numberOfTokens;
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _claimTime[ts + i] = block.timestamp;
            _safeMint(msg.sender, ts + i);
        }
    }

    // ONLY OWNER 
    function setClaimableTokenAddress(address _claimableTokenAddress) public onlyOwner {
        claimableTokenAddress = _claimableTokenAddress;
    }
    function setClaimableAmountRatio(uint256 claimableAmountRatio) public onlyOwner {
        CLAIMABLE_AMOUNT_RATIO = claimableAmountRatio;
    }
    function setProvenance(string memory provenance) public onlyOwner {
            PROVENANCE = provenance;
    }
    function setSaleState(bool newState) public onlyOwner {
            saleIsActive = newState;
    }
    function setMaxPublicMint(uint256 MAX_PUBLIC_MINT_) public onlyOwner {
            MAX_PUBLIC_MINT = MAX_PUBLIC_MINT_;
    }
    function setPrice(uint256 PRICE_PER_TOKEN_) public onlyOwner {
            PRICE_PER_TOKEN = PRICE_PER_TOKEN_;
    }
    function setRevealed(bool _revealed) public onlyOwner {
            revealed = _revealed;
    }
    function setBaseURI(string memory baseURI_) external onlyOwner() {
            _baseURIextended = baseURI_;
    }
    function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
            isAllowListActive = _isAllowListActive;
    }
    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }
    function reserve(uint256 n) public onlyOwner {
        uint supply = totalSupply();
        for (uint i = 0; i < n; i++) {
            _safeMint(msg.sender, supply + i);
            _claimTime[supply + i] = block.timestamp;
        }
    }
    function withdraw() external onlyOwner {
            uint balance = address(this).balance;
            payable(msg.sender).transfer(balance);
    }
    function withdrawToken(address _tokenContract, uint256 _amount) external onlyOwner {
        IERC20 tokenContract = IERC20(_tokenContract);
        tokenContract.transfer(msg.sender, _amount);
    }
    
    // INTERFACES
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
            super._beforeTokenTransfer(from, to, tokenId);
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
            return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLAIMABLE_AMOUNT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountOfTokensToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimableTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimableAmountRatio","type":"uint256"}],"name":"setClaimableAmountRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_claimableTokenAddress","type":"address"}],"name":"setClaimableTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"MAX_PUBLIC_MINT_","type":"uint256"}],"name":"setMaxPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"PRICE_PER_TOKEN_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806036815260200162005b2d60369139600c9080519060200190620000359291906200024a565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff02191690831515021790555061115c600e556005600f55600260105567011c37937e0800006011556001601255348015620000b557600080fd5b506040518060400160405280600f81526020017f4f726967696e616c20436c6f6e657300000000000000000000000000000000008152506040518060400160405280600581526020017f542d34303400000000000000000000000000000000000000000000000000000081525081600090805190602001906200013a9291906200024a565b508060019080519060200190620001539291906200024a565b505050620001766200016a6200017c60201b60201c565b6200018460201b60201c565b6200035e565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002589062000329565b90600052602060002090601f0160209004810192826200027c5760008555620002c8565b82601f106200029757805160ff1916838001178555620002c8565b82800160010185558215620002c8579182015b82811115620002c7578251825591602001919060010190620002aa565b5b509050620002d79190620002db565b5090565b5b80821115620002f6576000816000905550600101620002dc565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034257607f821691505b602082108103620003585762000357620002fa565b5b50919050565b6157bf806200036e6000396000f3fe6080604052600436106102ae5760003560e01c80637449da4811610175578063b3a7ce4f116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610a7c578063eb8d244414610ab9578063f2fde38b14610ae4578063ffe630b514610b0d576102ae565b8063c87b56dd146109eb578063d060256014610a28578063e0a8085314610a53576102ae565b8063b3a7ce4f146108dd578063b5962bd214610908578063b88d4fde14610931578063c04a28361461095a578063c08dfd3c14610997578063c4e37095146109c2576102ae565b806395d89b411161012e57806395d89b41146107f05780639e281a981461081b5780639ef8e74914610844578063a0712d681461086f578063a1e3a3931461088b578063a22cb465146108b4576102ae565b80637449da48146107035780637cb647591461071f578063819b25ba14610748578063833b9499146107715780638da5cb5b1461079c57806391b7f5ed146107c7576102ae565b806342842e0e116102195780636352211e116101d25780636352211e146105f35780636373a6b11461063057806365f130971461065b57806370a0823114610686578063715018a6146106c3578063718bc4af146106da576102ae565b806342842e0e146104d3578063438b6300146104fc57806346e04a2f146105395780634f6ccce714610562578063518302271461059f57806355f804b3146105ca576102ae565b8063270ab52c1161026b578063270ab52c146103d557806329fc6bae146103fe5780632eb4a7ab146104295780632f745c591461045457806332cb6b0c146104915780633ccfd60b146104bc576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b31461035857806318160ddd1461038157806323b872dd146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613bbd565b610b36565b6040516102e79190613c05565b60405180910390f35b3480156102fc57600080fd5b50610305610b48565b6040516103129190613cb9565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613d11565b610bda565b60405161034f9190613d7f565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613dc6565b610c5f565b005b34801561038d57600080fd5b50610396610d76565b6040516103a39190613e15565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613e30565b610d83565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190613d11565b610de3565b005b34801561040a57600080fd5b50610413610e69565b6040516104209190613c05565b60405180910390f35b34801561043557600080fd5b5061043e610e7c565b60405161044b9190613e9c565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190613dc6565b610e82565b6040516104889190613e15565b60405180910390f35b34801561049d57600080fd5b506104a6610f27565b6040516104b39190613e15565b60405180910390f35b3480156104c857600080fd5b506104d1610f2d565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613e30565b610ff8565b005b34801561050857600080fd5b50610523600480360381019061051e9190613eb7565b611018565b6040516105309190613fa2565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b9190613d11565b6110c6565b005b34801561056e57600080fd5b5061058960048036038101906105849190613d11565b611330565b6040516105969190613e15565b60405180910390f35b3480156105ab57600080fd5b506105b46113a1565b6040516105c19190613c05565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906140f9565b6113b4565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613d11565b61144a565b6040516106279190613d7f565b60405180910390f35b34801561063c57600080fd5b506106456114fb565b6040516106529190613cb9565b60405180910390f35b34801561066757600080fd5b50610670611589565b60405161067d9190613e15565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613eb7565b61158f565b6040516106ba9190613e15565b60405180910390f35b3480156106cf57600080fd5b506106d8611646565b005b3480156106e657600080fd5b5061070160048036038101906106fc919061416e565b6116ce565b005b61071d60048036038101906107189190614234565b611767565b005b34801561072b57600080fd5b50610746600480360381019061074191906142c0565b611a93565b005b34801561075457600080fd5b5061076f600480360381019061076a9190613d11565b611b19565b005b34801561077d57600080fd5b50610786611bfc565b6040516107939190613e15565b60405180910390f35b3480156107a857600080fd5b506107b1611c02565b6040516107be9190613d7f565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613d11565b611c2c565b005b3480156107fc57600080fd5b50610805611cb2565b6040516108129190613cb9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613dc6565b611d44565b005b34801561085057600080fd5b50610859611e49565b6040516108669190613e15565b60405180910390f35b61088960048036038101906108849190613d11565b611e4f565b005b34801561089757600080fd5b506108b260048036038101906108ad9190613d11565b611fea565b005b3480156108c057600080fd5b506108db60048036038101906108d691906142ed565b612070565b005b3480156108e957600080fd5b506108f2612086565b6040516108ff9190613d7f565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a9190613eb7565b6120ac565b005b34801561093d57600080fd5b50610958600480360381019061095391906143ce565b61216c565b005b34801561096657600080fd5b50610981600480360381019061097c9190613eb7565b6121ce565b60405161098e9190613e15565b60405180910390f35b3480156109a357600080fd5b506109ac612234565b6040516109b99190613e15565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e4919061416e565b61223a565b005b3480156109f757600080fd5b50610a126004803603810190610a0d9190613d11565b6122d3565b604051610a1f9190613cb9565b60405180910390f35b348015610a3457600080fd5b50610a3d612310565b604051610a4a9190613e15565b60405180910390f35b348015610a5f57600080fd5b50610a7a6004803603810190610a75919061416e565b6123b2565b005b348015610a8857600080fd5b50610aa36004803603810190610a9e9190614451565b61244b565b604051610ab09190613c05565b60405180910390f35b348015610ac557600080fd5b50610ace6124df565b604051610adb9190613c05565b60405180910390f35b348015610af057600080fd5b50610b0b6004803603810190610b069190613eb7565b6124f2565b005b348015610b1957600080fd5b50610b346004803603810190610b2f91906140f9565b6125e9565b005b6000610b418261267f565b9050919050565b606060008054610b57906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b83906144c0565b8015610bd05780601f10610ba557610100808354040283529160200191610bd0565b820191906000526020600020905b815481529060010190602001808311610bb357829003601f168201915b5050505050905090565b6000610be5826126f9565b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90614563565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6a8261144a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd1906145f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cf9612765565b73ffffffffffffffffffffffffffffffffffffffff161480610d285750610d2781610d22612765565b61244b565b5b610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90614687565b60405180910390fd5b610d71838361276d565b505050565b6000600880549050905090565b610d94610d8e612765565b82612826565b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90614719565b60405180910390fd5b610dde838383612904565b505050565b610deb612765565b73ffffffffffffffffffffffffffffffffffffffff16610e09611c02565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690614785565b60405180910390fd5b80600f8190555050565b600d60019054906101000a900460ff1681565b60165481565b6000610e8d8361158f565b8210610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614817565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610f35612765565b73ffffffffffffffffffffffffffffffffffffffff16610f53611c02565b73ffffffffffffffffffffffffffffffffffffffff1614610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614785565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ff4573d6000803e3d6000fd5b5050565b6110138383836040518060200160405280600081525061216c565b505050565b606060006110258361158f565b905060008167ffffffffffffffff81111561104357611042613fce565b5b6040519080825280602002602001820160405280156110715781602001602082028036833780820191505090505b50905060005b828110156110bb576110898582610e82565b82828151811061109c5761109b614837565b5b60200260200101818152505080806110b390614895565b915050611077565b508092505050919050565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111289190613d7f565b602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116991906148f2565b9050828110156111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a59061496b565b60405180910390fd5b826111b7612310565b146111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee906149d7565b60405180910390fd5b600061120233611018565b905060005b81518110156112aa576000620151806013600085858151811061122d5761122c614837565b5b60200260200101518152602001908152602001600020544261124f91906149f7565b6112599190614a5a565b90506001811061129657426013600085858151811061127b5761127a614837565b5b60200260200101518152602001908152602001600020819055505b5080806112a290614895565b915050611207565b508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b81526004016112e6929190614a8b565b6020604051808303816000875af1158015611305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113299190614ac9565b5050505050565b600061133a610d76565b821061137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290614b68565b60405180910390fd5b6008828154811061138f5761138e614837565b5b90600052602060002001549050919050565b600d60029054906101000a900460ff1681565b6113bc612765565b73ffffffffffffffffffffffffffffffffffffffff166113da611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790614785565b60405180910390fd5b80600c9080519060200190611446929190613aae565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e990614bfa565b60405180910390fd5b80915050919050565b600b8054611508906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611534906144c0565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b505050505081565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614c8c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164e612765565b73ffffffffffffffffffffffffffffffffffffffff1661166c611c02565b73ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b990614785565b60405180910390fd5b6116cc6000612b6a565b565b6116d6612765565b73ffffffffffffffffffffffffffffffffffffffff166116f4611c02565b73ffffffffffffffffffffffffffffffffffffffff161461174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190614785565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6000611771610d76565b9050600d60019054906101000a900460ff166117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990614cf8565b60405180910390fd5b60105482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661181d9190614d18565b60ff161115611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890614dc1565b60405180910390fd5b600e548260ff16826118739190614de1565b11156118b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ab90614e83565b60405180910390fd5b348260ff166011546118c69190614ea3565b1115611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614f49565b60405180910390fd5b60003360405160200161191a9190614fb1565b604051602081830303815290604052805190602001209050611980858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483612c30565b6119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690615018565b60405180910390fd5b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611a1a9190614d18565b92506101000a81548160ff021916908360ff16021790555060005b8360ff16811015611a8b5742601360008386611a519190614de1565b815260200190815260200160002081905550611a78338285611a739190614de1565b612c47565b8080611a8390614895565b915050611a35565b505050505050565b611a9b612765565b73ffffffffffffffffffffffffffffffffffffffff16611ab9611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0690614785565b60405180910390fd5b8060168190555050565b611b21612765565b73ffffffffffffffffffffffffffffffffffffffff16611b3f611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90614785565b60405180910390fd5b6000611b9f610d76565b905060005b82811015611bf757611bc1338284611bbc9190614de1565b612c47565b42601360008385611bd29190614de1565b8152602001908152602001600020819055508080611bef90614895565b915050611ba4565b505050565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c34612765565b73ffffffffffffffffffffffffffffffffffffffff16611c52611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f90614785565b60405180910390fd5b8060118190555050565b606060018054611cc1906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ced906144c0565b8015611d3a5780601f10611d0f57610100808354040283529160200191611d3a565b820191906000526020600020905b815481529060010190602001808311611d1d57829003601f168201915b5050505050905090565b611d4c612765565b73ffffffffffffffffffffffffffffffffffffffff16611d6a611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790614785565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611e00929190614a8b565b6020604051808303816000875af1158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190614ac9565b50505050565b60125481565b6000611e59610d76565b9050600d60009054906101000a900460ff16611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea1906150aa565b60405180910390fd5b600f54821115611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690615116565b60405180910390fd5b600e548282611efe9190614de1565b1115611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690614e83565b60405180910390fd5b3482601154611f4e9190614ea3565b1115611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690614f49565b60405180910390fd5b60005b82811015611fe557611faf338284611faa9190614de1565b612c47565b42601360008385611fc09190614de1565b8152602001908152602001600020819055508080611fdd90614895565b915050611f92565b505050565b611ff2612765565b73ffffffffffffffffffffffffffffffffffffffff16612010611c02565b73ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614785565b60405180910390fd5b8060128190555050565b61208261207b612765565b8383612c65565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120b4612765565b73ffffffffffffffffffffffffffffffffffffffff166120d2611c02565b73ffffffffffffffffffffffffffffffffffffffff1614612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614785565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61217d612177612765565b83612826565b6121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390614719565b60405180910390fd5b6121c884848484612dd1565b50505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1660105461222d91906149f7565b9050919050565b60105481565b612242612765565b73ffffffffffffffffffffffffffffffffffffffff16612260611c02565b73ffffffffffffffffffffffffffffffffffffffff16146122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90614785565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b606060001515600d60029054906101000a900460ff161515036122ff576122f8612e2d565b905061230b565b61230882612ebf565b90505b919050565b60008061231c33611018565b9050600080600090505b82518110156123a9576000620151806013600086858151811061234c5761234b614837565b5b60200260200101518152602001908152602001600020544261236e91906149f7565b6123789190614a5a565b9050601254816123889190614ea3565b836123939190614de1565b92505080806123a190614895565b915050612326565b50809250505090565b6123ba612765565b73ffffffffffffffffffffffffffffffffffffffff166123d8611c02565b73ffffffffffffffffffffffffffffffffffffffff161461242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590614785565b60405180910390fd5b80600d60026101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b6124fa612765565b73ffffffffffffffffffffffffffffffffffffffff16612518611c02565b73ffffffffffffffffffffffffffffffffffffffff161461256e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256590614785565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d4906151a8565b60405180910390fd5b6125e681612b6a565b50565b6125f1612765565b73ffffffffffffffffffffffffffffffffffffffff1661260f611c02565b73ffffffffffffffffffffffffffffffffffffffff1614612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614785565b60405180910390fd5b80600b908051906020019061267b929190613aae565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126f257506126f182612f66565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127e08361144a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612831826126f9565b612870576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128679061523a565b60405180910390fd5b600061287b8361144a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ea57508373ffffffffffffffffffffffffffffffffffffffff166128d284610bda565b73ffffffffffffffffffffffffffffffffffffffff16145b806128fb57506128fa818561244b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129248261144a565b73ffffffffffffffffffffffffffffffffffffffff161461297a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612971906152cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e09061535e565b60405180910390fd5b6129f4838383613048565b6129ff60008261276d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4f91906149f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa69190614de1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b65838383613058565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612c3d858461305d565b1490509392505050565b612c618282604051806020016040528060008152506130d2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca906153ca565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612dc49190613c05565b60405180910390a3505050565b612ddc848484612904565b612de88484848461312d565b612e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1e9061545c565b60405180910390fd5b50505050565b6060600c8054612e3c906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612e68906144c0565b8015612eb55780601f10612e8a57610100808354040283529160200191612eb5565b820191906000526020600020905b815481529060010190602001808311612e9857829003601f168201915b5050505050905090565b6060612eca826126f9565b612f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f00906154ee565b60405180910390fd5b6000612f13612e2d565b90506000815111612f335760405180602001604052806000815250612f5e565b80612f3d846132b4565b604051602001612f4e92919061554a565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061303157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613041575061304082613414565b5b9050919050565b61305383838361347e565b505050565b505050565b60008082905060005b84518110156130c757600085828151811061308457613083614837565b5b602002602001015190508083116130a65761309f8382613590565b92506130b3565b6130b08184613590565b92505b5080806130bf90614895565b915050613066565b508091505092915050565b6130dc83836135a7565b6130e9600084848461312d565b613128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311f9061545c565b60405180910390fd5b505050565b600061314e8473ffffffffffffffffffffffffffffffffffffffff16613780565b156132a7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613177612765565b8786866040518563ffffffff1660e01b815260040161319994939291906155c3565b6020604051808303816000875af19250505080156131d557506040513d601f19601f820116820180604052508101906131d29190615624565b60015b613257573d8060008114613205576040519150601f19603f3d011682016040523d82523d6000602084013e61320a565b606091505b50600081510361324f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132469061545c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132ac565b600190505b949350505050565b6060600082036132fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061340f565b600082905060005b6000821461332d57808061331690614895565b915050600a826133269190614a5a565b9150613303565b60008167ffffffffffffffff81111561334957613348613fce565b5b6040519080825280601f01601f19166020018201604052801561337b5781602001600182028036833780820191505090505b5090505b600085146134085760018261339491906149f7565b9150600a856133a39190615651565b60306133af9190614de1565b60f81b8183815181106133c5576133c4614837565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134019190614a5a565b945061337f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134898383836137a3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134cb576134c6816137a8565b61350a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135095761350883826137f1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361354c576135478161395e565b61358b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461358a576135898282613a2f565b5b5b505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360d906156ce565b60405180910390fd5b61361f816126f9565b1561365f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136569061573a565b60405180910390fd5b61366b60008383613048565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136bb9190614de1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377c60008383613058565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137fe8461158f565b61380891906149f7565b90506000600760008481526020019081526020016000205490508181146138ed576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061397291906149f7565b90506000600960008481526020019081526020016000205490506000600883815481106139a2576139a1614837565b5b9060005260206000200154905080600883815481106139c4576139c3614837565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a1357613a1261575a565b5b6001900381819060005260206000200160009055905550505050565b6000613a3a8361158f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613aba906144c0565b90600052602060002090601f016020900481019282613adc5760008555613b23565b82601f10613af557805160ff1916838001178555613b23565b82800160010185558215613b23579182015b82811115613b22578251825591602001919060010190613b07565b5b509050613b309190613b34565b5090565b5b80821115613b4d576000816000905550600101613b35565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b9a81613b65565b8114613ba557600080fd5b50565b600081359050613bb781613b91565b92915050565b600060208284031215613bd357613bd2613b5b565b5b6000613be184828501613ba8565b91505092915050565b60008115159050919050565b613bff81613bea565b82525050565b6000602082019050613c1a6000830184613bf6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c5a578082015181840152602081019050613c3f565b83811115613c69576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c8b82613c20565b613c958185613c2b565b9350613ca5818560208601613c3c565b613cae81613c6f565b840191505092915050565b60006020820190508181036000830152613cd38184613c80565b905092915050565b6000819050919050565b613cee81613cdb565b8114613cf957600080fd5b50565b600081359050613d0b81613ce5565b92915050565b600060208284031215613d2757613d26613b5b565b5b6000613d3584828501613cfc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d6982613d3e565b9050919050565b613d7981613d5e565b82525050565b6000602082019050613d946000830184613d70565b92915050565b613da381613d5e565b8114613dae57600080fd5b50565b600081359050613dc081613d9a565b92915050565b60008060408385031215613ddd57613ddc613b5b565b5b6000613deb85828601613db1565b9250506020613dfc85828601613cfc565b9150509250929050565b613e0f81613cdb565b82525050565b6000602082019050613e2a6000830184613e06565b92915050565b600080600060608486031215613e4957613e48613b5b565b5b6000613e5786828701613db1565b9350506020613e6886828701613db1565b9250506040613e7986828701613cfc565b9150509250925092565b6000819050919050565b613e9681613e83565b82525050565b6000602082019050613eb16000830184613e8d565b92915050565b600060208284031215613ecd57613ecc613b5b565b5b6000613edb84828501613db1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f1981613cdb565b82525050565b6000613f2b8383613f10565b60208301905092915050565b6000602082019050919050565b6000613f4f82613ee4565b613f598185613eef565b9350613f6483613f00565b8060005b83811015613f95578151613f7c8882613f1f565b9750613f8783613f37565b925050600181019050613f68565b5085935050505092915050565b60006020820190508181036000830152613fbc8184613f44565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61400682613c6f565b810181811067ffffffffffffffff8211171561402557614024613fce565b5b80604052505050565b6000614038613b51565b90506140448282613ffd565b919050565b600067ffffffffffffffff82111561406457614063613fce565b5b61406d82613c6f565b9050602081019050919050565b82818337600083830152505050565b600061409c61409784614049565b61402e565b9050828152602081018484840111156140b8576140b7613fc9565b5b6140c384828561407a565b509392505050565b600082601f8301126140e0576140df613fc4565b5b81356140f0848260208601614089565b91505092915050565b60006020828403121561410f5761410e613b5b565b5b600082013567ffffffffffffffff81111561412d5761412c613b60565b5b614139848285016140cb565b91505092915050565b61414b81613bea565b811461415657600080fd5b50565b60008135905061416881614142565b92915050565b60006020828403121561418457614183613b5b565b5b600061419284828501614159565b91505092915050565b600080fd5b600080fd5b60008083601f8401126141bb576141ba613fc4565b5b8235905067ffffffffffffffff8111156141d8576141d761419b565b5b6020830191508360208202830111156141f4576141f36141a0565b5b9250929050565b600060ff82169050919050565b614211816141fb565b811461421c57600080fd5b50565b60008135905061422e81614208565b92915050565b60008060006040848603121561424d5761424c613b5b565b5b600084013567ffffffffffffffff81111561426b5761426a613b60565b5b614277868287016141a5565b9350935050602061428a8682870161421f565b9150509250925092565b61429d81613e83565b81146142a857600080fd5b50565b6000813590506142ba81614294565b92915050565b6000602082840312156142d6576142d5613b5b565b5b60006142e4848285016142ab565b91505092915050565b6000806040838503121561430457614303613b5b565b5b600061431285828601613db1565b925050602061432385828601614159565b9150509250929050565b600067ffffffffffffffff82111561434857614347613fce565b5b61435182613c6f565b9050602081019050919050565b600061437161436c8461432d565b61402e565b90508281526020810184848401111561438d5761438c613fc9565b5b61439884828561407a565b509392505050565b600082601f8301126143b5576143b4613fc4565b5b81356143c584826020860161435e565b91505092915050565b600080600080608085870312156143e8576143e7613b5b565b5b60006143f687828801613db1565b945050602061440787828801613db1565b935050604061441887828801613cfc565b925050606085013567ffffffffffffffff81111561443957614438613b60565b5b614445878288016143a0565b91505092959194509250565b6000806040838503121561446857614467613b5b565b5b600061447685828601613db1565b925050602061448785828601613db1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144d857607f821691505b6020821081036144eb576144ea614491565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061454d602c83613c2b565b9150614558826144f1565b604082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006145df602183613c2b565b91506145ea82614583565b604082019050919050565b6000602082019050818103600083015261460e816145d2565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614671603883613c2b565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614703603183613c2b565b915061470e826146a7565b604082019050919050565b60006020820190508181036000830152614732816146f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061476f602083613c2b565b915061477a82614739565b602082019050919050565b6000602082019050818103600083015261479e81614762565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614801602b83613c2b565b915061480c826147a5565b604082019050919050565b60006020820190508181036000830152614830816147f4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148a082613cdb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148d2576148d1614866565b5b600182019050919050565b6000815190506148ec81613ce5565b92915050565b60006020828403121561490857614907613b5b565b5b6000614916848285016148dd565b91505092915050565b7f496e73756666696369656e7420746f6b656e7320696e20706f6f6c2e00000000600082015250565b6000614955601c83613c2b565b91506149608261491f565b602082019050919050565b6000602082019050818103600083015261498481614948565b9050919050565b7f496e636f727265637420636c61696d61626c6520616d6f756e742e0000000000600082015250565b60006149c1601b83613c2b565b91506149cc8261498b565b602082019050919050565b600060208201905081810360008301526149f0816149b4565b9050919050565b6000614a0282613cdb565b9150614a0d83613cdb565b925082821015614a2057614a1f614866565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a6582613cdb565b9150614a7083613cdb565b925082614a8057614a7f614a2b565b5b828204905092915050565b6000604082019050614aa06000830185613d70565b614aad6020830184613e06565b9392505050565b600081519050614ac381614142565b92915050565b600060208284031215614adf57614ade613b5b565b5b6000614aed84828501614ab4565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614b52602c83613c2b565b9150614b5d82614af6565b604082019050919050565b60006020820190508181036000830152614b8181614b45565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614be4602983613c2b565b9150614bef82614b88565b604082019050919050565b60006020820190508181036000830152614c1381614bd7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614c76602a83613c2b565b9150614c8182614c1a565b604082019050919050565b60006020820190508181036000830152614ca581614c69565b9050919050565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b6000614ce2601883613c2b565b9150614ced82614cac565b602082019050919050565b60006020820190508181036000830152614d1181614cd5565b9050919050565b6000614d23826141fb565b9150614d2e836141fb565b92508260ff03821115614d4457614d43614866565b5b828201905092915050565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dab602283613c2b565b9150614db682614d4f565b604082019050919050565b60006020820190508181036000830152614dda81614d9e565b9050919050565b6000614dec82613cdb565b9150614df783613cdb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e2c57614e2b614866565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614e6d602083613c2b565b9150614e7882614e37565b602082019050919050565b60006020820190508181036000830152614e9c81614e60565b9050919050565b6000614eae82613cdb565b9150614eb983613cdb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ef257614ef1614866565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614f33601f83613c2b565b9150614f3e82614efd565b602082019050919050565b60006020820190508181036000830152614f6281614f26565b9050919050565b60008160601b9050919050565b6000614f8182614f69565b9050919050565b6000614f9382614f76565b9050919050565b614fab614fa682613d5e565b614f88565b82525050565b6000614fbd8284614f9a565b60148201915081905092915050565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b6000615002600e83613c2b565b915061500d82614fcc565b602082019050919050565b6000602082019050818103600083015261503181614ff5565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000615094602283613c2b565b915061509f82615038565b604082019050919050565b600060208201905081810360008301526150c381615087565b9050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000615100601b83613c2b565b915061510b826150ca565b602082019050919050565b6000602082019050818103600083015261512f816150f3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615192602683613c2b565b915061519d82615136565b604082019050919050565b600060208201905081810360008301526151c181615185565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615224602c83613c2b565b915061522f826151c8565b604082019050919050565b6000602082019050818103600083015261525381615217565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006152b6602583613c2b565b91506152c18261525a565b604082019050919050565b600060208201905081810360008301526152e5816152a9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615348602483613c2b565b9150615353826152ec565b604082019050919050565b600060208201905081810360008301526153778161533b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006153b4601983613c2b565b91506153bf8261537e565b602082019050919050565b600060208201905081810360008301526153e3816153a7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615446603283613c2b565b9150615451826153ea565b604082019050919050565b6000602082019050818103600083015261547581615439565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006154d8602f83613c2b565b91506154e38261547c565b604082019050919050565b60006020820190508181036000830152615507816154cb565b9050919050565b600081905092915050565b600061552482613c20565b61552e818561550e565b935061553e818560208601613c3c565b80840191505092915050565b60006155568285615519565b91506155628284615519565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006155958261556e565b61559f8185615579565b93506155af818560208601613c3c565b6155b881613c6f565b840191505092915050565b60006080820190506155d86000830187613d70565b6155e56020830186613d70565b6155f26040830185613e06565b8181036060830152615604818461558a565b905095945050505050565b60008151905061561e81613b91565b92915050565b60006020828403121561563a57615639613b5b565b5b60006156488482850161560f565b91505092915050565b600061565c82613cdb565b915061566783613cdb565b92508261567757615676614a2b565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006156b8602083613c2b565b91506156c382615682565b602082019050919050565b600060208201905081810360008301526156e7816156ab565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615724601c83613c2b565b915061572f826156ee565b602082019050919050565b6000602082019050818103600083015261575381615717565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f197bd69a8f5246e45d1c28100dc856a0439ad0e2a5a6c649bcf7bcaa813863f64736f6c634300080d0033697066733a2f2f516d564377333541596f5265424c41396875665771314a6f65396563766332674d7270524537796a6852764d65762f

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80637449da4811610175578063b3a7ce4f116100dc578063c87b56dd11610095578063e985e9c51161006f578063e985e9c514610a7c578063eb8d244414610ab9578063f2fde38b14610ae4578063ffe630b514610b0d576102ae565b8063c87b56dd146109eb578063d060256014610a28578063e0a8085314610a53576102ae565b8063b3a7ce4f146108dd578063b5962bd214610908578063b88d4fde14610931578063c04a28361461095a578063c08dfd3c14610997578063c4e37095146109c2576102ae565b806395d89b411161012e57806395d89b41146107f05780639e281a981461081b5780639ef8e74914610844578063a0712d681461086f578063a1e3a3931461088b578063a22cb465146108b4576102ae565b80637449da48146107035780637cb647591461071f578063819b25ba14610748578063833b9499146107715780638da5cb5b1461079c57806391b7f5ed146107c7576102ae565b806342842e0e116102195780636352211e116101d25780636352211e146105f35780636373a6b11461063057806365f130971461065b57806370a0823114610686578063715018a6146106c3578063718bc4af146106da576102ae565b806342842e0e146104d3578063438b6300146104fc57806346e04a2f146105395780634f6ccce714610562578063518302271461059f57806355f804b3146105ca576102ae565b8063270ab52c1161026b578063270ab52c146103d557806329fc6bae146103fe5780632eb4a7ab146104295780632f745c591461045457806332cb6b0c146104915780633ccfd60b146104bc576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b31461035857806318160ddd1461038157806323b872dd146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613bbd565b610b36565b6040516102e79190613c05565b60405180910390f35b3480156102fc57600080fd5b50610305610b48565b6040516103129190613cb9565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613d11565b610bda565b60405161034f9190613d7f565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613dc6565b610c5f565b005b34801561038d57600080fd5b50610396610d76565b6040516103a39190613e15565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613e30565b610d83565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190613d11565b610de3565b005b34801561040a57600080fd5b50610413610e69565b6040516104209190613c05565b60405180910390f35b34801561043557600080fd5b5061043e610e7c565b60405161044b9190613e9c565b60405180910390f35b34801561046057600080fd5b5061047b60048036038101906104769190613dc6565b610e82565b6040516104889190613e15565b60405180910390f35b34801561049d57600080fd5b506104a6610f27565b6040516104b39190613e15565b60405180910390f35b3480156104c857600080fd5b506104d1610f2d565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613e30565b610ff8565b005b34801561050857600080fd5b50610523600480360381019061051e9190613eb7565b611018565b6040516105309190613fa2565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b9190613d11565b6110c6565b005b34801561056e57600080fd5b5061058960048036038101906105849190613d11565b611330565b6040516105969190613e15565b60405180910390f35b3480156105ab57600080fd5b506105b46113a1565b6040516105c19190613c05565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec91906140f9565b6113b4565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613d11565b61144a565b6040516106279190613d7f565b60405180910390f35b34801561063c57600080fd5b506106456114fb565b6040516106529190613cb9565b60405180910390f35b34801561066757600080fd5b50610670611589565b60405161067d9190613e15565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613eb7565b61158f565b6040516106ba9190613e15565b60405180910390f35b3480156106cf57600080fd5b506106d8611646565b005b3480156106e657600080fd5b5061070160048036038101906106fc919061416e565b6116ce565b005b61071d60048036038101906107189190614234565b611767565b005b34801561072b57600080fd5b50610746600480360381019061074191906142c0565b611a93565b005b34801561075457600080fd5b5061076f600480360381019061076a9190613d11565b611b19565b005b34801561077d57600080fd5b50610786611bfc565b6040516107939190613e15565b60405180910390f35b3480156107a857600080fd5b506107b1611c02565b6040516107be9190613d7f565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613d11565b611c2c565b005b3480156107fc57600080fd5b50610805611cb2565b6040516108129190613cb9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613dc6565b611d44565b005b34801561085057600080fd5b50610859611e49565b6040516108669190613e15565b60405180910390f35b61088960048036038101906108849190613d11565b611e4f565b005b34801561089757600080fd5b506108b260048036038101906108ad9190613d11565b611fea565b005b3480156108c057600080fd5b506108db60048036038101906108d691906142ed565b612070565b005b3480156108e957600080fd5b506108f2612086565b6040516108ff9190613d7f565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a9190613eb7565b6120ac565b005b34801561093d57600080fd5b50610958600480360381019061095391906143ce565b61216c565b005b34801561096657600080fd5b50610981600480360381019061097c9190613eb7565b6121ce565b60405161098e9190613e15565b60405180910390f35b3480156109a357600080fd5b506109ac612234565b6040516109b99190613e15565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e4919061416e565b61223a565b005b3480156109f757600080fd5b50610a126004803603810190610a0d9190613d11565b6122d3565b604051610a1f9190613cb9565b60405180910390f35b348015610a3457600080fd5b50610a3d612310565b604051610a4a9190613e15565b60405180910390f35b348015610a5f57600080fd5b50610a7a6004803603810190610a75919061416e565b6123b2565b005b348015610a8857600080fd5b50610aa36004803603810190610a9e9190614451565b61244b565b604051610ab09190613c05565b60405180910390f35b348015610ac557600080fd5b50610ace6124df565b604051610adb9190613c05565b60405180910390f35b348015610af057600080fd5b50610b0b6004803603810190610b069190613eb7565b6124f2565b005b348015610b1957600080fd5b50610b346004803603810190610b2f91906140f9565b6125e9565b005b6000610b418261267f565b9050919050565b606060008054610b57906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b83906144c0565b8015610bd05780601f10610ba557610100808354040283529160200191610bd0565b820191906000526020600020905b815481529060010190602001808311610bb357829003601f168201915b5050505050905090565b6000610be5826126f9565b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90614563565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6a8261144a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd1906145f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cf9612765565b73ffffffffffffffffffffffffffffffffffffffff161480610d285750610d2781610d22612765565b61244b565b5b610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90614687565b60405180910390fd5b610d71838361276d565b505050565b6000600880549050905090565b610d94610d8e612765565b82612826565b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90614719565b60405180910390fd5b610dde838383612904565b505050565b610deb612765565b73ffffffffffffffffffffffffffffffffffffffff16610e09611c02565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690614785565b60405180910390fd5b80600f8190555050565b600d60019054906101000a900460ff1681565b60165481565b6000610e8d8361158f565b8210610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614817565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610f35612765565b73ffffffffffffffffffffffffffffffffffffffff16610f53611c02565b73ffffffffffffffffffffffffffffffffffffffff1614610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614785565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ff4573d6000803e3d6000fd5b5050565b6110138383836040518060200160405280600081525061216c565b505050565b606060006110258361158f565b905060008167ffffffffffffffff81111561104357611042613fce565b5b6040519080825280602002602001820160405280156110715781602001602082028036833780820191505090505b50905060005b828110156110bb576110898582610e82565b82828151811061109c5761109b614837565b5b60200260200101818152505080806110b390614895565b915050611077565b508092505050919050565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111289190613d7f565b602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116991906148f2565b9050828110156111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a59061496b565b60405180910390fd5b826111b7612310565b146111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee906149d7565b60405180910390fd5b600061120233611018565b905060005b81518110156112aa576000620151806013600085858151811061122d5761122c614837565b5b60200260200101518152602001908152602001600020544261124f91906149f7565b6112599190614a5a565b90506001811061129657426013600085858151811061127b5761127a614837565b5b60200260200101518152602001908152602001600020819055505b5080806112a290614895565b915050611207565b508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b81526004016112e6929190614a8b565b6020604051808303816000875af1158015611305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113299190614ac9565b5050505050565b600061133a610d76565b821061137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290614b68565b60405180910390fd5b6008828154811061138f5761138e614837565b5b90600052602060002001549050919050565b600d60029054906101000a900460ff1681565b6113bc612765565b73ffffffffffffffffffffffffffffffffffffffff166113da611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790614785565b60405180910390fd5b80600c9080519060200190611446929190613aae565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e990614bfa565b60405180910390fd5b80915050919050565b600b8054611508906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611534906144c0565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b505050505081565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614c8c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164e612765565b73ffffffffffffffffffffffffffffffffffffffff1661166c611c02565b73ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b990614785565b60405180910390fd5b6116cc6000612b6a565b565b6116d6612765565b73ffffffffffffffffffffffffffffffffffffffff166116f4611c02565b73ffffffffffffffffffffffffffffffffffffffff161461174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190614785565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6000611771610d76565b9050600d60019054906101000a900460ff166117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990614cf8565b60405180910390fd5b60105482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661181d9190614d18565b60ff161115611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890614dc1565b60405180910390fd5b600e548260ff16826118739190614de1565b11156118b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ab90614e83565b60405180910390fd5b348260ff166011546118c69190614ea3565b1115611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90614f49565b60405180910390fd5b60003360405160200161191a9190614fb1565b604051602081830303815290604052805190602001209050611980858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483612c30565b6119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690615018565b60405180910390fd5b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611a1a9190614d18565b92506101000a81548160ff021916908360ff16021790555060005b8360ff16811015611a8b5742601360008386611a519190614de1565b815260200190815260200160002081905550611a78338285611a739190614de1565b612c47565b8080611a8390614895565b915050611a35565b505050505050565b611a9b612765565b73ffffffffffffffffffffffffffffffffffffffff16611ab9611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0690614785565b60405180910390fd5b8060168190555050565b611b21612765565b73ffffffffffffffffffffffffffffffffffffffff16611b3f611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90614785565b60405180910390fd5b6000611b9f610d76565b905060005b82811015611bf757611bc1338284611bbc9190614de1565b612c47565b42601360008385611bd29190614de1565b8152602001908152602001600020819055508080611bef90614895565b915050611ba4565b505050565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c34612765565b73ffffffffffffffffffffffffffffffffffffffff16611c52611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f90614785565b60405180910390fd5b8060118190555050565b606060018054611cc1906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ced906144c0565b8015611d3a5780601f10611d0f57610100808354040283529160200191611d3a565b820191906000526020600020905b815481529060010190602001808311611d1d57829003601f168201915b5050505050905090565b611d4c612765565b73ffffffffffffffffffffffffffffffffffffffff16611d6a611c02565b73ffffffffffffffffffffffffffffffffffffffff1614611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790614785565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611e00929190614a8b565b6020604051808303816000875af1158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190614ac9565b50505050565b60125481565b6000611e59610d76565b9050600d60009054906101000a900460ff16611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea1906150aa565b60405180910390fd5b600f54821115611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690615116565b60405180910390fd5b600e548282611efe9190614de1565b1115611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690614e83565b60405180910390fd5b3482601154611f4e9190614ea3565b1115611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690614f49565b60405180910390fd5b60005b82811015611fe557611faf338284611faa9190614de1565b612c47565b42601360008385611fc09190614de1565b8152602001908152602001600020819055508080611fdd90614895565b915050611f92565b505050565b611ff2612765565b73ffffffffffffffffffffffffffffffffffffffff16612010611c02565b73ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614785565b60405180910390fd5b8060128190555050565b61208261207b612765565b8383612c65565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120b4612765565b73ffffffffffffffffffffffffffffffffffffffff166120d2611c02565b73ffffffffffffffffffffffffffffffffffffffff1614612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614785565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61217d612177612765565b83612826565b6121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390614719565b60405180910390fd5b6121c884848484612dd1565b50505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1660105461222d91906149f7565b9050919050565b60105481565b612242612765565b73ffffffffffffffffffffffffffffffffffffffff16612260611c02565b73ffffffffffffffffffffffffffffffffffffffff16146122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90614785565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b606060001515600d60029054906101000a900460ff161515036122ff576122f8612e2d565b905061230b565b61230882612ebf565b90505b919050565b60008061231c33611018565b9050600080600090505b82518110156123a9576000620151806013600086858151811061234c5761234b614837565b5b60200260200101518152602001908152602001600020544261236e91906149f7565b6123789190614a5a565b9050601254816123889190614ea3565b836123939190614de1565b92505080806123a190614895565b915050612326565b50809250505090565b6123ba612765565b73ffffffffffffffffffffffffffffffffffffffff166123d8611c02565b73ffffffffffffffffffffffffffffffffffffffff161461242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590614785565b60405180910390fd5b80600d60026101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b6124fa612765565b73ffffffffffffffffffffffffffffffffffffffff16612518611c02565b73ffffffffffffffffffffffffffffffffffffffff161461256e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256590614785565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d4906151a8565b60405180910390fd5b6125e681612b6a565b50565b6125f1612765565b73ffffffffffffffffffffffffffffffffffffffff1661260f611c02565b73ffffffffffffffffffffffffffffffffffffffff1614612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614785565b60405180910390fd5b80600b908051906020019061267b929190613aae565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126f257506126f182612f66565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127e08361144a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612831826126f9565b612870576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128679061523a565b60405180910390fd5b600061287b8361144a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ea57508373ffffffffffffffffffffffffffffffffffffffff166128d284610bda565b73ffffffffffffffffffffffffffffffffffffffff16145b806128fb57506128fa818561244b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129248261144a565b73ffffffffffffffffffffffffffffffffffffffff161461297a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612971906152cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e09061535e565b60405180910390fd5b6129f4838383613048565b6129ff60008261276d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4f91906149f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa69190614de1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b65838383613058565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612c3d858461305d565b1490509392505050565b612c618282604051806020016040528060008152506130d2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca906153ca565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612dc49190613c05565b60405180910390a3505050565b612ddc848484612904565b612de88484848461312d565b612e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1e9061545c565b60405180910390fd5b50505050565b6060600c8054612e3c906144c0565b80601f0160208091040260200160405190810160405280929190818152602001828054612e68906144c0565b8015612eb55780601f10612e8a57610100808354040283529160200191612eb5565b820191906000526020600020905b815481529060010190602001808311612e9857829003601f168201915b5050505050905090565b6060612eca826126f9565b612f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f00906154ee565b60405180910390fd5b6000612f13612e2d565b90506000815111612f335760405180602001604052806000815250612f5e565b80612f3d846132b4565b604051602001612f4e92919061554a565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061303157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613041575061304082613414565b5b9050919050565b61305383838361347e565b505050565b505050565b60008082905060005b84518110156130c757600085828151811061308457613083614837565b5b602002602001015190508083116130a65761309f8382613590565b92506130b3565b6130b08184613590565b92505b5080806130bf90614895565b915050613066565b508091505092915050565b6130dc83836135a7565b6130e9600084848461312d565b613128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311f9061545c565b60405180910390fd5b505050565b600061314e8473ffffffffffffffffffffffffffffffffffffffff16613780565b156132a7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613177612765565b8786866040518563ffffffff1660e01b815260040161319994939291906155c3565b6020604051808303816000875af19250505080156131d557506040513d601f19601f820116820180604052508101906131d29190615624565b60015b613257573d8060008114613205576040519150601f19603f3d011682016040523d82523d6000602084013e61320a565b606091505b50600081510361324f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132469061545c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132ac565b600190505b949350505050565b6060600082036132fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061340f565b600082905060005b6000821461332d57808061331690614895565b915050600a826133269190614a5a565b9150613303565b60008167ffffffffffffffff81111561334957613348613fce565b5b6040519080825280601f01601f19166020018201604052801561337b5781602001600182028036833780820191505090505b5090505b600085146134085760018261339491906149f7565b9150600a856133a39190615651565b60306133af9190614de1565b60f81b8183815181106133c5576133c4614837565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134019190614a5a565b945061337f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134898383836137a3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134cb576134c6816137a8565b61350a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135095761350883826137f1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361354c576135478161395e565b61358b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461358a576135898282613a2f565b5b5b505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360d906156ce565b60405180910390fd5b61361f816126f9565b1561365f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136569061573a565b60405180910390fd5b61366b60008383613048565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136bb9190614de1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377c60008383613058565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137fe8461158f565b61380891906149f7565b90506000600760008481526020019081526020016000205490508181146138ed576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061397291906149f7565b90506000600960008481526020019081526020016000205490506000600883815481106139a2576139a1614837565b5b9060005260206000200154905080600883815481106139c4576139c3614837565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a1357613a1261575a565b5b6001900381819060005260206000200160009055905550505050565b6000613a3a8361158f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613aba906144c0565b90600052602060002090601f016020900481019282613adc5760008555613b23565b82601f10613af557805160ff1916838001178555613b23565b82800160010185558215613b23579182015b82811115613b22578251825591602001919060010190613b07565b5b509050613b309190613b34565b5090565b5b80821115613b4d576000816000905550600101613b35565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b9a81613b65565b8114613ba557600080fd5b50565b600081359050613bb781613b91565b92915050565b600060208284031215613bd357613bd2613b5b565b5b6000613be184828501613ba8565b91505092915050565b60008115159050919050565b613bff81613bea565b82525050565b6000602082019050613c1a6000830184613bf6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c5a578082015181840152602081019050613c3f565b83811115613c69576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c8b82613c20565b613c958185613c2b565b9350613ca5818560208601613c3c565b613cae81613c6f565b840191505092915050565b60006020820190508181036000830152613cd38184613c80565b905092915050565b6000819050919050565b613cee81613cdb565b8114613cf957600080fd5b50565b600081359050613d0b81613ce5565b92915050565b600060208284031215613d2757613d26613b5b565b5b6000613d3584828501613cfc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d6982613d3e565b9050919050565b613d7981613d5e565b82525050565b6000602082019050613d946000830184613d70565b92915050565b613da381613d5e565b8114613dae57600080fd5b50565b600081359050613dc081613d9a565b92915050565b60008060408385031215613ddd57613ddc613b5b565b5b6000613deb85828601613db1565b9250506020613dfc85828601613cfc565b9150509250929050565b613e0f81613cdb565b82525050565b6000602082019050613e2a6000830184613e06565b92915050565b600080600060608486031215613e4957613e48613b5b565b5b6000613e5786828701613db1565b9350506020613e6886828701613db1565b9250506040613e7986828701613cfc565b9150509250925092565b6000819050919050565b613e9681613e83565b82525050565b6000602082019050613eb16000830184613e8d565b92915050565b600060208284031215613ecd57613ecc613b5b565b5b6000613edb84828501613db1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f1981613cdb565b82525050565b6000613f2b8383613f10565b60208301905092915050565b6000602082019050919050565b6000613f4f82613ee4565b613f598185613eef565b9350613f6483613f00565b8060005b83811015613f95578151613f7c8882613f1f565b9750613f8783613f37565b925050600181019050613f68565b5085935050505092915050565b60006020820190508181036000830152613fbc8184613f44565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61400682613c6f565b810181811067ffffffffffffffff8211171561402557614024613fce565b5b80604052505050565b6000614038613b51565b90506140448282613ffd565b919050565b600067ffffffffffffffff82111561406457614063613fce565b5b61406d82613c6f565b9050602081019050919050565b82818337600083830152505050565b600061409c61409784614049565b61402e565b9050828152602081018484840111156140b8576140b7613fc9565b5b6140c384828561407a565b509392505050565b600082601f8301126140e0576140df613fc4565b5b81356140f0848260208601614089565b91505092915050565b60006020828403121561410f5761410e613b5b565b5b600082013567ffffffffffffffff81111561412d5761412c613b60565b5b614139848285016140cb565b91505092915050565b61414b81613bea565b811461415657600080fd5b50565b60008135905061416881614142565b92915050565b60006020828403121561418457614183613b5b565b5b600061419284828501614159565b91505092915050565b600080fd5b600080fd5b60008083601f8401126141bb576141ba613fc4565b5b8235905067ffffffffffffffff8111156141d8576141d761419b565b5b6020830191508360208202830111156141f4576141f36141a0565b5b9250929050565b600060ff82169050919050565b614211816141fb565b811461421c57600080fd5b50565b60008135905061422e81614208565b92915050565b60008060006040848603121561424d5761424c613b5b565b5b600084013567ffffffffffffffff81111561426b5761426a613b60565b5b614277868287016141a5565b9350935050602061428a8682870161421f565b9150509250925092565b61429d81613e83565b81146142a857600080fd5b50565b6000813590506142ba81614294565b92915050565b6000602082840312156142d6576142d5613b5b565b5b60006142e4848285016142ab565b91505092915050565b6000806040838503121561430457614303613b5b565b5b600061431285828601613db1565b925050602061432385828601614159565b9150509250929050565b600067ffffffffffffffff82111561434857614347613fce565b5b61435182613c6f565b9050602081019050919050565b600061437161436c8461432d565b61402e565b90508281526020810184848401111561438d5761438c613fc9565b5b61439884828561407a565b509392505050565b600082601f8301126143b5576143b4613fc4565b5b81356143c584826020860161435e565b91505092915050565b600080600080608085870312156143e8576143e7613b5b565b5b60006143f687828801613db1565b945050602061440787828801613db1565b935050604061441887828801613cfc565b925050606085013567ffffffffffffffff81111561443957614438613b60565b5b614445878288016143a0565b91505092959194509250565b6000806040838503121561446857614467613b5b565b5b600061447685828601613db1565b925050602061448785828601613db1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144d857607f821691505b6020821081036144eb576144ea614491565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061454d602c83613c2b565b9150614558826144f1565b604082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006145df602183613c2b565b91506145ea82614583565b604082019050919050565b6000602082019050818103600083015261460e816145d2565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614671603883613c2b565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614703603183613c2b565b915061470e826146a7565b604082019050919050565b60006020820190508181036000830152614732816146f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061476f602083613c2b565b915061477a82614739565b602082019050919050565b6000602082019050818103600083015261479e81614762565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614801602b83613c2b565b915061480c826147a5565b604082019050919050565b60006020820190508181036000830152614830816147f4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148a082613cdb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148d2576148d1614866565b5b600182019050919050565b6000815190506148ec81613ce5565b92915050565b60006020828403121561490857614907613b5b565b5b6000614916848285016148dd565b91505092915050565b7f496e73756666696369656e7420746f6b656e7320696e20706f6f6c2e00000000600082015250565b6000614955601c83613c2b565b91506149608261491f565b602082019050919050565b6000602082019050818103600083015261498481614948565b9050919050565b7f496e636f727265637420636c61696d61626c6520616d6f756e742e0000000000600082015250565b60006149c1601b83613c2b565b91506149cc8261498b565b602082019050919050565b600060208201905081810360008301526149f0816149b4565b9050919050565b6000614a0282613cdb565b9150614a0d83613cdb565b925082821015614a2057614a1f614866565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a6582613cdb565b9150614a7083613cdb565b925082614a8057614a7f614a2b565b5b828204905092915050565b6000604082019050614aa06000830185613d70565b614aad6020830184613e06565b9392505050565b600081519050614ac381614142565b92915050565b600060208284031215614adf57614ade613b5b565b5b6000614aed84828501614ab4565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614b52602c83613c2b565b9150614b5d82614af6565b604082019050919050565b60006020820190508181036000830152614b8181614b45565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614be4602983613c2b565b9150614bef82614b88565b604082019050919050565b60006020820190508181036000830152614c1381614bd7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614c76602a83613c2b565b9150614c8182614c1a565b604082019050919050565b60006020820190508181036000830152614ca581614c69565b9050919050565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b6000614ce2601883613c2b565b9150614ced82614cac565b602082019050919050565b60006020820190508181036000830152614d1181614cd5565b9050919050565b6000614d23826141fb565b9150614d2e836141fb565b92508260ff03821115614d4457614d43614866565b5b828201905092915050565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dab602283613c2b565b9150614db682614d4f565b604082019050919050565b60006020820190508181036000830152614dda81614d9e565b9050919050565b6000614dec82613cdb565b9150614df783613cdb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e2c57614e2b614866565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614e6d602083613c2b565b9150614e7882614e37565b602082019050919050565b60006020820190508181036000830152614e9c81614e60565b9050919050565b6000614eae82613cdb565b9150614eb983613cdb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ef257614ef1614866565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614f33601f83613c2b565b9150614f3e82614efd565b602082019050919050565b60006020820190508181036000830152614f6281614f26565b9050919050565b60008160601b9050919050565b6000614f8182614f69565b9050919050565b6000614f9382614f76565b9050919050565b614fab614fa682613d5e565b614f88565b82525050565b6000614fbd8284614f9a565b60148201915081905092915050565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b6000615002600e83613c2b565b915061500d82614fcc565b602082019050919050565b6000602082019050818103600083015261503181614ff5565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000615094602283613c2b565b915061509f82615038565b604082019050919050565b600060208201905081810360008301526150c381615087565b9050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000615100601b83613c2b565b915061510b826150ca565b602082019050919050565b6000602082019050818103600083015261512f816150f3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615192602683613c2b565b915061519d82615136565b604082019050919050565b600060208201905081810360008301526151c181615185565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615224602c83613c2b565b915061522f826151c8565b604082019050919050565b6000602082019050818103600083015261525381615217565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006152b6602583613c2b565b91506152c18261525a565b604082019050919050565b600060208201905081810360008301526152e5816152a9565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615348602483613c2b565b9150615353826152ec565b604082019050919050565b600060208201905081810360008301526153778161533b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006153b4601983613c2b565b91506153bf8261537e565b602082019050919050565b600060208201905081810360008301526153e3816153a7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615446603283613c2b565b9150615451826153ea565b604082019050919050565b6000602082019050818103600083015261547581615439565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006154d8602f83613c2b565b91506154e38261547c565b604082019050919050565b60006020820190508181036000830152615507816154cb565b9050919050565b600081905092915050565b600061552482613c20565b61552e818561550e565b935061553e818560208601613c3c565b80840191505092915050565b60006155568285615519565b91506155628284615519565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006155958261556e565b61559f8185615579565b93506155af818560208601613c3c565b6155b881613c6f565b840191505092915050565b60006080820190506155d86000830187613d70565b6155e56020830186613d70565b6155f26040830185613e06565b8181036060830152615604818461558a565b905095945050505050565b60008151905061561e81613b91565b92915050565b60006020828403121561563a57615639613b5b565b5b60006156488482850161560f565b91505092915050565b600061565c82613cdb565b915061566783613cdb565b92508261567757615676614a2b565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006156b8602083613c2b565b91506156c382615682565b602082019050919050565b600060208201905081810360008301526156e7816156ab565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615724601c83613c2b565b915061572f826156ee565b602082019050919050565b6000602082019050818103600083015261575381615717565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f197bd69a8f5246e45d1c28100dc856a0439ad0e2a5a6c649bcf7bcaa813863f64736f6c634300080d0033

Deployed Bytecode Sourcemap

54893:6592:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61299:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22608:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24167:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23690:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40045:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24917:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59736:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55124:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55587:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39713:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55205:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60720:150;;;;;;;;;;;;;:::i;:::-;;25327:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56108:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57618:651;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40235:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55168:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60095:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22302:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54955:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55244:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22032:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36493:103;;;;;;;;;;;;;:::i;:::-;;60216:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58275:905;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60357:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60469:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55329:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35842:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59868:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22777:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60876:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55379:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57010:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59362:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24460:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55542:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59208:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25583:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56685:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55285:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59630:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56476:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55716:386;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59992:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24686:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55085:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36751:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59512:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61299:183;61410:4;61438:36;61462:11;61438:23;:36::i;:::-;61431:43;;61299:183;;;:::o;22608:100::-;22662:13;22695:5;22688:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22608:100;:::o;24167:221::-;24243:7;24271:16;24279:7;24271;:16::i;:::-;24263:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24356:15;:24;24372:7;24356:24;;;;;;;;;;;;;;;;;;;;;24349:31;;24167:221;;;:::o;23690:411::-;23771:13;23787:23;23802:7;23787:14;:23::i;:::-;23771:39;;23835:5;23829:11;;:2;:11;;;23821:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23929:5;23913:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23938:37;23955:5;23962:12;:10;:12::i;:::-;23938:16;:37::i;:::-;23913:62;23891:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24072:21;24081:2;24085:7;24072:8;:21::i;:::-;23760:341;23690:411;;:::o;40045:113::-;40106:7;40133:10;:17;;;;40126:24;;40045:113;:::o;24917:339::-;25112:41;25131:12;:10;:12::i;:::-;25145:7;25112:18;:41::i;:::-;25104:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25220:28;25230:4;25236:2;25240:7;25220:9;:28::i;:::-;24917:339;;;:::o;59736:126::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59838:16:::1;59820:15;:34;;;;59736:126:::0;:::o;55124:37::-;;;;;;;;;;;;;:::o;55587:25::-;;;;:::o;39713:256::-;39810:7;39846:23;39863:5;39846:16;:23::i;:::-;39838:5;:31;39830:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39935:12;:19;39948:5;39935:19;;;;;;;;;;;;;;;:26;39955:5;39935:26;;;;;;;;;;;;39928:33;;39713:256;;;;:::o;55205:32::-;;;;:::o;60720:150::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60774:12:::1;60789:21;60774:36;;60833:10;60825:28;;:37;60854:7;60825:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60759:111;60720:150::o:0;25327:185::-;25465:39;25482:4;25488:2;25492:7;25465:39;;;;;;;;;;;;:16;:39::i;:::-;25327:185;;;:::o;56108:362::-;56167:16;56196:18;56217:17;56227:6;56217:9;:17::i;:::-;56196:38;;56255:25;56297:10;56283:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56255:53;;56323:9;56319:108;56342:10;56338:1;:14;56319:108;;;56385:30;56405:6;56413:1;56385:19;:30::i;:::-;56371:8;56380:1;56371:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;56354:3;;;;;:::i;:::-;;;;56319:108;;;;56454:8;56447:15;;;;56108:362;;;:::o;57618:651::-;57674:12;57696:21;;;;;;;;;;;57674:44;;57727:20;57750:5;:15;;;57774:4;57750:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57727:53;;57813:7;57797:12;:23;;57789:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57897:7;57870:23;:21;:23::i;:::-;:34;57862:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57947:20;57970:25;57984:10;57970:13;:25::i;:::-;57947:48;;58008:9;58004:212;58027:3;:10;58023:1;:14;58004:212;;;58054:13;58113:6;58090:10;:18;58101:3;58105:1;58101:6;;;;;;;;:::i;:::-;;;;;;;;58090:18;;;;;;;;;;;;58072:15;:36;;;;:::i;:::-;58070:49;;;;:::i;:::-;58054:65;;58142:1;58133:5;:10;58130:76;;58179:15;58158:10;:18;58169:3;58173:1;58169:6;;;;;;;;:::i;:::-;;;;;;;;58158:18;;;;;;;;;;;:36;;;;58130:76;58043:173;58039:3;;;;;:::i;:::-;;;;58004:212;;;;58226:5;:14;;;58241:10;58253:7;58226:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57665:604;;;57618:651;:::o;40235:233::-;40310:7;40346:30;:28;:30::i;:::-;40338:5;:38;40330:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40443:10;40454:5;40443:17;;;;;;;;:::i;:::-;;;;;;;;;;40436:24;;40235:233;;;:::o;55168:28::-;;;;;;;;;;;;;:::o;60095:115::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60194:8:::1;60175:16;:27;;;;;;;;;;;;:::i;:::-;;60095:115:::0;:::o;22302:239::-;22374:7;22394:13;22410:7;:16;22418:7;22410:16;;;;;;;;;;;;;;;;;;;;;22394:32;;22462:1;22445:19;;:5;:19;;;22437:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22528:5;22521:12;;;22302:239;;;:::o;54955:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55244:34::-;;;;:::o;22032:208::-;22104:7;22149:1;22132:19;;:5;:19;;;22124:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22216:9;:16;22226:5;22216:16;;;;;;;;;;;;;;;;22209:23;;22032:208;;;:::o;36493:103::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36558:30:::1;36585:1;36558:18;:30::i;:::-;36493:103::o:0;60216:135::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60325:18:::1;60305:17;;:38;;;;;;;;;;;;;;;;;;60216:135:::0;:::o;58275:905::-;58381:10;58394:13;:11;:13::i;:::-;58381:26;;58426:17;;;;;;;;;;;58418:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;58541:18;;58523:14;58491:17;:29;58509:10;58491:29;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:68;;;;58483:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;58640:10;;58622:14;58617:19;;:2;:19;;;;:::i;:::-;:33;;58609:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58742:9;58724:14;58706:32;;:15;;:32;;;;:::i;:::-;:45;;58698:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;58800:12;58842:10;58825:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58815:39;;;;;;58800:54;;58873:50;58892:12;;58873:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58906:10;;58918:4;58873:18;:50::i;:::-;58865:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;58996:14;58963:17;:29;58981:10;58963:29;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59026:9;59021:152;59045:14;59041:18;;:1;:18;59021:152;;;59102:15;59081:10;:18;59097:1;59092:2;:6;;;;:::i;:::-;59081:18;;;;;;;;;;;:36;;;;59132:29;59142:10;59159:1;59154:2;:6;;;;:::i;:::-;59132:9;:29::i;:::-;59061:3;;;;;:::i;:::-;;;;59021:152;;;;58370:810;;58275:905;;;:::o;60357:106::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60444:11:::1;60431:10;:24;;;;60357:106:::0;:::o;60469:245::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60525:11:::1;60539:13;:11;:13::i;:::-;60525:27;;60568:6;60563:144;60584:1;60580;:5;60563:144;;;60607:33;60617:10;60638:1;60629:6;:10;;;;:::i;:::-;60607:9;:33::i;:::-;60680:15;60655:10;:22;60675:1;60666:6;:10;;;;:::i;:::-;60655:22;;;;;;;;;;;:40;;;;60587:3;;;;;:::i;:::-;;;;60563:144;;;;60514:200;60469:245:::0;:::o;55329:43::-;;;;:::o;35842:87::-;35888:7;35915:6;;;;;;;;;;;35908:13;;35842:87;:::o;59868:118::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59962:16:::1;59944:15;:34;;;;59868:118:::0;:::o;22777:104::-;22833:13;22866:7;22859:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22777:104;:::o;60876:201::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60970:20:::1;61000:14;60970:45;;61026:13;:22;;;61049:10;61061:7;61026:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60959:118;60876:201:::0;;:::o;55379:41::-;;;;:::o;57010:602::-;57071:10;57084:13;:11;:13::i;:::-;57071:26;;57116:12;;;;;;;;;;;57108:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57204:15;;57186:14;:33;;57178:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57293:10;;57275:14;57270:2;:19;;;;:::i;:::-;:33;;57262:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57395:9;57377:14;57359:15;;:32;;;;:::i;:::-;:45;;57351:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;57458:9;57453:152;57477:14;57473:1;:18;57453:152;;;57513:29;57523:10;57540:1;57535:2;:6;;;;:::i;:::-;57513:9;:29::i;:::-;57578:15;57557:10;:18;57573:1;57568:2;:6;;;;:::i;:::-;57557:18;;;;;;;;;;;:36;;;;57493:3;;;;;:::i;:::-;;;;57453:152;;;;57060:552;57010:602;:::o;59362:144::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59478:20:::1;59453:22;:45;;;;59362:144:::0;:::o;24460:155::-;24555:52;24574:12;:10;:12::i;:::-;24588:8;24598;24555:18;:52::i;:::-;24460:155;;:::o;55542:36::-;;;;;;;;;;;;;:::o;59208:148::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59326:22:::1;59302:21;;:46;;;;;;;;;;;;;;;;;;59208:148:::0;:::o;25583:328::-;25758:41;25777:12;:10;:12::i;:::-;25791:7;25758:18;:41::i;:::-;25750:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25864:39;25878:4;25884:2;25888:7;25897:5;25864:13;:39::i;:::-;25583:328;;;;:::o;56685:146::-;56750:7;56799:17;:23;56817:4;56799:23;;;;;;;;;;;;;;;;;;;;;;;;;56778:44;;:18;;:44;;;;:::i;:::-;56770:53;;56685:146;;;:::o;55285:37::-;;;;:::o;59630:100::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59714:8:::1;59699:12;;:23;;;;;;;;;;;;;;;;;;59630:100:::0;:::o;56476:203::-;56549:13;56588:5;56576:17;;:8;;;;;;;;;;;:17;;;56573:60;;56613:10;:8;:10::i;:::-;56606:17;;;;56573:60;56648:23;56663:7;56648:14;:23::i;:::-;56641:30;;56476:203;;;;:::o;55716:386::-;55769:7;55787:20;55810:25;55824:10;55810:13;:25::i;:::-;55787:48;;55844:23;55880:9;55892:1;55880:13;;55876:187;55899:3;:10;55895:1;:14;55876:187;;;55927:13;55986:6;55963:10;:18;55974:3;55978:1;55974:6;;;;;;;;:::i;:::-;;;;;;;;55963:18;;;;;;;;;;;;55945:15;:36;;;;:::i;:::-;55943:49;;;;:::i;:::-;55927:65;;56030:22;;56022:5;:30;;;;:::i;:::-;56003:49;;;;;:::i;:::-;;;55916:147;55911:3;;;;;:::i;:::-;;;;55876:187;;;;56079:15;56072:22;;;;55716:386;:::o;59992:97::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60072:9:::1;60061:8;;:20;;;;;;;;;;;;;;;;;;59992:97:::0;:::o;24686:164::-;24783:4;24807:18;:25;24826:5;24807:25;;;;;;;;;;;;;;;:35;24833:8;24807:35;;;;;;;;;;;;;;;;;;;;;;;;;24800:42;;24686:164;;;;:::o;55085:32::-;;;;;;;;;;;;;:::o;36751:201::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36860:1:::1;36840:22;;:8;:22;;::::0;36832:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36916:28;36935:8;36916:18;:28::i;:::-;36751:201:::0;:::o;59512:112::-;36073:12;:10;:12::i;:::-;36062:23;;:7;:5;:7::i;:::-;:23;;;36054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59606:10:::1;59593;:23;;;;;;;;;;;;:::i;:::-;;59512:112:::0;:::o;39405:224::-;39507:4;39546:35;39531:50;;;:11;:50;;;;:90;;;;39585:36;39609:11;39585:23;:36::i;:::-;39531:90;39524:97;;39405:224;;;:::o;27421:127::-;27486:4;27538:1;27510:30;;:7;:16;27518:7;27510:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27503:37;;27421:127;;;:::o;16888:98::-;16941:7;16968:10;16961:17;;16888:98;:::o;31567:174::-;31669:2;31642:15;:24;31658:7;31642:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31725:7;31721:2;31687:46;;31696:23;31711:7;31696:14;:23::i;:::-;31687:46;;;;;;;;;;;;31567:174;;:::o;27715:348::-;27808:4;27833:16;27841:7;27833;:16::i;:::-;27825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27909:13;27925:23;27940:7;27925:14;:23::i;:::-;27909:39;;27978:5;27967:16;;:7;:16;;;:51;;;;28011:7;27987:31;;:20;27999:7;27987:11;:20::i;:::-;:31;;;27967:51;:87;;;;28022:32;28039:5;28046:7;28022:16;:32::i;:::-;27967:87;27959:96;;;27715:348;;;;:::o;30824:625::-;30983:4;30956:31;;:23;30971:7;30956:14;:23::i;:::-;:31;;;30948:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31062:1;31048:16;;:2;:16;;;31040:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31118:39;31139:4;31145:2;31149:7;31118:20;:39::i;:::-;31222:29;31239:1;31243:7;31222:8;:29::i;:::-;31283:1;31264:9;:15;31274:4;31264:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31312:1;31295:9;:13;31305:2;31295:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31343:2;31324:7;:16;31332:7;31324:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31382:7;31378:2;31363:27;;31372:4;31363:27;;;;;;;;;;;;31403:38;31423:4;31429:2;31433:7;31403:19;:38::i;:::-;30824:625;;;:::o;37112:191::-;37186:16;37205:6;;;;;;;;;;;37186:25;;37231:8;37222:6;;:17;;;;;;;;;;;;;;;;;;37286:8;37255:40;;37276:8;37255:40;;;;;;;;;;;;37175:128;37112:191;:::o;53363:190::-;53488:4;53541;53512:25;53525:5;53532:4;53512:12;:25::i;:::-;:33;53505:40;;53363:190;;;;;:::o;28405:110::-;28481:26;28491:2;28495:7;28481:26;;;;;;;;;;;;:9;:26::i;:::-;28405:110;;:::o;31883:315::-;32038:8;32029:17;;:5;:17;;;32021:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32125:8;32087:18;:25;32106:5;32087:25;;;;;;;;;;;;;;;:35;32113:8;32087:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32171:8;32149:41;;32164:5;32149:41;;;32181:8;32149:41;;;;;;:::i;:::-;;;;;;;;31883:315;;;:::o;26793:::-;26950:28;26960:4;26966:2;26970:7;26950:9;:28::i;:::-;26997:48;27020:4;27026:2;27030:7;27039:5;26997:22;:48::i;:::-;26989:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26793:315;;;;:::o;56860:117::-;56920:13;56953:16;56946:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56860:117;:::o;22952:334::-;23025:13;23059:16;23067:7;23059;:16::i;:::-;23051:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23140:21;23164:10;:8;:10::i;:::-;23140:34;;23216:1;23198:7;23192:21;:25;:86;;;;;;;;;;;;;;;;;23244:7;23253:18;:7;:16;:18::i;:::-;23227:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23192:86;23185:93;;;22952:334;;;:::o;21663:305::-;21765:4;21817:25;21802:40;;;:11;:40;;;;:105;;;;21874:33;21859:48;;;:11;:48;;;;21802:105;:158;;;;21924:36;21948:11;21924:23;:36::i;:::-;21802:158;21782:178;;21663:305;;;:::o;61108:185::-;61240:45;61267:4;61273:2;61277:7;61240:26;:45::i;:::-;61108:185;;;:::o;34645:125::-;;;;:::o;53915:675::-;53998:7;54018:20;54041:4;54018:27;;54061:9;54056:497;54080:5;:12;54076:1;:16;54056:497;;;54114:20;54137:5;54143:1;54137:8;;;;;;;;:::i;:::-;;;;;;;;54114:31;;54180:12;54164;:28;54160:382;;54307:42;54322:12;54336;54307:14;:42::i;:::-;54292:57;;54160:382;;;54484:42;54499:12;54513;54484:14;:42::i;:::-;54469:57;;54160:382;54099:454;54094:3;;;;;:::i;:::-;;;;54056:497;;;;54570:12;54563:19;;;53915:675;;;;:::o;28742:321::-;28872:18;28878:2;28882:7;28872:5;:18::i;:::-;28923:54;28954:1;28958:2;28962:7;28971:5;28923:22;:54::i;:::-;28901:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28742:321;;;:::o;32763:799::-;32918:4;32939:15;:2;:13;;;:15::i;:::-;32935:620;;;32991:2;32975:36;;;33012:12;:10;:12::i;:::-;33026:4;33032:7;33041:5;32975:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32971:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33234:1;33217:6;:13;:18;33213:272;;33260:60;;;;;;;;;;:::i;:::-;;;;;;;;33213:272;33435:6;33429:13;33420:6;33416:2;33412:15;33405:38;32971:529;33108:41;;;33098:51;;;:6;:51;;;;33091:58;;;;;32935:620;33539:4;33532:11;;32763:799;;;;;;;:::o;17474:723::-;17530:13;17760:1;17751:5;:10;17747:53;;17778:10;;;;;;;;;;;;;;;;;;;;;17747:53;17810:12;17825:5;17810:20;;17841:14;17866:78;17881:1;17873:4;:9;17866:78;;17899:8;;;;;:::i;:::-;;;;17930:2;17922:10;;;;;:::i;:::-;;;17866:78;;;17954:19;17986:6;17976:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17954:39;;18004:154;18020:1;18011:5;:10;18004:154;;18048:1;18038:11;;;;;:::i;:::-;;;18115:2;18107:5;:10;;;;:::i;:::-;18094:2;:24;;;;:::i;:::-;18081:39;;18064:6;18071;18064:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18144:2;18135:11;;;;;:::i;:::-;;;18004:154;;;18182:6;18168:21;;;;;17474:723;;;;:::o;20101:157::-;20186:4;20225:25;20210:40;;;:11;:40;;;;20203:47;;20101:157;;;:::o;41081:589::-;41225:45;41252:4;41258:2;41262:7;41225:26;:45::i;:::-;41303:1;41287:18;;:4;:18;;;41283:187;;41322:40;41354:7;41322:31;:40::i;:::-;41283:187;;;41392:2;41384:10;;:4;:10;;;41380:90;;41411:47;41444:4;41450:7;41411:32;:47::i;:::-;41380:90;41283:187;41498:1;41484:16;;:2;:16;;;41480:183;;41517:45;41554:7;41517:36;:45::i;:::-;41480:183;;;41590:4;41584:10;;:2;:10;;;41580:83;;41611:40;41639:2;41643:7;41611:27;:40::i;:::-;41580:83;41480:183;41081:589;;;:::o;54598:224::-;54666:13;54729:1;54723:4;54716:15;54758:1;54752:4;54745:15;54799:4;54793;54783:21;54774:30;;54598:224;;;;:::o;29399:439::-;29493:1;29479:16;;:2;:16;;;29471:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29552:16;29560:7;29552;:16::i;:::-;29551:17;29543:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29614:45;29643:1;29647:2;29651:7;29614:20;:45::i;:::-;29689:1;29672:9;:13;29682:2;29672:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29720:2;29701:7;:16;29709:7;29701:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29765:7;29761:2;29740:33;;29757:1;29740:33;;;;;;;;;;;;29786:44;29814:1;29818:2;29822:7;29786:19;:44::i;:::-;29399:439;;:::o;8932:326::-;8992:4;9249:1;9227:7;:19;;;:23;9220:30;;8932:326;;;:::o;34134:126::-;;;;:::o;42393:164::-;42497:10;:17;;;;42470:15;:24;42486:7;42470:24;;;;;;;;;;;:44;;;;42525:10;42541:7;42525:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42393:164;:::o;43184:988::-;43450:22;43500:1;43475:22;43492:4;43475:16;:22::i;:::-;:26;;;;:::i;:::-;43450:51;;43512:18;43533:17;:26;43551:7;43533:26;;;;;;;;;;;;43512:47;;43680:14;43666:10;:28;43662:328;;43711:19;43733:12;:18;43746:4;43733:18;;;;;;;;;;;;;;;:34;43752:14;43733:34;;;;;;;;;;;;43711:56;;43817:11;43784:12;:18;43797:4;43784:18;;;;;;;;;;;;;;;:30;43803:10;43784:30;;;;;;;;;;;:44;;;;43934:10;43901:17;:30;43919:11;43901:30;;;;;;;;;;;:43;;;;43696:294;43662:328;44086:17;:26;44104:7;44086:26;;;;;;;;;;;44079:33;;;44130:12;:18;44143:4;44130:18;;;;;;;;;;;;;;;:34;44149:14;44130:34;;;;;;;;;;;44123:41;;;43265:907;;43184:988;;:::o;44467:1079::-;44720:22;44765:1;44745:10;:17;;;;:21;;;;:::i;:::-;44720:46;;44777:18;44798:15;:24;44814:7;44798:24;;;;;;;;;;;;44777:45;;45149:19;45171:10;45182:14;45171:26;;;;;;;;:::i;:::-;;;;;;;;;;45149:48;;45235:11;45210:10;45221;45210:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45346:10;45315:15;:28;45331:11;45315:28;;;;;;;;;;;:41;;;;45487:15;:24;45503:7;45487:24;;;;;;;;;;;45480:31;;;45522:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44538:1008;;;44467:1079;:::o;41971:221::-;42056:14;42073:20;42090:2;42073:16;:20::i;:::-;42056:37;;42131:7;42104:12;:16;42117:2;42104:16;;;;;;;;;;;;;;;:24;42121:6;42104:24;;;;;;;;;;;:34;;;;42178:6;42149:17;:26;42167:7;42149:26;;;;;;;;;;;:35;;;;42045:147;41971:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:329::-;6409:6;6458:2;6446:9;6437:7;6433:23;6429:32;6426:119;;;6464:79;;:::i;:::-;6426:119;6584:1;6609:53;6654:7;6645:6;6634:9;6630:22;6609:53;:::i;:::-;6599:63;;6555:117;6350:329;;;;:::o;6685:114::-;6752:6;6786:5;6780:12;6770:22;;6685:114;;;:::o;6805:184::-;6904:11;6938:6;6933:3;6926:19;6978:4;6973:3;6969:14;6954:29;;6805:184;;;;:::o;6995:132::-;7062:4;7085:3;7077:11;;7115:4;7110:3;7106:14;7098:22;;6995:132;;;:::o;7133:108::-;7210:24;7228:5;7210:24;:::i;:::-;7205:3;7198:37;7133:108;;:::o;7247:179::-;7316:10;7337:46;7379:3;7371:6;7337:46;:::i;:::-;7415:4;7410:3;7406:14;7392:28;;7247:179;;;;:::o;7432:113::-;7502:4;7534;7529:3;7525:14;7517:22;;7432:113;;;:::o;7581:732::-;7700:3;7729:54;7777:5;7729:54;:::i;:::-;7799:86;7878:6;7873:3;7799:86;:::i;:::-;7792:93;;7909:56;7959:5;7909:56;:::i;:::-;7988:7;8019:1;8004:284;8029:6;8026:1;8023:13;8004:284;;;8105:6;8099:13;8132:63;8191:3;8176:13;8132:63;:::i;:::-;8125:70;;8218:60;8271:6;8218:60;:::i;:::-;8208:70;;8064:224;8051:1;8048;8044:9;8039:14;;8004:284;;;8008:14;8304:3;8297:10;;7705:608;;;7581:732;;;;:::o;8319:373::-;8462:4;8500:2;8489:9;8485:18;8477:26;;8549:9;8543:4;8539:20;8535:1;8524:9;8520:17;8513:47;8577:108;8680:4;8671:6;8577:108;:::i;:::-;8569:116;;8319:373;;;;:::o;8698:117::-;8807:1;8804;8797:12;8821:117;8930:1;8927;8920:12;8944:180;8992:77;8989:1;8982:88;9089:4;9086:1;9079:15;9113:4;9110:1;9103:15;9130:281;9213:27;9235:4;9213:27;:::i;:::-;9205:6;9201:40;9343:6;9331:10;9328:22;9307:18;9295:10;9292:34;9289:62;9286:88;;;9354:18;;:::i;:::-;9286:88;9394:10;9390:2;9383:22;9173:238;9130:281;;:::o;9417:129::-;9451:6;9478:20;;:::i;:::-;9468:30;;9507:33;9535:4;9527:6;9507:33;:::i;:::-;9417:129;;;:::o;9552:308::-;9614:4;9704:18;9696:6;9693:30;9690:56;;;9726:18;;:::i;:::-;9690:56;9764:29;9786:6;9764:29;:::i;:::-;9756:37;;9848:4;9842;9838:15;9830:23;;9552:308;;;:::o;9866:154::-;9950:6;9945:3;9940;9927:30;10012:1;10003:6;9998:3;9994:16;9987:27;9866:154;;;:::o;10026:412::-;10104:5;10129:66;10145:49;10187:6;10145:49;:::i;:::-;10129:66;:::i;:::-;10120:75;;10218:6;10211:5;10204:21;10256:4;10249:5;10245:16;10294:3;10285:6;10280:3;10276:16;10273:25;10270:112;;;10301:79;;:::i;:::-;10270:112;10391:41;10425:6;10420:3;10415;10391:41;:::i;:::-;10110:328;10026:412;;;;;:::o;10458:340::-;10514:5;10563:3;10556:4;10548:6;10544:17;10540:27;10530:122;;10571:79;;:::i;:::-;10530:122;10688:6;10675:20;10713:79;10788:3;10780:6;10773:4;10765:6;10761:17;10713:79;:::i;:::-;10704:88;;10520:278;10458:340;;;;:::o;10804:509::-;10873:6;10922:2;10910:9;10901:7;10897:23;10893:32;10890:119;;;10928:79;;:::i;:::-;10890:119;11076:1;11065:9;11061:17;11048:31;11106:18;11098:6;11095:30;11092:117;;;11128:79;;:::i;:::-;11092:117;11233:63;11288:7;11279:6;11268:9;11264:22;11233:63;:::i;:::-;11223:73;;11019:287;10804:509;;;;:::o;11319:116::-;11389:21;11404:5;11389:21;:::i;:::-;11382:5;11379:32;11369:60;;11425:1;11422;11415:12;11369:60;11319:116;:::o;11441:133::-;11484:5;11522:6;11509:20;11500:29;;11538:30;11562:5;11538:30;:::i;:::-;11441:133;;;;:::o;11580:323::-;11636:6;11685:2;11673:9;11664:7;11660:23;11656:32;11653:119;;;11691:79;;:::i;:::-;11653:119;11811:1;11836:50;11878:7;11869:6;11858:9;11854:22;11836:50;:::i;:::-;11826:60;;11782:114;11580:323;;;;:::o;11909:117::-;12018:1;12015;12008:12;12032:117;12141:1;12138;12131:12;12172:568;12245:8;12255:6;12305:3;12298:4;12290:6;12286:17;12282:27;12272:122;;12313:79;;:::i;:::-;12272:122;12426:6;12413:20;12403:30;;12456:18;12448:6;12445:30;12442:117;;;12478:79;;:::i;:::-;12442:117;12592:4;12584:6;12580:17;12568:29;;12646:3;12638:4;12630:6;12626:17;12616:8;12612:32;12609:41;12606:128;;;12653:79;;:::i;:::-;12606:128;12172:568;;;;;:::o;12746:86::-;12781:7;12821:4;12814:5;12810:16;12799:27;;12746:86;;;:::o;12838:118::-;12909:22;12925:5;12909:22;:::i;:::-;12902:5;12899:33;12889:61;;12946:1;12943;12936:12;12889:61;12838:118;:::o;12962:135::-;13006:5;13044:6;13031:20;13022:29;;13060:31;13085:5;13060:31;:::i;:::-;12962:135;;;;:::o;13103:700::-;13196:6;13204;13212;13261:2;13249:9;13240:7;13236:23;13232:32;13229:119;;;13267:79;;:::i;:::-;13229:119;13415:1;13404:9;13400:17;13387:31;13445:18;13437:6;13434:30;13431:117;;;13467:79;;:::i;:::-;13431:117;13580:80;13652:7;13643:6;13632:9;13628:22;13580:80;:::i;:::-;13562:98;;;;13358:312;13709:2;13735:51;13778:7;13769:6;13758:9;13754:22;13735:51;:::i;:::-;13725:61;;13680:116;13103:700;;;;;:::o;13809:122::-;13882:24;13900:5;13882:24;:::i;:::-;13875:5;13872:35;13862:63;;13921:1;13918;13911:12;13862:63;13809:122;:::o;13937:139::-;13983:5;14021:6;14008:20;13999:29;;14037:33;14064:5;14037:33;:::i;:::-;13937:139;;;;:::o;14082:329::-;14141:6;14190:2;14178:9;14169:7;14165:23;14161:32;14158:119;;;14196:79;;:::i;:::-;14158:119;14316:1;14341:53;14386:7;14377:6;14366:9;14362:22;14341:53;:::i;:::-;14331:63;;14287:117;14082:329;;;;:::o;14417:468::-;14482:6;14490;14539:2;14527:9;14518:7;14514:23;14510:32;14507:119;;;14545:79;;:::i;:::-;14507:119;14665:1;14690:53;14735:7;14726:6;14715:9;14711:22;14690:53;:::i;:::-;14680:63;;14636:117;14792:2;14818:50;14860:7;14851:6;14840:9;14836:22;14818:50;:::i;:::-;14808:60;;14763:115;14417:468;;;;;:::o;14891:307::-;14952:4;15042:18;15034:6;15031:30;15028:56;;;15064:18;;:::i;:::-;15028:56;15102:29;15124:6;15102:29;:::i;:::-;15094:37;;15186:4;15180;15176:15;15168:23;;14891:307;;;:::o;15204:410::-;15281:5;15306:65;15322:48;15363:6;15322:48;:::i;:::-;15306:65;:::i;:::-;15297:74;;15394:6;15387:5;15380:21;15432:4;15425:5;15421:16;15470:3;15461:6;15456:3;15452:16;15449:25;15446:112;;;15477:79;;:::i;:::-;15446:112;15567:41;15601:6;15596:3;15591;15567:41;:::i;:::-;15287:327;15204:410;;;;;:::o;15633:338::-;15688:5;15737:3;15730:4;15722:6;15718:17;15714:27;15704:122;;15745:79;;:::i;:::-;15704:122;15862:6;15849:20;15887:78;15961:3;15953:6;15946:4;15938:6;15934:17;15887:78;:::i;:::-;15878:87;;15694:277;15633:338;;;;:::o;15977:943::-;16072:6;16080;16088;16096;16145:3;16133:9;16124:7;16120:23;16116:33;16113:120;;;16152:79;;:::i;:::-;16113:120;16272:1;16297:53;16342:7;16333:6;16322:9;16318:22;16297:53;:::i;:::-;16287:63;;16243:117;16399:2;16425:53;16470:7;16461:6;16450:9;16446:22;16425:53;:::i;:::-;16415:63;;16370:118;16527:2;16553:53;16598:7;16589:6;16578:9;16574:22;16553:53;:::i;:::-;16543:63;;16498:118;16683:2;16672:9;16668:18;16655:32;16714:18;16706:6;16703:30;16700:117;;;16736:79;;:::i;:::-;16700:117;16841:62;16895:7;16886:6;16875:9;16871:22;16841:62;:::i;:::-;16831:72;;16626:287;15977:943;;;;;;;:::o;16926:474::-;16994:6;17002;17051:2;17039:9;17030:7;17026:23;17022:32;17019:119;;;17057:79;;:::i;:::-;17019:119;17177:1;17202:53;17247:7;17238:6;17227:9;17223:22;17202:53;:::i;:::-;17192:63;;17148:117;17304:2;17330:53;17375:7;17366:6;17355:9;17351:22;17330:53;:::i;:::-;17320:63;;17275:118;16926:474;;;;;:::o;17406:180::-;17454:77;17451:1;17444:88;17551:4;17548:1;17541:15;17575:4;17572:1;17565:15;17592:320;17636:6;17673:1;17667:4;17663:12;17653:22;;17720:1;17714:4;17710:12;17741:18;17731:81;;17797:4;17789:6;17785:17;17775:27;;17731:81;17859:2;17851:6;17848:14;17828:18;17825:38;17822:84;;17878:18;;:::i;:::-;17822:84;17643:269;17592:320;;;:::o;17918:231::-;18058:34;18054:1;18046:6;18042:14;18035:58;18127:14;18122:2;18114:6;18110:15;18103:39;17918:231;:::o;18155:366::-;18297:3;18318:67;18382:2;18377:3;18318:67;:::i;:::-;18311:74;;18394:93;18483:3;18394:93;:::i;:::-;18512:2;18507:3;18503:12;18496:19;;18155:366;;;:::o;18527:419::-;18693:4;18731:2;18720:9;18716:18;18708:26;;18780:9;18774:4;18770:20;18766:1;18755:9;18751:17;18744:47;18808:131;18934:4;18808:131;:::i;:::-;18800:139;;18527:419;;;:::o;18952:220::-;19092:34;19088:1;19080:6;19076:14;19069:58;19161:3;19156:2;19148:6;19144:15;19137:28;18952:220;:::o;19178:366::-;19320:3;19341:67;19405:2;19400:3;19341:67;:::i;:::-;19334:74;;19417:93;19506:3;19417:93;:::i;:::-;19535:2;19530:3;19526:12;19519:19;;19178:366;;;:::o;19550:419::-;19716:4;19754:2;19743:9;19739:18;19731:26;;19803:9;19797:4;19793:20;19789:1;19778:9;19774:17;19767:47;19831:131;19957:4;19831:131;:::i;:::-;19823:139;;19550:419;;;:::o;19975:243::-;20115:34;20111:1;20103:6;20099:14;20092:58;20184:26;20179:2;20171:6;20167:15;20160:51;19975:243;:::o;20224:366::-;20366:3;20387:67;20451:2;20446:3;20387:67;:::i;:::-;20380:74;;20463:93;20552:3;20463:93;:::i;:::-;20581:2;20576:3;20572:12;20565:19;;20224:366;;;:::o;20596:419::-;20762:4;20800:2;20789:9;20785:18;20777:26;;20849:9;20843:4;20839:20;20835:1;20824:9;20820:17;20813:47;20877:131;21003:4;20877:131;:::i;:::-;20869:139;;20596:419;;;:::o;21021:236::-;21161:34;21157:1;21149:6;21145:14;21138:58;21230:19;21225:2;21217:6;21213:15;21206:44;21021:236;:::o;21263:366::-;21405:3;21426:67;21490:2;21485:3;21426:67;:::i;:::-;21419:74;;21502:93;21591:3;21502:93;:::i;:::-;21620:2;21615:3;21611:12;21604:19;;21263:366;;;:::o;21635:419::-;21801:4;21839:2;21828:9;21824:18;21816:26;;21888:9;21882:4;21878:20;21874:1;21863:9;21859:17;21852:47;21916:131;22042:4;21916:131;:::i;:::-;21908:139;;21635:419;;;:::o;22060:182::-;22200:34;22196:1;22188:6;22184:14;22177:58;22060:182;:::o;22248:366::-;22390:3;22411:67;22475:2;22470:3;22411:67;:::i;:::-;22404:74;;22487:93;22576:3;22487:93;:::i;:::-;22605:2;22600:3;22596:12;22589:19;;22248:366;;;:::o;22620:419::-;22786:4;22824:2;22813:9;22809:18;22801:26;;22873:9;22867:4;22863:20;22859:1;22848:9;22844:17;22837:47;22901:131;23027:4;22901:131;:::i;:::-;22893:139;;22620:419;;;:::o;23045:230::-;23185:34;23181:1;23173:6;23169:14;23162:58;23254:13;23249:2;23241:6;23237:15;23230:38;23045:230;:::o;23281:366::-;23423:3;23444:67;23508:2;23503:3;23444:67;:::i;:::-;23437:74;;23520:93;23609:3;23520:93;:::i;:::-;23638:2;23633:3;23629:12;23622:19;;23281:366;;;:::o;23653:419::-;23819:4;23857:2;23846:9;23842:18;23834:26;;23906:9;23900:4;23896:20;23892:1;23881:9;23877:17;23870:47;23934:131;24060:4;23934:131;:::i;:::-;23926:139;;23653:419;;;:::o;24078:180::-;24126:77;24123:1;24116:88;24223:4;24220:1;24213:15;24247:4;24244:1;24237:15;24264:180;24312:77;24309:1;24302:88;24409:4;24406:1;24399:15;24433:4;24430:1;24423:15;24450:233;24489:3;24512:24;24530:5;24512:24;:::i;:::-;24503:33;;24558:66;24551:5;24548:77;24545:103;;24628:18;;:::i;:::-;24545:103;24675:1;24668:5;24664:13;24657:20;;24450:233;;;:::o;24689:143::-;24746:5;24777:6;24771:13;24762:22;;24793:33;24820:5;24793:33;:::i;:::-;24689:143;;;;:::o;24838:351::-;24908:6;24957:2;24945:9;24936:7;24932:23;24928:32;24925:119;;;24963:79;;:::i;:::-;24925:119;25083:1;25108:64;25164:7;25155:6;25144:9;25140:22;25108:64;:::i;:::-;25098:74;;25054:128;24838:351;;;;:::o;25195:178::-;25335:30;25331:1;25323:6;25319:14;25312:54;25195:178;:::o;25379:366::-;25521:3;25542:67;25606:2;25601:3;25542:67;:::i;:::-;25535:74;;25618:93;25707:3;25618:93;:::i;:::-;25736:2;25731:3;25727:12;25720:19;;25379:366;;;:::o;25751:419::-;25917:4;25955:2;25944:9;25940:18;25932:26;;26004:9;25998:4;25994:20;25990:1;25979:9;25975:17;25968:47;26032:131;26158:4;26032:131;:::i;:::-;26024:139;;25751:419;;;:::o;26176:177::-;26316:29;26312:1;26304:6;26300:14;26293:53;26176:177;:::o;26359:366::-;26501:3;26522:67;26586:2;26581:3;26522:67;:::i;:::-;26515:74;;26598:93;26687:3;26598:93;:::i;:::-;26716:2;26711:3;26707:12;26700:19;;26359:366;;;:::o;26731:419::-;26897:4;26935:2;26924:9;26920:18;26912:26;;26984:9;26978:4;26974:20;26970:1;26959:9;26955:17;26948:47;27012:131;27138:4;27012:131;:::i;:::-;27004:139;;26731:419;;;:::o;27156:191::-;27196:4;27216:20;27234:1;27216:20;:::i;:::-;27211:25;;27250:20;27268:1;27250:20;:::i;:::-;27245:25;;27289:1;27286;27283:8;27280:34;;;27294:18;;:::i;:::-;27280:34;27339:1;27336;27332:9;27324:17;;27156:191;;;;:::o;27353:180::-;27401:77;27398:1;27391:88;27498:4;27495:1;27488:15;27522:4;27519:1;27512:15;27539:185;27579:1;27596:20;27614:1;27596:20;:::i;:::-;27591:25;;27630:20;27648:1;27630:20;:::i;:::-;27625:25;;27669:1;27659:35;;27674:18;;:::i;:::-;27659:35;27716:1;27713;27709:9;27704:14;;27539:185;;;;:::o;27730:332::-;27851:4;27889:2;27878:9;27874:18;27866:26;;27902:71;27970:1;27959:9;27955:17;27946:6;27902:71;:::i;:::-;27983:72;28051:2;28040:9;28036:18;28027:6;27983:72;:::i;:::-;27730:332;;;;;:::o;28068:137::-;28122:5;28153:6;28147:13;28138:22;;28169:30;28193:5;28169:30;:::i;:::-;28068:137;;;;:::o;28211:345::-;28278:6;28327:2;28315:9;28306:7;28302:23;28298:32;28295:119;;;28333:79;;:::i;:::-;28295:119;28453:1;28478:61;28531:7;28522:6;28511:9;28507:22;28478:61;:::i;:::-;28468:71;;28424:125;28211:345;;;;:::o;28562:231::-;28702:34;28698:1;28690:6;28686:14;28679:58;28771:14;28766:2;28758:6;28754:15;28747:39;28562:231;:::o;28799:366::-;28941:3;28962:67;29026:2;29021:3;28962:67;:::i;:::-;28955:74;;29038:93;29127:3;29038:93;:::i;:::-;29156:2;29151:3;29147:12;29140:19;;28799:366;;;:::o;29171:419::-;29337:4;29375:2;29364:9;29360:18;29352:26;;29424:9;29418:4;29414:20;29410:1;29399:9;29395:17;29388:47;29452:131;29578:4;29452:131;:::i;:::-;29444:139;;29171:419;;;:::o;29596:228::-;29736:34;29732:1;29724:6;29720:14;29713:58;29805:11;29800:2;29792:6;29788:15;29781:36;29596:228;:::o;29830:366::-;29972:3;29993:67;30057:2;30052:3;29993:67;:::i;:::-;29986:74;;30069:93;30158:3;30069:93;:::i;:::-;30187:2;30182:3;30178:12;30171:19;;29830:366;;;:::o;30202:419::-;30368:4;30406:2;30395:9;30391:18;30383:26;;30455:9;30449:4;30445:20;30441:1;30430:9;30426:17;30419:47;30483:131;30609:4;30483:131;:::i;:::-;30475:139;;30202:419;;;:::o;30627:229::-;30767:34;30763:1;30755:6;30751:14;30744:58;30836:12;30831:2;30823:6;30819:15;30812:37;30627:229;:::o;30862:366::-;31004:3;31025:67;31089:2;31084:3;31025:67;:::i;:::-;31018:74;;31101:93;31190:3;31101:93;:::i;:::-;31219:2;31214:3;31210:12;31203:19;;30862:366;;;:::o;31234:419::-;31400:4;31438:2;31427:9;31423:18;31415:26;;31487:9;31481:4;31477:20;31473:1;31462:9;31458:17;31451:47;31515:131;31641:4;31515:131;:::i;:::-;31507:139;;31234:419;;;:::o;31659:174::-;31799:26;31795:1;31787:6;31783:14;31776:50;31659:174;:::o;31839:366::-;31981:3;32002:67;32066:2;32061:3;32002:67;:::i;:::-;31995:74;;32078:93;32167:3;32078:93;:::i;:::-;32196:2;32191:3;32187:12;32180:19;;31839:366;;;:::o;32211:419::-;32377:4;32415:2;32404:9;32400:18;32392:26;;32464:9;32458:4;32454:20;32450:1;32439:9;32435:17;32428:47;32492:131;32618:4;32492:131;:::i;:::-;32484:139;;32211:419;;;:::o;32636:237::-;32674:3;32693:18;32709:1;32693:18;:::i;:::-;32688:23;;32725:18;32741:1;32725:18;:::i;:::-;32720:23;;32815:1;32809:4;32805:12;32802:1;32799:19;32796:45;;;32821:18;;:::i;:::-;32796:45;32865:1;32862;32858:9;32851:16;;32636:237;;;;:::o;32879:221::-;33019:34;33015:1;33007:6;33003:14;32996:58;33088:4;33083:2;33075:6;33071:15;33064:29;32879:221;:::o;33106:366::-;33248:3;33269:67;33333:2;33328:3;33269:67;:::i;:::-;33262:74;;33345:93;33434:3;33345:93;:::i;:::-;33463:2;33458:3;33454:12;33447:19;;33106:366;;;:::o;33478:419::-;33644:4;33682:2;33671:9;33667:18;33659:26;;33731:9;33725:4;33721:20;33717:1;33706:9;33702:17;33695:47;33759:131;33885:4;33759:131;:::i;:::-;33751:139;;33478:419;;;:::o;33903:305::-;33943:3;33962:20;33980:1;33962:20;:::i;:::-;33957:25;;33996:20;34014:1;33996:20;:::i;:::-;33991:25;;34150:1;34082:66;34078:74;34075:1;34072:81;34069:107;;;34156:18;;:::i;:::-;34069:107;34200:1;34197;34193:9;34186:16;;33903:305;;;;:::o;34214:182::-;34354:34;34350:1;34342:6;34338:14;34331:58;34214:182;:::o;34402:366::-;34544:3;34565:67;34629:2;34624:3;34565:67;:::i;:::-;34558:74;;34641:93;34730:3;34641:93;:::i;:::-;34759:2;34754:3;34750:12;34743:19;;34402:366;;;:::o;34774:419::-;34940:4;34978:2;34967:9;34963:18;34955:26;;35027:9;35021:4;35017:20;35013:1;35002:9;34998:17;34991:47;35055:131;35181:4;35055:131;:::i;:::-;35047:139;;34774:419;;;:::o;35199:348::-;35239:7;35262:20;35280:1;35262:20;:::i;:::-;35257:25;;35296:20;35314:1;35296:20;:::i;:::-;35291:25;;35484:1;35416:66;35412:74;35409:1;35406:81;35401:1;35394:9;35387:17;35383:105;35380:131;;;35491:18;;:::i;:::-;35380:131;35539:1;35536;35532:9;35521:20;;35199:348;;;;:::o;35553:181::-;35693:33;35689:1;35681:6;35677:14;35670:57;35553:181;:::o;35740:366::-;35882:3;35903:67;35967:2;35962:3;35903:67;:::i;:::-;35896:74;;35979:93;36068:3;35979:93;:::i;:::-;36097:2;36092:3;36088:12;36081:19;;35740:366;;;:::o;36112:419::-;36278:4;36316:2;36305:9;36301:18;36293:26;;36365:9;36359:4;36355:20;36351:1;36340:9;36336:17;36329:47;36393:131;36519:4;36393:131;:::i;:::-;36385:139;;36112:419;;;:::o;36537:94::-;36570:8;36618:5;36614:2;36610:14;36589:35;;36537:94;;;:::o;36637:::-;36676:7;36705:20;36719:5;36705:20;:::i;:::-;36694:31;;36637:94;;;:::o;36737:100::-;36776:7;36805:26;36825:5;36805:26;:::i;:::-;36794:37;;36737:100;;;:::o;36843:157::-;36948:45;36968:24;36986:5;36968:24;:::i;:::-;36948:45;:::i;:::-;36943:3;36936:58;36843:157;;:::o;37006:256::-;37118:3;37133:75;37204:3;37195:6;37133:75;:::i;:::-;37233:2;37228:3;37224:12;37217:19;;37253:3;37246:10;;37006:256;;;;:::o;37268:164::-;37408:16;37404:1;37396:6;37392:14;37385:40;37268:164;:::o;37438:366::-;37580:3;37601:67;37665:2;37660:3;37601:67;:::i;:::-;37594:74;;37677:93;37766:3;37677:93;:::i;:::-;37795:2;37790:3;37786:12;37779:19;;37438:366;;;:::o;37810:419::-;37976:4;38014:2;38003:9;37999:18;37991:26;;38063:9;38057:4;38053:20;38049:1;38038:9;38034:17;38027:47;38091:131;38217:4;38091:131;:::i;:::-;38083:139;;37810:419;;;:::o;38235:221::-;38375:34;38371:1;38363:6;38359:14;38352:58;38444:4;38439:2;38431:6;38427:15;38420:29;38235:221;:::o;38462:366::-;38604:3;38625:67;38689:2;38684:3;38625:67;:::i;:::-;38618:74;;38701:93;38790:3;38701:93;:::i;:::-;38819:2;38814:3;38810:12;38803:19;;38462:366;;;:::o;38834:419::-;39000:4;39038:2;39027:9;39023:18;39015:26;;39087:9;39081:4;39077:20;39073:1;39062:9;39058:17;39051:47;39115:131;39241:4;39115:131;:::i;:::-;39107:139;;38834:419;;;:::o;39259:177::-;39399:29;39395:1;39387:6;39383:14;39376:53;39259:177;:::o;39442:366::-;39584:3;39605:67;39669:2;39664:3;39605:67;:::i;:::-;39598:74;;39681:93;39770:3;39681:93;:::i;:::-;39799:2;39794:3;39790:12;39783:19;;39442:366;;;:::o;39814:419::-;39980:4;40018:2;40007:9;40003:18;39995:26;;40067:9;40061:4;40057:20;40053:1;40042:9;40038:17;40031:47;40095:131;40221:4;40095:131;:::i;:::-;40087:139;;39814:419;;;:::o;40239:225::-;40379:34;40375:1;40367:6;40363:14;40356:58;40448:8;40443:2;40435:6;40431:15;40424:33;40239:225;:::o;40470:366::-;40612:3;40633:67;40697:2;40692:3;40633:67;:::i;:::-;40626:74;;40709:93;40798:3;40709:93;:::i;:::-;40827:2;40822:3;40818:12;40811:19;;40470:366;;;:::o;40842:419::-;41008:4;41046:2;41035:9;41031:18;41023:26;;41095:9;41089:4;41085:20;41081:1;41070:9;41066:17;41059:47;41123:131;41249:4;41123:131;:::i;:::-;41115:139;;40842:419;;;:::o;41267:231::-;41407:34;41403:1;41395:6;41391:14;41384:58;41476:14;41471:2;41463:6;41459:15;41452:39;41267:231;:::o;41504:366::-;41646:3;41667:67;41731:2;41726:3;41667:67;:::i;:::-;41660:74;;41743:93;41832:3;41743:93;:::i;:::-;41861:2;41856:3;41852:12;41845:19;;41504:366;;;:::o;41876:419::-;42042:4;42080:2;42069:9;42065:18;42057:26;;42129:9;42123:4;42119:20;42115:1;42104:9;42100:17;42093:47;42157:131;42283:4;42157:131;:::i;:::-;42149:139;;41876:419;;;:::o;42301:224::-;42441:34;42437:1;42429:6;42425:14;42418:58;42510:7;42505:2;42497:6;42493:15;42486:32;42301:224;:::o;42531:366::-;42673:3;42694:67;42758:2;42753:3;42694:67;:::i;:::-;42687:74;;42770:93;42859:3;42770:93;:::i;:::-;42888:2;42883:3;42879:12;42872:19;;42531:366;;;:::o;42903:419::-;43069:4;43107:2;43096:9;43092:18;43084:26;;43156:9;43150:4;43146:20;43142:1;43131:9;43127:17;43120:47;43184:131;43310:4;43184:131;:::i;:::-;43176:139;;42903:419;;;:::o;43328:223::-;43468:34;43464:1;43456:6;43452:14;43445:58;43537:6;43532:2;43524:6;43520:15;43513:31;43328:223;:::o;43557:366::-;43699:3;43720:67;43784:2;43779:3;43720:67;:::i;:::-;43713:74;;43796:93;43885:3;43796:93;:::i;:::-;43914:2;43909:3;43905:12;43898:19;;43557:366;;;:::o;43929:419::-;44095:4;44133:2;44122:9;44118:18;44110:26;;44182:9;44176:4;44172:20;44168:1;44157:9;44153:17;44146:47;44210:131;44336:4;44210:131;:::i;:::-;44202:139;;43929:419;;;:::o;44354:175::-;44494:27;44490:1;44482:6;44478:14;44471:51;44354:175;:::o;44535:366::-;44677:3;44698:67;44762:2;44757:3;44698:67;:::i;:::-;44691:74;;44774:93;44863:3;44774:93;:::i;:::-;44892:2;44887:3;44883:12;44876:19;;44535:366;;;:::o;44907:419::-;45073:4;45111:2;45100:9;45096:18;45088:26;;45160:9;45154:4;45150:20;45146:1;45135:9;45131:17;45124:47;45188:131;45314:4;45188:131;:::i;:::-;45180:139;;44907:419;;;:::o;45332:237::-;45472:34;45468:1;45460:6;45456:14;45449:58;45541:20;45536:2;45528:6;45524:15;45517:45;45332:237;:::o;45575:366::-;45717:3;45738:67;45802:2;45797:3;45738:67;:::i;:::-;45731:74;;45814:93;45903:3;45814:93;:::i;:::-;45932:2;45927:3;45923:12;45916:19;;45575:366;;;:::o;45947:419::-;46113:4;46151:2;46140:9;46136:18;46128:26;;46200:9;46194:4;46190:20;46186:1;46175:9;46171:17;46164:47;46228:131;46354:4;46228:131;:::i;:::-;46220:139;;45947:419;;;:::o;46372:234::-;46512:34;46508:1;46500:6;46496:14;46489:58;46581:17;46576:2;46568:6;46564:15;46557:42;46372:234;:::o;46612:366::-;46754:3;46775:67;46839:2;46834:3;46775:67;:::i;:::-;46768:74;;46851:93;46940:3;46851:93;:::i;:::-;46969:2;46964:3;46960:12;46953:19;;46612:366;;;:::o;46984:419::-;47150:4;47188:2;47177:9;47173:18;47165:26;;47237:9;47231:4;47227:20;47223:1;47212:9;47208:17;47201:47;47265:131;47391:4;47265:131;:::i;:::-;47257:139;;46984:419;;;:::o;47409:148::-;47511:11;47548:3;47533:18;;47409:148;;;;:::o;47563:377::-;47669:3;47697:39;47730:5;47697:39;:::i;:::-;47752:89;47834:6;47829:3;47752:89;:::i;:::-;47745:96;;47850:52;47895:6;47890:3;47883:4;47876:5;47872:16;47850:52;:::i;:::-;47927:6;47922:3;47918:16;47911:23;;47673:267;47563:377;;;;:::o;47946:435::-;48126:3;48148:95;48239:3;48230:6;48148:95;:::i;:::-;48141:102;;48260:95;48351:3;48342:6;48260:95;:::i;:::-;48253:102;;48372:3;48365:10;;47946:435;;;;;:::o;48387:98::-;48438:6;48472:5;48466:12;48456:22;;48387:98;;;:::o;48491:168::-;48574:11;48608:6;48603:3;48596:19;48648:4;48643:3;48639:14;48624:29;;48491:168;;;;:::o;48665:360::-;48751:3;48779:38;48811:5;48779:38;:::i;:::-;48833:70;48896:6;48891:3;48833:70;:::i;:::-;48826:77;;48912:52;48957:6;48952:3;48945:4;48938:5;48934:16;48912:52;:::i;:::-;48989:29;49011:6;48989:29;:::i;:::-;48984:3;48980:39;48973:46;;48755:270;48665:360;;;;:::o;49031:640::-;49226:4;49264:3;49253:9;49249:19;49241:27;;49278:71;49346:1;49335:9;49331:17;49322:6;49278:71;:::i;:::-;49359:72;49427:2;49416:9;49412:18;49403:6;49359:72;:::i;:::-;49441;49509:2;49498:9;49494:18;49485:6;49441:72;:::i;:::-;49560:9;49554:4;49550:20;49545:2;49534:9;49530:18;49523:48;49588:76;49659:4;49650:6;49588:76;:::i;:::-;49580:84;;49031:640;;;;;;;:::o;49677:141::-;49733:5;49764:6;49758:13;49749:22;;49780:32;49806:5;49780:32;:::i;:::-;49677:141;;;;:::o;49824:349::-;49893:6;49942:2;49930:9;49921:7;49917:23;49913:32;49910:119;;;49948:79;;:::i;:::-;49910:119;50068:1;50093:63;50148:7;50139:6;50128:9;50124:22;50093:63;:::i;:::-;50083:73;;50039:127;49824:349;;;;:::o;50179:176::-;50211:1;50228:20;50246:1;50228:20;:::i;:::-;50223:25;;50262:20;50280:1;50262:20;:::i;:::-;50257:25;;50301:1;50291:35;;50306:18;;:::i;:::-;50291:35;50347:1;50344;50340:9;50335:14;;50179:176;;;;:::o;50361:182::-;50501:34;50497:1;50489:6;50485:14;50478:58;50361:182;:::o;50549:366::-;50691:3;50712:67;50776:2;50771:3;50712:67;:::i;:::-;50705:74;;50788:93;50877:3;50788:93;:::i;:::-;50906:2;50901:3;50897:12;50890:19;;50549:366;;;:::o;50921:419::-;51087:4;51125:2;51114:9;51110:18;51102:26;;51174:9;51168:4;51164:20;51160:1;51149:9;51145:17;51138:47;51202:131;51328:4;51202:131;:::i;:::-;51194:139;;50921:419;;;:::o;51346:178::-;51486:30;51482:1;51474:6;51470:14;51463:54;51346:178;:::o;51530:366::-;51672:3;51693:67;51757:2;51752:3;51693:67;:::i;:::-;51686:74;;51769:93;51858:3;51769:93;:::i;:::-;51887:2;51882:3;51878:12;51871:19;;51530:366;;;:::o;51902:419::-;52068:4;52106:2;52095:9;52091:18;52083:26;;52155:9;52149:4;52145:20;52141:1;52130:9;52126:17;52119:47;52183:131;52309:4;52183:131;:::i;:::-;52175:139;;51902:419;;;:::o;52327:180::-;52375:77;52372:1;52365:88;52472:4;52469:1;52462:15;52496:4;52493:1;52486:15

Swarm Source

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