ETH Price: $2,675.24 (+1.52%)
Gas: 1 Gwei

Token

Soul Cops (SOULCOPS)
 

Overview

Max Total Supply

2,229 SOULCOPS

Holders

406

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SOULCOPS
0x242110b579406b2cb7e3c782c09e9ac5fab90c10
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:
Soulcops

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-03
*/

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

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


/**
 * @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 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 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}.
 */
abstract contract ERC721M is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    // 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");

        uint count = 0;
        for( uint i = 0; i < _owners.length; i++ ){
          if( owner == _owners[i] ){
            count++;
          }
        }

        return count;
    }

    /**
     * @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 {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721M.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 tokenId < _owners.length && _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 = ERC721M.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);
        _owners.push(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 = ERC721M.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        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(ERC721M.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);
        _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(ERC721M.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 ERC721EnumerableM is ERC721M, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721M) 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 tokenId) {
        require(index < ERC721M.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }

        require(false, "ERC721Enumerable: owner index out of bounds");
    }

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

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

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

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// Created by thealphalets.com

contract Soulcops is ERC721EnumerableM, Ownable {
    using Strings for uint256;
    enum Stage {
        Shutdown,
        Presale,
        Publicsale
    }

    Stage public stage;
    
    bytes32 public root;

    uint256 public constant MAX_RESERVED = 500;
    uint256 public constant MAX_PRESALE = 2000 + MAX_RESERVED;
    uint256 public constant TOTAL = 10000;
    uint256 public constant PRICE = 0.08 ether;
    uint256 public constant PRE_PRICE = 0.068 ether;
    uint256 public constant MAX_NFT_SALE = 3;
    uint256 public reservedQtyMinted;
    uint256 public presaleQtyMinted;
    
    mapping(address => uint256) public listPresalePurchases;
    mapping(address => uint256) public listSalePurchases;

    string private _contractURI;
    string private _baseTokenURI;
    string private _defaultTokenURI;

    address SOULCOPS_WALLET = 0x71D54d6Dd26339B4d69C5cd922C4846aC6fb5E95;

    constructor(
        string memory defaultTokenURI,
        bytes32 merkleroot
    ) 
        ERC721M("Soul Cops", "SOULCOPS")  
    {
        _defaultTokenURI = defaultTokenURI;
        root = merkleroot;
    }
    
    function setMerkleRoot(bytes32 merkleroot) onlyOwner public 
    {
        root = merkleroot;
    }

     // get remaining pre sale qty
    function presaleQtyRemaining() public view returns (uint256) {
        return MAX_PRESALE - reservedQtyMinted;
    }

    // get remaining sale qty
    function saleQtyRemaining() external view returns (uint256) {
        return TOTAL - presaleQtyMinted - reservedQtyMinted;
    }
    
    // gift token to spesfic address
    function gifting(address receiver,uint256 tokenQuantity) external onlyOwner {
        uint256 supply = totalSupply();
        require(supply <= TOTAL, "All Soulcops minted");
        require(reservedQtyMinted + tokenQuantity <= MAX_RESERVED, "Reserved Empty");
      
        for (uint256 i = 0; i < tokenQuantity; i++) {
            reservedQtyMinted++;
            _safeMint(receiver, supply++);
        }
    }

    // presale sale buy
    function presaleBuy(uint256 tokenQuantity, uint256 allowance, bytes32[] calldata proof) external payable {
        uint256 supply = totalSupply();
        require(_verify(_leaf(msg.sender, allowance), proof), "Invalid merkle proof");
        require(stage==Stage.Presale, "The presale not active");
        require(supply + tokenQuantity <= TOTAL, "Minting would exceed the sale allocation");
        require(presaleQtyMinted + tokenQuantity <= presaleQtyRemaining(), "Minting would exceed the presale allocation");
        require(listPresalePurchases[msg.sender] + tokenQuantity <= allowance, "You can not mint exceeds maximum NFT");
        require(PRE_PRICE * tokenQuantity == msg.value, "ETH sent not match with total purchase");
        
        listPresalePurchases[msg.sender] += tokenQuantity;

        for (uint256 i = 0; i < tokenQuantity; i++) {
            presaleQtyMinted++;
            _safeMint(msg.sender, supply++);
        }
    }
    
    // public sale buy
    function buy(uint256 tokenQuantity) external payable {
        uint256 supply = totalSupply();
        require(stage==Stage.Publicsale, "The sale not active");
        require(supply + tokenQuantity <= TOTAL, "Minting would exceed the sale allocation");
        require(listSalePurchases[msg.sender] + tokenQuantity <= MAX_NFT_SALE, "You can not mint exceeds maximum NFT");
        require(PRICE * tokenQuantity == msg.value, "ETH sent not match with total purchase");

        listSalePurchases[msg.sender] += tokenQuantity;

        for (uint256 i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, supply++);
        }
    }

    // get all token by owner addresss
    function tokensOfOwner(address _owner) external view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
    
    function withdraw() external onlyOwner {
        Address.sendValue(payable(SOULCOPS_WALLET), address(this).balance);
    }

    // list address presale purchased count
    function presalePurchasedCount(address addr) external view returns (uint256) {
        return listPresalePurchases[addr];
    }
    
    // change stage presale, sale, and shutdown
    function setStage(Stage _stage) external {
        stage = _stage;
    }

    function setContractURI(string calldata URI) external onlyOwner {
        _contractURI = URI;
    }
    
    function setBaseURI(string calldata URI) external onlyOwner {
        _baseTokenURI = URI;
    }
    
    function setDefaultTokenURI(string calldata URI) external onlyOwner {
        _defaultTokenURI = URI;
    }
    
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function baseURI() public view returns (string memory) {
        return _baseTokenURI;
    }

    // get tokenURI by index, add default base uri
    function tokenURI(uint256 tokenId) external override view 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())) : _defaultTokenURI;
    }


    function _leaf(address account, uint256 allowance)internal pure returns (bytes32)
    {
        return keccak256(abi.encodePacked(account,allowance));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool)
    {
        return MerkleProof.verify(proof, root, leaf);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"defaultTokenURI","type":"string"},{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"gifting","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"listPresalePurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"listSalePurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleQtyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleQtyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedQtyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleQtyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setDefaultTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Soulcops.Stage","name":"_stage","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum Soulcops.Stage","name":"","type":"uint8"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527371d54d6dd26339b4d69c5cd922c4846ac6fb5e95600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b50604051620056ee380380620056ee83398181016040528101906200008c91906200037b565b6040518060400160405280600981526020017f536f756c20436f707300000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f534f554c434f505300000000000000000000000000000000000000000000000081525081600090805190602001906200011092919062000242565b5080600190805190602001906200012992919062000242565b5050506200014c620001406200017460201b60201c565b6200017c60201b60201c565b81600d90805190602001906200016492919062000242565b5080600681905550505062000569565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002509062000474565b90600052602060002090601f016020900481019282620002745760008555620002c0565b82601f106200028f57805160ff1916838001178555620002c0565b82800160010185558215620002c0579182015b82811115620002bf578251825591602001919060010190620002a2565b5b509050620002cf9190620002d3565b5090565b5b80821115620002ee576000816000905550600101620002d4565b5090565b6000620003096200030384620003fe565b620003d5565b9050828152602081018484840111156200032257600080fd5b6200032f8482856200043e565b509392505050565b60008151905062000348816200054f565b92915050565b600082601f8301126200036057600080fd5b815162000372848260208601620002f2565b91505092915050565b600080604083850312156200038f57600080fd5b600083015167ffffffffffffffff811115620003aa57600080fd5b620003b8858286016200034e565b9250506020620003cb8582860162000337565b9150509250929050565b6000620003e1620003f4565b9050620003ef8282620004aa565b919050565b6000604051905090565b600067ffffffffffffffff8211156200041c576200041b6200050f565b5b62000427826200053e565b9050602081019050919050565b6000819050919050565b60005b838110156200045e57808201518184015260208101905062000441565b838111156200046e576000848401525b50505050565b600060028204905060018216806200048d57607f821691505b60208210811415620004a457620004a3620004e0565b5b50919050565b620004b5826200053e565b810181811067ffffffffffffffff82111715620004d757620004d66200050f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200055a8162000434565b81146200056657600080fd5b50565b61517580620005796000396000f3fe60806040526004361061027d5760003560e01c80636ba90c6e1161014f578063a125c824116100c1578063ce3cd9971161007a578063ce3cd997146109b5578063d96a094a146109de578063e8a3d485146109fa578063e985e9c514610a25578063ebf0c71714610a62578063f2fde38b14610a8d5761027d565b8063a125c82414610895578063a22cb465146108be578063b88d4fde146108e7578063c040e6b814610910578063c87b56dd1461093b578063ca3d3394146109785761027d565b80638462151c116101135780638462151c146107835780638d859f3e146107c05780638da5cb5b146107eb5780638f24ebfd14610816578063938e3d7b1461084157806395d89b411461086a5761027d565b80636ba90c6e146106b05780636c0360eb146106db57806370a0823114610706578063715018a6146107435780637cb647591461075a5761027d565b806338552d0d116101f3578063556fedd2116101ac578063556fedd21461059d57806355f804b3146105c857806358aaf18c146105f1578063599651bf1461060d5780635ce7af1f146106365780636352211e146106735761027d565b806338552d0d1461049f5780633a68ba58146104ca5780633ccfd60b146104f557806342842e0e1461050c5780634d4c4e99146105355780634f6ccce7146105605761027d565b80631abe10f0116102455780631abe10f01461037b5780632178656a146103a657806323b872dd146103d157806326b9f863146103fa57806327efc086146104375780632f745c59146104625761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806318160ddd14610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906137ca565b610ab6565b6040516102b6919061400b565b60405180910390f35b3480156102cb57600080fd5b506102d4610b30565b6040516102e1919061405c565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c919061388a565b610bc2565b60405161031e9190613f82565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613765565b610c47565b005b34801561035c57600080fd5b50610365610d5f565b604051610372919061441e565b60405180910390f35b34801561038757600080fd5b50610390610d6c565b60405161039d919061441e565b60405180910390f35b3480156103b257600080fd5b506103bb610d71565b6040516103c8919061441e565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f3919061365f565b610d95565b005b34801561040657600080fd5b50610421600480360381019061041c91906135fa565b610df5565b60405161042e919061441e565b60405180910390f35b34801561044357600080fd5b5061044c610e0d565b604051610459919061441e565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613765565b610e13565b604051610496919061441e565b60405180910390f35b3480156104ab57600080fd5b506104b4610f82565b6040516104c1919061441e565b60405180910390f35b3480156104d657600080fd5b506104df610f88565b6040516104ec919061441e565b60405180910390f35b34801561050157600080fd5b5061050a610fac565b005b34801561051857600080fd5b50610533600480360381019061052e919061365f565b611056565b005b34801561054157600080fd5b5061054a611076565b604051610557919061441e565b60405180910390f35b34801561056c57600080fd5b506105876004803603810190610582919061388a565b611089565b604051610594919061441e565b60405180910390f35b3480156105a957600080fd5b506105b26110dc565b6040516105bf919061441e565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190613845565b6110e7565b005b61060b600480360381019061060691906138b3565b611179565b005b34801561061957600080fd5b50610634600480360381019061062f9190613765565b61150c565b005b34801561064257600080fd5b5061065d600480360381019061065891906135fa565b61167d565b60405161066a919061441e565b60405180910390f35b34801561067f57600080fd5b5061069a6004803603810190610695919061388a565b6116c6565b6040516106a79190613f82565b60405180910390f35b3480156106bc57600080fd5b506106c56117a9565b6040516106d2919061441e565b60405180910390f35b3480156106e757600080fd5b506106f06117af565b6040516106fd919061405c565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906135fa565b611841565b60405161073a919061441e565b60405180910390f35b34801561074f57600080fd5b50610758611987565b005b34801561076657600080fd5b50610781600480360381019061077c91906137a1565b611a0f565b005b34801561078f57600080fd5b506107aa60048036038101906107a591906135fa565b611a95565b6040516107b79190613fe9565b60405180910390f35b3480156107cc57600080fd5b506107d5611b8f565b6040516107e2919061441e565b60405180910390f35b3480156107f757600080fd5b50610800611b9b565b60405161080d9190613f82565b60405180910390f35b34801561082257600080fd5b5061082b611bc5565b604051610838919061441e565b60405180910390f35b34801561084d57600080fd5b5061086860048036038101906108639190613845565b611bcb565b005b34801561087657600080fd5b5061087f611c5d565b60405161088c919061405c565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b79190613845565b611cef565b005b3480156108ca57600080fd5b506108e560048036038101906108e09190613729565b611d81565b005b3480156108f357600080fd5b5061090e600480360381019061090991906136ae565b611f02565b005b34801561091c57600080fd5b50610925611f64565b6040516109329190614041565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d919061388a565b611f77565b60405161096f919061405c565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a91906135fa565b612099565b6040516109ac919061441e565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d7919061381c565b6120b1565b005b6109f860048036038101906109f3919061388a565b612104565b005b348015610a0657600080fd5b50610a0f612393565b604051610a1c919061405c565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190613623565b612425565b604051610a59919061400b565b60405180910390f35b348015610a6e57600080fd5b50610a776124b9565b604051610a849190614026565b60405180910390f35b348015610a9957600080fd5b50610ab46004803603810190610aaf91906135fa565b6124bf565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b295750610b28826125b7565b5b9050919050565b606060008054610b3f90614710565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6b90614710565b8015610bb85780601f10610b8d57610100808354040283529160200191610bb8565b820191906000526020600020905b815481529060010190602001808311610b9b57829003601f168201915b5050505050905090565b6000610bcd82612699565b610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c03906142fe565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c52826116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba906143be565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce2612747565b73ffffffffffffffffffffffffffffffffffffffff161480610d115750610d1081610d0b612747565b612425565b5b610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d479061425e565b60405180910390fd5b610d5a838361274f565b505050565b6000600280549050905090565b600381565b6000600754600854612710610d8691906145f7565b610d9091906145f7565b905090565b610da6610da0612747565b82612808565b610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906143de565b60405180910390fd5b610df08383836128e6565b505050565b60096020528060005260406000206000915090505481565b61271081565b6000610e1e83611841565b8210610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e56906140fe565b60405180910390fd5b6000805b600280549050811015610f385760028181548110610eaa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610f275783821415610f1a578092505050610f7c565b81610f2490614773565b91505b80610f3190614773565b9050610e63565b506000610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f71906140fe565b60405180910390fd5b505b92915050565b60075481565b60006007546101f46107d0610f9d9190614516565b610fa791906145f7565b905090565b610fb4612747565b73ffffffffffffffffffffffffffffffffffffffff16610fd2611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f9061431e565b60405180910390fd5b611054600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647612ac5565b565b61107183838360405180602001604052806000815250611f02565b505050565b6101f46107d06110869190614516565b81565b6000611093610d5f565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb906143fe565b60405180910390fd5b819050919050565b66f195a3c4ba000081565b6110ef612747565b73ffffffffffffffffffffffffffffffffffffffff1661110d611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a9061431e565b60405180910390fd5b8181600c91906111749291906133c8565b505050565b6000611183610d5f565b90506111d96111923386612bb9565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612bec565b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f9061433e565b60405180910390fd5b60016002811115611252577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600560149054906101000a900460ff16600281111561129a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d1906140de565b60405180910390fd5b61271085826112e99190614516565b111561132a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113219061409e565b60405180910390fd5b611332610f88565b856008546113409190614516565b1115611381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113789061421e565b60405180910390fd5b8385600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113cd9190614516565b111561140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906140be565b60405180910390fd5b348566f195a3c4ba0000611422919061459d565b14611462576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114599061407e565b60405180910390fd5b84600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b19190614516565b9250508190555060005b8581101561150457600860008154809291906114d690614773565b91905055506114f13383806114ea90614773565b9450612c03565b80806114fc90614773565b9150506114bb565b505050505050565b611514612747565b73ffffffffffffffffffffffffffffffffffffffff16611532611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f9061431e565b60405180910390fd5b6000611592610d5f565b90506127108111156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d09061439e565b60405180910390fd5b6101f4826007546115ea9190614516565b111561162b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116229061423e565b60405180910390fd5b60005b82811015611677576007600081548092919061164990614773565b919050555061166484838061165d90614773565b9450612c03565b808061166f90614773565b91505061162e565b50505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060028381548110611703577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061429e565b60405180910390fd5b80915050919050565b6101f481565b6060600c80546117be90614710565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea90614710565b80156118375780601f1061180c57610100808354040283529160200191611837565b820191906000526020600020905b81548152906001019060200180831161181a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a99061427e565b60405180910390fd5b6000805b60028054905081101561197d57600281815481106118fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561196a57818061196690614773565b9250505b808061197590614773565b9150506118b6565b5080915050919050565b61198f612747565b73ffffffffffffffffffffffffffffffffffffffff166119ad611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa9061431e565b60405180910390fd5b611a0d6000612c21565b565b611a17612747565b73ffffffffffffffffffffffffffffffffffffffff16611a35611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061431e565b60405180910390fd5b8060068190555050565b60606000611aa283611841565b905060008167ffffffffffffffff811115611ae6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b145781602001602082028036833780820191505090505b50905060005b82811015611b8457611b2c8582610e13565b828281518110611b65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611b7c90614773565b915050611b1a565b508092505050919050565b67011c37937e08000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b611bd3612747565b73ffffffffffffffffffffffffffffffffffffffff16611bf1611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e9061431e565b60405180910390fd5b8181600b9190611c589291906133c8565b505050565b606060018054611c6c90614710565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9890614710565b8015611ce55780601f10611cba57610100808354040283529160200191611ce5565b820191906000526020600020905b815481529060010190602001808311611cc857829003601f168201915b5050505050905090565b611cf7612747565b73ffffffffffffffffffffffffffffffffffffffff16611d15611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061431e565b60405180910390fd5b8181600d9190611d7c9291906133c8565b505050565b611d89612747565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee9061419e565b60405180910390fd5b8060046000611e04612747565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eb1612747565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ef6919061400b565b60405180910390a35050565b611f13611f0d612747565b83612808565b611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f49906143de565b60405180910390fd5b611f5e84848484612ce7565b50505050565b600560149054906101000a900460ff1681565b6060611f8282612699565b611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb89061437e565b60405180910390fd5b6000611fcb6117af565b9050600081511161206657600d8054611fe390614710565b80601f016020809104026020016040519081016040528092919081815260200182805461200f90614710565b801561205c5780601f106120315761010080835404028352916020019161205c565b820191906000526020600020905b81548152906001019060200180831161203f57829003601f168201915b5050505050612091565b8061207084612d43565b604051602001612081929190613f49565b6040516020818303038152906040525b915050919050565b600a6020528060005260406000206000915090505481565b80600560146101000a81548160ff021916908360028111156120fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b600061210e610d5f565b9050600280811115612149577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600560149054906101000a900460ff166002811115612191577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c8906142de565b60405180910390fd5b61271082826121e09190614516565b1115612221576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122189061409e565b60405180910390fd5b600382600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461226e9190614516565b11156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a6906140be565b60405180910390fd5b348267011c37937e0800006122c4919061459d565b14612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb9061407e565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123539190614516565b9250508190555060005b8281101561238e5761237b33838061237490614773565b9450612c03565b808061238690614773565b91505061235d565b505050565b6060600b80546123a290614710565b80601f01602080910402602001604051908101604052809291908181526020018280546123ce90614710565b801561241b5780601f106123f05761010080835404028352916020019161241b565b820191906000526020600020905b8154815290600101906020018083116123fe57829003601f168201915b5050505050905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60065481565b6124c7612747565b73ffffffffffffffffffffffffffffffffffffffff166124e5611b9b565b73ffffffffffffffffffffffffffffffffffffffff161461253b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125329061431e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a29061413e565b60405180910390fd5b6125b481612c21565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612692575061269182612ef0565b5b9050919050565b6000600280549050821080156127405750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106126fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127c2836116c6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061281382612699565b612852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612849906141fe565b60405180910390fd5b600061285d836116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128cc57508373ffffffffffffffffffffffffffffffffffffffff166128b484610bc2565b73ffffffffffffffffffffffffffffffffffffffff16145b806128dd57506128dc8185612425565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612906826116c6565b73ffffffffffffffffffffffffffffffffffffffff161461295c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129539061435e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c39061417e565b60405180910390fd5b6129d7838383612f5a565b6129e260008261274f565b8160028281548110612a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aff906141de565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b2e90613f6d565b60006040518083038185875af1925050503d8060008114612b6b576040519150601f19603f3d011682016040523d82523d6000602084013e612b70565b606091505b5050905080612bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bab906141be565b60405180910390fd5b505050565b60008282604051602001612bce929190613ef1565b60405160208183030381529060405280519060200120905092915050565b6000612bfb8260065485612f5f565b905092915050565b612c1d82826040518060200160405280600081525061303b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cf28484846128e6565b612cfe84848484613096565b612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d349061411e565b60405180910390fd5b50505050565b60606000821415612d8b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eeb565b600082905060005b60008214612dbd578080612da690614773565b915050600a82612db6919061456c565b9150612d93565b60008167ffffffffffffffff811115612dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e315781602001600182028036833780820191505090505b5090505b60008514612ee457600182612e4a91906145f7565b9150600a85612e5991906147f4565b6030612e659190614516565b60f81b818381518110612ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612edd919061456c565b9450612e35565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60008082905060005b855181101561302d576000868281518110612fac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612fed578281604051602001612fd0929190613f1d565b604051602081830303815290604052805190602001209250613019565b8083604051602001613000929190613f1d565b6040516020818303038152906040528051906020012092505b50808061302590614773565b915050612f68565b508381149150509392505050565b613045838361322d565b6130526000848484613096565b613091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130889061411e565b60405180910390fd5b505050565b60006130b78473ffffffffffffffffffffffffffffffffffffffff166133b5565b15613220578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130e0612747565b8786866040518563ffffffff1660e01b81526004016131029493929190613f9d565b602060405180830381600087803b15801561311c57600080fd5b505af192505050801561314d57506040513d601f19601f8201168201806040525081019061314a91906137f3565b60015b6131d0573d806000811461317d576040519150601f19603f3d011682016040523d82523d6000602084013e613182565b606091505b506000815114156131c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bf9061411e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613225565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561329d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613294906142be565b60405180910390fd5b6132a681612699565b156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dd9061415e565b60405180910390fd5b6132f260008383612f5a565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546133d490614710565b90600052602060002090601f0160209004810192826133f6576000855561343d565b82601f1061340f57803560ff191683800117855561343d565b8280016001018555821561343d579182015b8281111561343c578235825591602001919060010190613421565b5b50905061344a919061344e565b5090565b5b8082111561346757600081600090555060010161344f565b5090565b600061347e6134798461445e565b614439565b90508281526020810184848401111561349657600080fd5b6134a18482856146ce565b509392505050565b6000813590506134b8816150bc565b92915050565b60008083601f8401126134d057600080fd5b8235905067ffffffffffffffff8111156134e957600080fd5b60208301915083602082028301111561350157600080fd5b9250929050565b600081359050613517816150d3565b92915050565b60008135905061352c816150ea565b92915050565b60008135905061354181615101565b92915050565b60008151905061355681615101565b92915050565b600082601f83011261356d57600080fd5b813561357d84826020860161346b565b91505092915050565b60008135905061359581615118565b92915050565b60008083601f8401126135ad57600080fd5b8235905067ffffffffffffffff8111156135c657600080fd5b6020830191508360018202830111156135de57600080fd5b9250929050565b6000813590506135f481615128565b92915050565b60006020828403121561360c57600080fd5b600061361a848285016134a9565b91505092915050565b6000806040838503121561363657600080fd5b6000613644858286016134a9565b9250506020613655858286016134a9565b9150509250929050565b60008060006060848603121561367457600080fd5b6000613682868287016134a9565b9350506020613693868287016134a9565b92505060406136a4868287016135e5565b9150509250925092565b600080600080608085870312156136c457600080fd5b60006136d2878288016134a9565b94505060206136e3878288016134a9565b93505060406136f4878288016135e5565b925050606085013567ffffffffffffffff81111561371157600080fd5b61371d8782880161355c565b91505092959194509250565b6000806040838503121561373c57600080fd5b600061374a858286016134a9565b925050602061375b85828601613508565b9150509250929050565b6000806040838503121561377857600080fd5b6000613786858286016134a9565b9250506020613797858286016135e5565b9150509250929050565b6000602082840312156137b357600080fd5b60006137c18482850161351d565b91505092915050565b6000602082840312156137dc57600080fd5b60006137ea84828501613532565b91505092915050565b60006020828403121561380557600080fd5b600061381384828501613547565b91505092915050565b60006020828403121561382e57600080fd5b600061383c84828501613586565b91505092915050565b6000806020838503121561385857600080fd5b600083013567ffffffffffffffff81111561387257600080fd5b61387e8582860161359b565b92509250509250929050565b60006020828403121561389c57600080fd5b60006138aa848285016135e5565b91505092915050565b600080600080606085870312156138c957600080fd5b60006138d7878288016135e5565b94505060206138e8878288016135e5565b935050604085013567ffffffffffffffff81111561390557600080fd5b613911878288016134be565b925092505092959194509250565b600061392b8383613ebc565b60208301905092915050565b6139408161462b565b82525050565b6139576139528261462b565b6147bc565b82525050565b60006139688261449f565b61397281856144cd565b935061397d8361448f565b8060005b838110156139ae578151613995888261391f565b97506139a0836144c0565b925050600181019050613981565b5085935050505092915050565b6139c48161463d565b82525050565b6139d381614649565b82525050565b6139ea6139e582614649565b6147ce565b82525050565b60006139fb826144aa565b613a0581856144de565b9350613a158185602086016146dd565b613a1e81614910565b840191505092915050565b613a32816146bc565b82525050565b6000613a43826144b5565b613a4d81856144fa565b9350613a5d8185602086016146dd565b613a6681614910565b840191505092915050565b6000613a7c826144b5565b613a86818561450b565b9350613a968185602086016146dd565b80840191505092915050565b6000613aaf6026836144fa565b9150613aba8261492e565b604082019050919050565b6000613ad26028836144fa565b9150613add8261497d565b604082019050919050565b6000613af56024836144fa565b9150613b00826149cc565b604082019050919050565b6000613b186016836144fa565b9150613b2382614a1b565b602082019050919050565b6000613b3b602b836144fa565b9150613b4682614a44565b604082019050919050565b6000613b5e6032836144fa565b9150613b6982614a93565b604082019050919050565b6000613b816026836144fa565b9150613b8c82614ae2565b604082019050919050565b6000613ba4601c836144fa565b9150613baf82614b31565b602082019050919050565b6000613bc76024836144fa565b9150613bd282614b5a565b604082019050919050565b6000613bea6019836144fa565b9150613bf582614ba9565b602082019050919050565b6000613c0d603a836144fa565b9150613c1882614bd2565b604082019050919050565b6000613c30601d836144fa565b9150613c3b82614c21565b602082019050919050565b6000613c53602c836144fa565b9150613c5e82614c4a565b604082019050919050565b6000613c76602b836144fa565b9150613c8182614c99565b604082019050919050565b6000613c99600e836144fa565b9150613ca482614ce8565b602082019050919050565b6000613cbc6038836144fa565b9150613cc782614d11565b604082019050919050565b6000613cdf602a836144fa565b9150613cea82614d60565b604082019050919050565b6000613d026029836144fa565b9150613d0d82614daf565b604082019050919050565b6000613d256020836144fa565b9150613d3082614dfe565b602082019050919050565b6000613d486013836144fa565b9150613d5382614e27565b602082019050919050565b6000613d6b602c836144fa565b9150613d7682614e50565b604082019050919050565b6000613d8e6020836144fa565b9150613d9982614e9f565b602082019050919050565b6000613db16014836144fa565b9150613dbc82614ec8565b602082019050919050565b6000613dd46029836144fa565b9150613ddf82614ef1565b604082019050919050565b6000613df7602f836144fa565b9150613e0282614f40565b604082019050919050565b6000613e1a6013836144fa565b9150613e2582614f8f565b602082019050919050565b6000613e3d6021836144fa565b9150613e4882614fb8565b604082019050919050565b6000613e606000836144ef565b9150613e6b82615007565b600082019050919050565b6000613e836031836144fa565b9150613e8e8261500a565b604082019050919050565b6000613ea6602c836144fa565b9150613eb182615059565b604082019050919050565b613ec5816146b2565b82525050565b613ed4816146b2565b82525050565b613eeb613ee6826146b2565b6147ea565b82525050565b6000613efd8285613946565b601482019150613f0d8284613eda565b6020820191508190509392505050565b6000613f2982856139d9565b602082019150613f3982846139d9565b6020820191508190509392505050565b6000613f558285613a71565b9150613f618284613a71565b91508190509392505050565b6000613f7882613e53565b9150819050919050565b6000602082019050613f976000830184613937565b92915050565b6000608082019050613fb26000830187613937565b613fbf6020830186613937565b613fcc6040830185613ecb565b8181036060830152613fde81846139f0565b905095945050505050565b60006020820190508181036000830152614003818461395d565b905092915050565b600060208201905061402060008301846139bb565b92915050565b600060208201905061403b60008301846139ca565b92915050565b60006020820190506140566000830184613a29565b92915050565b600060208201905081810360008301526140768184613a38565b905092915050565b6000602082019050818103600083015261409781613aa2565b9050919050565b600060208201905081810360008301526140b781613ac5565b9050919050565b600060208201905081810360008301526140d781613ae8565b9050919050565b600060208201905081810360008301526140f781613b0b565b9050919050565b6000602082019050818103600083015261411781613b2e565b9050919050565b6000602082019050818103600083015261413781613b51565b9050919050565b6000602082019050818103600083015261415781613b74565b9050919050565b6000602082019050818103600083015261417781613b97565b9050919050565b6000602082019050818103600083015261419781613bba565b9050919050565b600060208201905081810360008301526141b781613bdd565b9050919050565b600060208201905081810360008301526141d781613c00565b9050919050565b600060208201905081810360008301526141f781613c23565b9050919050565b6000602082019050818103600083015261421781613c46565b9050919050565b6000602082019050818103600083015261423781613c69565b9050919050565b6000602082019050818103600083015261425781613c8c565b9050919050565b6000602082019050818103600083015261427781613caf565b9050919050565b6000602082019050818103600083015261429781613cd2565b9050919050565b600060208201905081810360008301526142b781613cf5565b9050919050565b600060208201905081810360008301526142d781613d18565b9050919050565b600060208201905081810360008301526142f781613d3b565b9050919050565b6000602082019050818103600083015261431781613d5e565b9050919050565b6000602082019050818103600083015261433781613d81565b9050919050565b6000602082019050818103600083015261435781613da4565b9050919050565b6000602082019050818103600083015261437781613dc7565b9050919050565b6000602082019050818103600083015261439781613dea565b9050919050565b600060208201905081810360008301526143b781613e0d565b9050919050565b600060208201905081810360008301526143d781613e30565b9050919050565b600060208201905081810360008301526143f781613e76565b9050919050565b6000602082019050818103600083015261441781613e99565b9050919050565b60006020820190506144336000830184613ecb565b92915050565b6000614443614454565b905061444f8282614742565b919050565b6000604051905090565b600067ffffffffffffffff821115614479576144786148e1565b5b61448282614910565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614521826146b2565b915061452c836146b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456157614560614825565b5b828201905092915050565b6000614577826146b2565b9150614582836146b2565b92508261459257614591614854565b5b828204905092915050565b60006145a8826146b2565b91506145b3836146b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145ec576145eb614825565b5b828202905092915050565b6000614602826146b2565b915061460d836146b2565b9250828210156146205761461f614825565b5b828203905092915050565b600061463682614692565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061468d826150a8565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146c78261467f565b9050919050565b82818337600083830152505050565b60005b838110156146fb5780820151818401526020810190506146e0565b8381111561470a576000848401525b50505050565b6000600282049050600182168061472857607f821691505b6020821081141561473c5761473b6148b2565b5b50919050565b61474b82614910565b810181811067ffffffffffffffff8211171561476a576147696148e1565b5b80604052505050565b600061477e826146b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147b1576147b0614825565b5b600182019050919050565b60006147c7826147d8565b9050919050565b6000819050919050565b60006147e382614921565b9050919050565b6000819050919050565b60006147ff826146b2565b915061480a836146b2565b92508261481a57614819614854565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4554482073656e74206e6f74206d61746368207769746820746f74616c20707560008201527f7263686173650000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564207468652073616c6520616c60008201527f6c6f636174696f6e000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206e6f74206d696e742065786365656473206d6178696d756d60008201527f204e465400000000000000000000000000000000000000000000000000000000602082015250565b7f5468652070726573616c65206e6f742061637469766500000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564207468652070726573616c6560008201527f20616c6c6f636174696f6e000000000000000000000000000000000000000000602082015250565b7f526573657276656420456d707479000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5468652073616c65206e6f742061637469766500000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c6c20536f756c636f7073206d696e74656400000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600381106150b9576150b8614883565b5b50565b6150c58161462b565b81146150d057600080fd5b50565b6150dc8161463d565b81146150e757600080fd5b50565b6150f381614649565b81146150fe57600080fd5b50565b61510a81614653565b811461511557600080fd5b50565b6003811061512557600080fd5b50565b615131816146b2565b811461513c57600080fd5b5056fea264697066735822122080557aa808a4dd9cebcd1005c195d262dbd669fd2909871e30800a83c69b8a3064736f6c634300080400330000000000000000000000000000000000000000000000000000000000000040fcaacdfb0421ebf1ee6071b69f686cb0f14aab0605c330663e7cfcbeaa9cef180000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d59696d6b4276716f6f635064744c73323653326f5a3847534d56686b6f4133786f48643479696431785236420000000000000000000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80636ba90c6e1161014f578063a125c824116100c1578063ce3cd9971161007a578063ce3cd997146109b5578063d96a094a146109de578063e8a3d485146109fa578063e985e9c514610a25578063ebf0c71714610a62578063f2fde38b14610a8d5761027d565b8063a125c82414610895578063a22cb465146108be578063b88d4fde146108e7578063c040e6b814610910578063c87b56dd1461093b578063ca3d3394146109785761027d565b80638462151c116101135780638462151c146107835780638d859f3e146107c05780638da5cb5b146107eb5780638f24ebfd14610816578063938e3d7b1461084157806395d89b411461086a5761027d565b80636ba90c6e146106b05780636c0360eb146106db57806370a0823114610706578063715018a6146107435780637cb647591461075a5761027d565b806338552d0d116101f3578063556fedd2116101ac578063556fedd21461059d57806355f804b3146105c857806358aaf18c146105f1578063599651bf1461060d5780635ce7af1f146106365780636352211e146106735761027d565b806338552d0d1461049f5780633a68ba58146104ca5780633ccfd60b146104f557806342842e0e1461050c5780634d4c4e99146105355780634f6ccce7146105605761027d565b80631abe10f0116102455780631abe10f01461037b5780632178656a146103a657806323b872dd146103d157806326b9f863146103fa57806327efc086146104375780632f745c59146104625761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806318160ddd14610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906137ca565b610ab6565b6040516102b6919061400b565b60405180910390f35b3480156102cb57600080fd5b506102d4610b30565b6040516102e1919061405c565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c919061388a565b610bc2565b60405161031e9190613f82565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613765565b610c47565b005b34801561035c57600080fd5b50610365610d5f565b604051610372919061441e565b60405180910390f35b34801561038757600080fd5b50610390610d6c565b60405161039d919061441e565b60405180910390f35b3480156103b257600080fd5b506103bb610d71565b6040516103c8919061441e565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f3919061365f565b610d95565b005b34801561040657600080fd5b50610421600480360381019061041c91906135fa565b610df5565b60405161042e919061441e565b60405180910390f35b34801561044357600080fd5b5061044c610e0d565b604051610459919061441e565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613765565b610e13565b604051610496919061441e565b60405180910390f35b3480156104ab57600080fd5b506104b4610f82565b6040516104c1919061441e565b60405180910390f35b3480156104d657600080fd5b506104df610f88565b6040516104ec919061441e565b60405180910390f35b34801561050157600080fd5b5061050a610fac565b005b34801561051857600080fd5b50610533600480360381019061052e919061365f565b611056565b005b34801561054157600080fd5b5061054a611076565b604051610557919061441e565b60405180910390f35b34801561056c57600080fd5b506105876004803603810190610582919061388a565b611089565b604051610594919061441e565b60405180910390f35b3480156105a957600080fd5b506105b26110dc565b6040516105bf919061441e565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190613845565b6110e7565b005b61060b600480360381019061060691906138b3565b611179565b005b34801561061957600080fd5b50610634600480360381019061062f9190613765565b61150c565b005b34801561064257600080fd5b5061065d600480360381019061065891906135fa565b61167d565b60405161066a919061441e565b60405180910390f35b34801561067f57600080fd5b5061069a6004803603810190610695919061388a565b6116c6565b6040516106a79190613f82565b60405180910390f35b3480156106bc57600080fd5b506106c56117a9565b6040516106d2919061441e565b60405180910390f35b3480156106e757600080fd5b506106f06117af565b6040516106fd919061405c565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906135fa565b611841565b60405161073a919061441e565b60405180910390f35b34801561074f57600080fd5b50610758611987565b005b34801561076657600080fd5b50610781600480360381019061077c91906137a1565b611a0f565b005b34801561078f57600080fd5b506107aa60048036038101906107a591906135fa565b611a95565b6040516107b79190613fe9565b60405180910390f35b3480156107cc57600080fd5b506107d5611b8f565b6040516107e2919061441e565b60405180910390f35b3480156107f757600080fd5b50610800611b9b565b60405161080d9190613f82565b60405180910390f35b34801561082257600080fd5b5061082b611bc5565b604051610838919061441e565b60405180910390f35b34801561084d57600080fd5b5061086860048036038101906108639190613845565b611bcb565b005b34801561087657600080fd5b5061087f611c5d565b60405161088c919061405c565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b79190613845565b611cef565b005b3480156108ca57600080fd5b506108e560048036038101906108e09190613729565b611d81565b005b3480156108f357600080fd5b5061090e600480360381019061090991906136ae565b611f02565b005b34801561091c57600080fd5b50610925611f64565b6040516109329190614041565b60405180910390f35b34801561094757600080fd5b50610962600480360381019061095d919061388a565b611f77565b60405161096f919061405c565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a91906135fa565b612099565b6040516109ac919061441e565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d7919061381c565b6120b1565b005b6109f860048036038101906109f3919061388a565b612104565b005b348015610a0657600080fd5b50610a0f612393565b604051610a1c919061405c565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190613623565b612425565b604051610a59919061400b565b60405180910390f35b348015610a6e57600080fd5b50610a776124b9565b604051610a849190614026565b60405180910390f35b348015610a9957600080fd5b50610ab46004803603810190610aaf91906135fa565b6124bf565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b295750610b28826125b7565b5b9050919050565b606060008054610b3f90614710565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6b90614710565b8015610bb85780601f10610b8d57610100808354040283529160200191610bb8565b820191906000526020600020905b815481529060010190602001808311610b9b57829003601f168201915b5050505050905090565b6000610bcd82612699565b610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c03906142fe565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c52826116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba906143be565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce2612747565b73ffffffffffffffffffffffffffffffffffffffff161480610d115750610d1081610d0b612747565b612425565b5b610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d479061425e565b60405180910390fd5b610d5a838361274f565b505050565b6000600280549050905090565b600381565b6000600754600854612710610d8691906145f7565b610d9091906145f7565b905090565b610da6610da0612747565b82612808565b610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906143de565b60405180910390fd5b610df08383836128e6565b505050565b60096020528060005260406000206000915090505481565b61271081565b6000610e1e83611841565b8210610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e56906140fe565b60405180910390fd5b6000805b600280549050811015610f385760028181548110610eaa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610f275783821415610f1a578092505050610f7c565b81610f2490614773565b91505b80610f3190614773565b9050610e63565b506000610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f71906140fe565b60405180910390fd5b505b92915050565b60075481565b60006007546101f46107d0610f9d9190614516565b610fa791906145f7565b905090565b610fb4612747565b73ffffffffffffffffffffffffffffffffffffffff16610fd2611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f9061431e565b60405180910390fd5b611054600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647612ac5565b565b61107183838360405180602001604052806000815250611f02565b505050565b6101f46107d06110869190614516565b81565b6000611093610d5f565b82106110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb906143fe565b60405180910390fd5b819050919050565b66f195a3c4ba000081565b6110ef612747565b73ffffffffffffffffffffffffffffffffffffffff1661110d611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a9061431e565b60405180910390fd5b8181600c91906111749291906133c8565b505050565b6000611183610d5f565b90506111d96111923386612bb9565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612bec565b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f9061433e565b60405180910390fd5b60016002811115611252577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600560149054906101000a900460ff16600281111561129a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d1906140de565b60405180910390fd5b61271085826112e99190614516565b111561132a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113219061409e565b60405180910390fd5b611332610f88565b856008546113409190614516565b1115611381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113789061421e565b60405180910390fd5b8385600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113cd9190614516565b111561140e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611405906140be565b60405180910390fd5b348566f195a3c4ba0000611422919061459d565b14611462576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114599061407e565b60405180910390fd5b84600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b19190614516565b9250508190555060005b8581101561150457600860008154809291906114d690614773565b91905055506114f13383806114ea90614773565b9450612c03565b80806114fc90614773565b9150506114bb565b505050505050565b611514612747565b73ffffffffffffffffffffffffffffffffffffffff16611532611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f9061431e565b60405180910390fd5b6000611592610d5f565b90506127108111156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d09061439e565b60405180910390fd5b6101f4826007546115ea9190614516565b111561162b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116229061423e565b60405180910390fd5b60005b82811015611677576007600081548092919061164990614773565b919050555061166484838061165d90614773565b9450612c03565b808061166f90614773565b91505061162e565b50505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060028381548110611703577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061429e565b60405180910390fd5b80915050919050565b6101f481565b6060600c80546117be90614710565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea90614710565b80156118375780601f1061180c57610100808354040283529160200191611837565b820191906000526020600020905b81548152906001019060200180831161181a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a99061427e565b60405180910390fd5b6000805b60028054905081101561197d57600281815481106118fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561196a57818061196690614773565b9250505b808061197590614773565b9150506118b6565b5080915050919050565b61198f612747565b73ffffffffffffffffffffffffffffffffffffffff166119ad611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa9061431e565b60405180910390fd5b611a0d6000612c21565b565b611a17612747565b73ffffffffffffffffffffffffffffffffffffffff16611a35611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061431e565b60405180910390fd5b8060068190555050565b60606000611aa283611841565b905060008167ffffffffffffffff811115611ae6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b145781602001602082028036833780820191505090505b50905060005b82811015611b8457611b2c8582610e13565b828281518110611b65577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611b7c90614773565b915050611b1a565b508092505050919050565b67011c37937e08000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b611bd3612747565b73ffffffffffffffffffffffffffffffffffffffff16611bf1611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e9061431e565b60405180910390fd5b8181600b9190611c589291906133c8565b505050565b606060018054611c6c90614710565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9890614710565b8015611ce55780601f10611cba57610100808354040283529160200191611ce5565b820191906000526020600020905b815481529060010190602001808311611cc857829003601f168201915b5050505050905090565b611cf7612747565b73ffffffffffffffffffffffffffffffffffffffff16611d15611b9b565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061431e565b60405180910390fd5b8181600d9190611d7c9291906133c8565b505050565b611d89612747565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee9061419e565b60405180910390fd5b8060046000611e04612747565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eb1612747565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ef6919061400b565b60405180910390a35050565b611f13611f0d612747565b83612808565b611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f49906143de565b60405180910390fd5b611f5e84848484612ce7565b50505050565b600560149054906101000a900460ff1681565b6060611f8282612699565b611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb89061437e565b60405180910390fd5b6000611fcb6117af565b9050600081511161206657600d8054611fe390614710565b80601f016020809104026020016040519081016040528092919081815260200182805461200f90614710565b801561205c5780601f106120315761010080835404028352916020019161205c565b820191906000526020600020905b81548152906001019060200180831161203f57829003601f168201915b5050505050612091565b8061207084612d43565b604051602001612081929190613f49565b6040516020818303038152906040525b915050919050565b600a6020528060005260406000206000915090505481565b80600560146101000a81548160ff021916908360028111156120fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b600061210e610d5f565b9050600280811115612149577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600560149054906101000a900460ff166002811115612191577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c8906142de565b60405180910390fd5b61271082826121e09190614516565b1115612221576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122189061409e565b60405180910390fd5b600382600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461226e9190614516565b11156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a6906140be565b60405180910390fd5b348267011c37937e0800006122c4919061459d565b14612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb9061407e565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123539190614516565b9250508190555060005b8281101561238e5761237b33838061237490614773565b9450612c03565b808061238690614773565b91505061235d565b505050565b6060600b80546123a290614710565b80601f01602080910402602001604051908101604052809291908181526020018280546123ce90614710565b801561241b5780601f106123f05761010080835404028352916020019161241b565b820191906000526020600020905b8154815290600101906020018083116123fe57829003601f168201915b5050505050905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60065481565b6124c7612747565b73ffffffffffffffffffffffffffffffffffffffff166124e5611b9b565b73ffffffffffffffffffffffffffffffffffffffff161461253b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125329061431e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a29061413e565b60405180910390fd5b6125b481612c21565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612692575061269182612ef0565b5b9050919050565b6000600280549050821080156127405750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106126fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127c2836116c6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061281382612699565b612852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612849906141fe565b60405180910390fd5b600061285d836116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128cc57508373ffffffffffffffffffffffffffffffffffffffff166128b484610bc2565b73ffffffffffffffffffffffffffffffffffffffff16145b806128dd57506128dc8185612425565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612906826116c6565b73ffffffffffffffffffffffffffffffffffffffff161461295c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129539061435e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c39061417e565b60405180910390fd5b6129d7838383612f5a565b6129e260008261274f565b8160028281548110612a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aff906141de565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b2e90613f6d565b60006040518083038185875af1925050503d8060008114612b6b576040519150601f19603f3d011682016040523d82523d6000602084013e612b70565b606091505b5050905080612bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bab906141be565b60405180910390fd5b505050565b60008282604051602001612bce929190613ef1565b60405160208183030381529060405280519060200120905092915050565b6000612bfb8260065485612f5f565b905092915050565b612c1d82826040518060200160405280600081525061303b565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cf28484846128e6565b612cfe84848484613096565b612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d349061411e565b60405180910390fd5b50505050565b60606000821415612d8b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eeb565b600082905060005b60008214612dbd578080612da690614773565b915050600a82612db6919061456c565b9150612d93565b60008167ffffffffffffffff811115612dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e315781602001600182028036833780820191505090505b5090505b60008514612ee457600182612e4a91906145f7565b9150600a85612e5991906147f4565b6030612e659190614516565b60f81b818381518110612ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612edd919061456c565b9450612e35565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60008082905060005b855181101561302d576000868281518110612fac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612fed578281604051602001612fd0929190613f1d565b604051602081830303815290604052805190602001209250613019565b8083604051602001613000929190613f1d565b6040516020818303038152906040528051906020012092505b50808061302590614773565b915050612f68565b508381149150509392505050565b613045838361322d565b6130526000848484613096565b613091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130889061411e565b60405180910390fd5b505050565b60006130b78473ffffffffffffffffffffffffffffffffffffffff166133b5565b15613220578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130e0612747565b8786866040518563ffffffff1660e01b81526004016131029493929190613f9d565b602060405180830381600087803b15801561311c57600080fd5b505af192505050801561314d57506040513d601f19601f8201168201806040525081019061314a91906137f3565b60015b6131d0573d806000811461317d576040519150601f19603f3d011682016040523d82523d6000602084013e613182565b606091505b506000815114156131c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bf9061411e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613225565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561329d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613294906142be565b60405180910390fd5b6132a681612699565b156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dd9061415e565b60405180910390fd5b6132f260008383612f5a565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546133d490614710565b90600052602060002090601f0160209004810192826133f6576000855561343d565b82601f1061340f57803560ff191683800117855561343d565b8280016001018555821561343d579182015b8281111561343c578235825591602001919060010190613421565b5b50905061344a919061344e565b5090565b5b8082111561346757600081600090555060010161344f565b5090565b600061347e6134798461445e565b614439565b90508281526020810184848401111561349657600080fd5b6134a18482856146ce565b509392505050565b6000813590506134b8816150bc565b92915050565b60008083601f8401126134d057600080fd5b8235905067ffffffffffffffff8111156134e957600080fd5b60208301915083602082028301111561350157600080fd5b9250929050565b600081359050613517816150d3565b92915050565b60008135905061352c816150ea565b92915050565b60008135905061354181615101565b92915050565b60008151905061355681615101565b92915050565b600082601f83011261356d57600080fd5b813561357d84826020860161346b565b91505092915050565b60008135905061359581615118565b92915050565b60008083601f8401126135ad57600080fd5b8235905067ffffffffffffffff8111156135c657600080fd5b6020830191508360018202830111156135de57600080fd5b9250929050565b6000813590506135f481615128565b92915050565b60006020828403121561360c57600080fd5b600061361a848285016134a9565b91505092915050565b6000806040838503121561363657600080fd5b6000613644858286016134a9565b9250506020613655858286016134a9565b9150509250929050565b60008060006060848603121561367457600080fd5b6000613682868287016134a9565b9350506020613693868287016134a9565b92505060406136a4868287016135e5565b9150509250925092565b600080600080608085870312156136c457600080fd5b60006136d2878288016134a9565b94505060206136e3878288016134a9565b93505060406136f4878288016135e5565b925050606085013567ffffffffffffffff81111561371157600080fd5b61371d8782880161355c565b91505092959194509250565b6000806040838503121561373c57600080fd5b600061374a858286016134a9565b925050602061375b85828601613508565b9150509250929050565b6000806040838503121561377857600080fd5b6000613786858286016134a9565b9250506020613797858286016135e5565b9150509250929050565b6000602082840312156137b357600080fd5b60006137c18482850161351d565b91505092915050565b6000602082840312156137dc57600080fd5b60006137ea84828501613532565b91505092915050565b60006020828403121561380557600080fd5b600061381384828501613547565b91505092915050565b60006020828403121561382e57600080fd5b600061383c84828501613586565b91505092915050565b6000806020838503121561385857600080fd5b600083013567ffffffffffffffff81111561387257600080fd5b61387e8582860161359b565b92509250509250929050565b60006020828403121561389c57600080fd5b60006138aa848285016135e5565b91505092915050565b600080600080606085870312156138c957600080fd5b60006138d7878288016135e5565b94505060206138e8878288016135e5565b935050604085013567ffffffffffffffff81111561390557600080fd5b613911878288016134be565b925092505092959194509250565b600061392b8383613ebc565b60208301905092915050565b6139408161462b565b82525050565b6139576139528261462b565b6147bc565b82525050565b60006139688261449f565b61397281856144cd565b935061397d8361448f565b8060005b838110156139ae578151613995888261391f565b97506139a0836144c0565b925050600181019050613981565b5085935050505092915050565b6139c48161463d565b82525050565b6139d381614649565b82525050565b6139ea6139e582614649565b6147ce565b82525050565b60006139fb826144aa565b613a0581856144de565b9350613a158185602086016146dd565b613a1e81614910565b840191505092915050565b613a32816146bc565b82525050565b6000613a43826144b5565b613a4d81856144fa565b9350613a5d8185602086016146dd565b613a6681614910565b840191505092915050565b6000613a7c826144b5565b613a86818561450b565b9350613a968185602086016146dd565b80840191505092915050565b6000613aaf6026836144fa565b9150613aba8261492e565b604082019050919050565b6000613ad26028836144fa565b9150613add8261497d565b604082019050919050565b6000613af56024836144fa565b9150613b00826149cc565b604082019050919050565b6000613b186016836144fa565b9150613b2382614a1b565b602082019050919050565b6000613b3b602b836144fa565b9150613b4682614a44565b604082019050919050565b6000613b5e6032836144fa565b9150613b6982614a93565b604082019050919050565b6000613b816026836144fa565b9150613b8c82614ae2565b604082019050919050565b6000613ba4601c836144fa565b9150613baf82614b31565b602082019050919050565b6000613bc76024836144fa565b9150613bd282614b5a565b604082019050919050565b6000613bea6019836144fa565b9150613bf582614ba9565b602082019050919050565b6000613c0d603a836144fa565b9150613c1882614bd2565b604082019050919050565b6000613c30601d836144fa565b9150613c3b82614c21565b602082019050919050565b6000613c53602c836144fa565b9150613c5e82614c4a565b604082019050919050565b6000613c76602b836144fa565b9150613c8182614c99565b604082019050919050565b6000613c99600e836144fa565b9150613ca482614ce8565b602082019050919050565b6000613cbc6038836144fa565b9150613cc782614d11565b604082019050919050565b6000613cdf602a836144fa565b9150613cea82614d60565b604082019050919050565b6000613d026029836144fa565b9150613d0d82614daf565b604082019050919050565b6000613d256020836144fa565b9150613d3082614dfe565b602082019050919050565b6000613d486013836144fa565b9150613d5382614e27565b602082019050919050565b6000613d6b602c836144fa565b9150613d7682614e50565b604082019050919050565b6000613d8e6020836144fa565b9150613d9982614e9f565b602082019050919050565b6000613db16014836144fa565b9150613dbc82614ec8565b602082019050919050565b6000613dd46029836144fa565b9150613ddf82614ef1565b604082019050919050565b6000613df7602f836144fa565b9150613e0282614f40565b604082019050919050565b6000613e1a6013836144fa565b9150613e2582614f8f565b602082019050919050565b6000613e3d6021836144fa565b9150613e4882614fb8565b604082019050919050565b6000613e606000836144ef565b9150613e6b82615007565b600082019050919050565b6000613e836031836144fa565b9150613e8e8261500a565b604082019050919050565b6000613ea6602c836144fa565b9150613eb182615059565b604082019050919050565b613ec5816146b2565b82525050565b613ed4816146b2565b82525050565b613eeb613ee6826146b2565b6147ea565b82525050565b6000613efd8285613946565b601482019150613f0d8284613eda565b6020820191508190509392505050565b6000613f2982856139d9565b602082019150613f3982846139d9565b6020820191508190509392505050565b6000613f558285613a71565b9150613f618284613a71565b91508190509392505050565b6000613f7882613e53565b9150819050919050565b6000602082019050613f976000830184613937565b92915050565b6000608082019050613fb26000830187613937565b613fbf6020830186613937565b613fcc6040830185613ecb565b8181036060830152613fde81846139f0565b905095945050505050565b60006020820190508181036000830152614003818461395d565b905092915050565b600060208201905061402060008301846139bb565b92915050565b600060208201905061403b60008301846139ca565b92915050565b60006020820190506140566000830184613a29565b92915050565b600060208201905081810360008301526140768184613a38565b905092915050565b6000602082019050818103600083015261409781613aa2565b9050919050565b600060208201905081810360008301526140b781613ac5565b9050919050565b600060208201905081810360008301526140d781613ae8565b9050919050565b600060208201905081810360008301526140f781613b0b565b9050919050565b6000602082019050818103600083015261411781613b2e565b9050919050565b6000602082019050818103600083015261413781613b51565b9050919050565b6000602082019050818103600083015261415781613b74565b9050919050565b6000602082019050818103600083015261417781613b97565b9050919050565b6000602082019050818103600083015261419781613bba565b9050919050565b600060208201905081810360008301526141b781613bdd565b9050919050565b600060208201905081810360008301526141d781613c00565b9050919050565b600060208201905081810360008301526141f781613c23565b9050919050565b6000602082019050818103600083015261421781613c46565b9050919050565b6000602082019050818103600083015261423781613c69565b9050919050565b6000602082019050818103600083015261425781613c8c565b9050919050565b6000602082019050818103600083015261427781613caf565b9050919050565b6000602082019050818103600083015261429781613cd2565b9050919050565b600060208201905081810360008301526142b781613cf5565b9050919050565b600060208201905081810360008301526142d781613d18565b9050919050565b600060208201905081810360008301526142f781613d3b565b9050919050565b6000602082019050818103600083015261431781613d5e565b9050919050565b6000602082019050818103600083015261433781613d81565b9050919050565b6000602082019050818103600083015261435781613da4565b9050919050565b6000602082019050818103600083015261437781613dc7565b9050919050565b6000602082019050818103600083015261439781613dea565b9050919050565b600060208201905081810360008301526143b781613e0d565b9050919050565b600060208201905081810360008301526143d781613e30565b9050919050565b600060208201905081810360008301526143f781613e76565b9050919050565b6000602082019050818103600083015261441781613e99565b9050919050565b60006020820190506144336000830184613ecb565b92915050565b6000614443614454565b905061444f8282614742565b919050565b6000604051905090565b600067ffffffffffffffff821115614479576144786148e1565b5b61448282614910565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614521826146b2565b915061452c836146b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456157614560614825565b5b828201905092915050565b6000614577826146b2565b9150614582836146b2565b92508261459257614591614854565b5b828204905092915050565b60006145a8826146b2565b91506145b3836146b2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145ec576145eb614825565b5b828202905092915050565b6000614602826146b2565b915061460d836146b2565b9250828210156146205761461f614825565b5b828203905092915050565b600061463682614692565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061468d826150a8565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146c78261467f565b9050919050565b82818337600083830152505050565b60005b838110156146fb5780820151818401526020810190506146e0565b8381111561470a576000848401525b50505050565b6000600282049050600182168061472857607f821691505b6020821081141561473c5761473b6148b2565b5b50919050565b61474b82614910565b810181811067ffffffffffffffff8211171561476a576147696148e1565b5b80604052505050565b600061477e826146b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147b1576147b0614825565b5b600182019050919050565b60006147c7826147d8565b9050919050565b6000819050919050565b60006147e382614921565b9050919050565b6000819050919050565b60006147ff826146b2565b915061480a836146b2565b92508261481a57614819614854565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4554482073656e74206e6f74206d61746368207769746820746f74616c20707560008201527f7263686173650000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564207468652073616c6520616c60008201527f6c6f636174696f6e000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206e6f74206d696e742065786365656473206d6178696d756d60008201527f204e465400000000000000000000000000000000000000000000000000000000602082015250565b7f5468652070726573616c65206e6f742061637469766500000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564207468652070726573616c6560008201527f20616c6c6f636174696f6e000000000000000000000000000000000000000000602082015250565b7f526573657276656420456d707479000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5468652073616c65206e6f742061637469766500000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c6c20536f756c636f7073206d696e74656400000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600381106150b9576150b8614883565b5b50565b6150c58161462b565b81146150d057600080fd5b50565b6150dc8161463d565b81146150e757600080fd5b50565b6150f381614649565b81146150fe57600080fd5b50565b61510a81614653565b811461511557600080fd5b50565b6003811061512557600080fd5b50565b615131816146b2565b811461513c57600080fd5b5056fea264697066735822122080557aa808a4dd9cebcd1005c195d262dbd669fd2909871e30800a83c69b8a3064736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000040fcaacdfb0421ebf1ee6071b69f686cb0f14aab0605c330663e7cfcbeaa9cef180000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d59696d6b4276716f6f635064744c73323653326f5a3847534d56686b6f4133786f48643479696431785236420000000000000000000000

-----Decoded View---------------
Arg [0] : defaultTokenURI (string): ipfs://QmYimkBvqoocPdtLs26S2oZ8GSMVhkoA3xoHd4yid1xR6B
Arg [1] : merkleroot (bytes32): 0xfcaacdfb0421ebf1ee6071b69f686cb0f14aab0605c330663e7cfcbeaa9cef18

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : fcaacdfb0421ebf1ee6071b69f686cb0f14aab0605c330663e7cfcbeaa9cef18
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d59696d6b4276716f6f635064744c73323653326f5a3847
Arg [4] : 534d56686b6f4133786f48643479696431785236420000000000000000000000


Deployed Bytecode Sourcemap

37516:5890:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30380:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18818:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19631:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19153:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31319:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38006:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38979:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20523:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38136:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37859:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30689:554;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38053:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38822:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41672:124;;;;;;;;;;;;;:::i;:::-;;20933:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37795:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31506:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37952:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42234:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39614:965;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39159:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41849:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18512:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37746:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42570:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18087:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33296:94;;;;;;;;;;;;;:::i;:::-;;38676:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41316:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37903:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32645:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38092:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42121:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18987:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42344:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19924:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21189:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37687:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42724:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38198:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42039:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40615:653;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42465:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20290:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37718:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33545:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30380:225;30483:4;30522:35;30507:50;;;:11;:50;;;;:90;;;;30561:36;30585:11;30561:23;:36::i;:::-;30507:90;30500:97;;30380:225;;;:::o;18818:100::-;18872:13;18905:5;18898:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18818:100;:::o;19631:221::-;19707:7;19735:16;19743:7;19735;:16::i;:::-;19727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19820:15;:24;19836:7;19820:24;;;;;;;;;;;;;;;;;;;;;19813:31;;19631:221;;;:::o;19153:412::-;19234:13;19250:24;19266:7;19250:15;:24::i;:::-;19234:40;;19299:5;19293:11;;:2;:11;;;;19285:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;19393:5;19377:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;19402:37;19419:5;19426:12;:10;:12::i;:::-;19402:16;:37::i;:::-;19377:62;19355:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;19536:21;19545:2;19549:7;19536:8;:21::i;:::-;19153:412;;;:::o;31319:110::-;31380:7;31407;:14;;;;31400:21;;31319:110;:::o;38006:40::-;38045:1;38006:40;:::o;38979:130::-;39030:7;39084:17;;39065:16;;37891:5;39057:24;;;;:::i;:::-;:44;;;;:::i;:::-;39050:51;;38979:130;:::o;20523:339::-;20718:41;20737:12;:10;:12::i;:::-;20751:7;20718:18;:41::i;:::-;20710:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;20826:28;20836:4;20842:2;20846:7;20826:9;:28::i;:::-;20523:339;;;:::o;38136:55::-;;;;;;;;;;;;;;;;;:::o;37859:37::-;37891:5;37859:37;:::o;30689:554::-;30786:15;30830:24;30848:5;30830:17;:24::i;:::-;30822:5;:32;30814:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;30915:10;30941:6;30936:226;30953:7;:14;;;;30949:1;:18;30936:226;;;31002:7;31010:1;31002:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30993:19;;:5;:19;;;30989:162;;;31046:5;31037;:14;31033:102;;;31082:1;31075:8;;;;;;31033:102;31128:7;;;;:::i;:::-;;;30989:162;30969:3;;;;:::i;:::-;;;30936:226;;;;31182:5;31174:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30689:554;;;;;;:::o;38053:32::-;;;;:::o;38822:118::-;38874:7;38915:17;;37785:3;37833:4;:19;;;;:::i;:::-;38901:31;;;;:::i;:::-;38894:38;;38822:118;:::o;41672:124::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41722:66:::1;41748:15;;;;;;;;;;;41766:21;41722:17;:66::i;:::-;41672:124::o:0;20933:185::-;21071:39;21088:4;21094:2;21098:7;21071:39;;;;;;;;;;;;:16;:39::i;:::-;20933:185;;;:::o;37795:57::-;37785:3;37833:4;:19;;;;:::i;:::-;37795:57;:::o;31506:222::-;31581:7;31617:31;:29;:31::i;:::-;31609:5;:39;31601:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31715:5;31708:12;;31506:222;;;:::o;37952:47::-;37988:11;37952:47;:::o;42234:98::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42321:3:::1;;42305:13;:19;;;;;;;:::i;:::-;;42234:98:::0;;:::o;39614:965::-;39730:14;39747:13;:11;:13::i;:::-;39730:30;;39779:44;39787:28;39793:10;39805:9;39787:5;:28::i;:::-;39817:5;;39779:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:44::i;:::-;39771:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39874:13;39867:20;;;;;;;;;;;;;;;;:5;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;39859:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37891:5;39942:13;39933:6;:22;;;;:::i;:::-;:31;;39925:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;40064:21;:19;:21::i;:::-;40047:13;40028:16;;:32;;;;:::i;:::-;:57;;40020:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;40204:9;40187:13;40152:20;:32;40173:10;40152:32;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;:61;;40144:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40302:9;40285:13;37988:11;40273:25;;;;:::i;:::-;:38;40265:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;40411:13;40375:20;:32;40396:10;40375:32;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;40442:9;40437:135;40461:13;40457:1;:17;40437:135;;;40496:16;;:18;;;;;;;;;:::i;:::-;;;;;;40529:31;40539:10;40551:8;;;;;:::i;:::-;;;40529:9;:31::i;:::-;40476:3;;;;;:::i;:::-;;;;40437:135;;;;39614:965;;;;;:::o;39159:422::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39246:14:::1;39263:13;:11;:13::i;:::-;39246:30;;37891:5;39295:6;:15;;39287:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;37785:3;39373:13;39353:17;;:33;;;;:::i;:::-;:49;;39345:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39445:9;39440:134;39464:13;39460:1;:17;39440:134;;;39499:17;;:19;;;;;;;;;:::i;:::-;;;;;;39533:29;39543:8;39553;;;;;:::i;:::-;;;39533:9;:29::i;:::-;39479:3;;;;;:::i;:::-;;;;39440:134;;;;32936:1;39159:422:::0;;:::o;41849:129::-;41917:7;41944:20;:26;41965:4;41944:26;;;;;;;;;;;;;;;;41937:33;;41849:129;;;:::o;18512:239::-;18584:7;18604:13;18620:7;18628;18620:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18604:32;;18672:1;18655:19;;:5;:19;;;;18647:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18738:5;18731:12;;;18512:239;;;:::o;37746:42::-;37785:3;37746:42;:::o;42570:94::-;42610:13;42643;42636:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42570:94;:::o;18087:363::-;18159:7;18204:1;18187:19;;:5;:19;;;;18179:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18266:10;18296:6;18291:127;18312:7;:14;;;;18308:1;:18;18291:127;;;18359:7;18367:1;18359:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18350:19;;:5;:19;;;18346:61;;;18386:7;;;;;:::i;:::-;;;;18346:61;18328:3;;;;;:::i;:::-;;;;18291:127;;;;18437:5;18430:12;;;18087:363;;;:::o;33296:94::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33361:21:::1;33379:1;33361:9;:21::i;:::-;33296:94::o:0;38676:102::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38760:10:::1;38753:4;:17;;;;38676:102:::0;:::o;41316:344::-;41377:16;41406:18;41427:17;41437:6;41427:9;:17::i;:::-;41406:38;;41457:25;41499:10;41485:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41457:53;;41525:9;41521:106;41540:10;41536:1;:14;41521:106;;;41585:30;41605:6;41613:1;41585:19;:30::i;:::-;41571:8;41580:1;41571:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;41552:3;;;;;:::i;:::-;;;;41521:106;;;;41644:8;41637:15;;;;41316:344;;;:::o;37903:42::-;37935:10;37903:42;:::o;32645:87::-;32691:7;32718:6;;;;;;;;;;;32711:13;;32645:87;:::o;38092:31::-;;;;:::o;42121:101::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42211:3:::1;;42196:12;:18;;;;;;;:::i;:::-;;42121:101:::0;;:::o;18987:104::-;19043:13;19076:7;19069:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18987:104;:::o;42344:109::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42442:3:::1;;42423:16;:22;;;;;;;:::i;:::-;;42344:109:::0;;:::o;19924:295::-;20039:12;:10;:12::i;:::-;20027:24;;:8;:24;;;;20019:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;20139:8;20094:18;:32;20113:12;:10;:12::i;:::-;20094:32;;;;;;;;;;;;;;;:42;20127:8;20094:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20192:8;20163:48;;20178:12;:10;:12::i;:::-;20163:48;;;20202:8;20163:48;;;;;;:::i;:::-;;;;;;;;19924:295;;:::o;21189:328::-;21364:41;21383:12;:10;:12::i;:::-;21397:7;21364:18;:41::i;:::-;21356:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21470:39;21484:4;21490:2;21494:7;21503:5;21470:13;:39::i;:::-;21189:328;;;;:::o;37687:18::-;;;;;;;;;;;;;:::o;42724:344::-;42791:13;42825:16;42833:7;42825;:16::i;:::-;42817:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42906:22;42931:9;:7;:9::i;:::-;42906:34;;42983:1;42964:8;42958:22;:26;:102;;43044:16;42958:102;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43011:8;43021:18;:7;:16;:18::i;:::-;42994:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42958:102;42951:109;;;42724:344;;;:::o;38198:52::-;;;;;;;;;;;;;;;;;:::o;42039:74::-;42099:6;42091:5;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42039:74;:::o;40615:653::-;40679:14;40696:13;:11;:13::i;:::-;40679:30;;40735:16;40728:23;;;;;;;;;;;;;;;;:5;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;40720:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37891:5;40803:13;40794:6;:22;;;;:::i;:::-;:31;;40786:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;38045:1;40921:13;40889:17;:29;40907:10;40889:29;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:61;;40881:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41035:9;41018:13;37935:10;41010:21;;;;:::i;:::-;:34;41002:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41133:13;41100:17;:29;41118:10;41100:29;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;41164:9;41159:102;41183:13;41179:1;:17;41159:102;;;41218:31;41228:10;41240:8;;;;;:::i;:::-;;;41218:9;:31::i;:::-;41198:3;;;;;:::i;:::-;;;;41159:102;;;;40615:653;;:::o;42465:97::-;42509:13;42542:12;42535:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42465:97;:::o;20290:164::-;20387:4;20411:18;:25;20430:5;20411:25;;;;;;;;;;;;;;;:35;20437:8;20411:35;;;;;;;;;;;;;;;;;;;;;;;;;20404:42;;20290:164;;;;:::o;37718:19::-;;;;:::o;33545:192::-;32876:12;:10;:12::i;:::-;32865:23;;:7;:5;:7::i;:::-;:23;;;32857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33654:1:::1;33634:22;;:8;:22;;;;33626:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33710:19;33720:8;33710:9;:19::i;:::-;33545:192:::0;:::o;17718:305::-;17820:4;17872:25;17857:40;;;:11;:40;;;;:105;;;;17929:33;17914:48;;;:11;:48;;;;17857:105;:158;;;;17979:36;18003:11;17979:23;:36::i;:::-;17857:158;17837:178;;17718:305;;;:::o;23027:155::-;23092:4;23126:7;:14;;;;23116:7;:24;:58;;;;;23172:1;23144:30;;:7;23152;23144:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;23116:58;23109:65;;23027:155;;;:::o;15553:98::-;15606:7;15633:10;15626:17;;15553:98;:::o;26916:175::-;27018:2;26991:15;:24;27007:7;26991:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27075:7;27071:2;27036:47;;27045:24;27061:7;27045:15;:24::i;:::-;27036:47;;;;;;;;;;;;26916:175;;:::o;23349:349::-;23442:4;23467:16;23475:7;23467;:16::i;:::-;23459:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23543:13;23559:24;23575:7;23559:15;:24::i;:::-;23543:40;;23613:5;23602:16;;:7;:16;;;:51;;;;23646:7;23622:31;;:20;23634:7;23622:11;:20::i;:::-;:31;;;23602:51;:87;;;;23657:32;23674:5;23681:7;23657:16;:32::i;:::-;23602:87;23594:96;;;23349:349;;;;:::o;26281:517::-;26441:4;26413:32;;:24;26429:7;26413:15;:24::i;:::-;:32;;;26405:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;26524:1;26510:16;;:2;:16;;;;26502:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;26580:39;26601:4;26607:2;26611:7;26580:20;:39::i;:::-;26684:29;26701:1;26705:7;26684:8;:29::i;:::-;26743:2;26724:7;26732;26724:16;;;;;;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;26782:7;26778:2;26763:27;;26772:4;26763:27;;;;;;;;;;;;26281:517;;;:::o;9004:317::-;9119:6;9094:21;:31;;9086:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9173:12;9191:9;:14;;9213:6;9191:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9172:52;;;9243:7;9235:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9004:317;;;:::o;43078:159::-;43151:7;43210;43218:9;43193:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43183:46;;;;;;43176:53;;43078:159;;;;:::o;43245:152::-;43323:4;43352:37;43371:5;43378:4;;43384;43352:18;:37::i;:::-;43345:44;;43245:152;;;;:::o;24040:110::-;24116:26;24126:2;24130:7;24116:26;;;;;;;;;;;;:9;:26::i;:::-;24040:110;;:::o;33745:173::-;33801:16;33820:6;;;;;;;;;;;33801:25;;33846:8;33837:6;;:17;;;;;;;;;;;;;;;;;;33901:8;33870:40;;33891:8;33870:40;;;;;;;;;;;;33745:173;;:::o;22399:315::-;22556:28;22566:4;22572:2;22576:7;22556:9;:28::i;:::-;22603:48;22626:4;22632:2;22636:7;22645:5;22603:22;:48::i;:::-;22595:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22399:315;;;;:::o;34151:723::-;34207:13;34437:1;34428:5;:10;34424:53;;;34455:10;;;;;;;;;;;;;;;;;;;;;34424:53;34487:12;34502:5;34487:20;;34518:14;34543:78;34558:1;34550:4;:9;34543:78;;34576:8;;;;;:::i;:::-;;;;34607:2;34599:10;;;;;:::i;:::-;;;34543:78;;;34631:19;34663:6;34653:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34631:39;;34681:154;34697:1;34688:5;:10;34681:154;;34725:1;34715:11;;;;;:::i;:::-;;;34792:2;34784:5;:10;;;;:::i;:::-;34771:2;:24;;;;:::i;:::-;34758:39;;34741:6;34748;34741:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;34821:2;34812:11;;;;;:::i;:::-;;;34681:154;;;34859:6;34845:21;;;;;34151:723;;;;:::o;16465:157::-;16550:4;16589:25;16574:40;;;:11;:40;;;;16567:47;;16465:157;;;:::o;29029:126::-;;;;:::o;36645:830::-;36770:4;36787:20;36810:4;36787:27;;36832:9;36827:525;36851:5;:12;36847:1;:16;36827:525;;;36885:20;36908:5;36914:1;36908:8;;;;;;;;;;;;;;;;;;;;;;36885:31;;36953:12;36937;:28;36933:408;;37107:12;37121;37090:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37080:55;;;;;;37065:70;;36933:408;;;37297:12;37311;37280:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37270:55;;;;;;37255:70;;36933:408;36827:525;36865:3;;;;;:::i;:::-;;;;36827:525;;;;37463:4;37447:12;:20;37440:27;;;36645:830;;;;;:::o;24379:321::-;24509:18;24515:2;24519:7;24509:5;:18::i;:::-;24560:54;24591:1;24595:2;24599:7;24608:5;24560:22;:54::i;:::-;24538:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;24379:321;;;:::o;27658:799::-;27813:4;27834:15;:2;:13;;;:15::i;:::-;27830:620;;;27886:2;27870:36;;;27907:12;:10;:12::i;:::-;27921:4;27927:7;27936:5;27870:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27866:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28129:1;28112:6;:13;:18;28108:272;;;28155:60;;;;;;;;;;:::i;:::-;;;;;;;;28108:272;28330:6;28324:13;28315:6;28311:2;28307:15;28300:38;27866:529;28003:41;;;27993:51;;;:6;:51;;;;27986:58;;;;;27830:620;28434:4;28427:11;;27658:799;;;;;;;:::o;25036:346::-;25130:1;25116:16;;:2;:16;;;;25108:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;25189:16;25197:7;25189;:16::i;:::-;25188:17;25180:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25251:45;25280:1;25284:2;25288:7;25251:20;:45::i;:::-;25307:7;25320:2;25307:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25366:7;25362:2;25341:33;;25358:1;25341:33;;;;;;;;;;;;25036:346;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:139::-;1076:5;1114:6;1101:20;1092:29;;1130:33;1157:5;1130:33;:::i;:::-;1082:87;;;;:::o;1175:137::-;1220:5;1258:6;1245:20;1236:29;;1274:32;1300:5;1274:32;:::i;:::-;1226:86;;;;:::o;1318:141::-;1374:5;1405:6;1399:13;1390:22;;1421:32;1447:5;1421:32;:::i;:::-;1380:79;;;;:::o;1478:271::-;1533:5;1582:3;1575:4;1567:6;1563:17;1559:27;1549:2;;1600:1;1597;1590:12;1549:2;1640:6;1627:20;1665:78;1739:3;1731:6;1724:4;1716:6;1712:17;1665:78;:::i;:::-;1656:87;;1539:210;;;;;:::o;1755:159::-;1811:5;1849:6;1836:20;1827:29;;1865:43;1902:5;1865:43;:::i;:::-;1817:97;;;;:::o;1934:352::-;1992:8;2002:6;2052:3;2045:4;2037:6;2033:17;2029:27;2019:2;;2070:1;2067;2060:12;2019:2;2106:6;2093:20;2083:30;;2136:18;2128:6;2125:30;2122:2;;;2168:1;2165;2158:12;2122:2;2205:4;2197:6;2193:17;2181:29;;2259:3;2251:4;2243:6;2239:17;2229:8;2225:32;2222:41;2219:2;;;2276:1;2273;2266:12;2219:2;2009:277;;;;;:::o;2292:139::-;2338:5;2376:6;2363:20;2354:29;;2392:33;2419:5;2392:33;:::i;:::-;2344:87;;;;:::o;2437:262::-;2496:6;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:53;2674:7;2665:6;2654:9;2650:22;2629:53;:::i;:::-;2619:63;;2575:117;2503:196;;;;:::o;2705:407::-;2773:6;2781;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;2788:324;;;;;:::o;3118:552::-;3195:6;3203;3211;3260:2;3248:9;3239:7;3235:23;3231:32;3228:2;;;3276:1;3273;3266:12;3228:2;3319:1;3344:53;3389:7;3380:6;3369:9;3365:22;3344:53;:::i;:::-;3334:63;;3290:117;3446:2;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3417:118;3574:2;3600:53;3645:7;3636:6;3625:9;3621:22;3600:53;:::i;:::-;3590:63;;3545:118;3218:452;;;;;:::o;3676:809::-;3771:6;3779;3787;3795;3844:3;3832:9;3823:7;3819:23;3815:33;3812:2;;;3861:1;3858;3851:12;3812:2;3904:1;3929:53;3974:7;3965:6;3954:9;3950:22;3929:53;:::i;:::-;3919:63;;3875:117;4031:2;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4002:118;4159:2;4185:53;4230:7;4221:6;4210:9;4206:22;4185:53;:::i;:::-;4175:63;;4130:118;4315:2;4304:9;4300:18;4287:32;4346:18;4338:6;4335:30;4332:2;;;4378:1;4375;4368:12;4332:2;4406:62;4460:7;4451:6;4440:9;4436:22;4406:62;:::i;:::-;4396:72;;4258:220;3802:683;;;;;;;:::o;4491:401::-;4556:6;4564;4613:2;4601:9;4592:7;4588:23;4584:32;4581:2;;;4629:1;4626;4619:12;4581:2;4672:1;4697:53;4742:7;4733:6;4722:9;4718:22;4697:53;:::i;:::-;4687:63;;4643:117;4799:2;4825:50;4867:7;4858:6;4847:9;4843:22;4825:50;:::i;:::-;4815:60;;4770:115;4571:321;;;;;:::o;4898:407::-;4966:6;4974;5023:2;5011:9;5002:7;4998:23;4994:32;4991:2;;;5039:1;5036;5029:12;4991:2;5082:1;5107:53;5152:7;5143:6;5132:9;5128:22;5107:53;:::i;:::-;5097:63;;5053:117;5209:2;5235:53;5280:7;5271:6;5260:9;5256:22;5235:53;:::i;:::-;5225:63;;5180:118;4981:324;;;;;:::o;5311:262::-;5370:6;5419:2;5407:9;5398:7;5394:23;5390:32;5387:2;;;5435:1;5432;5425:12;5387:2;5478:1;5503:53;5548:7;5539:6;5528:9;5524:22;5503:53;:::i;:::-;5493:63;;5449:117;5377:196;;;;:::o;5579:260::-;5637:6;5686:2;5674:9;5665:7;5661:23;5657:32;5654:2;;;5702:1;5699;5692:12;5654:2;5745:1;5770:52;5814:7;5805:6;5794:9;5790:22;5770:52;:::i;:::-;5760:62;;5716:116;5644:195;;;;:::o;5845:282::-;5914:6;5963:2;5951:9;5942:7;5938:23;5934:32;5931:2;;;5979:1;5976;5969:12;5931:2;6022:1;6047:63;6102:7;6093:6;6082:9;6078:22;6047:63;:::i;:::-;6037:73;;5993:127;5921:206;;;;:::o;6133:282::-;6202:6;6251:2;6239:9;6230:7;6226:23;6222:32;6219:2;;;6267:1;6264;6257:12;6219:2;6310:1;6335:63;6390:7;6381:6;6370:9;6366:22;6335:63;:::i;:::-;6325:73;;6281:127;6209:206;;;;:::o;6421:395::-;6492:6;6500;6549:2;6537:9;6528:7;6524:23;6520:32;6517:2;;;6565:1;6562;6555:12;6517:2;6636:1;6625:9;6621:17;6608:31;6666:18;6658:6;6655:30;6652:2;;;6698:1;6695;6688:12;6652:2;6734:65;6791:7;6782:6;6771:9;6767:22;6734:65;:::i;:::-;6716:83;;;;6579:230;6507:309;;;;;:::o;6822:262::-;6881:6;6930:2;6918:9;6909:7;6905:23;6901:32;6898:2;;;6946:1;6943;6936:12;6898:2;6989:1;7014:53;7059:7;7050:6;7039:9;7035:22;7014:53;:::i;:::-;7004:63;;6960:117;6888:196;;;;:::o;7090:715::-;7194:6;7202;7210;7218;7267:2;7255:9;7246:7;7242:23;7238:32;7235:2;;;7283:1;7280;7273:12;7235:2;7326:1;7351:53;7396:7;7387:6;7376:9;7372:22;7351:53;:::i;:::-;7341:63;;7297:117;7453:2;7479:53;7524:7;7515:6;7504:9;7500:22;7479:53;:::i;:::-;7469:63;;7424:118;7609:2;7598:9;7594:18;7581:32;7640:18;7632:6;7629:30;7626:2;;;7672:1;7669;7662:12;7626:2;7708:80;7780:7;7771:6;7760:9;7756:22;7708:80;:::i;:::-;7690:98;;;;7552:246;7225:580;;;;;;;:::o;7811:179::-;7880:10;7901:46;7943:3;7935:6;7901:46;:::i;:::-;7979:4;7974:3;7970:14;7956:28;;7891:99;;;;:::o;7996:118::-;8083:24;8101:5;8083:24;:::i;:::-;8078:3;8071:37;8061:53;;:::o;8120:157::-;8225:45;8245:24;8263:5;8245:24;:::i;:::-;8225:45;:::i;:::-;8220:3;8213:58;8203:74;;:::o;8313:732::-;8432:3;8461:54;8509:5;8461:54;:::i;:::-;8531:86;8610:6;8605:3;8531:86;:::i;:::-;8524:93;;8641:56;8691:5;8641:56;:::i;:::-;8720:7;8751:1;8736:284;8761:6;8758:1;8755:13;8736:284;;;8837:6;8831:13;8864:63;8923:3;8908:13;8864:63;:::i;:::-;8857:70;;8950:60;9003:6;8950:60;:::i;:::-;8940:70;;8796:224;8783:1;8780;8776:9;8771:14;;8736:284;;;8740:14;9036:3;9029:10;;8437:608;;;;;;;:::o;9051:109::-;9132:21;9147:5;9132:21;:::i;:::-;9127:3;9120:34;9110:50;;:::o;9166:118::-;9253:24;9271:5;9253:24;:::i;:::-;9248:3;9241:37;9231:53;;:::o;9290:157::-;9395:45;9415:24;9433:5;9415:24;:::i;:::-;9395:45;:::i;:::-;9390:3;9383:58;9373:74;;:::o;9453:360::-;9539:3;9567:38;9599:5;9567:38;:::i;:::-;9621:70;9684:6;9679:3;9621:70;:::i;:::-;9614:77;;9700:52;9745:6;9740:3;9733:4;9726:5;9722:16;9700:52;:::i;:::-;9777:29;9799:6;9777:29;:::i;:::-;9772:3;9768:39;9761:46;;9543:270;;;;;:::o;9819:147::-;9914:45;9953:5;9914:45;:::i;:::-;9909:3;9902:58;9892:74;;:::o;9972:364::-;10060:3;10088:39;10121:5;10088:39;:::i;:::-;10143:71;10207:6;10202:3;10143:71;:::i;:::-;10136:78;;10223:52;10268:6;10263:3;10256:4;10249:5;10245:16;10223:52;:::i;:::-;10300:29;10322:6;10300:29;:::i;:::-;10295:3;10291:39;10284:46;;10064:272;;;;;:::o;10342:377::-;10448:3;10476:39;10509:5;10476:39;:::i;:::-;10531:89;10613:6;10608:3;10531:89;:::i;:::-;10524:96;;10629:52;10674:6;10669:3;10662:4;10655:5;10651:16;10629:52;:::i;:::-;10706:6;10701:3;10697:16;10690:23;;10452:267;;;;;:::o;10725:366::-;10867:3;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10964:93;11053:3;10964:93;:::i;:::-;11082:2;11077:3;11073:12;11066:19;;10871:220;;;:::o;11097:366::-;11239:3;11260:67;11324:2;11319:3;11260:67;:::i;:::-;11253:74;;11336:93;11425:3;11336:93;:::i;:::-;11454:2;11449:3;11445:12;11438:19;;11243:220;;;:::o;11469:366::-;11611:3;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11615:220;;;:::o;11841:366::-;11983:3;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11987:220;;;:::o;12213:366::-;12355:3;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12359:220;;;:::o;12585:366::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12731:220;;;:::o;12957:366::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;13103:220;;;:::o;13329:366::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13475:220;;;:::o;13701:366::-;13843:3;13864:67;13928:2;13923:3;13864:67;:::i;:::-;13857:74;;13940:93;14029:3;13940:93;:::i;:::-;14058:2;14053:3;14049:12;14042:19;;13847:220;;;:::o;14073:366::-;14215:3;14236:67;14300:2;14295:3;14236:67;:::i;:::-;14229:74;;14312:93;14401:3;14312:93;:::i;:::-;14430:2;14425:3;14421:12;14414:19;;14219:220;;;:::o;14445:366::-;14587:3;14608:67;14672:2;14667:3;14608:67;:::i;:::-;14601:74;;14684:93;14773:3;14684:93;:::i;:::-;14802:2;14797:3;14793:12;14786:19;;14591:220;;;:::o;14817:366::-;14959:3;14980:67;15044:2;15039:3;14980:67;:::i;:::-;14973:74;;15056:93;15145:3;15056:93;:::i;:::-;15174:2;15169:3;15165:12;15158:19;;14963:220;;;:::o;15189:366::-;15331:3;15352:67;15416:2;15411:3;15352:67;:::i;:::-;15345:74;;15428:93;15517:3;15428:93;:::i;:::-;15546:2;15541:3;15537:12;15530:19;;15335:220;;;:::o;15561:366::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15707:220;;;:::o;15933:366::-;16075:3;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16172:93;16261:3;16172:93;:::i;:::-;16290:2;16285:3;16281:12;16274:19;;16079:220;;;:::o;16305:366::-;16447:3;16468:67;16532:2;16527:3;16468:67;:::i;:::-;16461:74;;16544:93;16633:3;16544:93;:::i;:::-;16662:2;16657:3;16653:12;16646:19;;16451:220;;;:::o;16677:366::-;16819:3;16840:67;16904:2;16899:3;16840:67;:::i;:::-;16833:74;;16916:93;17005:3;16916:93;:::i;:::-;17034:2;17029:3;17025:12;17018:19;;16823:220;;;:::o;17049:366::-;17191:3;17212:67;17276:2;17271:3;17212:67;:::i;:::-;17205:74;;17288:93;17377:3;17288:93;:::i;:::-;17406:2;17401:3;17397:12;17390:19;;17195:220;;;:::o;17421:366::-;17563:3;17584:67;17648:2;17643:3;17584:67;:::i;:::-;17577:74;;17660:93;17749:3;17660:93;:::i;:::-;17778:2;17773:3;17769:12;17762:19;;17567:220;;;:::o;17793:366::-;17935:3;17956:67;18020:2;18015:3;17956:67;:::i;:::-;17949:74;;18032:93;18121:3;18032:93;:::i;:::-;18150:2;18145:3;18141:12;18134:19;;17939:220;;;:::o;18165:366::-;18307:3;18328:67;18392:2;18387:3;18328:67;:::i;:::-;18321:74;;18404:93;18493:3;18404:93;:::i;:::-;18522:2;18517:3;18513:12;18506:19;;18311:220;;;:::o;18537:366::-;18679:3;18700:67;18764:2;18759:3;18700:67;:::i;:::-;18693:74;;18776:93;18865:3;18776:93;:::i;:::-;18894:2;18889:3;18885:12;18878:19;;18683:220;;;:::o;18909:366::-;19051:3;19072:67;19136:2;19131:3;19072:67;:::i;:::-;19065:74;;19148:93;19237:3;19148:93;:::i;:::-;19266:2;19261:3;19257:12;19250:19;;19055:220;;;:::o;19281:366::-;19423:3;19444:67;19508:2;19503:3;19444:67;:::i;:::-;19437:74;;19520:93;19609:3;19520:93;:::i;:::-;19638:2;19633:3;19629:12;19622:19;;19427:220;;;:::o;19653:366::-;19795:3;19816:67;19880:2;19875:3;19816:67;:::i;:::-;19809:74;;19892:93;19981:3;19892:93;:::i;:::-;20010:2;20005:3;20001:12;19994:19;;19799:220;;;:::o;20025:366::-;20167:3;20188:67;20252:2;20247:3;20188:67;:::i;:::-;20181:74;;20264:93;20353:3;20264:93;:::i;:::-;20382:2;20377:3;20373:12;20366:19;;20171:220;;;:::o;20397:366::-;20539:3;20560:67;20624:2;20619:3;20560:67;:::i;:::-;20553:74;;20636:93;20725:3;20636:93;:::i;:::-;20754:2;20749:3;20745:12;20738:19;;20543:220;;;:::o;20769:398::-;20928:3;20949:83;21030:1;21025:3;20949:83;:::i;:::-;20942:90;;21041:93;21130:3;21041:93;:::i;:::-;21159:1;21154:3;21150:11;21143:18;;20932:235;;;:::o;21173:366::-;21315:3;21336:67;21400:2;21395:3;21336:67;:::i;:::-;21329:74;;21412:93;21501:3;21412:93;:::i;:::-;21530:2;21525:3;21521:12;21514:19;;21319:220;;;:::o;21545:366::-;21687:3;21708:67;21772:2;21767:3;21708:67;:::i;:::-;21701:74;;21784:93;21873:3;21784:93;:::i;:::-;21902:2;21897:3;21893:12;21886:19;;21691:220;;;:::o;21917:108::-;21994:24;22012:5;21994:24;:::i;:::-;21989:3;21982:37;21972:53;;:::o;22031:118::-;22118:24;22136:5;22118:24;:::i;:::-;22113:3;22106:37;22096:53;;:::o;22155:157::-;22260:45;22280:24;22298:5;22280:24;:::i;:::-;22260:45;:::i;:::-;22255:3;22248:58;22238:74;;:::o;22318:397::-;22458:3;22473:75;22544:3;22535:6;22473:75;:::i;:::-;22573:2;22568:3;22564:12;22557:19;;22586:75;22657:3;22648:6;22586:75;:::i;:::-;22686:2;22681:3;22677:12;22670:19;;22706:3;22699:10;;22462:253;;;;;:::o;22721:397::-;22861:3;22876:75;22947:3;22938:6;22876:75;:::i;:::-;22976:2;22971:3;22967:12;22960:19;;22989:75;23060:3;23051:6;22989:75;:::i;:::-;23089:2;23084:3;23080:12;23073:19;;23109:3;23102:10;;22865:253;;;;;:::o;23124:435::-;23304:3;23326:95;23417:3;23408:6;23326:95;:::i;:::-;23319:102;;23438:95;23529:3;23520:6;23438:95;:::i;:::-;23431:102;;23550:3;23543:10;;23308:251;;;;;:::o;23565:379::-;23749:3;23771:147;23914:3;23771:147;:::i;:::-;23764:154;;23935:3;23928:10;;23753:191;;;:::o;23950:222::-;24043:4;24081:2;24070:9;24066:18;24058:26;;24094:71;24162:1;24151:9;24147:17;24138:6;24094:71;:::i;:::-;24048:124;;;;:::o;24178:640::-;24373:4;24411:3;24400:9;24396:19;24388:27;;24425:71;24493:1;24482:9;24478:17;24469:6;24425:71;:::i;:::-;24506:72;24574:2;24563:9;24559:18;24550:6;24506:72;:::i;:::-;24588;24656:2;24645:9;24641:18;24632:6;24588:72;:::i;:::-;24707:9;24701:4;24697:20;24692:2;24681:9;24677:18;24670:48;24735:76;24806:4;24797:6;24735:76;:::i;:::-;24727:84;;24378:440;;;;;;;:::o;24824:373::-;24967:4;25005:2;24994:9;24990:18;24982:26;;25054:9;25048:4;25044:20;25040:1;25029:9;25025:17;25018:47;25082:108;25185:4;25176:6;25082:108;:::i;:::-;25074:116;;24972:225;;;;:::o;25203:210::-;25290:4;25328:2;25317:9;25313:18;25305:26;;25341:65;25403:1;25392:9;25388:17;25379:6;25341:65;:::i;:::-;25295:118;;;;:::o;25419:222::-;25512:4;25550:2;25539:9;25535:18;25527:26;;25563:71;25631:1;25620:9;25616:17;25607:6;25563:71;:::i;:::-;25517:124;;;;:::o;25647:238::-;25748:4;25786:2;25775:9;25771:18;25763:26;;25799:79;25875:1;25864:9;25860:17;25851:6;25799:79;:::i;:::-;25753:132;;;;:::o;25891:313::-;26004:4;26042:2;26031:9;26027:18;26019:26;;26091:9;26085:4;26081:20;26077:1;26066:9;26062:17;26055:47;26119:78;26192:4;26183:6;26119:78;:::i;:::-;26111:86;;26009:195;;;;:::o;26210:419::-;26376:4;26414:2;26403:9;26399:18;26391:26;;26463:9;26457:4;26453:20;26449:1;26438:9;26434:17;26427:47;26491:131;26617:4;26491:131;:::i;:::-;26483:139;;26381:248;;;:::o;26635:419::-;26801:4;26839:2;26828:9;26824:18;26816:26;;26888:9;26882:4;26878:20;26874:1;26863:9;26859:17;26852:47;26916:131;27042:4;26916:131;:::i;:::-;26908:139;;26806:248;;;:::o;27060:419::-;27226:4;27264:2;27253:9;27249:18;27241:26;;27313:9;27307:4;27303:20;27299:1;27288:9;27284:17;27277:47;27341:131;27467:4;27341:131;:::i;:::-;27333:139;;27231:248;;;:::o;27485:419::-;27651:4;27689:2;27678:9;27674:18;27666:26;;27738:9;27732:4;27728:20;27724:1;27713:9;27709:17;27702:47;27766:131;27892:4;27766:131;:::i;:::-;27758:139;;27656:248;;;:::o;27910:419::-;28076:4;28114:2;28103:9;28099:18;28091:26;;28163:9;28157:4;28153:20;28149:1;28138:9;28134:17;28127:47;28191:131;28317:4;28191:131;:::i;:::-;28183:139;;28081:248;;;:::o;28335:419::-;28501:4;28539:2;28528:9;28524:18;28516:26;;28588:9;28582:4;28578:20;28574:1;28563:9;28559:17;28552:47;28616:131;28742:4;28616:131;:::i;:::-;28608:139;;28506:248;;;:::o;28760:419::-;28926:4;28964:2;28953:9;28949:18;28941:26;;29013:9;29007:4;29003:20;28999:1;28988:9;28984:17;28977:47;29041:131;29167:4;29041:131;:::i;:::-;29033:139;;28931:248;;;:::o;29185:419::-;29351:4;29389:2;29378:9;29374:18;29366:26;;29438:9;29432:4;29428:20;29424:1;29413:9;29409:17;29402:47;29466:131;29592:4;29466:131;:::i;:::-;29458:139;;29356:248;;;:::o;29610:419::-;29776:4;29814:2;29803:9;29799:18;29791:26;;29863:9;29857:4;29853:20;29849:1;29838:9;29834:17;29827:47;29891:131;30017:4;29891:131;:::i;:::-;29883:139;;29781:248;;;:::o;30035:419::-;30201:4;30239:2;30228:9;30224:18;30216:26;;30288:9;30282:4;30278:20;30274:1;30263:9;30259:17;30252:47;30316:131;30442:4;30316:131;:::i;:::-;30308:139;;30206:248;;;:::o;30460:419::-;30626:4;30664:2;30653:9;30649:18;30641:26;;30713:9;30707:4;30703:20;30699:1;30688:9;30684:17;30677:47;30741:131;30867:4;30741:131;:::i;:::-;30733:139;;30631:248;;;:::o;30885:419::-;31051:4;31089:2;31078:9;31074:18;31066:26;;31138:9;31132:4;31128:20;31124:1;31113:9;31109:17;31102:47;31166:131;31292:4;31166:131;:::i;:::-;31158:139;;31056:248;;;:::o;31310:419::-;31476:4;31514:2;31503:9;31499:18;31491:26;;31563:9;31557:4;31553:20;31549:1;31538:9;31534:17;31527:47;31591:131;31717:4;31591:131;:::i;:::-;31583:139;;31481:248;;;:::o;31735:419::-;31901:4;31939:2;31928:9;31924:18;31916:26;;31988:9;31982:4;31978:20;31974:1;31963:9;31959:17;31952:47;32016:131;32142:4;32016:131;:::i;:::-;32008:139;;31906:248;;;:::o;32160:419::-;32326:4;32364:2;32353:9;32349:18;32341:26;;32413:9;32407:4;32403:20;32399:1;32388:9;32384:17;32377:47;32441:131;32567:4;32441:131;:::i;:::-;32433:139;;32331:248;;;:::o;32585:419::-;32751:4;32789:2;32778:9;32774:18;32766:26;;32838:9;32832:4;32828:20;32824:1;32813:9;32809:17;32802:47;32866:131;32992:4;32866:131;:::i;:::-;32858:139;;32756:248;;;:::o;33010:419::-;33176:4;33214:2;33203:9;33199:18;33191:26;;33263:9;33257:4;33253:20;33249:1;33238:9;33234:17;33227:47;33291:131;33417:4;33291:131;:::i;:::-;33283:139;;33181:248;;;:::o;33435:419::-;33601:4;33639:2;33628:9;33624:18;33616:26;;33688:9;33682:4;33678:20;33674:1;33663:9;33659:17;33652:47;33716:131;33842:4;33716:131;:::i;:::-;33708:139;;33606:248;;;:::o;33860:419::-;34026:4;34064:2;34053:9;34049:18;34041:26;;34113:9;34107:4;34103:20;34099:1;34088:9;34084:17;34077:47;34141:131;34267:4;34141:131;:::i;:::-;34133:139;;34031:248;;;:::o;34285:419::-;34451:4;34489:2;34478:9;34474:18;34466:26;;34538:9;34532:4;34528:20;34524:1;34513:9;34509:17;34502:47;34566:131;34692:4;34566:131;:::i;:::-;34558:139;;34456:248;;;:::o;34710:419::-;34876:4;34914:2;34903:9;34899:18;34891:26;;34963:9;34957:4;34953:20;34949:1;34938:9;34934:17;34927:47;34991:131;35117:4;34991:131;:::i;:::-;34983:139;;34881:248;;;:::o;35135:419::-;35301:4;35339:2;35328:9;35324:18;35316:26;;35388:9;35382:4;35378:20;35374:1;35363:9;35359:17;35352:47;35416:131;35542:4;35416:131;:::i;:::-;35408:139;;35306:248;;;:::o;35560:419::-;35726:4;35764:2;35753:9;35749:18;35741:26;;35813:9;35807:4;35803:20;35799:1;35788:9;35784:17;35777:47;35841:131;35967:4;35841:131;:::i;:::-;35833:139;;35731:248;;;:::o;35985:419::-;36151:4;36189:2;36178:9;36174:18;36166:26;;36238:9;36232:4;36228:20;36224:1;36213:9;36209:17;36202:47;36266:131;36392:4;36266:131;:::i;:::-;36258:139;;36156:248;;;:::o;36410:419::-;36576:4;36614:2;36603:9;36599:18;36591:26;;36663:9;36657:4;36653:20;36649:1;36638:9;36634:17;36627:47;36691:131;36817:4;36691:131;:::i;:::-;36683:139;;36581:248;;;:::o;36835:419::-;37001:4;37039:2;37028:9;37024:18;37016:26;;37088:9;37082:4;37078:20;37074:1;37063:9;37059:17;37052:47;37116:131;37242:4;37116:131;:::i;:::-;37108:139;;37006:248;;;:::o;37260:419::-;37426:4;37464:2;37453:9;37449:18;37441:26;;37513:9;37507:4;37503:20;37499:1;37488:9;37484:17;37477:47;37541:131;37667:4;37541:131;:::i;:::-;37533:139;;37431:248;;;:::o;37685:419::-;37851:4;37889:2;37878:9;37874:18;37866:26;;37938:9;37932:4;37928:20;37924:1;37913:9;37909:17;37902:47;37966:131;38092:4;37966:131;:::i;:::-;37958:139;;37856:248;;;:::o;38110:419::-;38276:4;38314:2;38303:9;38299:18;38291:26;;38363:9;38357:4;38353:20;38349:1;38338:9;38334:17;38327:47;38391:131;38517:4;38391:131;:::i;:::-;38383:139;;38281:248;;;:::o;38535:222::-;38628:4;38666:2;38655:9;38651:18;38643:26;;38679:71;38747:1;38736:9;38732:17;38723:6;38679:71;:::i;:::-;38633:124;;;;:::o;38763:129::-;38797:6;38824:20;;:::i;:::-;38814:30;;38853:33;38881:4;38873:6;38853:33;:::i;:::-;38804:88;;;:::o;38898:75::-;38931:6;38964:2;38958:9;38948:19;;38938:35;:::o;38979:307::-;39040:4;39130:18;39122:6;39119:30;39116:2;;;39152:18;;:::i;:::-;39116:2;39190:29;39212:6;39190:29;:::i;:::-;39182:37;;39274:4;39268;39264:15;39256:23;;39045:241;;;:::o;39292:132::-;39359:4;39382:3;39374:11;;39412:4;39407:3;39403:14;39395:22;;39364:60;;;:::o;39430:114::-;39497:6;39531:5;39525:12;39515:22;;39504:40;;;:::o;39550:98::-;39601:6;39635:5;39629:12;39619:22;;39608:40;;;:::o;39654:99::-;39706:6;39740:5;39734:12;39724:22;;39713:40;;;:::o;39759:113::-;39829:4;39861;39856:3;39852:14;39844:22;;39834:38;;;:::o;39878:184::-;39977:11;40011:6;40006:3;39999:19;40051:4;40046:3;40042:14;40027:29;;39989:73;;;;:::o;40068:168::-;40151:11;40185:6;40180:3;40173:19;40225:4;40220:3;40216:14;40201:29;;40163:73;;;;:::o;40242:147::-;40343:11;40380:3;40365:18;;40355:34;;;;:::o;40395:169::-;40479:11;40513:6;40508:3;40501:19;40553:4;40548:3;40544:14;40529:29;;40491:73;;;;:::o;40570:148::-;40672:11;40709:3;40694:18;;40684:34;;;;:::o;40724:305::-;40764:3;40783:20;40801:1;40783:20;:::i;:::-;40778:25;;40817:20;40835:1;40817:20;:::i;:::-;40812:25;;40971:1;40903:66;40899:74;40896:1;40893:81;40890:2;;;40977:18;;:::i;:::-;40890:2;41021:1;41018;41014:9;41007:16;;40768:261;;;;:::o;41035:185::-;41075:1;41092:20;41110:1;41092:20;:::i;:::-;41087:25;;41126:20;41144:1;41126:20;:::i;:::-;41121:25;;41165:1;41155:2;;41170:18;;:::i;:::-;41155:2;41212:1;41209;41205:9;41200:14;;41077:143;;;;:::o;41226:348::-;41266:7;41289:20;41307:1;41289:20;:::i;:::-;41284:25;;41323:20;41341:1;41323:20;:::i;:::-;41318:25;;41511:1;41443:66;41439:74;41436:1;41433:81;41428:1;41421:9;41414:17;41410:105;41407:2;;;41518:18;;:::i;:::-;41407:2;41566:1;41563;41559:9;41548:20;;41274:300;;;;:::o;41580:191::-;41620:4;41640:20;41658:1;41640:20;:::i;:::-;41635:25;;41674:20;41692:1;41674:20;:::i;:::-;41669:25;;41713:1;41710;41707:8;41704:2;;;41718:18;;:::i;:::-;41704:2;41763:1;41760;41756:9;41748:17;;41625:146;;;;:::o;41777:96::-;41814:7;41843:24;41861:5;41843:24;:::i;:::-;41832:35;;41822:51;;;:::o;41879:90::-;41913:7;41956:5;41949:13;41942:21;41931:32;;41921:48;;;:::o;41975:77::-;42012:7;42041:5;42030:16;;42020:32;;;:::o;42058:149::-;42094:7;42134:66;42127:5;42123:78;42112:89;;42102:105;;;:::o;42213:131::-;42260:7;42289:5;42278:16;;42295:43;42332:5;42295:43;:::i;:::-;42268:76;;;:::o;42350:126::-;42387:7;42427:42;42420:5;42416:54;42405:65;;42395:81;;;:::o;42482:77::-;42519:7;42548:5;42537:16;;42527:32;;;:::o;42565:131::-;42623:9;42656:34;42684:5;42656:34;:::i;:::-;42643:47;;42633:63;;;:::o;42702:154::-;42786:6;42781:3;42776;42763:30;42848:1;42839:6;42834:3;42830:16;42823:27;42753:103;;;:::o;42862:307::-;42930:1;42940:113;42954:6;42951:1;42948:13;42940:113;;;43039:1;43034:3;43030:11;43024:18;43020:1;43015:3;43011:11;43004:39;42976:2;42973:1;42969:10;42964:15;;42940:113;;;43071:6;43068:1;43065:13;43062:2;;;43151:1;43142:6;43137:3;43133:16;43126:27;43062:2;42911:258;;;;:::o;43175:320::-;43219:6;43256:1;43250:4;43246:12;43236:22;;43303:1;43297:4;43293:12;43324:18;43314:2;;43380:4;43372:6;43368:17;43358:27;;43314:2;43442;43434:6;43431:14;43411:18;43408:38;43405:2;;;43461:18;;:::i;:::-;43405:2;43226:269;;;;:::o;43501:281::-;43584:27;43606:4;43584:27;:::i;:::-;43576:6;43572:40;43714:6;43702:10;43699:22;43678:18;43666:10;43663:34;43660:62;43657:2;;;43725:18;;:::i;:::-;43657:2;43765:10;43761:2;43754:22;43544:238;;;:::o;43788:233::-;43827:3;43850:24;43868:5;43850:24;:::i;:::-;43841:33;;43896:66;43889:5;43886:77;43883:2;;;43966:18;;:::i;:::-;43883:2;44013:1;44006:5;44002:13;43995:20;;43831:190;;;:::o;44027:100::-;44066:7;44095:26;44115:5;44095:26;:::i;:::-;44084:37;;44074:53;;;:::o;44133:79::-;44172:7;44201:5;44190:16;;44180:32;;;:::o;44218:94::-;44257:7;44286:20;44300:5;44286:20;:::i;:::-;44275:31;;44265:47;;;:::o;44318:79::-;44357:7;44386:5;44375:16;;44365:32;;;:::o;44403:176::-;44435:1;44452:20;44470:1;44452:20;:::i;:::-;44447:25;;44486:20;44504:1;44486:20;:::i;:::-;44481:25;;44525:1;44515:2;;44530:18;;:::i;:::-;44515:2;44571:1;44568;44564:9;44559:14;;44437:142;;;;:::o;44585:180::-;44633:77;44630:1;44623:88;44730:4;44727:1;44720:15;44754:4;44751:1;44744:15;44771:180;44819:77;44816:1;44809:88;44916:4;44913:1;44906:15;44940:4;44937:1;44930:15;44957:180;45005:77;45002:1;44995:88;45102:4;45099:1;45092:15;45126:4;45123:1;45116:15;45143:180;45191:77;45188:1;45181:88;45288:4;45285:1;45278:15;45312:4;45309:1;45302:15;45329:180;45377:77;45374:1;45367:88;45474:4;45471:1;45464:15;45498:4;45495:1;45488:15;45515:102;45556:6;45607:2;45603:7;45598:2;45591:5;45587:14;45583:28;45573:38;;45563:54;;;:::o;45623:94::-;45656:8;45704:5;45700:2;45696:14;45675:35;;45665:52;;;:::o;45723:225::-;45863:34;45859:1;45851:6;45847:14;45840:58;45932:8;45927:2;45919:6;45915:15;45908:33;45829:119;:::o;45954:227::-;46094:34;46090:1;46082:6;46078:14;46071:58;46163:10;46158:2;46150:6;46146:15;46139:35;46060:121;:::o;46187:223::-;46327:34;46323:1;46315:6;46311:14;46304:58;46396:6;46391:2;46383:6;46379:15;46372:31;46293:117;:::o;46416:172::-;46556:24;46552:1;46544:6;46540:14;46533:48;46522:66;:::o;46594:230::-;46734:34;46730:1;46722:6;46718:14;46711:58;46803:13;46798:2;46790:6;46786:15;46779:38;46700:124;:::o;46830:237::-;46970:34;46966:1;46958:6;46954:14;46947:58;47039:20;47034:2;47026:6;47022:15;47015:45;46936:131;:::o;47073:225::-;47213:34;47209:1;47201:6;47197:14;47190:58;47282:8;47277:2;47269:6;47265:15;47258:33;47179:119;:::o;47304:178::-;47444:30;47440:1;47432:6;47428:14;47421:54;47410:72;:::o;47488:223::-;47628:34;47624:1;47616:6;47612:14;47605:58;47697:6;47692:2;47684:6;47680:15;47673:31;47594:117;:::o;47717:175::-;47857:27;47853:1;47845:6;47841:14;47834:51;47823:69;:::o;47898:245::-;48038:34;48034:1;48026:6;48022:14;48015:58;48107:28;48102:2;48094:6;48090:15;48083:53;48004:139;:::o;48149:179::-;48289:31;48285:1;48277:6;48273:14;48266:55;48255:73;:::o;48334:231::-;48474:34;48470:1;48462:6;48458:14;48451:58;48543:14;48538:2;48530:6;48526:15;48519:39;48440:125;:::o;48571:230::-;48711:34;48707:1;48699:6;48695:14;48688:58;48780:13;48775:2;48767:6;48763:15;48756:38;48677:124;:::o;48807:164::-;48947:16;48943:1;48935:6;48931:14;48924:40;48913:58;:::o;48977:243::-;49117:34;49113:1;49105:6;49101:14;49094:58;49186:26;49181:2;49173:6;49169:15;49162:51;49083:137;:::o;49226:229::-;49366:34;49362:1;49354:6;49350:14;49343:58;49435:12;49430:2;49422:6;49418:15;49411:37;49332:123;:::o;49461:228::-;49601:34;49597:1;49589:6;49585:14;49578:58;49670:11;49665:2;49657:6;49653:15;49646:36;49567:122;:::o;49695:182::-;49835:34;49831:1;49823:6;49819:14;49812:58;49801:76;:::o;49883:169::-;50023:21;50019:1;50011:6;50007:14;50000:45;49989:63;:::o;50058:231::-;50198:34;50194:1;50186:6;50182:14;50175:58;50267:14;50262:2;50254:6;50250:15;50243:39;50164:125;:::o;50295:182::-;50435:34;50431:1;50423:6;50419:14;50412:58;50401:76;:::o;50483:170::-;50623:22;50619:1;50611:6;50607:14;50600:46;50589:64;:::o;50659:228::-;50799:34;50795:1;50787:6;50783:14;50776:58;50868:11;50863:2;50855:6;50851:15;50844:36;50765:122;:::o;50893:234::-;51033:34;51029:1;51021:6;51017:14;51010:58;51102:17;51097:2;51089:6;51085:15;51078:42;50999:128;:::o;51133:169::-;51273:21;51269:1;51261:6;51257:14;51250:45;51239:63;:::o;51308:220::-;51448:34;51444:1;51436:6;51432:14;51425:58;51517:3;51512:2;51504:6;51500:15;51493:28;51414:114;:::o;51534:::-;51640:8;:::o;51654:236::-;51794:34;51790:1;51782:6;51778:14;51771:58;51863:19;51858:2;51850:6;51846:15;51839:44;51760:130;:::o;51896:231::-;52036:34;52032:1;52024:6;52020:14;52013:58;52105:14;52100:2;52092:6;52088:15;52081:39;52002:125;:::o;52133:115::-;52216:1;52209:5;52206:12;52196:2;;52222:18;;:::i;:::-;52196:2;52186:62;:::o;52254:122::-;52327:24;52345:5;52327:24;:::i;:::-;52320:5;52317:35;52307:2;;52366:1;52363;52356:12;52307:2;52297:79;:::o;52382:116::-;52452:21;52467:5;52452:21;:::i;:::-;52445:5;52442:32;52432:2;;52488:1;52485;52478:12;52432:2;52422:76;:::o;52504:122::-;52577:24;52595:5;52577:24;:::i;:::-;52570:5;52567:35;52557:2;;52616:1;52613;52606:12;52557:2;52547:79;:::o;52632:120::-;52704:23;52721:5;52704:23;:::i;:::-;52697:5;52694:34;52684:2;;52742:1;52739;52732:12;52684:2;52674:78;:::o;52758:109::-;52841:1;52834:5;52831:12;52821:2;;52857:1;52854;52847:12;52821:2;52811:56;:::o;52873:122::-;52946:24;52964:5;52946:24;:::i;:::-;52939:5;52936:35;52926:2;;52985:1;52982;52975:12;52926:2;52916:79;:::o

Swarm Source

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