ETH Price: $2,408.37 (+2.50%)

Token

Traitsniffer (SNIFF)
 

Overview

Max Total Supply

105 SNIFF

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SNIFF
0x759EA6dB5bf409fc91551a726092726Bf58Fff29
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:
Traitsniffer

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-05
*/

pragma solidity ^0.8.0;


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

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


/**
 * @dev 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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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


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

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

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

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

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

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

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

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

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

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

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

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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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


/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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


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

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

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


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


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


contract Traitsniffer is ERC721Enumerable, Ownable {
    uint256 public trialPrice = 100000000000000000;
    uint256 public maxUsers = 78;
    uint256 constant private DAY_IN_UNIX = 86400;
    uint256 private trialTimestamp = 3600;
    string private _baseURIExtended;
    bool private trialSeason = false;

    mapping (address => bool) private whitelisted;
    mapping (address => bool) private mintedNFT;
    mapping (address => uint256) private userToTimeRegistered;
    mapping (address => uint256) private trialToTime;

    address[] private registeredAddresses;
    Subscription[] private subscriptionPlans;

    struct Subscription {
        uint _price;
        uint _days;
    }

    constructor() ERC721("Traitsniffer", "SNIFF") {
        subscriptionPlans.push(Subscription(300000000000000000,14));
        subscriptionPlans.push(Subscription(500000000000000000,30));
        subscriptionPlans.push(Subscription(800000000000000000,60));
    }

    function register(uint _id) public payable {
        require(msg.value == getPrice(_id), "Incorrect ETH value");
        require(getActiveSubCount() < maxUsers, "Max users reached");
        require(subscriptionPlans[_id]._days > 0, "ID does not exist");
        require(userToTimeRegistered[msg.sender] == 0, "Already registered");
        require(whitelisted[msg.sender] == false, "Already whitelisted");

        uint256 blockTimeStamp = block.timestamp + (DAY_IN_UNIX * subscriptionPlans[_id]._days);
        registeredAddresses.push(msg.sender);
        userToTimeRegistered[msg.sender] = blockTimeStamp;
        _safeMint(msg.sender, totalSupply());
        mintedNFT[msg.sender] = true;
    }

    function updateSubscription(uint _id) public payable{
        require(msg.value == getPrice(_id), "Incorrect ETH value");
        uint256 expireTime = userToTimeRegistered[msg.sender];
        uint256 timestamp = block.timestamp;
        require(isRegistered(msg.sender), "User not registered");
        require(getActiveSubCount() < maxUsers || expireTime > timestamp, "Max users reached");
        require(subscriptionPlans[_id]._days > 0, "ID does not exist.");

        if (expireTime < timestamp) {
            // Previous subscription has expired
            userToTimeRegistered[msg.sender] = timestamp + (DAY_IN_UNIX * subscriptionPlans[_id]._days);
        } else {
            // Still has an active subscription but wants to add time
            userToTimeRegistered[msg.sender] = expireTime + (DAY_IN_UNIX * subscriptionPlans[_id]._days);
        }

        if (!mintedNFT[msg.sender]) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function buyTrial() public payable {
        require(trialSeason, "Trial buying closed");
        require(msg.value == trialPrice, "Incorrect ETH value");
        trialToTime[msg.sender] = block.timestamp + trialTimestamp;
    }

    function migrateExistingUsers(address[] memory _addresses, address[] memory _whitelist) external onlyOwner {
        for (uint i = 0; i < _addresses.length; i++) {
            registeredAddresses.push(_addresses[i]);
            userToTimeRegistered[_addresses[i]] = block.timestamp + (DAY_IN_UNIX * 7);
        }

        for (uint i = 0; i < _whitelist.length; i++) {
            registeredAddresses.push(_whitelist[i]);
            whitelisted[_whitelist[i]] = true;
        }
    }

    function sniffMint(uint n) public onlyOwner {
        uint totalSupply = totalSupply();
        for (uint i = 0; i < n; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function flipTrialSeason() external onlyOwner {
        trialSeason = !trialSeason;
    }

    function isTrial(address _address) external view returns (bool) {
        return trialToTime[_address] > block.timestamp;
    }

    function hasAccess(address _address) external view returns (bool) {
        return userToTimeRegistered[_address] > block.timestamp ||
                whitelisted[_address] == true ||
                trialToTime[_address] > block.timestamp;
    }

    function getTimestamp(address _address) external view returns (uint256) {
        if (whitelisted[_address] == true) {
            return 1;
        } else if (trialToTime[_address] > block.timestamp){
            return trialToTime[_address];
        } else {
            return userToTimeRegistered[_address];
        }
    }

    function getActiveSubCount() public view returns(uint) {
        uint activeSubCount;
        uint256 timestamp = block.timestamp;
        for(uint i = 0; i < registeredAddresses.length; i++) {
            if (userToTimeRegistered[registeredAddresses[i]] > timestamp) {
                activeSubCount++;
            }
        }
        return activeSubCount;
    }

    function getAllSubscribers() external view returns (address[] memory) {
        uint count = getActiveSubCount();
        address [] memory activeUsers = new address[](count);
        uint x;
        uint256 timestamp = block.timestamp;

        for(uint i = 0; i < registeredAddresses.length; i++) {
            address current = registeredAddresses[i];
            if (userToTimeRegistered[current] > timestamp) {
                activeUsers[x++] = current;
            }
        }
        return activeUsers;
    }

    function getWhitelisted() external view returns(address[] memory) {
        uint whitelistedCount;
        for(uint i = 0; i < registeredAddresses.length; i++) {
            if (whitelisted[registeredAddresses[i]] == true) {
                whitelistedCount++;
            }
        }
        uint count = whitelistedCount;
        address[] memory whitelistedUsers = new address[](count);

        uint x;
        for (uint i = 0; i < registeredAddresses.length; i++) {
            address current = registeredAddresses[i];
            if (whitelisted[current] == true) {
                whitelistedUsers[x] = current;
                x++;
            }
        }
        return whitelistedUsers;
    }

    function getPrice(uint _id) public view returns(uint256) {
        return subscriptionPlans[_id]._price;
    }

    function setPrice(uint _planId, uint256 _price) public onlyOwner {
        subscriptionPlans[_planId]._price = _price;
    }

    function setMaxUsers(uint n) public onlyOwner {
        maxUsers = n;
    }

    function setTrialPeriod(uint256 _time) external onlyOwner {
        trialTimestamp = _time;
    }

    function setTrialPrice(uint256 _price) external onlyOwner {
        trialPrice = _price;
    }

    function giveTrial(address _address, uint256 _timestamp) external onlyOwner {
        trialToTime[_address] = _timestamp;
    }

    function setTimestampForAddress(address _address, uint256 _timestamp) external onlyOwner {
        if (!isRegistered(_address)) {
            registeredAddresses.push(_address);
        }
        userToTimeRegistered[_address] = _timestamp;
    }

    function whitelistAddress(address _address) external onlyOwner {
        require(whitelisted[_address] == false, "Already whitelisted");
        if (!isRegistered(_address)) {
            registeredAddresses.push(_address);
        }
        whitelisted[_address] = true;
    }

    function removeAddressFromWhitelist(address _address) external onlyOwner {
        require(whitelisted[_address] == true, "Not whitelisted");
        delete whitelisted[_address];
    }

    function isRegistered(address _address) public view returns (bool) {
        for(uint i = 0; i < registeredAddresses.length; i++) {
            if (registeredAddresses[i] == _address ) {
                return true;
            }
        }
        return false;
    }

    function isWhitelisted(address _address) external view returns (bool) {
        return whitelisted[_address];
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

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

    function setBaseURI(string memory baseURI_) public onlyOwner {
        _baseURIExtended = baseURI_;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTrial","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipTrialSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveSubCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllSubscribers","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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelisted","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"giveTrial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasAccess","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isTrial","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"migrateExistingUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"setMaxUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_planId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setTimestampForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setTrialPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTrialPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"sniffMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trialPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"updateSubscription","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600b55604e600c55610e10600d556000600f60006101000a81548160ff0219169083151502179055503480156200004357600080fd5b506040518060400160405280600c81526020017f5472616974736e696666657200000000000000000000000000000000000000008152506040518060400160405280600581526020017f534e4946460000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c8929190620002f5565b508060019080519060200190620000e1929190620002f5565b50505062000104620000f86200022760201b60201c565b6200022f60201b60201c565b60156040518060400160405280670429d069189e00008152602001600e815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050601560405180604001604052806706f05b59d3b200008152602001601e81525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505060156040518060400160405280670b1a2bc2ec5000008152602001603c8152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550506200040a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030390620003a5565b90600052602060002090601f01602090048101928262000327576000855562000373565b82601f106200034257805160ff191683800117855562000373565b8280016001018555821562000373579182015b828111156200037257825182559160200191906001019062000355565b5b50905062000382919062000386565b5090565b5b80821115620003a157600081600090555060010162000387565b5090565b60006002820490506001821680620003be57607f821691505b60208210811415620003d557620003d4620003db565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615ff9806200041a6000396000f3fe60806040526004361061027d5760003560e01c8063715018a61161014f578063bcf73f20116100c1578063e65f79f41161007a578063e65f79f41461098a578063e7572230146109b3578063e985e9c5146109f0578063f207564e14610a2d578063f2fde38b14610a49578063f7d9757714610a725761027d565b8063bcf73f2014610889578063c3c5a547146108b2578063c87b56dd146108ef578063daebc9d61461092c578063de0ee2eb14610936578063e1b0e8021461095f5761027d565b806395a078e81161011357806395a078e81461077957806395d89b41146107b65780639b372b2b146107e1578063a22cb4651461080c578063ac6d0fa414610835578063b88d4fde146108605761027d565b8063715018a6146106b357806374d38e0f146106ca57806381a36eec146106f55780638bf57f4e146107115780638da5cb5b1461074e5761027d565b80632f745c59116101f357806342842e0e116101ac57806342842e0e1461056d5780634f345a14146105965780634f6ccce7146105d357806355f804b3146106105780636352211e1461063957806370a08231146106765761027d565b80632f745c5914610473578063381cec9a146104b05780633af32abf146104c75780633ccfd60b14610504578063415665851461051b578063416f4267146105445761027d565b8063095ea7b311610245578063095ea7b3146103795780630d115258146103a257806318160ddd146103cd5780631cc1f185146103f857806323b872dd14610421578063286dd3f51461044a5761027d565b806301ffc9a7146102825780630526c8fc146102bf57806305663773146102e857806306fdde0314610311578063081812fc1461033c575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614b64565b610a9b565b6040516102b69190615732565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190614bf7565b610b15565b005b3480156102f457600080fd5b5061030f600480360381019061030a9190614af8565b610bd5565b005b34801561031d57600080fd5b50610326610f11565b604051610333919061574d565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190614bf7565b610fa3565b60405161037091906156a9565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190614abc565b611028565b005b3480156103ae57600080fd5b506103b7611140565b6040516103c49190615acf565b60405180910390f35b3480156103d957600080fd5b506103e2611146565b6040516103ef9190615acf565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190614abc565b611153565b005b34801561042d57600080fd5b50610448600480360381019061044391906149b6565b611288565b005b34801561045657600080fd5b50610471600480360381019061046c9190614951565b6112e8565b005b34801561047f57600080fd5b5061049a60048036038101906104959190614abc565b611449565b6040516104a79190615acf565b60405180910390f35b3480156104bc57600080fd5b506104c56114ee565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190614951565b611596565b6040516104fb9190615732565b60405180910390f35b34801561051057600080fd5b506105196115ec565b005b34801561052757600080fd5b50610542600480360381019061053d9190614951565b6116b7565b005b34801561055057600080fd5b5061056b60048036038101906105669190614bf7565b611892565b005b34801561057957600080fd5b50610594600480360381019061058f91906149b6565b611918565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190614951565b611938565b6040516105ca9190615732565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614bf7565b611983565b6040516106079190615acf565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190614bb6565b611a1a565b005b34801561064557600080fd5b50610660600480360381019061065b9190614bf7565b611ab0565b60405161066d91906156a9565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190614951565b611b62565b6040516106aa9190615acf565b60405180910390f35b3480156106bf57600080fd5b506106c8611c1a565b005b3480156106d657600080fd5b506106df611ca2565b6040516106ec9190615acf565b60405180910390f35b61070f600480360381019061070a9190614bf7565b611d90565b005b34801561071d57600080fd5b5061073860048036038101906107339190614951565b612114565b6040516107459190615acf565b60405180910390f35b34801561075a57600080fd5b5061076361224e565b60405161077091906156a9565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190614951565b612278565b6040516107ad9190615732565b60405180910390f35b3480156107c257600080fd5b506107cb612367565b6040516107d8919061574d565b60405180910390f35b3480156107ed57600080fd5b506107f66123f9565b6040516108039190615710565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190614a80565b6126e1565b005b34801561084157600080fd5b5061084a612862565b6040516108579190615710565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190614a05565b612a49565b005b34801561089557600080fd5b506108b060048036038101906108ab9190614bf7565b612aab565b005b3480156108be57600080fd5b506108d960048036038101906108d49190614951565b612b31565b6040516108e69190615732565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190614bf7565b612c06565b604051610923919061574d565b60405180910390f35b610934612cad565b005b34801561094257600080fd5b5061095d60048036038101906109589190614bf7565b612d93565b005b34801561096b57600080fd5b50610974612e19565b6040516109819190615acf565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac9190614abc565b612e1f565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190614bf7565b612ee3565b6040516109e79190615acf565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a12919061497a565b612f38565b604051610a249190615732565b60405180910390f35b610a476004803603810190610a429190614bf7565b612fcc565b005b348015610a5557600080fd5b50610a706004803603810190610a6b9190614951565b613381565b005b348015610a7e57600080fd5b50610a996004803603810190610a949190614c20565b613479565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0e5750610b0d82613549565b5b9050919050565b610b1d61362b565b73ffffffffffffffffffffffffffffffffffffffff16610b3b61224e565b73ffffffffffffffffffffffffffffffffffffffff1614610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b88906159af565b60405180910390fd5b6000610b9b611146565b905060005b82811015610bd057610bbd338284610bb89190615c23565b613633565b8080610bc890615e20565b915050610ba0565b505050565b610bdd61362b565b73ffffffffffffffffffffffffffffffffffffffff16610bfb61224e565b73ffffffffffffffffffffffffffffffffffffffff1614610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c48906159af565b60405180910390fd5b60005b8251811015610db1576014838281518110610c98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600762015180610d109190615caa565b42610d1b9190615c23565b60126000858481518110610d58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610da990615e20565b915050610c54565b5060005b8151811015610f0c576014828281518110610df9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160106000848481518110610ea0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0490615e20565b915050610db5565b505050565b606060008054610f2090615dee565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4c90615dee565b8015610f995780601f10610f6e57610100808354040283529160200191610f99565b820191906000526020600020905b815481529060010190602001808311610f7c57829003601f168201915b5050505050905090565b6000610fae82613651565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe49061598f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061103382611ab0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90615a4f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110c361362b565b73ffffffffffffffffffffffffffffffffffffffff1614806110f257506110f1816110ec61362b565b612f38565b5b611131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611128906158af565b60405180910390fd5b61113b83836136bd565b505050565b600b5481565b6000600880549050905090565b61115b61362b565b73ffffffffffffffffffffffffffffffffffffffff1661117961224e565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c6906159af565b60405180910390fd5b6111d882612b31565b611240576014829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61129961129361362b565b82613776565b6112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90615a6f565b60405180910390fd5b6112e3838383613854565b505050565b6112f061362b565b73ffffffffffffffffffffffffffffffffffffffff1661130e61224e565b73ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b906159af565b60405180910390fd5b60011515601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee906158ef565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b600061145483611b62565b8210611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c9061576f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6114f661362b565b73ffffffffffffffffffffffffffffffffffffffff1661151461224e565b73ffffffffffffffffffffffffffffffffffffffff161461156a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611561906159af565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6115f461362b565b73ffffffffffffffffffffffffffffffffffffffff1661161261224e565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906159af565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116b3573d6000803e3d6000fd5b5050565b6116bf61362b565b73ffffffffffffffffffffffffffffffffffffffff166116dd61224e565b73ffffffffffffffffffffffffffffffffffffffff1614611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a906159af565b60405180910390fd5b60001515601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90615a0f565b60405180910390fd5b6117cf81612b31565b611837576014819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61189a61362b565b73ffffffffffffffffffffffffffffffffffffffff166118b861224e565b73ffffffffffffffffffffffffffffffffffffffff161461190e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611905906159af565b60405180910390fd5b80600c8190555050565b61193383838360405180602001604052806000815250612a49565b505050565b600042601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b600061198d611146565b82106119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590615a8f565b60405180910390fd5b60088281548110611a08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611a2261362b565b73ffffffffffffffffffffffffffffffffffffffff16611a4061224e565b73ffffffffffffffffffffffffffffffffffffffff1614611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d906159af565b60405180910390fd5b80600e9080519060200190611aac9291906146df565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b509061592f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca9061590f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c2261362b565b73ffffffffffffffffffffffffffffffffffffffff16611c4061224e565b73ffffffffffffffffffffffffffffffffffffffff1614611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d906159af565b60405180910390fd5b611ca06000613ab0565b565b600080600042905060005b601480549050811015611d8757816012600060148481548110611cf9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d74578280611d7090615e20565b9350505b8080611d7f90615e20565b915050611cad565b50819250505090565b611d9981612ee3565b3414611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190615aaf565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000429050611e2c33612b31565b611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e62906157cf565b60405180910390fd5b600c54611e76611ca2565b1080611e8157508082115b611ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb79061594f565b60405180910390fd5b600060158481548110611efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015411611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4590615a2f565b60405180910390fd5b808210156120035760158381548110611f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015462015180611fb09190615caa565b81611fbb9190615c23565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120ac565b6015838154811061203d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101546201518061205d9190615caa565b826120689190615c23565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661210f5761210e33612109611146565b613633565b5b505050565b600060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156121785760019050612249565b42601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561220657601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612249565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600042601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612317575060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b80612360575042601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b9050919050565b60606001805461237690615dee565b80601f01602080910402602001604051908101604052809291908181526020018280546123a290615dee565b80156123ef5780601f106123c4576101008083540402835291602001916123ef565b820191906000526020600020905b8154815290600101906020018083116123d257829003601f168201915b5050505050905090565b6060600080600090505b6014805490508110156124ef57600115156010600060148481548110612452577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156124dc5781806124d890615e20565b9250505b80806124e790615e20565b915050612403565b50600081905060008167ffffffffffffffff811115612537577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125655781602001602082028036833780820191505090505b509050600080600090505b6014805490508110156126d6576000601482815481106125b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060011515601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156126c25780848481518110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082806126be90615e20565b9350505b5080806126ce90615e20565b915050612570565b508194505050505090565b6126e961362b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e9061582f565b60405180910390fd5b806005600061276461362b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661281161362b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128569190615732565b60405180910390a35050565b6060600061286e611ca2565b905060008167ffffffffffffffff8111156128b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128e05781602001602082028036833780820191505090505b50905060008042905060005b601480549050811015612a3e57600060148281548110612935577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612a2a57808585806129b690615e20565b9650815181106129ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b508080612a3690615e20565b9150506128ec565b508294505050505090565b612a5a612a5461362b565b83613776565b612a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9090615a6f565b60405180910390fd5b612aa584848484613b76565b50505050565b612ab361362b565b73ffffffffffffffffffffffffffffffffffffffff16612ad161224e565b73ffffffffffffffffffffffffffffffffffffffff1614612b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1e906159af565b60405180910390fd5b80600b8190555050565b600080600090505b601480549050811015612bfb578273ffffffffffffffffffffffffffffffffffffffff1660148281548110612b97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be8576001915050612c01565b8080612bf390615e20565b915050612b39565b50600090505b919050565b6060612c1182613651565b612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c47906159ef565b60405180910390fd5b6000612c5a613bd2565b90506000815111612c7a5760405180602001604052806000815250612ca5565b80612c8484613c64565b604051602001612c95929190615685565b6040516020818303038152906040525b915050919050565b600f60009054906101000a900460ff16612cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf39061588f565b60405180910390fd5b600b543414612d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3790615aaf565b60405180910390fd5b600d5442612d4e9190615c23565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b612d9b61362b565b73ffffffffffffffffffffffffffffffffffffffff16612db961224e565b73ffffffffffffffffffffffffffffffffffffffff1614612e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e06906159af565b60405180910390fd5b80600d8190555050565b600c5481565b612e2761362b565b73ffffffffffffffffffffffffffffffffffffffff16612e4561224e565b73ffffffffffffffffffffffffffffffffffffffff1614612e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e92906159af565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600060158281548110612f1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600001549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612fd581612ee3565b3414613016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300d90615aaf565b60405180910390fd5b600c54613021611ca2565b10613061576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130589061594f565b60405180910390fd5b60006015828154811061309d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154116130ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e6906158cf565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414613171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131689061584f565b60405180910390fd5b60001515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514613204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fb90615a0f565b60405180910390fd5b600060158281548110613240577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154620151806132609190615caa565b4261326b9190615c23565b90506014339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061332533613320611146565b613633565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61338961362b565b73ffffffffffffffffffffffffffffffffffffffff166133a761224e565b73ffffffffffffffffffffffffffffffffffffffff16146133fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f4906159af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561346d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613464906157af565b60405180910390fd5b61347681613ab0565b50565b61348161362b565b73ffffffffffffffffffffffffffffffffffffffff1661349f61224e565b73ffffffffffffffffffffffffffffffffffffffff16146134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ec906159af565b60405180910390fd5b8060158381548110613530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600001819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061361457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613624575061362382613e11565b5b9050919050565b600033905090565b61364d828260405180602001604052806000815250613e7b565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661373083611ab0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061378182613651565b6137c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b79061586f565b60405180910390fd5b60006137cb83611ab0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061383a57508373ffffffffffffffffffffffffffffffffffffffff1661382284610fa3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061384b575061384a8185612f38565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661387482611ab0565b73ffffffffffffffffffffffffffffffffffffffff16146138ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c1906159cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139319061580f565b60405180910390fd5b613945838383613ed6565b6139506000826136bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139a09190615d04565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139f79190615c23565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613b81848484613854565b613b8d84848484613fea565b613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bc39061578f565b60405180910390fd5b50505050565b6060600e8054613be190615dee565b80601f0160208091040260200160405190810160405280929190818152602001828054613c0d90615dee565b8015613c5a5780601f10613c2f57610100808354040283529160200191613c5a565b820191906000526020600020905b815481529060010190602001808311613c3d57829003601f168201915b5050505050905090565b60606000821415613cac576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613e0c565b600082905060005b60008214613cde578080613cc790615e20565b915050600a82613cd79190615c79565b9150613cb4565b60008167ffffffffffffffff811115613d20577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613d525781602001600182028036833780820191505090505b5090505b60008514613e0557600182613d6b9190615d04565b9150600a85613d7a9190615e69565b6030613d869190615c23565b60f81b818381518110613dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613dfe9190615c79565b9450613d56565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613e858383614181565b613e926000848484613fea565b613ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ec89061578f565b60405180910390fd5b505050565b613ee183838361434f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613f2457613f1f81614354565b613f63565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f6257613f61838261439d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fa657613fa18161450a565b613fe5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613fe457613fe3828261464d565b5b5b505050565b600061400b8473ffffffffffffffffffffffffffffffffffffffff166146cc565b15614174578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261403461362b565b8786866040518563ffffffff1660e01b815260040161405694939291906156c4565b602060405180830381600087803b15801561407057600080fd5b505af19250505080156140a157506040513d601f19601f8201168201806040525081019061409e9190614b8d565b60015b614124573d80600081146140d1576040519150601f19603f3d011682016040523d82523d6000602084013e6140d6565b606091505b5060008151141561411c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141139061578f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050614179565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141e89061596f565b60405180910390fd5b6141fa81613651565b1561423a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614231906157ef565b60405180910390fd5b61424660008383613ed6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142969190615c23565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016143aa84611b62565b6143b49190615d04565b9050600060076000848152602001908152602001600020549050818114614499576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061451e9190615d04565b9050600060096000848152602001908152602001600020549050600060088381548110614574577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106145bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480614631577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061465883611b62565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546146eb90615dee565b90600052602060002090601f01602090048101928261470d5760008555614754565b82601f1061472657805160ff1916838001178555614754565b82800160010185558215614754579182015b82811115614753578251825591602001919060010190614738565b5b5090506147619190614765565b5090565b5b8082111561477e576000816000905550600101614766565b5090565b600061479561479084615b1b565b615aea565b905080838252602082019050828560208602820111156147b457600080fd5b60005b858110156147e457816147ca888261486a565b8452602084019350602083019250506001810190506147b7565b5050509392505050565b60006148016147fc84615b47565b615aea565b90508281526020810184848401111561481957600080fd5b614824848285615dac565b509392505050565b600061483f61483a84615b77565b615aea565b90508281526020810184848401111561485757600080fd5b614862848285615dac565b509392505050565b60008135905061487981615f67565b92915050565b600082601f83011261489057600080fd5b81356148a0848260208601614782565b91505092915050565b6000813590506148b881615f7e565b92915050565b6000813590506148cd81615f95565b92915050565b6000815190506148e281615f95565b92915050565b600082601f8301126148f957600080fd5b81356149098482602086016147ee565b91505092915050565b600082601f83011261492357600080fd5b813561493384826020860161482c565b91505092915050565b60008135905061494b81615fac565b92915050565b60006020828403121561496357600080fd5b60006149718482850161486a565b91505092915050565b6000806040838503121561498d57600080fd5b600061499b8582860161486a565b92505060206149ac8582860161486a565b9150509250929050565b6000806000606084860312156149cb57600080fd5b60006149d98682870161486a565b93505060206149ea8682870161486a565b92505060406149fb8682870161493c565b9150509250925092565b60008060008060808587031215614a1b57600080fd5b6000614a298782880161486a565b9450506020614a3a8782880161486a565b9350506040614a4b8782880161493c565b925050606085013567ffffffffffffffff811115614a6857600080fd5b614a74878288016148e8565b91505092959194509250565b60008060408385031215614a9357600080fd5b6000614aa18582860161486a565b9250506020614ab2858286016148a9565b9150509250929050565b60008060408385031215614acf57600080fd5b6000614add8582860161486a565b9250506020614aee8582860161493c565b9150509250929050565b60008060408385031215614b0b57600080fd5b600083013567ffffffffffffffff811115614b2557600080fd5b614b318582860161487f565b925050602083013567ffffffffffffffff811115614b4e57600080fd5b614b5a8582860161487f565b9150509250929050565b600060208284031215614b7657600080fd5b6000614b84848285016148be565b91505092915050565b600060208284031215614b9f57600080fd5b6000614bad848285016148d3565b91505092915050565b600060208284031215614bc857600080fd5b600082013567ffffffffffffffff811115614be257600080fd5b614bee84828501614912565b91505092915050565b600060208284031215614c0957600080fd5b6000614c178482850161493c565b91505092915050565b60008060408385031215614c3357600080fd5b6000614c418582860161493c565b9250506020614c528582860161493c565b9150509250929050565b6000614c688383614c74565b60208301905092915050565b614c7d81615d38565b82525050565b614c8c81615d38565b82525050565b6000614c9d82615bb7565b614ca78185615be5565b9350614cb283615ba7565b8060005b83811015614ce3578151614cca8882614c5c565b9750614cd583615bd8565b925050600181019050614cb6565b5085935050505092915050565b614cf981615d4a565b82525050565b6000614d0a82615bc2565b614d148185615bf6565b9350614d24818560208601615dbb565b614d2d81615f56565b840191505092915050565b6000614d4382615bcd565b614d4d8185615c07565b9350614d5d818560208601615dbb565b614d6681615f56565b840191505092915050565b6000614d7c82615bcd565b614d868185615c18565b9350614d96818560208601615dbb565b80840191505092915050565b6000614daf602b83615c07565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000614e15603283615c07565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000614e7b602683615c07565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee1601383615c07565b91507f55736572206e6f742072656769737465726564000000000000000000000000006000830152602082019050919050565b6000614f21601c83615c07565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614f61602483615c07565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fc7601983615c07565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000615007601283615c07565b91507f416c7265616479207265676973746572656400000000000000000000000000006000830152602082019050919050565b6000615047602c83615c07565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006150ad601383615c07565b91507f547269616c20627579696e6720636c6f736564000000000000000000000000006000830152602082019050919050565b60006150ed603883615c07565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000615153601183615c07565b91507f494420646f6573206e6f742065786973740000000000000000000000000000006000830152602082019050919050565b6000615193600f83615c07565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b60006151d3602a83615c07565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000615239602983615c07565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061529f601183615c07565b91507f4d617820757365727320726561636865640000000000000000000000000000006000830152602082019050919050565b60006152df602083615c07565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061531f602c83615c07565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000615385602083615c07565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006153c5602983615c07565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061542b602f83615c07565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000615491601383615c07565b91507f416c72656164792077686974656c6973746564000000000000000000000000006000830152602082019050919050565b60006154d1601283615c07565b91507f494420646f6573206e6f742065786973742e00000000000000000000000000006000830152602082019050919050565b6000615511602183615c07565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615577603183615c07565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006155dd602c83615c07565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000615643601383615c07565b91507f496e636f7272656374204554482076616c7565000000000000000000000000006000830152602082019050919050565b61567f81615da2565b82525050565b60006156918285614d71565b915061569d8284614d71565b91508190509392505050565b60006020820190506156be6000830184614c83565b92915050565b60006080820190506156d96000830187614c83565b6156e66020830186614c83565b6156f36040830185615676565b81810360608301526157058184614cff565b905095945050505050565b6000602082019050818103600083015261572a8184614c92565b905092915050565b60006020820190506157476000830184614cf0565b92915050565b600060208201905081810360008301526157678184614d38565b905092915050565b6000602082019050818103600083015261578881614da2565b9050919050565b600060208201905081810360008301526157a881614e08565b9050919050565b600060208201905081810360008301526157c881614e6e565b9050919050565b600060208201905081810360008301526157e881614ed4565b9050919050565b6000602082019050818103600083015261580881614f14565b9050919050565b6000602082019050818103600083015261582881614f54565b9050919050565b6000602082019050818103600083015261584881614fba565b9050919050565b6000602082019050818103600083015261586881614ffa565b9050919050565b600060208201905081810360008301526158888161503a565b9050919050565b600060208201905081810360008301526158a8816150a0565b9050919050565b600060208201905081810360008301526158c8816150e0565b9050919050565b600060208201905081810360008301526158e881615146565b9050919050565b6000602082019050818103600083015261590881615186565b9050919050565b60006020820190508181036000830152615928816151c6565b9050919050565b600060208201905081810360008301526159488161522c565b9050919050565b6000602082019050818103600083015261596881615292565b9050919050565b60006020820190508181036000830152615988816152d2565b9050919050565b600060208201905081810360008301526159a881615312565b9050919050565b600060208201905081810360008301526159c881615378565b9050919050565b600060208201905081810360008301526159e8816153b8565b9050919050565b60006020820190508181036000830152615a088161541e565b9050919050565b60006020820190508181036000830152615a2881615484565b9050919050565b60006020820190508181036000830152615a48816154c4565b9050919050565b60006020820190508181036000830152615a6881615504565b9050919050565b60006020820190508181036000830152615a888161556a565b9050919050565b60006020820190508181036000830152615aa8816155d0565b9050919050565b60006020820190508181036000830152615ac881615636565b9050919050565b6000602082019050615ae46000830184615676565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615b1157615b10615f27565b5b8060405250919050565b600067ffffffffffffffff821115615b3657615b35615f27565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615b6257615b61615f27565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615b9257615b91615f27565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615c2e82615da2565b9150615c3983615da2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615c6e57615c6d615e9a565b5b828201905092915050565b6000615c8482615da2565b9150615c8f83615da2565b925082615c9f57615c9e615ec9565b5b828204905092915050565b6000615cb582615da2565b9150615cc083615da2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf8615e9a565b5b828202905092915050565b6000615d0f82615da2565b9150615d1a83615da2565b925082821015615d2d57615d2c615e9a565b5b828203905092915050565b6000615d4382615d82565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615dd9578082015181840152602081019050615dbe565b83811115615de8576000848401525b50505050565b60006002820490506001821680615e0657607f821691505b60208210811415615e1a57615e19615ef8565b5b50919050565b6000615e2b82615da2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615e5e57615e5d615e9a565b5b600182019050919050565b6000615e7482615da2565b9150615e7f83615da2565b925082615e8f57615e8e615ec9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615f7081615d38565b8114615f7b57600080fd5b50565b615f8781615d4a565b8114615f9257600080fd5b50565b615f9e81615d56565b8114615fa957600080fd5b50565b615fb581615da2565b8114615fc057600080fd5b5056fea2646970667358221220c31cf2ba84f8f7bf813346b273094d49697b0690a8dc03d32a65632acfc4ecd364736f6c63430008000033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063715018a61161014f578063bcf73f20116100c1578063e65f79f41161007a578063e65f79f41461098a578063e7572230146109b3578063e985e9c5146109f0578063f207564e14610a2d578063f2fde38b14610a49578063f7d9757714610a725761027d565b8063bcf73f2014610889578063c3c5a547146108b2578063c87b56dd146108ef578063daebc9d61461092c578063de0ee2eb14610936578063e1b0e8021461095f5761027d565b806395a078e81161011357806395a078e81461077957806395d89b41146107b65780639b372b2b146107e1578063a22cb4651461080c578063ac6d0fa414610835578063b88d4fde146108605761027d565b8063715018a6146106b357806374d38e0f146106ca57806381a36eec146106f55780638bf57f4e146107115780638da5cb5b1461074e5761027d565b80632f745c59116101f357806342842e0e116101ac57806342842e0e1461056d5780634f345a14146105965780634f6ccce7146105d357806355f804b3146106105780636352211e1461063957806370a08231146106765761027d565b80632f745c5914610473578063381cec9a146104b05780633af32abf146104c75780633ccfd60b14610504578063415665851461051b578063416f4267146105445761027d565b8063095ea7b311610245578063095ea7b3146103795780630d115258146103a257806318160ddd146103cd5780631cc1f185146103f857806323b872dd14610421578063286dd3f51461044a5761027d565b806301ffc9a7146102825780630526c8fc146102bf57806305663773146102e857806306fdde0314610311578063081812fc1461033c575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614b64565b610a9b565b6040516102b69190615732565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190614bf7565b610b15565b005b3480156102f457600080fd5b5061030f600480360381019061030a9190614af8565b610bd5565b005b34801561031d57600080fd5b50610326610f11565b604051610333919061574d565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190614bf7565b610fa3565b60405161037091906156a9565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190614abc565b611028565b005b3480156103ae57600080fd5b506103b7611140565b6040516103c49190615acf565b60405180910390f35b3480156103d957600080fd5b506103e2611146565b6040516103ef9190615acf565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190614abc565b611153565b005b34801561042d57600080fd5b50610448600480360381019061044391906149b6565b611288565b005b34801561045657600080fd5b50610471600480360381019061046c9190614951565b6112e8565b005b34801561047f57600080fd5b5061049a60048036038101906104959190614abc565b611449565b6040516104a79190615acf565b60405180910390f35b3480156104bc57600080fd5b506104c56114ee565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190614951565b611596565b6040516104fb9190615732565b60405180910390f35b34801561051057600080fd5b506105196115ec565b005b34801561052757600080fd5b50610542600480360381019061053d9190614951565b6116b7565b005b34801561055057600080fd5b5061056b60048036038101906105669190614bf7565b611892565b005b34801561057957600080fd5b50610594600480360381019061058f91906149b6565b611918565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190614951565b611938565b6040516105ca9190615732565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614bf7565b611983565b6040516106079190615acf565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190614bb6565b611a1a565b005b34801561064557600080fd5b50610660600480360381019061065b9190614bf7565b611ab0565b60405161066d91906156a9565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190614951565b611b62565b6040516106aa9190615acf565b60405180910390f35b3480156106bf57600080fd5b506106c8611c1a565b005b3480156106d657600080fd5b506106df611ca2565b6040516106ec9190615acf565b60405180910390f35b61070f600480360381019061070a9190614bf7565b611d90565b005b34801561071d57600080fd5b5061073860048036038101906107339190614951565b612114565b6040516107459190615acf565b60405180910390f35b34801561075a57600080fd5b5061076361224e565b60405161077091906156a9565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190614951565b612278565b6040516107ad9190615732565b60405180910390f35b3480156107c257600080fd5b506107cb612367565b6040516107d8919061574d565b60405180910390f35b3480156107ed57600080fd5b506107f66123f9565b6040516108039190615710565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190614a80565b6126e1565b005b34801561084157600080fd5b5061084a612862565b6040516108579190615710565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190614a05565b612a49565b005b34801561089557600080fd5b506108b060048036038101906108ab9190614bf7565b612aab565b005b3480156108be57600080fd5b506108d960048036038101906108d49190614951565b612b31565b6040516108e69190615732565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190614bf7565b612c06565b604051610923919061574d565b60405180910390f35b610934612cad565b005b34801561094257600080fd5b5061095d60048036038101906109589190614bf7565b612d93565b005b34801561096b57600080fd5b50610974612e19565b6040516109819190615acf565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac9190614abc565b612e1f565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190614bf7565b612ee3565b6040516109e79190615acf565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a12919061497a565b612f38565b604051610a249190615732565b60405180910390f35b610a476004803603810190610a429190614bf7565b612fcc565b005b348015610a5557600080fd5b50610a706004803603810190610a6b9190614951565b613381565b005b348015610a7e57600080fd5b50610a996004803603810190610a949190614c20565b613479565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0e5750610b0d82613549565b5b9050919050565b610b1d61362b565b73ffffffffffffffffffffffffffffffffffffffff16610b3b61224e565b73ffffffffffffffffffffffffffffffffffffffff1614610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b88906159af565b60405180910390fd5b6000610b9b611146565b905060005b82811015610bd057610bbd338284610bb89190615c23565b613633565b8080610bc890615e20565b915050610ba0565b505050565b610bdd61362b565b73ffffffffffffffffffffffffffffffffffffffff16610bfb61224e565b73ffffffffffffffffffffffffffffffffffffffff1614610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c48906159af565b60405180910390fd5b60005b8251811015610db1576014838281518110610c98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600762015180610d109190615caa565b42610d1b9190615c23565b60126000858481518110610d58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610da990615e20565b915050610c54565b5060005b8151811015610f0c576014828281518110610df9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160106000848481518110610ea0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0490615e20565b915050610db5565b505050565b606060008054610f2090615dee565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4c90615dee565b8015610f995780601f10610f6e57610100808354040283529160200191610f99565b820191906000526020600020905b815481529060010190602001808311610f7c57829003601f168201915b5050505050905090565b6000610fae82613651565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe49061598f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061103382611ab0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b90615a4f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110c361362b565b73ffffffffffffffffffffffffffffffffffffffff1614806110f257506110f1816110ec61362b565b612f38565b5b611131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611128906158af565b60405180910390fd5b61113b83836136bd565b505050565b600b5481565b6000600880549050905090565b61115b61362b565b73ffffffffffffffffffffffffffffffffffffffff1661117961224e565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c6906159af565b60405180910390fd5b6111d882612b31565b611240576014829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b61129961129361362b565b82613776565b6112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90615a6f565b60405180910390fd5b6112e3838383613854565b505050565b6112f061362b565b73ffffffffffffffffffffffffffffffffffffffff1661130e61224e565b73ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b906159af565b60405180910390fd5b60011515601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee906158ef565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b600061145483611b62565b8210611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c9061576f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6114f661362b565b73ffffffffffffffffffffffffffffffffffffffff1661151461224e565b73ffffffffffffffffffffffffffffffffffffffff161461156a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611561906159af565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6115f461362b565b73ffffffffffffffffffffffffffffffffffffffff1661161261224e565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906159af565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116b3573d6000803e3d6000fd5b5050565b6116bf61362b565b73ffffffffffffffffffffffffffffffffffffffff166116dd61224e565b73ffffffffffffffffffffffffffffffffffffffff1614611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a906159af565b60405180910390fd5b60001515601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90615a0f565b60405180910390fd5b6117cf81612b31565b611837576014819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61189a61362b565b73ffffffffffffffffffffffffffffffffffffffff166118b861224e565b73ffffffffffffffffffffffffffffffffffffffff161461190e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611905906159af565b60405180910390fd5b80600c8190555050565b61193383838360405180602001604052806000815250612a49565b505050565b600042601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b600061198d611146565b82106119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590615a8f565b60405180910390fd5b60088281548110611a08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611a2261362b565b73ffffffffffffffffffffffffffffffffffffffff16611a4061224e565b73ffffffffffffffffffffffffffffffffffffffff1614611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d906159af565b60405180910390fd5b80600e9080519060200190611aac9291906146df565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b509061592f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca9061590f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c2261362b565b73ffffffffffffffffffffffffffffffffffffffff16611c4061224e565b73ffffffffffffffffffffffffffffffffffffffff1614611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d906159af565b60405180910390fd5b611ca06000613ab0565b565b600080600042905060005b601480549050811015611d8757816012600060148481548110611cf9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d74578280611d7090615e20565b9350505b8080611d7f90615e20565b915050611cad565b50819250505090565b611d9981612ee3565b3414611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190615aaf565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000429050611e2c33612b31565b611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e62906157cf565b60405180910390fd5b600c54611e76611ca2565b1080611e8157508082115b611ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb79061594f565b60405180910390fd5b600060158481548110611efc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015411611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4590615a2f565b60405180910390fd5b808210156120035760158381548110611f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015462015180611fb09190615caa565b81611fbb9190615c23565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120ac565b6015838154811061203d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101546201518061205d9190615caa565b826120689190615c23565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661210f5761210e33612109611146565b613633565b5b505050565b600060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156121785760019050612249565b42601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561220657601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612249565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600042601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612317575060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b80612360575042601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b9050919050565b60606001805461237690615dee565b80601f01602080910402602001604051908101604052809291908181526020018280546123a290615dee565b80156123ef5780601f106123c4576101008083540402835291602001916123ef565b820191906000526020600020905b8154815290600101906020018083116123d257829003601f168201915b5050505050905090565b6060600080600090505b6014805490508110156124ef57600115156010600060148481548110612452577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156124dc5781806124d890615e20565b9250505b80806124e790615e20565b915050612403565b50600081905060008167ffffffffffffffff811115612537577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125655781602001602082028036833780820191505090505b509050600080600090505b6014805490508110156126d6576000601482815481106125b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060011515601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156126c25780848481518110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082806126be90615e20565b9350505b5080806126ce90615e20565b915050612570565b508194505050505090565b6126e961362b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e9061582f565b60405180910390fd5b806005600061276461362b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661281161362b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128569190615732565b60405180910390a35050565b6060600061286e611ca2565b905060008167ffffffffffffffff8111156128b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156128e05781602001602082028036833780820191505090505b50905060008042905060005b601480549050811015612a3e57600060148281548110612935577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612a2a57808585806129b690615e20565b9650815181106129ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b508080612a3690615e20565b9150506128ec565b508294505050505090565b612a5a612a5461362b565b83613776565b612a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9090615a6f565b60405180910390fd5b612aa584848484613b76565b50505050565b612ab361362b565b73ffffffffffffffffffffffffffffffffffffffff16612ad161224e565b73ffffffffffffffffffffffffffffffffffffffff1614612b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1e906159af565b60405180910390fd5b80600b8190555050565b600080600090505b601480549050811015612bfb578273ffffffffffffffffffffffffffffffffffffffff1660148281548110612b97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be8576001915050612c01565b8080612bf390615e20565b915050612b39565b50600090505b919050565b6060612c1182613651565b612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c47906159ef565b60405180910390fd5b6000612c5a613bd2565b90506000815111612c7a5760405180602001604052806000815250612ca5565b80612c8484613c64565b604051602001612c95929190615685565b6040516020818303038152906040525b915050919050565b600f60009054906101000a900460ff16612cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf39061588f565b60405180910390fd5b600b543414612d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3790615aaf565b60405180910390fd5b600d5442612d4e9190615c23565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b612d9b61362b565b73ffffffffffffffffffffffffffffffffffffffff16612db961224e565b73ffffffffffffffffffffffffffffffffffffffff1614612e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e06906159af565b60405180910390fd5b80600d8190555050565b600c5481565b612e2761362b565b73ffffffffffffffffffffffffffffffffffffffff16612e4561224e565b73ffffffffffffffffffffffffffffffffffffffff1614612e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e92906159af565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600060158281548110612f1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600001549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612fd581612ee3565b3414613016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300d90615aaf565b60405180910390fd5b600c54613021611ca2565b10613061576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130589061594f565b60405180910390fd5b60006015828154811061309d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154116130ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e6906158cf565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414613171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131689061584f565b60405180910390fd5b60001515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514613204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fb90615a0f565b60405180910390fd5b600060158281548110613240577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154620151806132609190615caa565b4261326b9190615c23565b90506014339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061332533613320611146565b613633565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61338961362b565b73ffffffffffffffffffffffffffffffffffffffff166133a761224e565b73ffffffffffffffffffffffffffffffffffffffff16146133fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f4906159af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561346d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613464906157af565b60405180910390fd5b61347681613ab0565b50565b61348161362b565b73ffffffffffffffffffffffffffffffffffffffff1661349f61224e565b73ffffffffffffffffffffffffffffffffffffffff16146134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ec906159af565b60405180910390fd5b8060158381548110613530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600001819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061361457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613624575061362382613e11565b5b9050919050565b600033905090565b61364d828260405180602001604052806000815250613e7b565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661373083611ab0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061378182613651565b6137c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b79061586f565b60405180910390fd5b60006137cb83611ab0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061383a57508373ffffffffffffffffffffffffffffffffffffffff1661382284610fa3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061384b575061384a8185612f38565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661387482611ab0565b73ffffffffffffffffffffffffffffffffffffffff16146138ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c1906159cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139319061580f565b60405180910390fd5b613945838383613ed6565b6139506000826136bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139a09190615d04565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139f79190615c23565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613b81848484613854565b613b8d84848484613fea565b613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bc39061578f565b60405180910390fd5b50505050565b6060600e8054613be190615dee565b80601f0160208091040260200160405190810160405280929190818152602001828054613c0d90615dee565b8015613c5a5780601f10613c2f57610100808354040283529160200191613c5a565b820191906000526020600020905b815481529060010190602001808311613c3d57829003601f168201915b5050505050905090565b60606000821415613cac576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613e0c565b600082905060005b60008214613cde578080613cc790615e20565b915050600a82613cd79190615c79565b9150613cb4565b60008167ffffffffffffffff811115613d20577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613d525781602001600182028036833780820191505090505b5090505b60008514613e0557600182613d6b9190615d04565b9150600a85613d7a9190615e69565b6030613d869190615c23565b60f81b818381518110613dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613dfe9190615c79565b9450613d56565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613e858383614181565b613e926000848484613fea565b613ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ec89061578f565b60405180910390fd5b505050565b613ee183838361434f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613f2457613f1f81614354565b613f63565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f6257613f61838261439d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fa657613fa18161450a565b613fe5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613fe457613fe3828261464d565b5b5b505050565b600061400b8473ffffffffffffffffffffffffffffffffffffffff166146cc565b15614174578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261403461362b565b8786866040518563ffffffff1660e01b815260040161405694939291906156c4565b602060405180830381600087803b15801561407057600080fd5b505af19250505080156140a157506040513d601f19601f8201168201806040525081019061409e9190614b8d565b60015b614124573d80600081146140d1576040519150601f19603f3d011682016040523d82523d6000602084013e6140d6565b606091505b5060008151141561411c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141139061578f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050614179565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141e89061596f565b60405180910390fd5b6141fa81613651565b1561423a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614231906157ef565b60405180910390fd5b61424660008383613ed6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142969190615c23565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016143aa84611b62565b6143b49190615d04565b9050600060076000848152602001908152602001600020549050818114614499576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061451e9190615d04565b9050600060096000848152602001908152602001600020549050600060088381548110614574577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106145bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480614631577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061465883611b62565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546146eb90615dee565b90600052602060002090601f01602090048101928261470d5760008555614754565b82601f1061472657805160ff1916838001178555614754565b82800160010185558215614754579182015b82811115614753578251825591602001919060010190614738565b5b5090506147619190614765565b5090565b5b8082111561477e576000816000905550600101614766565b5090565b600061479561479084615b1b565b615aea565b905080838252602082019050828560208602820111156147b457600080fd5b60005b858110156147e457816147ca888261486a565b8452602084019350602083019250506001810190506147b7565b5050509392505050565b60006148016147fc84615b47565b615aea565b90508281526020810184848401111561481957600080fd5b614824848285615dac565b509392505050565b600061483f61483a84615b77565b615aea565b90508281526020810184848401111561485757600080fd5b614862848285615dac565b509392505050565b60008135905061487981615f67565b92915050565b600082601f83011261489057600080fd5b81356148a0848260208601614782565b91505092915050565b6000813590506148b881615f7e565b92915050565b6000813590506148cd81615f95565b92915050565b6000815190506148e281615f95565b92915050565b600082601f8301126148f957600080fd5b81356149098482602086016147ee565b91505092915050565b600082601f83011261492357600080fd5b813561493384826020860161482c565b91505092915050565b60008135905061494b81615fac565b92915050565b60006020828403121561496357600080fd5b60006149718482850161486a565b91505092915050565b6000806040838503121561498d57600080fd5b600061499b8582860161486a565b92505060206149ac8582860161486a565b9150509250929050565b6000806000606084860312156149cb57600080fd5b60006149d98682870161486a565b93505060206149ea8682870161486a565b92505060406149fb8682870161493c565b9150509250925092565b60008060008060808587031215614a1b57600080fd5b6000614a298782880161486a565b9450506020614a3a8782880161486a565b9350506040614a4b8782880161493c565b925050606085013567ffffffffffffffff811115614a6857600080fd5b614a74878288016148e8565b91505092959194509250565b60008060408385031215614a9357600080fd5b6000614aa18582860161486a565b9250506020614ab2858286016148a9565b9150509250929050565b60008060408385031215614acf57600080fd5b6000614add8582860161486a565b9250506020614aee8582860161493c565b9150509250929050565b60008060408385031215614b0b57600080fd5b600083013567ffffffffffffffff811115614b2557600080fd5b614b318582860161487f565b925050602083013567ffffffffffffffff811115614b4e57600080fd5b614b5a8582860161487f565b9150509250929050565b600060208284031215614b7657600080fd5b6000614b84848285016148be565b91505092915050565b600060208284031215614b9f57600080fd5b6000614bad848285016148d3565b91505092915050565b600060208284031215614bc857600080fd5b600082013567ffffffffffffffff811115614be257600080fd5b614bee84828501614912565b91505092915050565b600060208284031215614c0957600080fd5b6000614c178482850161493c565b91505092915050565b60008060408385031215614c3357600080fd5b6000614c418582860161493c565b9250506020614c528582860161493c565b9150509250929050565b6000614c688383614c74565b60208301905092915050565b614c7d81615d38565b82525050565b614c8c81615d38565b82525050565b6000614c9d82615bb7565b614ca78185615be5565b9350614cb283615ba7565b8060005b83811015614ce3578151614cca8882614c5c565b9750614cd583615bd8565b925050600181019050614cb6565b5085935050505092915050565b614cf981615d4a565b82525050565b6000614d0a82615bc2565b614d148185615bf6565b9350614d24818560208601615dbb565b614d2d81615f56565b840191505092915050565b6000614d4382615bcd565b614d4d8185615c07565b9350614d5d818560208601615dbb565b614d6681615f56565b840191505092915050565b6000614d7c82615bcd565b614d868185615c18565b9350614d96818560208601615dbb565b80840191505092915050565b6000614daf602b83615c07565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000614e15603283615c07565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000614e7b602683615c07565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee1601383615c07565b91507f55736572206e6f742072656769737465726564000000000000000000000000006000830152602082019050919050565b6000614f21601c83615c07565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614f61602483615c07565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fc7601983615c07565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000615007601283615c07565b91507f416c7265616479207265676973746572656400000000000000000000000000006000830152602082019050919050565b6000615047602c83615c07565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006150ad601383615c07565b91507f547269616c20627579696e6720636c6f736564000000000000000000000000006000830152602082019050919050565b60006150ed603883615c07565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000615153601183615c07565b91507f494420646f6573206e6f742065786973740000000000000000000000000000006000830152602082019050919050565b6000615193600f83615c07565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b60006151d3602a83615c07565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000615239602983615c07565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061529f601183615c07565b91507f4d617820757365727320726561636865640000000000000000000000000000006000830152602082019050919050565b60006152df602083615c07565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061531f602c83615c07565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000615385602083615c07565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006153c5602983615c07565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061542b602f83615c07565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000615491601383615c07565b91507f416c72656164792077686974656c6973746564000000000000000000000000006000830152602082019050919050565b60006154d1601283615c07565b91507f494420646f6573206e6f742065786973742e00000000000000000000000000006000830152602082019050919050565b6000615511602183615c07565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615577603183615c07565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006155dd602c83615c07565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000615643601383615c07565b91507f496e636f7272656374204554482076616c7565000000000000000000000000006000830152602082019050919050565b61567f81615da2565b82525050565b60006156918285614d71565b915061569d8284614d71565b91508190509392505050565b60006020820190506156be6000830184614c83565b92915050565b60006080820190506156d96000830187614c83565b6156e66020830186614c83565b6156f36040830185615676565b81810360608301526157058184614cff565b905095945050505050565b6000602082019050818103600083015261572a8184614c92565b905092915050565b60006020820190506157476000830184614cf0565b92915050565b600060208201905081810360008301526157678184614d38565b905092915050565b6000602082019050818103600083015261578881614da2565b9050919050565b600060208201905081810360008301526157a881614e08565b9050919050565b600060208201905081810360008301526157c881614e6e565b9050919050565b600060208201905081810360008301526157e881614ed4565b9050919050565b6000602082019050818103600083015261580881614f14565b9050919050565b6000602082019050818103600083015261582881614f54565b9050919050565b6000602082019050818103600083015261584881614fba565b9050919050565b6000602082019050818103600083015261586881614ffa565b9050919050565b600060208201905081810360008301526158888161503a565b9050919050565b600060208201905081810360008301526158a8816150a0565b9050919050565b600060208201905081810360008301526158c8816150e0565b9050919050565b600060208201905081810360008301526158e881615146565b9050919050565b6000602082019050818103600083015261590881615186565b9050919050565b60006020820190508181036000830152615928816151c6565b9050919050565b600060208201905081810360008301526159488161522c565b9050919050565b6000602082019050818103600083015261596881615292565b9050919050565b60006020820190508181036000830152615988816152d2565b9050919050565b600060208201905081810360008301526159a881615312565b9050919050565b600060208201905081810360008301526159c881615378565b9050919050565b600060208201905081810360008301526159e8816153b8565b9050919050565b60006020820190508181036000830152615a088161541e565b9050919050565b60006020820190508181036000830152615a2881615484565b9050919050565b60006020820190508181036000830152615a48816154c4565b9050919050565b60006020820190508181036000830152615a6881615504565b9050919050565b60006020820190508181036000830152615a888161556a565b9050919050565b60006020820190508181036000830152615aa8816155d0565b9050919050565b60006020820190508181036000830152615ac881615636565b9050919050565b6000602082019050615ae46000830184615676565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615b1157615b10615f27565b5b8060405250919050565b600067ffffffffffffffff821115615b3657615b35615f27565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615b6257615b61615f27565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615b9257615b91615f27565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615c2e82615da2565b9150615c3983615da2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615c6e57615c6d615e9a565b5b828201905092915050565b6000615c8482615da2565b9150615c8f83615da2565b925082615c9f57615c9e615ec9565b5b828204905092915050565b6000615cb582615da2565b9150615cc083615da2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf8615e9a565b5b828202905092915050565b6000615d0f82615da2565b9150615d1a83615da2565b925082821015615d2d57615d2c615e9a565b5b828203905092915050565b6000615d4382615d82565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615dd9578082015181840152602081019050615dbe565b83811115615de8576000848401525b50505050565b60006002820490506001821680615e0657607f821691505b60208210811415615e1a57615e19615ef8565b5b50919050565b6000615e2b82615da2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615e5e57615e5d615e9a565b5b600182019050919050565b6000615e7482615da2565b9150615e7f83615da2565b925082615e8f57615e8e615ec9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615f7081615d38565b8114615f7b57600080fd5b50565b615f8781615d4a565b8114615f9257600080fd5b50565b615f9e81615d56565b8114615fa957600080fd5b50565b615fb581615da2565b8114615fc057600080fd5b5056fea2646970667358221220c31cf2ba84f8f7bf813346b273094d49697b0690a8dc03d32a65632acfc4ecd364736f6c63430008000033

Deployed Bytecode Sourcemap

48882:8357:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35866:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52323:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51820:495;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22994:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24553:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24076:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48940:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36506:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55703:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25443:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56253:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36174:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52530:91;;;;;;;;;;;;;:::i;:::-;;56731:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56856:140;;;;;;;;;;;;;:::i;:::-;;55962:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55270:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52629:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36696:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57129:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22688:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22418:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2379:94;;;;;;;;;;;;;:::i;:::-;;53367:373;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50588:984;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53024:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1728:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52766:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23163:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54286:722;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24846:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53748:530;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26109:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55462:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56449:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23338:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51580:232;;;:::i;:::-;;55355:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48993:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55566:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55016:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25212:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49869:711;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2628:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55136:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35866:224;35968:4;36007:35;35992:50;;;:11;:50;;;;:90;;;;36046:36;36070:11;36046:23;:36::i;:::-;35992:90;35985:97;;35866:224;;;:::o;52323:199::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52378:16:::1;52397:13;:11;:13::i;:::-;52378:32;;52426:6;52421:94;52442:1;52438;:5;52421:94;;;52465:38;52475:10;52501:1;52487:11;:15;;;;:::i;:::-;52465:9;:38::i;:::-;52445:3;;;;;:::i;:::-;;;;52421:94;;;;2019:1;52323:199:::0;:::o;51820:495::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51943:6:::1;51938:199;51959:10;:17;51955:1;:21;51938:199;;;51998:19;52023:10;52034:1;52023:13;;;;;;;;;;;;;;;;;;;;;;51998:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52123:1;49067:5;52109:15;;;;:::i;:::-;52090;:35;;;;:::i;:::-;52052:20;:35;52073:10;52084:1;52073:13;;;;;;;;;;;;;;;;;;;;;;52052:35;;;;;;;;;;;;;;;:73;;;;51978:3;;;;;:::i;:::-;;;;51938:199;;;;52154:6;52149:159;52170:10;:17;52166:1;:21;52149:159;;;52209:19;52234:10;52245:1;52234:13;;;;;;;;;;;;;;;;;;;;;;52209:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52292:4;52263:11;:26;52275:10;52286:1;52275:13;;;;;;;;;;;;;;;;;;;;;;52263:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;52189:3;;;;;:::i;:::-;;;;52149:159;;;;51820:495:::0;;:::o;22994:100::-;23048:13;23081:5;23074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22994:100;:::o;24553:221::-;24629:7;24657:16;24665:7;24657;:16::i;:::-;24649:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24742:15;:24;24758:7;24742:24;;;;;;;;;;;;;;;;;;;;;24735:31;;24553:221;;;:::o;24076:411::-;24157:13;24173:23;24188:7;24173:14;:23::i;:::-;24157:39;;24221:5;24215:11;;:2;:11;;;;24207:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24315:5;24299:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24324:37;24341:5;24348:12;:10;:12::i;:::-;24324:16;:37::i;:::-;24299:62;24277:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24458:21;24467:2;24471:7;24458:8;:21::i;:::-;24076:411;;;:::o;48940:46::-;;;;:::o;36506:113::-;36567:7;36594:10;:17;;;;36587:24;;36506:113;:::o;55703:251::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55808:22:::1;55821:8;55808:12;:22::i;:::-;55803:90;;55847:19;55872:8;55847:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55803:90;55936:10;55903:20;:30;55924:8;55903:30;;;;;;;;;;;;;;;:43;;;;55703:251:::0;;:::o;25443:339::-;25638:41;25657:12;:10;:12::i;:::-;25671:7;25638:18;:41::i;:::-;25630:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25746:28;25756:4;25762:2;25766:7;25746:9;:28::i;:::-;25443:339;;;:::o;56253:188::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56370:4:::1;56345:29;;:11;:21;56357:8;56345:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;56337:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56412:11;:21;56424:8;56412:21;;;;;;;;;;;;;;;;56405:28;;;;;;;;;;;56253:188:::0;:::o;36174:256::-;36271:7;36307:23;36324:5;36307:16;:23::i;:::-;36299:5;:31;36291:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36396:12;:19;36409:5;36396:19;;;;;;;;;;;;;;;:26;36416:5;36396:26;;;;;;;;;;;;36389:33;;36174:256;;;;:::o;52530:91::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52602:11:::1;;;;;;;;;;;52601:12;52587:11;;:26;;;;;;;;;;;;;;;;;;52530:91::o:0;56731:117::-;56795:4;56819:11;:21;56831:8;56819:21;;;;;;;;;;;;;;;;;;;;;;;;;56812:28;;56731:117;;;:::o;56856:140::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56904:12:::1;56919:21;56904:36;;56959:10;56951:28;;:37;56980:7;56951:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2019:1;56856:140::o:0;55962:283::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56069:5:::1;56044:30;;:11;:21;56056:8;56044:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;56036:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56114:22;56127:8;56114:12;:22::i;:::-;56109:90;;56153:19;56178:8;56153:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56109:90;56233:4;56209:11;:21;56221:8;56209:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55962:283:::0;:::o;55270:77::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55338:1:::1;55327:8;:12;;;;55270:77:::0;:::o;25853:185::-;25991:39;26008:4;26014:2;26018:7;25991:39;;;;;;;;;;;;:16;:39::i;:::-;25853:185;;;:::o;52629:129::-;52687:4;52735:15;52711:11;:21;52723:8;52711:21;;;;;;;;;;;;;;;;:39;52704:46;;52629:129;;;:::o;36696:233::-;36771:7;36807:30;:28;:30::i;:::-;36799:5;:38;36791:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36904:10;36915:5;36904:17;;;;;;;;;;;;;;;;;;;;;;;;36897:24;;36696:233;;;:::o;57129:107::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57220:8:::1;57201:16;:27;;;;;;;;;;;;:::i;:::-;;57129:107:::0;:::o;22688:239::-;22760:7;22780:13;22796:7;:16;22804:7;22796:16;;;;;;;;;;;;;;;;;;;;;22780:32;;22848:1;22831:19;;:5;:19;;;;22823:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22914:5;22907:12;;;22688:239;;;:::o;22418:208::-;22490:7;22535:1;22518:19;;:5;:19;;;;22510:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22602:9;:16;22612:5;22602:16;;;;;;;;;;;;;;;;22595:23;;22418:208;;;:::o;2379:94::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2444:21:::1;2462:1;2444:9;:21::i;:::-;2379:94::o:0;53367:373::-;53416:4;53433:19;53463:17;53483:15;53463:35;;53513:6;53509:192;53529:19;:26;;;;53525:1;:30;53509:192;;;53628:9;53581:20;:44;53602:19;53622:1;53602:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53581:44;;;;;;;;;;;;;;;;:56;53577:113;;;53658:16;;;;;:::i;:::-;;;;53577:113;53557:3;;;;;:::i;:::-;;;;53509:192;;;;53718:14;53711:21;;;;53367:373;:::o;50588:984::-;50672:13;50681:3;50672:8;:13::i;:::-;50659:9;:26;50651:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50720:18;50741:20;:32;50762:10;50741:32;;;;;;;;;;;;;;;;50720:53;;50784:17;50804:15;50784:35;;50838:24;50851:10;50838:12;:24::i;:::-;50830:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50927:8;;50905:19;:17;:19::i;:::-;:30;:56;;;;50952:9;50939:10;:22;50905:56;50897:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;51033:1;51002:17;51020:3;51002:22;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;:32;50994:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51087:9;51074:10;:22;51070:392;;;51225:17;51243:3;51225:22;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;49067:5;51211:42;;;;:::i;:::-;51198:9;:56;;;;:::i;:::-;51163:20;:32;51184:10;51163:32;;;;;;;;;;;;;;;:91;;;;51070:392;;;51421:17;51439:3;51421:22;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;49067:5;51407:42;;;;:::i;:::-;51393:10;:57;;;;:::i;:::-;51358:20;:32;51379:10;51358:32;;;;;;;;;;;;;;;:92;;;;51070:392;51479:9;:21;51489:10;51479:21;;;;;;;;;;;;;;;;;;;;;;;;;51474:91;;51517:36;51527:10;51539:13;:11;:13::i;:::-;51517:9;:36::i;:::-;51474:91;50588:984;;;:::o;53024:335::-;53087:7;53136:4;53111:29;;:11;:21;53123:8;53111:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;53107:245;;;53164:1;53157:8;;;;53107:245;53211:15;53187:11;:21;53199:8;53187:21;;;;;;;;;;;;;;;;:39;53183:169;;;53249:11;:21;53261:8;53249:21;;;;;;;;;;;;;;;;53242:28;;;;53183:169;53310:20;:30;53331:8;53310:30;;;;;;;;;;;;;;;;53303:37;;53024:335;;;;:::o;1728:87::-;1774:7;1801:6;;;;;;;;;;;1794:13;;1728:87;:::o;52766:250::-;52826:4;52883:15;52850:20;:30;52871:8;52850:30;;;;;;;;;;;;;;;;:48;:98;;;;52944:4;52919:29;;:11;:21;52931:8;52919:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;52850:98;:158;;;;52993:15;52969:11;:21;52981:8;52969:21;;;;;;;;;;;;;;;;:39;52850:158;52843:165;;52766:250;;;:::o;23163:104::-;23219:13;23252:7;23245:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23163:104;:::o;54286:722::-;54334:16;54363:21;54399:6;54408:1;54399:10;;54395:181;54415:19;:26;;;;54411:1;:30;54395:181;;;54506:4;54467:43;;:11;:35;54479:19;54499:1;54479:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54467:35;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;54463:102;;;54531:18;;;;;:::i;:::-;;;;54463:102;54443:3;;;;;:::i;:::-;;;;54395:181;;;;54586:10;54599:16;54586:29;;54626:33;54676:5;54662:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54626:56;;54695:6;54717;54726:1;54717:10;;54712:255;54733:19;:26;;;;54729:1;:30;54712:255;;;54781:15;54799:19;54819:1;54799:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54781:40;;54864:4;54840:28;;:11;:20;54852:7;54840:20;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;54836:120;;;54911:7;54889:16;54906:1;54889:19;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;54937:3;;;;;:::i;:::-;;;;54836:120;54712:255;54761:3;;;;;:::i;:::-;;;;54712:255;;;;54984:16;54977:23;;;;;;54286:722;:::o;24846:295::-;24961:12;:10;:12::i;:::-;24949:24;;:8;:24;;;;24941:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25061:8;25016:18;:32;25035:12;:10;:12::i;:::-;25016:32;;;;;;;;;;;;;;;:42;25049:8;25016:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25114:8;25085:48;;25100:12;:10;:12::i;:::-;25085:48;;;25124:8;25085:48;;;;;;:::i;:::-;;;;;;;;24846:295;;:::o;53748:530::-;53800:16;53829:10;53842:19;:17;:19::i;:::-;53829:32;;53872:29;53918:5;53904:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53872:52;;53935:6;53952:17;53972:15;53952:35;;54004:6;54000:242;54020:19;:26;;;;54016:1;:30;54000:242;;;54068:15;54086:19;54106:1;54086:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54068:40;;54159:9;54127:20;:29;54148:7;54127:29;;;;;;;;;;;;;;;;:41;54123:108;;;54208:7;54189:11;54201:3;;;;;:::i;:::-;;;54189:16;;;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;54123:108;54000:242;54048:3;;;;;:::i;:::-;;;;54000:242;;;;54259:11;54252:18;;;;;;53748:530;:::o;26109:328::-;26284:41;26303:12;:10;:12::i;:::-;26317:7;26284:18;:41::i;:::-;26276:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26390:39;26404:4;26410:2;26414:7;26423:5;26390:13;:39::i;:::-;26109:328;;;;:::o;55462:96::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55544:6:::1;55531:10;:19;;;;55462:96:::0;:::o;56449:274::-;56510:4;56531:6;56540:1;56531:10;;56527:166;56547:19;:26;;;;56543:1;:30;56527:166;;;56625:8;56599:34;;:19;56619:1;56599:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;56595:87;;;56662:4;56655:11;;;;;56595:87;56575:3;;;;;:::i;:::-;;;;56527:166;;;;56710:5;56703:12;;56449:274;;;;:::o;23338:334::-;23411:13;23445:16;23453:7;23445;:16::i;:::-;23437:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23526:21;23550:10;:8;:10::i;:::-;23526:34;;23602:1;23584:7;23578:21;:25;:86;;;;;;;;;;;;;;;;;23630:7;23639:18;:7;:16;:18::i;:::-;23613:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23578:86;23571:93;;;23338:334;;;:::o;51580:232::-;51634:11;;;;;;;;;;;51626:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51701:10;;51688:9;:23;51680:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51790:14;;51772:15;:32;;;;:::i;:::-;51746:11;:23;51758:10;51746:23;;;;;;;;;;;;;;;:58;;;;51580:232::o;55355:99::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55441:5:::1;55424:14;:22;;;;55355:99:::0;:::o;48993:28::-;;;;:::o;55566:129::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55677:10:::1;55653:11;:21;55665:8;55653:21;;;;;;;;;;;;;;;:34;;;;55566:129:::0;;:::o;55016:112::-;55064:7;55091:17;55109:3;55091:22;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;55084:36;;55016:112;;;:::o;25212:164::-;25309:4;25333:18;:25;25352:5;25333:25;;;;;;;;;;;;;;;:35;25359:8;25333:35;;;;;;;;;;;;;;;;;;;;;;;;;25326:42;;25212:164;;;;:::o;49869:711::-;49944:13;49953:3;49944:8;:13::i;:::-;49931:9;:26;49923:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50022:8;;50000:19;:17;:19::i;:::-;:30;49992:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50102:1;50071:17;50089:3;50071:22;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;:32;50063:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50180:1;50144:20;:32;50165:10;50144:32;;;;;;;;;;;;;;;;:37;50136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50250:5;50223:32;;:11;:23;50235:10;50223:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;50215:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50292:22;50350:17;50368:3;50350:22;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;49067:5;50336:42;;;;:::i;:::-;50317:15;:62;;;;:::i;:::-;50292:87;;50390:19;50415:10;50390:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50472:14;50437:20;:32;50458:10;50437:32;;;;;;;;;;;;;;;:49;;;;50497:36;50507:10;50519:13;:11;:13::i;:::-;50497:9;:36::i;:::-;50568:4;50544:9;:21;50554:10;50544:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;49869:711;;:::o;2628:192::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2737:1:::1;2717:22;;:8;:22;;;;2709:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2793:19;2803:8;2793:9;:19::i;:::-;2628:192:::0;:::o;55136:126::-;1959:12;:10;:12::i;:::-;1948:23;;:7;:5;:7::i;:::-;:23;;;1940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55248:6:::1;55212:17;55230:7;55212:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:42;;;;55136:126:::0;;:::o;22049:305::-;22151:4;22203:25;22188:40;;;:11;:40;;;;:105;;;;22260:33;22245:48;;;:11;:48;;;;22188:105;:158;;;;22310:36;22334:11;22310:23;:36::i;:::-;22188:158;22168:178;;22049:305;;;:::o;602:98::-;655:7;682:10;675:17;;602:98;:::o;28931:110::-;29007:26;29017:2;29021:7;29007:26;;;;;;;;;;;;:9;:26::i;:::-;28931:110;;:::o;27947:127::-;28012:4;28064:1;28036:30;;:7;:16;28044:7;28036:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28029:37;;27947:127;;;:::o;31929:174::-;32031:2;32004:15;:24;32020:7;32004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32087:7;32083:2;32049:46;;32058:23;32073:7;32058:14;:23::i;:::-;32049:46;;;;;;;;;;;;31929:174;;:::o;28241:348::-;28334:4;28359:16;28367:7;28359;:16::i;:::-;28351:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28435:13;28451:23;28466:7;28451:14;:23::i;:::-;28435:39;;28504:5;28493:16;;:7;:16;;;:51;;;;28537:7;28513:31;;:20;28525:7;28513:11;:20::i;:::-;:31;;;28493:51;:87;;;;28548:32;28565:5;28572:7;28548:16;:32::i;:::-;28493:87;28485:96;;;28241:348;;;;:::o;31233:578::-;31392:4;31365:31;;:23;31380:7;31365:14;:23::i;:::-;:31;;;31357:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31475:1;31461:16;;:2;:16;;;;31453:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31531:39;31552:4;31558:2;31562:7;31531:20;:39::i;:::-;31635:29;31652:1;31656:7;31635:8;:29::i;:::-;31696:1;31677:9;:15;31687:4;31677:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31725:1;31708:9;:13;31718:2;31708:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31756:2;31737:7;:16;31745:7;31737:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31795:7;31791:2;31776:27;;31785:4;31776:27;;;;;;;;;;;;31233:578;;;:::o;2828:173::-;2884:16;2903:6;;;;;;;;;;;2884:25;;2929:8;2920:6;;:17;;;;;;;;;;;;;;;;;;2984:8;2953:40;;2974:8;2953:40;;;;;;;;;;;;2828:173;;:::o;27319:315::-;27476:28;27486:4;27492:2;27496:7;27476:9;:28::i;:::-;27523:48;27546:4;27552:2;27556:7;27565:5;27523:22;:48::i;:::-;27515:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27319:315;;;;:::o;57004:117::-;57064:13;57097:16;57090:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57004:117;:::o;18197:723::-;18253:13;18483:1;18474:5;:10;18470:53;;;18501:10;;;;;;;;;;;;;;;;;;;;;18470:53;18533:12;18548:5;18533:20;;18564:14;18589:78;18604:1;18596:4;:9;18589:78;;18622:8;;;;;:::i;:::-;;;;18653:2;18645:10;;;;;:::i;:::-;;;18589:78;;;18677:19;18709:6;18699:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18677:39;;18727:154;18743:1;18734:5;:10;18727:154;;18771:1;18761:11;;;;;:::i;:::-;;;18838:2;18830:5;:10;;;;:::i;:::-;18817:2;:24;;;;:::i;:::-;18804:39;;18787:6;18794;18787:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18867:2;18858:11;;;;;:::i;:::-;;;18727:154;;;18905:6;18891:21;;;;;18197:723;;;;:::o;20656:157::-;20741:4;20780:25;20765:40;;;:11;:40;;;;20758:47;;20656:157;;;:::o;29268:321::-;29398:18;29404:2;29408:7;29398:5;:18::i;:::-;29449:54;29480:1;29484:2;29488:7;29497:5;29449:22;:54::i;:::-;29427:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29268:321;;;:::o;37542:589::-;37686:45;37713:4;37719:2;37723:7;37686:26;:45::i;:::-;37764:1;37748:18;;:4;:18;;;37744:187;;;37783:40;37815:7;37783:31;:40::i;:::-;37744:187;;;37853:2;37845:10;;:4;:10;;;37841:90;;37872:47;37905:4;37911:7;37872:32;:47::i;:::-;37841:90;37744:187;37959:1;37945:16;;:2;:16;;;37941:183;;;37978:45;38015:7;37978:36;:45::i;:::-;37941:183;;;38051:4;38045:10;;:2;:10;;;38041:83;;38072:40;38100:2;38104:7;38072:27;:40::i;:::-;38041:83;37941:183;37542:589;;;:::o;32668:799::-;32823:4;32844:15;:2;:13;;;:15::i;:::-;32840:620;;;32896:2;32880:36;;;32917:12;:10;:12::i;:::-;32931:4;32937:7;32946:5;32880:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32876:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33139:1;33122:6;:13;:18;33118:272;;;33165:60;;;;;;;;;;:::i;:::-;;;;;;;;33118:272;33340:6;33334:13;33325:6;33321:2;33317:15;33310:38;32876:529;33013:41;;;33003:51;;;:6;:51;;;;32996:58;;;;;32840:620;33444:4;33437:11;;32668:799;;;;;;;:::o;29925:382::-;30019:1;30005:16;;:2;:16;;;;29997:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30078:16;30086:7;30078;:16::i;:::-;30077:17;30069:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30140:45;30169:1;30173:2;30177:7;30140:20;:45::i;:::-;30215:1;30198:9;:13;30208:2;30198:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30246:2;30227:7;:16;30235:7;30227:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30291:7;30287:2;30266:33;;30283:1;30266:33;;;;;;;;;;;;29925:382;;:::o;34039:126::-;;;;:::o;38854:164::-;38958:10;:17;;;;38931:15;:24;38947:7;38931:24;;;;;;;;;;;:44;;;;38986:10;39002:7;38986:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38854:164;:::o;39645:988::-;39911:22;39961:1;39936:22;39953:4;39936:16;:22::i;:::-;:26;;;;:::i;:::-;39911:51;;39973:18;39994:17;:26;40012:7;39994:26;;;;;;;;;;;;39973:47;;40141:14;40127:10;:28;40123:328;;40172:19;40194:12;:18;40207:4;40194:18;;;;;;;;;;;;;;;:34;40213:14;40194:34;;;;;;;;;;;;40172:56;;40278:11;40245:12;:18;40258:4;40245:18;;;;;;;;;;;;;;;:30;40264:10;40245:30;;;;;;;;;;;:44;;;;40395:10;40362:17;:30;40380:11;40362:30;;;;;;;;;;;:43;;;;40123:328;;40547:17;:26;40565:7;40547:26;;;;;;;;;;;40540:33;;;40591:12;:18;40604:4;40591:18;;;;;;;;;;;;;;;:34;40610:14;40591:34;;;;;;;;;;;40584:41;;;39645:988;;;;:::o;40928:1079::-;41181:22;41226:1;41206:10;:17;;;;:21;;;;:::i;:::-;41181:46;;41238:18;41259:15;:24;41275:7;41259:24;;;;;;;;;;;;41238:45;;41610:19;41632:10;41643:14;41632:26;;;;;;;;;;;;;;;;;;;;;;;;41610:48;;41696:11;41671:10;41682;41671:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;41807:10;41776:15;:28;41792:11;41776:28;;;;;;;;;;;:41;;;;41948:15;:24;41964:7;41948:24;;;;;;;;;;;41941:31;;;41983:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40928:1079;;;;:::o;38432:221::-;38517:14;38534:20;38551:2;38534:16;:20::i;:::-;38517:37;;38592:7;38565:12;:16;38578:2;38565:16;;;;;;;;;;;;;;;:24;38582:6;38565:24;;;;;;;;;;;:34;;;;38639:6;38610:17;:26;38628:7;38610:26;;;;;;;;;;;:35;;;;38432:221;;;:::o;10638:387::-;10698:4;10906:12;10973:7;10961:20;10953:28;;11016:1;11009:4;:8;11002:15;;;10638:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:693::-;;;6027:2;6015:9;6006:7;6002:23;5998:32;5995:2;;;6043:1;6040;6033:12;5995:2;6114:1;6103:9;6099:17;6086:31;6144:18;6136:6;6133:30;6130:2;;;6176:1;6173;6166:12;6130:2;6204:78;6274:7;6265:6;6254:9;6250:22;6204:78;:::i;:::-;6194:88;;6057:235;6359:2;6348:9;6344:18;6331:32;6390:18;6382:6;6379:30;6376:2;;;6422:1;6419;6412:12;6376:2;6450:78;6520:7;6511:6;6500:9;6496:22;6450:78;:::i;:::-;6440:88;;6302:236;5985:560;;;;;:::o;6551:260::-;;6658:2;6646:9;6637:7;6633:23;6629:32;6626:2;;;6674:1;6671;6664:12;6626:2;6717:1;6742:52;6786:7;6777:6;6766:9;6762:22;6742:52;:::i;:::-;6732:62;;6688:116;6616:195;;;;:::o;6817:282::-;;6935:2;6923:9;6914:7;6910:23;6906:32;6903:2;;;6951:1;6948;6941:12;6903:2;6994:1;7019:63;7074:7;7065:6;7054:9;7050:22;7019:63;:::i;:::-;7009:73;;6965:127;6893:206;;;;:::o;7105:375::-;;7223:2;7211:9;7202:7;7198:23;7194:32;7191:2;;;7239:1;7236;7229:12;7191:2;7310:1;7299:9;7295:17;7282:31;7340:18;7332:6;7329:30;7326:2;;;7372:1;7369;7362:12;7326:2;7400:63;7455:7;7446:6;7435:9;7431:22;7400:63;:::i;:::-;7390:73;;7253:220;7181:299;;;;:::o;7486:262::-;;7594:2;7582:9;7573:7;7569:23;7565:32;7562:2;;;7610:1;7607;7600:12;7562:2;7653:1;7678:53;7723:7;7714:6;7703:9;7699:22;7678:53;:::i;:::-;7668:63;;7624:117;7552:196;;;;:::o;7754:407::-;;;7879:2;7867:9;7858:7;7854:23;7850:32;7847:2;;;7895:1;7892;7885:12;7847:2;7938:1;7963:53;8008:7;7999:6;7988:9;7984:22;7963:53;:::i;:::-;7953:63;;7909:117;8065:2;8091:53;8136:7;8127:6;8116:9;8112:22;8091:53;:::i;:::-;8081:63;;8036:118;7837:324;;;;;:::o;8167:179::-;;8257:46;8299:3;8291:6;8257:46;:::i;:::-;8335:4;8330:3;8326:14;8312:28;;8247:99;;;;:::o;8352:108::-;8429:24;8447:5;8429:24;:::i;:::-;8424:3;8417:37;8407:53;;:::o;8466:118::-;8553:24;8571:5;8553:24;:::i;:::-;8548:3;8541:37;8531:53;;:::o;8620:732::-;;8768:54;8816:5;8768:54;:::i;:::-;8838:86;8917:6;8912:3;8838:86;:::i;:::-;8831:93;;8948:56;8998:5;8948:56;:::i;:::-;9027:7;9058:1;9043:284;9068:6;9065:1;9062:13;9043:284;;;9144:6;9138:13;9171:63;9230:3;9215:13;9171:63;:::i;:::-;9164:70;;9257:60;9310:6;9257:60;:::i;:::-;9247:70;;9103:224;9090:1;9087;9083:9;9078:14;;9043:284;;;9047:14;9343:3;9336:10;;8744:608;;;;;;;:::o;9358:109::-;9439:21;9454:5;9439:21;:::i;:::-;9434:3;9427:34;9417:50;;:::o;9473:360::-;;9587:38;9619:5;9587:38;:::i;:::-;9641:70;9704:6;9699:3;9641:70;:::i;:::-;9634:77;;9720:52;9765:6;9760:3;9753:4;9746:5;9742:16;9720:52;:::i;:::-;9797:29;9819:6;9797:29;:::i;:::-;9792:3;9788:39;9781:46;;9563:270;;;;;:::o;9839:364::-;;9955:39;9988:5;9955:39;:::i;:::-;10010:71;10074:6;10069:3;10010:71;:::i;:::-;10003:78;;10090:52;10135:6;10130:3;10123:4;10116:5;10112:16;10090:52;:::i;:::-;10167:29;10189:6;10167:29;:::i;:::-;10162:3;10158:39;10151:46;;9931:272;;;;;:::o;10209:377::-;;10343:39;10376:5;10343:39;:::i;:::-;10398:89;10480:6;10475:3;10398:89;:::i;:::-;10391:96;;10496:52;10541:6;10536:3;10529:4;10522:5;10518:16;10496:52;:::i;:::-;10573:6;10568:3;10564:16;10557:23;;10319:267;;;;;:::o;10592:375::-;;10755:67;10819:2;10814:3;10755:67;:::i;:::-;10748:74;;10852:34;10848:1;10843:3;10839:11;10832:55;10918:13;10913:2;10908:3;10904:12;10897:35;10958:2;10953:3;10949:12;10942:19;;10738:229;;;:::o;10973:382::-;;11136:67;11200:2;11195:3;11136:67;:::i;:::-;11129:74;;11233:34;11229:1;11224:3;11220:11;11213:55;11299:20;11294:2;11289:3;11285:12;11278:42;11346:2;11341:3;11337:12;11330:19;;11119:236;;;:::o;11361:370::-;;11524:67;11588:2;11583:3;11524:67;:::i;:::-;11517:74;;11621:34;11617:1;11612:3;11608:11;11601:55;11687:8;11682:2;11677:3;11673:12;11666:30;11722:2;11717:3;11713:12;11706:19;;11507:224;;;:::o;11737:317::-;;11900:67;11964:2;11959:3;11900:67;:::i;:::-;11893:74;;11997:21;11993:1;11988:3;11984:11;11977:42;12045:2;12040:3;12036:12;12029:19;;11883:171;;;:::o;12060:326::-;;12223:67;12287:2;12282:3;12223:67;:::i;:::-;12216:74;;12320:30;12316:1;12311:3;12307:11;12300:51;12377:2;12372:3;12368:12;12361:19;;12206:180;;;:::o;12392:368::-;;12555:67;12619:2;12614:3;12555:67;:::i;:::-;12548:74;;12652:34;12648:1;12643:3;12639:11;12632:55;12718:6;12713:2;12708:3;12704:12;12697:28;12751:2;12746:3;12742:12;12735:19;;12538:222;;;:::o;12766:323::-;;12929:67;12993:2;12988:3;12929:67;:::i;:::-;12922:74;;13026:27;13022:1;13017:3;13013:11;13006:48;13080:2;13075:3;13071:12;13064:19;;12912:177;;;:::o;13095:316::-;;13258:67;13322:2;13317:3;13258:67;:::i;:::-;13251:74;;13355:20;13351:1;13346:3;13342:11;13335:41;13402:2;13397:3;13393:12;13386:19;;13241:170;;;:::o;13417:376::-;;13580:67;13644:2;13639:3;13580:67;:::i;:::-;13573:74;;13677:34;13673:1;13668:3;13664:11;13657:55;13743:14;13738:2;13733:3;13729:12;13722:36;13784:2;13779:3;13775:12;13768:19;;13563:230;;;:::o;13799:317::-;;13962:67;14026:2;14021:3;13962:67;:::i;:::-;13955:74;;14059:21;14055:1;14050:3;14046:11;14039:42;14107:2;14102:3;14098:12;14091:19;;13945:171;;;:::o;14122:388::-;;14285:67;14349:2;14344:3;14285:67;:::i;:::-;14278:74;;14382:34;14378:1;14373:3;14369:11;14362:55;14448:26;14443:2;14438:3;14434:12;14427:48;14501:2;14496:3;14492:12;14485:19;;14268:242;;;:::o;14516:315::-;;14679:67;14743:2;14738:3;14679:67;:::i;:::-;14672:74;;14776:19;14772:1;14767:3;14763:11;14756:40;14822:2;14817:3;14813:12;14806:19;;14662:169;;;:::o;14837:313::-;;15000:67;15064:2;15059:3;15000:67;:::i;:::-;14993:74;;15097:17;15093:1;15088:3;15084:11;15077:38;15141:2;15136:3;15132:12;15125:19;;14983:167;;;:::o;15156:374::-;;15319:67;15383:2;15378:3;15319:67;:::i;:::-;15312:74;;15416:34;15412:1;15407:3;15403:11;15396:55;15482:12;15477:2;15472:3;15468:12;15461:34;15521:2;15516:3;15512:12;15505:19;;15302:228;;;:::o;15536:373::-;;15699:67;15763:2;15758:3;15699:67;:::i;:::-;15692:74;;15796:34;15792:1;15787:3;15783:11;15776:55;15862:11;15857:2;15852:3;15848:12;15841:33;15900:2;15895:3;15891:12;15884:19;;15682:227;;;:::o;15915:315::-;;16078:67;16142:2;16137:3;16078:67;:::i;:::-;16071:74;;16175:19;16171:1;16166:3;16162:11;16155:40;16221:2;16216:3;16212:12;16205:19;;16061:169;;;:::o;16236:330::-;;16399:67;16463:2;16458:3;16399:67;:::i;:::-;16392:74;;16496:34;16492:1;16487:3;16483:11;16476:55;16557:2;16552:3;16548:12;16541:19;;16382:184;;;:::o;16572:376::-;;16735:67;16799:2;16794:3;16735:67;:::i;:::-;16728:74;;16832:34;16828:1;16823:3;16819:11;16812:55;16898:14;16893:2;16888:3;16884:12;16877:36;16939:2;16934:3;16930:12;16923:19;;16718:230;;;:::o;16954:330::-;;17117:67;17181:2;17176:3;17117:67;:::i;:::-;17110:74;;17214:34;17210:1;17205:3;17201:11;17194:55;17275:2;17270:3;17266:12;17259:19;;17100:184;;;:::o;17290:373::-;;17453:67;17517:2;17512:3;17453:67;:::i;:::-;17446:74;;17550:34;17546:1;17541:3;17537:11;17530:55;17616:11;17611:2;17606:3;17602:12;17595:33;17654:2;17649:3;17645:12;17638:19;;17436:227;;;:::o;17669:379::-;;17832:67;17896:2;17891:3;17832:67;:::i;:::-;17825:74;;17929:34;17925:1;17920:3;17916:11;17909:55;17995:17;17990:2;17985:3;17981:12;17974:39;18039:2;18034:3;18030:12;18023:19;;17815:233;;;:::o;18054:317::-;;18217:67;18281:2;18276:3;18217:67;:::i;:::-;18210:74;;18314:21;18310:1;18305:3;18301:11;18294:42;18362:2;18357:3;18353:12;18346:19;;18200:171;;;:::o;18377:316::-;;18540:67;18604:2;18599:3;18540:67;:::i;:::-;18533:74;;18637:20;18633:1;18628:3;18624:11;18617:41;18684:2;18679:3;18675:12;18668:19;;18523:170;;;:::o;18699:365::-;;18862:67;18926:2;18921:3;18862:67;:::i;:::-;18855:74;;18959:34;18955:1;18950:3;18946:11;18939:55;19025:3;19020:2;19015:3;19011:12;19004:25;19055:2;19050:3;19046:12;19039:19;;18845:219;;;:::o;19070:381::-;;19233:67;19297:2;19292:3;19233:67;:::i;:::-;19226:74;;19330:34;19326:1;19321:3;19317:11;19310:55;19396:19;19391:2;19386:3;19382:12;19375:41;19442:2;19437:3;19433:12;19426:19;;19216:235;;;:::o;19457:376::-;;19620:67;19684:2;19679:3;19620:67;:::i;:::-;19613:74;;19717:34;19713:1;19708:3;19704:11;19697:55;19783:14;19778:2;19773:3;19769:12;19762:36;19824:2;19819:3;19815:12;19808:19;;19603:230;;;:::o;19839:317::-;;20002:67;20066:2;20061:3;20002:67;:::i;:::-;19995:74;;20099:21;20095:1;20090:3;20086:11;20079:42;20147:2;20142:3;20138:12;20131:19;;19985:171;;;:::o;20162:118::-;20249:24;20267:5;20249:24;:::i;:::-;20244:3;20237:37;20227:53;;:::o;20286:435::-;;20488:95;20579:3;20570:6;20488:95;:::i;:::-;20481:102;;20600:95;20691:3;20682:6;20600:95;:::i;:::-;20593:102;;20712:3;20705:10;;20470:251;;;;;:::o;20727:222::-;;20858:2;20847:9;20843:18;20835:26;;20871:71;20939:1;20928:9;20924:17;20915:6;20871:71;:::i;:::-;20825:124;;;;:::o;20955:640::-;;21188:3;21177:9;21173:19;21165:27;;21202:71;21270:1;21259:9;21255:17;21246:6;21202:71;:::i;:::-;21283:72;21351:2;21340:9;21336:18;21327:6;21283:72;:::i;:::-;21365;21433:2;21422:9;21418:18;21409:6;21365:72;:::i;:::-;21484:9;21478:4;21474:20;21469:2;21458:9;21454:18;21447:48;21512:76;21583:4;21574:6;21512:76;:::i;:::-;21504:84;;21155:440;;;;;;;:::o;21601:373::-;;21782:2;21771:9;21767:18;21759:26;;21831:9;21825:4;21821:20;21817:1;21806:9;21802:17;21795:47;21859:108;21962:4;21953:6;21859:108;:::i;:::-;21851:116;;21749:225;;;;:::o;21980:210::-;;22105:2;22094:9;22090:18;22082:26;;22118:65;22180:1;22169:9;22165:17;22156:6;22118:65;:::i;:::-;22072:118;;;;:::o;22196:313::-;;22347:2;22336:9;22332:18;22324:26;;22396:9;22390:4;22386:20;22382:1;22371:9;22367:17;22360:47;22424:78;22497:4;22488:6;22424:78;:::i;:::-;22416:86;;22314:195;;;;:::o;22515:419::-;;22719:2;22708:9;22704:18;22696:26;;22768:9;22762:4;22758:20;22754:1;22743:9;22739:17;22732:47;22796:131;22922:4;22796:131;:::i;:::-;22788:139;;22686:248;;;:::o;22940:419::-;;23144:2;23133:9;23129:18;23121:26;;23193:9;23187:4;23183:20;23179:1;23168:9;23164:17;23157:47;23221:131;23347:4;23221:131;:::i;:::-;23213:139;;23111:248;;;:::o;23365:419::-;;23569:2;23558:9;23554:18;23546:26;;23618:9;23612:4;23608:20;23604:1;23593:9;23589:17;23582:47;23646:131;23772:4;23646:131;:::i;:::-;23638:139;;23536:248;;;:::o;23790:419::-;;23994:2;23983:9;23979:18;23971:26;;24043:9;24037:4;24033:20;24029:1;24018:9;24014:17;24007:47;24071:131;24197:4;24071:131;:::i;:::-;24063:139;;23961:248;;;:::o;24215:419::-;;24419:2;24408:9;24404:18;24396:26;;24468:9;24462:4;24458:20;24454:1;24443:9;24439:17;24432:47;24496:131;24622:4;24496:131;:::i;:::-;24488:139;;24386:248;;;:::o;24640:419::-;;24844:2;24833:9;24829:18;24821:26;;24893:9;24887:4;24883:20;24879:1;24868:9;24864:17;24857:47;24921:131;25047:4;24921:131;:::i;:::-;24913:139;;24811:248;;;:::o;25065:419::-;;25269:2;25258:9;25254:18;25246:26;;25318:9;25312:4;25308:20;25304:1;25293:9;25289:17;25282:47;25346:131;25472:4;25346:131;:::i;:::-;25338:139;;25236:248;;;:::o;25490:419::-;;25694:2;25683:9;25679:18;25671:26;;25743:9;25737:4;25733:20;25729:1;25718:9;25714:17;25707:47;25771:131;25897:4;25771:131;:::i;:::-;25763:139;;25661:248;;;:::o;25915:419::-;;26119:2;26108:9;26104:18;26096:26;;26168:9;26162:4;26158:20;26154:1;26143:9;26139:17;26132:47;26196:131;26322:4;26196:131;:::i;:::-;26188:139;;26086:248;;;:::o;26340:419::-;;26544:2;26533:9;26529:18;26521:26;;26593:9;26587:4;26583:20;26579:1;26568:9;26564:17;26557:47;26621:131;26747:4;26621:131;:::i;:::-;26613:139;;26511:248;;;:::o;26765:419::-;;26969:2;26958:9;26954:18;26946:26;;27018:9;27012:4;27008:20;27004:1;26993:9;26989:17;26982:47;27046:131;27172:4;27046:131;:::i;:::-;27038:139;;26936:248;;;:::o;27190:419::-;;27394:2;27383:9;27379:18;27371:26;;27443:9;27437:4;27433:20;27429:1;27418:9;27414:17;27407:47;27471:131;27597:4;27471:131;:::i;:::-;27463:139;;27361:248;;;:::o;27615:419::-;;27819:2;27808:9;27804:18;27796:26;;27868:9;27862:4;27858:20;27854:1;27843:9;27839:17;27832:47;27896:131;28022:4;27896:131;:::i;:::-;27888:139;;27786:248;;;:::o;28040:419::-;;28244:2;28233:9;28229:18;28221:26;;28293:9;28287:4;28283:20;28279:1;28268:9;28264:17;28257:47;28321:131;28447:4;28321:131;:::i;:::-;28313:139;;28211:248;;;:::o;28465:419::-;;28669:2;28658:9;28654:18;28646:26;;28718:9;28712:4;28708:20;28704:1;28693:9;28689:17;28682:47;28746:131;28872:4;28746:131;:::i;:::-;28738:139;;28636:248;;;:::o;28890:419::-;;29094:2;29083:9;29079:18;29071:26;;29143:9;29137:4;29133:20;29129:1;29118:9;29114:17;29107:47;29171:131;29297:4;29171:131;:::i;:::-;29163:139;;29061:248;;;:::o;29315:419::-;;29519:2;29508:9;29504:18;29496:26;;29568:9;29562:4;29558:20;29554:1;29543:9;29539:17;29532:47;29596:131;29722:4;29596:131;:::i;:::-;29588:139;;29486:248;;;:::o;29740:419::-;;29944:2;29933:9;29929:18;29921:26;;29993:9;29987:4;29983:20;29979:1;29968:9;29964:17;29957:47;30021:131;30147:4;30021:131;:::i;:::-;30013:139;;29911:248;;;:::o;30165:419::-;;30369:2;30358:9;30354:18;30346:26;;30418:9;30412:4;30408:20;30404:1;30393:9;30389:17;30382:47;30446:131;30572:4;30446:131;:::i;:::-;30438:139;;30336:248;;;:::o;30590:419::-;;30794:2;30783:9;30779:18;30771:26;;30843:9;30837:4;30833:20;30829:1;30818:9;30814:17;30807:47;30871:131;30997:4;30871:131;:::i;:::-;30863:139;;30761:248;;;:::o;31015:419::-;;31219:2;31208:9;31204:18;31196:26;;31268:9;31262:4;31258:20;31254:1;31243:9;31239:17;31232:47;31296:131;31422:4;31296:131;:::i;:::-;31288:139;;31186:248;;;:::o;31440:419::-;;31644:2;31633:9;31629:18;31621:26;;31693:9;31687:4;31683:20;31679:1;31668:9;31664:17;31657:47;31721:131;31847:4;31721:131;:::i;:::-;31713:139;;31611:248;;;:::o;31865:419::-;;32069:2;32058:9;32054:18;32046:26;;32118:9;32112:4;32108:20;32104:1;32093:9;32089:17;32082:47;32146:131;32272:4;32146:131;:::i;:::-;32138:139;;32036:248;;;:::o;32290:419::-;;32494:2;32483:9;32479:18;32471:26;;32543:9;32537:4;32533:20;32529:1;32518:9;32514:17;32507:47;32571:131;32697:4;32571:131;:::i;:::-;32563:139;;32461:248;;;:::o;32715:419::-;;32919:2;32908:9;32904:18;32896:26;;32968:9;32962:4;32958:20;32954:1;32943:9;32939:17;32932:47;32996:131;33122:4;32996:131;:::i;:::-;32988:139;;32886:248;;;:::o;33140:419::-;;33344:2;33333:9;33329:18;33321:26;;33393:9;33387:4;33383:20;33379:1;33368:9;33364:17;33357:47;33421:131;33547:4;33421:131;:::i;:::-;33413:139;;33311:248;;;:::o;33565:419::-;;33769:2;33758:9;33754:18;33746:26;;33818:9;33812:4;33808:20;33804:1;33793:9;33789:17;33782:47;33846:131;33972:4;33846:131;:::i;:::-;33838:139;;33736:248;;;:::o;33990:222::-;;34121:2;34110:9;34106:18;34098:26;;34134:71;34202:1;34191:9;34187:17;34178:6;34134:71;:::i;:::-;34088:124;;;;:::o;34218:283::-;;34284:2;34278:9;34268:19;;34326:4;34318:6;34314:17;34433:6;34421:10;34418:22;34397:18;34385:10;34382:34;34379:62;34376:2;;;34444:18;;:::i;:::-;34376:2;34484:10;34480:2;34473:22;34258:243;;;;:::o;34507:311::-;;34674:18;34666:6;34663:30;34660:2;;;34696:18;;:::i;:::-;34660:2;34746:4;34738:6;34734:17;34726:25;;34806:4;34800;34796:15;34788:23;;34589:229;;;:::o;34824:331::-;;34975:18;34967:6;34964:30;34961:2;;;34997:18;;:::i;:::-;34961:2;35082:4;35078:9;35071:4;35063:6;35059:17;35055:33;35047:41;;35143:4;35137;35133:15;35125:23;;34890:265;;;:::o;35161:332::-;;35313:18;35305:6;35302:30;35299:2;;;35335:18;;:::i;:::-;35299:2;35420:4;35416:9;35409:4;35401:6;35397:17;35393:33;35385:41;;35481:4;35475;35471:15;35463:23;;35228:265;;;:::o;35499:132::-;;35589:3;35581:11;;35619:4;35614:3;35610:14;35602:22;;35571:60;;;:::o;35637:114::-;;35738:5;35732:12;35722:22;;35711:40;;;:::o;35757:98::-;;35842:5;35836:12;35826:22;;35815:40;;;:::o;35861:99::-;;35947:5;35941:12;35931:22;;35920:40;;;:::o;35966:113::-;;36068:4;36063:3;36059:14;36051:22;;36041:38;;;:::o;36085:184::-;;36218:6;36213:3;36206:19;36258:4;36253:3;36249:14;36234:29;;36196:73;;;;:::o;36275:168::-;;36392:6;36387:3;36380:19;36432:4;36427:3;36423:14;36408:29;;36370:73;;;;:::o;36449:169::-;;36567:6;36562:3;36555:19;36607:4;36602:3;36598:14;36583:29;;36545:73;;;;:::o;36624:148::-;;36763:3;36748:18;;36738:34;;;;:::o;36778:305::-;;36837:20;36855:1;36837:20;:::i;:::-;36832:25;;36871:20;36889:1;36871:20;:::i;:::-;36866:25;;37025:1;36957:66;36953:74;36950:1;36947:81;36944:2;;;37031:18;;:::i;:::-;36944:2;37075:1;37072;37068:9;37061:16;;36822:261;;;;:::o;37089:185::-;;37146:20;37164:1;37146:20;:::i;:::-;37141:25;;37180:20;37198:1;37180:20;:::i;:::-;37175:25;;37219:1;37209:2;;37224:18;;:::i;:::-;37209:2;37266:1;37263;37259:9;37254:14;;37131:143;;;;:::o;37280:348::-;;37343:20;37361:1;37343:20;:::i;:::-;37338:25;;37377:20;37395:1;37377:20;:::i;:::-;37372:25;;37565:1;37497:66;37493:74;37490:1;37487:81;37482:1;37475:9;37468:17;37464:105;37461:2;;;37572:18;;:::i;:::-;37461:2;37620:1;37617;37613:9;37602:20;;37328:300;;;;:::o;37634:191::-;;37694:20;37712:1;37694:20;:::i;:::-;37689:25;;37728:20;37746:1;37728:20;:::i;:::-;37723:25;;37767:1;37764;37761:8;37758:2;;;37772:18;;:::i;:::-;37758:2;37817:1;37814;37810:9;37802:17;;37679:146;;;;:::o;37831:96::-;;37897:24;37915:5;37897:24;:::i;:::-;37886:35;;37876:51;;;:::o;37933:90::-;;38010:5;38003:13;37996:21;37985:32;;37975:48;;;:::o;38029:149::-;;38105:66;38098:5;38094:78;38083:89;;38073:105;;;:::o;38184:126::-;;38261:42;38254:5;38250:54;38239:65;;38229:81;;;:::o;38316:77::-;;38382:5;38371:16;;38361:32;;;:::o;38399:154::-;38483:6;38478:3;38473;38460:30;38545:1;38536:6;38531:3;38527:16;38520:27;38450:103;;;:::o;38559:307::-;38627:1;38637:113;38651:6;38648:1;38645:13;38637:113;;;38736:1;38731:3;38727:11;38721:18;38717:1;38712:3;38708:11;38701:39;38673:2;38670:1;38666:10;38661:15;;38637:113;;;38768:6;38765:1;38762:13;38759:2;;;38848:1;38839:6;38834:3;38830:16;38823:27;38759:2;38608:258;;;;:::o;38872:320::-;;38953:1;38947:4;38943:12;38933:22;;39000:1;38994:4;38990:12;39021:18;39011:2;;39077:4;39069:6;39065:17;39055:27;;39011:2;39139;39131:6;39128:14;39108:18;39105:38;39102:2;;;39158:18;;:::i;:::-;39102:2;38923:269;;;;:::o;39198:233::-;;39260:24;39278:5;39260:24;:::i;:::-;39251:33;;39306:66;39299:5;39296:77;39293:2;;;39376:18;;:::i;:::-;39293:2;39423:1;39416:5;39412:13;39405:20;;39241:190;;;:::o;39437:176::-;;39486:20;39504:1;39486:20;:::i;:::-;39481:25;;39520:20;39538:1;39520:20;:::i;:::-;39515:25;;39559:1;39549:2;;39564:18;;:::i;:::-;39549:2;39605:1;39602;39598:9;39593:14;;39471:142;;;;:::o;39619:180::-;39667:77;39664:1;39657:88;39764:4;39761:1;39754:15;39788:4;39785:1;39778:15;39805:180;39853:77;39850:1;39843:88;39950:4;39947:1;39940:15;39974:4;39971:1;39964:15;39991:180;40039:77;40036:1;40029:88;40136:4;40133:1;40126:15;40160:4;40157:1;40150:15;40177:180;40225:77;40222:1;40215:88;40322:4;40319:1;40312:15;40346:4;40343:1;40336:15;40363:102;;40455:2;40451:7;40446:2;40439:5;40435:14;40431:28;40421:38;;40411:54;;;:::o;40471:122::-;40544:24;40562:5;40544:24;:::i;:::-;40537:5;40534:35;40524:2;;40583:1;40580;40573:12;40524:2;40514:79;:::o;40599:116::-;40669:21;40684:5;40669:21;:::i;:::-;40662:5;40659:32;40649:2;;40705:1;40702;40695:12;40649:2;40639:76;:::o;40721:120::-;40793:23;40810:5;40793:23;:::i;:::-;40786:5;40783:34;40773:2;;40831:1;40828;40821:12;40773:2;40763:78;:::o;40847:122::-;40920:24;40938:5;40920:24;:::i;:::-;40913:5;40910:35;40900:2;;40959:1;40956;40949:12;40900:2;40890:79;:::o

Swarm Source

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