ETH Price: $2,934.38 (-4.34%)
Gas: 2 Gwei

Token

GhettoSharkhood (GSH)
 

Overview

Max Total Supply

10,000 GSH

Holders

738

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
frothmonsterrr.eth
Balance
1 GSH
0xf31288b4b62f8f1580adc4420285c3d62c61e5bf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ghetto SharkHood is a limited collection of 10,000 Ghetto Shark NFTs swimming in the Ethereum blockchain. Your Ghetto Shark serves as your lifetime membership to the SharkHood, granting you access to members-only benefits. Future real-world and metaverse utilities will be unlo...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GhettoSharkhood

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

// File: contracts/interface/MinterMintable.sol

pragma solidity ^0.8.7;

interface MinterMintable {
    function isMinter(address check) external view returns (bool);
    function mint(address owner) external returns (uint256);
    function batchMint(address owner, uint256 amount) external returns (uint256[] memory);
}

// File: contracts/interface/GhettoSharkhoodInterface.sol

pragma solidity ^0.8.7;

interface GhettoSharkhoodInterface {
    function isRevealed() external view returns (bool);
    function sequenceId(uint256 tokenId) external view returns (uint256);
    function batchMax() external view returns (uint256);
}

// File: contracts/GhettoSharkhood.sol

pragma solidity ^0.8.7;






contract GhettoSharkhood is ERC721, Ownable, MinterMintable, GhettoSharkhoodInterface {

    constructor() ERC721("GhettoSharkhood", "GSH") {

    }

    // minters 

    mapping(address => bool) _isMinter_;

    modifier onlyMinter() {
        require(_isMinter_[msg.sender], "GhettoSharkhood: msg.sender is not a minter");
        _;
    }

    /**
     * This function is to get check whether the address is a minter.
     */
    function isMinter(address addr) external view override returns (bool) {
        return _isMinter_[addr];
    }

    function setMinter(address addr, bool status) external onlyOwner {
        _isMinter_[addr] = status;
    }

    // Blackbox control

    /**
     * The boolean value that saving the status of revealing.
     */
    bool private _isRevealed_ = false;

    /**
     * The offset of NFT
     */
    uint256 _offset_ = 0;

    /**
     * This event will be triggered after revealing.
     */
    event Revealed();

    /**
     * This is an owner only function
     * this function will set revealed to true, and generate a random offset less than totalSupply;
     */
    function reveal() public onlyOwner {
        require(_baseURILocked_, "GhettoSharkhood: Base URI should be locked before revealing.");
        _isRevealed_ = true;
        _offset_ = randomNumber();

        emit Revealed();
    }

    /**
     * The view function to the status of revealing.
     */
    function isRevealed() external override view returns (bool) {
        return _isRevealed_;
    }

    // Base URI

    bool _baseURILocked_ = false;
    string private _baseURI_ = "";
    string private _placeholderBaseURI_ = "ipfs://QmQYq3gcXzpsUqorNwt8iBoU5u6xVzjDoffGbV6fijbryK/";

    function lockBaseURI() public onlyOwner {
        require(bytes(_baseURI_).length > 0, "GhettoSharkhood: Base URI should be set before locking.");
        _baseURILocked_ = true;
    }

    /**
     * This function is an owner only function, it can change baseURI.
     */
    function setBaseURI(string memory uri) public onlyOwner {
        require(!_baseURILocked_, "GhettoSharkhodd: BaseURI has been locked, it cannot be changed anymore.");
        _baseURI_ = uri;
    }

    /**
     * This function overrides the function defined in ERC721 contract
     */
    function _baseURI() internal view override returns (string memory) {
        return _baseURI_;
    }

    /**
     * This function will return the real NFT base uri.
     */
    function baseURI() public view returns (string memory) {
        return _baseURI();
    }

    /**
     * This function is an owner only function, it can change placeholder baseURI.
     */
    function setPlaceholderBaseURI(string memory uri) public onlyOwner {
        _placeholderBaseURI_ = uri;
    }

    /**
     * This function will return the placeholder base uri.
     */
    function placeholderBaseURI() public view returns (string memory) {
        return _placeholderBaseURI_;
    }

    // NFT

    uint256 _totalSupply_ = 10000;

    uint256 _currentTokenId_ = 0;

    /**
     * This variable keep the max size of batch to avoid out of gas exception.
     */
    uint256 _batchMax_ = 100;

    /**
     * This modifier will calculate whether it will exceed the totalSupply after minting or not.
     */
    modifier enoughToMint(uint256 amount) {
        require(
            amount <= _totalSupply_ 
            && _currentTokenId_ + amount > _currentTokenId_
            && _currentTokenId_ + amount <= _totalSupply_, "GhettoSharkhood: GhettoSharkhoold are all minted.");
        _;
    }

    /**
     * This modifier will limit the amount larger than batch size.
     */
    modifier underMaxBatchSize(uint256 amount) {
        require(amount <= _batchMax_, "GhettoSharkhood: over the limit of batch size.");
        _;
    }

    /**
     * This function can only be called by minter, it will mint 1 NFT to specified owner.
     */
    function mint(address owner) external override onlyMinter enoughToMint(1) returns (uint256) {
        return (mintSpeficiedAmount(owner, 1))[0];
    }

    /**
     * This function can only called by minter, it will mint specified amount of NFT to specified owner.
     */
    function batchMint(address owner, uint256 amount) external override 
        onlyMinter
        enoughToMint(amount) 
        underMaxBatchSize(amount) 
        returns (uint256[] memory) {
        require(amount >= 1, "GhettoShakhood: amount should larger than 0.");
        return mintSpeficiedAmount(owner, amount);
    }

    /**
     * This is an internal function, and it is the real operator to mint NFT to user,
     * it will return an array of tokenID after minting.
     */
    function mintSpeficiedAmount(address owner, uint256 amount) internal returns (uint256[] memory) {
        uint256[] memory minted_ = new uint256[](amount);

        for(uint256 i = 0; i < amount; i ++) {
            uint256 tokenIdToMint = _currentTokenId_ + i + 1;
            _safeMint(owner, tokenIdToMint);
            minted_[i] = tokenIdToMint;
        }

        _currentTokenId_ += amount;

        return minted_;
    }

    /**
     * This function overrides the function defined in ERC721 contract,
     * before revealing or baseURI has not been set, it will always return the placeholder.
     * otherwise, the sequenceId will be calculated and combined to tokenURI.
     */
    function tokenURI(uint256 tokenId_) public view override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");

        if (!_isRevealed_) {
            return bytes(_placeholderBaseURI_).length > 0 ? 
                string(abi.encodePacked(_placeholderBaseURI_, Strings.toString(tokenId_), ".json")) : "";
        }

        return bytes(_baseURI_).length > 0 ? 
            string(abi.encodePacked(_baseURI_, Strings.toString(_sequenceId(tokenId_)), ".json")) : "";
    }

    /**
     * This function will return the max batch size.
     */
    function batchMax() external override view returns (uint256) {
        return _batchMax_;
    }

    /**
     * This function will return the totalSupply of NFT.
     */
    function totalSupply() external view returns (uint256) {
        return _totalSupply_;
    }

    /**
     * This function will return the last tokenID has been bought.
     */
    function getCurrentTokenId() external view returns (uint256) {
        return _currentTokenId_;
    }

    // Utilities

    function randomNumber() internal view virtual returns (uint256) {
        return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, block.number)));
    }

    /**
     * This function will return the sequenceId of tokenId,
     * as we mentioned above
     * sequenceId is the id that point to GhettoSharkhood.
     * tokenId is the token that user keep.
     */
    function sequenceId(uint256 tokenId) external override view returns (uint256) {
        return _sequenceId(tokenId);
    }

    /**
     * This function will caculate the ID for specified tokenID,
     * for example: 
     * tokenId -> 1 and the offset -> 1, the sequenceId will be 2.
     * tokenId -> 10000 and the offset -> 1, the sequenceId will be 1.
     */
    function _sequenceId(uint256 tokenId) internal view returns (uint256) {
        return _isRevealed_ ? (((tokenId - 1) + _offset_) % _totalSupply_ + 1) : 0;
    }

    /**
     * The flag to save whether team has reserved 200 NFT or not.
     */
    bool _teamClaimed_ = false;

    /**
     * This function is an owner only function,
     * the contract owner can mint 200 NFT, and don't need to mint via any minter,
     * but this is one time operation.
     */
    function teamClaim() public onlyOwner returns (uint256[] memory) {
        require(!_teamClaimed_, "GhettoSharkhood: team has claimed already");
        _teamClaimed_ = true;
        return mintSpeficiedAmount(msg.sender, 200);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Revealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"batchMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"sequenceId","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":"address","name":"addr","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setPlaceholderBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamClaim","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600860006101000a81548160ff02191690831515021790555060006009556000600a60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600b90805190602001906200006692919062000266565b506040518060600160405280603681526020016200458260369139600c90805190602001906200009892919062000266565b50612710600d556000600e556064600f556000601060006101000a81548160ff021916908315150217905550348015620000d157600080fd5b506040518060400160405280600f81526020017f47686574746f536861726b686f6f6400000000000000000000000000000000008152506040518060400160405280600381526020017f475348000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015692919062000266565b5080600190805190602001906200016f92919062000266565b50505062000192620001866200019860201b60201c565b620001a060201b60201c565b6200037b565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002749062000316565b90600052602060002090601f016020900481019282620002985760008555620002e4565b82601f10620002b357805160ff1916838001178555620002e4565b82800160010185558215620002e4579182015b82811115620002e3578251825591602001919060010190620002c6565b5b509050620002f39190620002f7565b5090565b5b8082111562000312576000816000905550600101620002f8565b5090565b600060028204905060018216806200032f57607f821691505b602082108114156200034657620003456200034c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6141f7806200038b6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80636a6278421161010f578063a475b5dd116100a2578063cef2427511610071578063cef2427514610583578063cf456ae7146105b3578063e985e9c5146105cf578063f2fde38b146105ff576101f0565b8063a475b5dd146104fd578063aa271e1a14610507578063b88d4fde14610537578063c87b56dd14610553576101f0565b8063715018a6116100de578063715018a61461049b5780638da5cb5b146104a557806395d89b41146104c3578063a22cb465146104e1576101f0565b80636a627842146103ff5780636ae146c21461042f5780636c0360eb1461044d57806370a082311461046b576101f0565b80634ed69eaf1161018757806355f804b31161015657806355f804b3146103775780635618923614610393578063589e47dc146103b15780636352211e146103cf576101f0565b80634ed69eaf146103155780635275e2de1461033157806353df5c7c1461034f57806354214f6914610359576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad57806342842e0e146102c957806343508b05146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612b53565b61061b565b60405161021c919061326e565b60405180910390f35b61022d6106fd565b60405161023a9190613289565b60405180910390f35b61025d60048036038101906102589190612bf6565b61078f565b60405161026a91906131e5565b60405180910390f35b61028d60048036038101906102889190612b13565b610814565b005b61029761092c565b6040516102a491906135ab565b60405180910390f35b6102c760048036038101906102c291906129fd565b610936565b005b6102e360048036038101906102de91906129fd565b610996565b005b6102ff60048036038101906102fa9190612b13565b6109b6565b60405161030c919061324c565b60405180910390f35b61032f600480360381019061032a9190612bad565b610b5d565b005b610339610bf3565b6040516103469190613289565b60405180910390f35b610357610c85565b005b610361610d6f565b60405161036e919061326e565b60405180910390f35b610391600480360381019061038c9190612bad565b610d86565b005b61039b610e6c565b6040516103a891906135ab565b60405180910390f35b6103b9610e76565b6040516103c691906135ab565b60405180910390f35b6103e960048036038101906103e49190612bf6565b610e80565b6040516103f691906131e5565b60405180910390f35b61041960048036038101906104149190612990565b610f32565b60405161042691906135ab565b60405180910390f35b61043761106a565b604051610444919061324c565b60405180910390f35b610455611163565b6040516104629190613289565b60405180910390f35b61048560048036038101906104809190612990565b611172565b60405161049291906135ab565b60405180910390f35b6104a361122a565b005b6104ad6112b2565b6040516104ba91906131e5565b60405180910390f35b6104cb6112dc565b6040516104d89190613289565b60405180910390f35b6104fb60048036038101906104f69190612ad3565b61136e565b005b6105056114ef565b005b610521600480360381019061051c9190612990565b611611565b60405161052e919061326e565b60405180910390f35b610551600480360381019061054c9190612a50565b611667565b005b61056d60048036038101906105689190612bf6565b6116c9565b60405161057a9190613289565b60405180910390f35b61059d60048036038101906105989190612bf6565b6117ec565b6040516105aa91906135ab565b60405180910390f35b6105cd60048036038101906105c89190612ad3565b6117fe565b005b6105e960048036038101906105e491906129bd565b6118d5565b6040516105f6919061326e565b60405180910390f35b61061960048036038101906106149190612990565b611969565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f657506106f582611a61565b5b9050919050565b60606000805461070c9061384f565b80601f01602080910402602001604051908101604052809291908181526020018280546107389061384f565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a82611acb565b6107d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d09061342b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081f82610e80565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610890576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610887906134ab565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108af611b37565b73ffffffffffffffffffffffffffffffffffffffff1614806108de57506108dd816108d8611b37565b6118d5565b5b61091d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610914906133ab565b60405180910390fd5b6109278383611b3f565b505050565b6000600d54905090565b610947610941611b37565b82611bf8565b610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d9061350b565b60405180910390fd5b610991838383611cd6565b505050565b6109b183838360405180602001604052806000815250611667565b505050565b6060600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b906134eb565b60405180910390fd5b81600d548111158015610a655750600e5481600e54610a6391906136de565b115b8015610a805750600d5481600e54610a7d91906136de565b11155b610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab6906134cb565b60405180910390fd5b82600f54811115610b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afc9061352b565b60405180910390fd5b6001841015610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b409061338b565b60405180910390fd5b610b538585611f32565b9250505092915050565b610b65611b37565b73ffffffffffffffffffffffffffffffffffffffff16610b836112b2565b73ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd09061344b565b60405180910390fd5b80600c9080519060200190610bef9291906127a4565b5050565b6060600c8054610c029061384f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e9061384f565b8015610c7b5780601f10610c5057610100808354040283529160200191610c7b565b820191906000526020600020905b815481529060010190602001808311610c5e57829003601f168201915b5050505050905090565b610c8d611b37565b73ffffffffffffffffffffffffffffffffffffffff16610cab6112b2565b73ffffffffffffffffffffffffffffffffffffffff1614610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf89061344b565b60405180910390fd5b6000600b8054610d109061384f565b905011610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d499061330b565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900460ff16905090565b610d8e611b37565b73ffffffffffffffffffffffffffffffffffffffff16610dac6112b2565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df99061344b565b60405180910390fd5b600a60009054906101000a900460ff1615610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061358b565b60405180910390fd5b80600b9080519060200190610e689291906127a4565b5050565b6000600e54905090565b6000600f54905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f20906133eb565b60405180910390fd5b80915050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb7906134eb565b60405180910390fd5b6001600d548111158015610fe25750600e5481600e54610fe091906136de565b115b8015610ffd5750600d5481600e54610ffa91906136de565b11155b61103c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611033906134cb565b60405180910390fd5b611047836001611f32565b60008151811061105a576110596139c3565b5b6020026020010151915050919050565b6060611074611b37565b73ffffffffffffffffffffffffffffffffffffffff166110926112b2565b73ffffffffffffffffffffffffffffffffffffffff16146110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df9061344b565b60405180910390fd5b601060009054906101000a900460ff1615611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f9061356b565b60405180910390fd5b6001601060006101000a81548160ff02191690831515021790555061115e3360c8611f32565b905090565b606061116d61200c565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da906133cb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611232611b37565b73ffffffffffffffffffffffffffffffffffffffff166112506112b2565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061344b565b60405180910390fd5b6112b0600061209e565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112eb9061384f565b80601f01602080910402602001604051908101604052809291908181526020018280546113179061384f565b80156113645780601f1061133957610100808354040283529160200191611364565b820191906000526020600020905b81548152906001019060200180831161134757829003601f168201915b5050505050905090565b611376611b37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db9061334b565b60405180910390fd5b80600560006113f1611b37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149e611b37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114e3919061326e565b60405180910390a35050565b6114f7611b37565b73ffffffffffffffffffffffffffffffffffffffff166115156112b2565b73ffffffffffffffffffffffffffffffffffffffff161461156b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115629061344b565b60405180910390fd5b600a60009054906101000a900460ff166115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b19061354b565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055506115dd612164565b6009819055507fe2a7169cedebe39671840370ae19ca4fc41be6191d4c77f174f189a4d8cd08c860405160405180910390a1565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611678611672611b37565b83611bf8565b6116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae9061350b565b60405180910390fd5b6116c384848484612199565b50505050565b60606116d482611acb565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061348b565b60405180910390fd5b600860009054906101000a900460ff16611785576000600c80546117369061384f565b905011611752576040518060200160405280600081525061177e565b600c61175d836121f5565b60405160200161176e929190613179565b6040516020818303038152906040525b90506117e7565b6000600b80546117949061384f565b9050116117b057604051806020016040528060008152506117e4565b600b6117c36117be84612356565b6121f5565b6040516020016117d4929190613179565b6040516020818303038152906040525b90505b919050565b60006117f782612356565b9050919050565b611806611b37565b73ffffffffffffffffffffffffffffffffffffffff166118246112b2565b73ffffffffffffffffffffffffffffffffffffffff161461187a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118719061344b565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611971611b37565b73ffffffffffffffffffffffffffffffffffffffff1661198f6112b2565b73ffffffffffffffffffffffffffffffffffffffff16146119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc9061344b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c906132cb565b60405180910390fd5b611a5e8161209e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bb283610e80565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0382611acb565b611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c399061336b565b60405180910390fd5b6000611c4d83610e80565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cbc57508373ffffffffffffffffffffffffffffffffffffffff16611ca48461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ccd5750611ccc81856118d5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cf682610e80565b73ffffffffffffffffffffffffffffffffffffffff1614611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d439061346b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db39061332b565b60405180910390fd5b611dc78383836123ae565b611dd2600082611b3f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e229190613765565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7991906136de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008267ffffffffffffffff811115611f5057611f4f6139f2565b5b604051908082528060200260200182016040528015611f7e5781602001602082028036833780820191505090505b50905060005b83811015611fe8576000600182600e54611f9e91906136de565b611fa891906136de565b9050611fb486826123b3565b80838381518110611fc857611fc76139c3565b5b602002602001018181525050508080611fe0906138b2565b915050611f84565b5082600e6000828254611ffb91906136de565b925050819055508091505092915050565b6060600b805461201b9061384f565b80601f01602080910402602001604051908101604052809291908181526020018280546120479061384f565b80156120945780601f1061206957610100808354040283529160200191612094565b820191906000526020600020905b81548152906001019060200180831161207757829003601f168201915b5050505050905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600044424360405160200161217b939291906131a8565b6040516020818303038152906040528051906020012060001c905090565b6121a4848484611cd6565b6121b0848484846123d1565b6121ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e6906132ab565b60405180910390fd5b50505050565b6060600082141561223d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612351565b600082905060005b6000821461226f578080612258906138b2565b915050600a826122689190613734565b9150612245565b60008167ffffffffffffffff81111561228b5761228a6139f2565b5b6040519080825280601f01601f1916602001820160405280156122bd5781602001600182028036833780820191505090505b5090505b6000851461234a576001826122d69190613765565b9150600a856122e59190613905565b60306122f191906136de565b60f81b818381518110612307576123066139c3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123439190613734565b94506122c1565b8093505050505b919050565b6000600860009054906101000a900460ff166123735760006123a7565b6001600d546009546001856123889190613765565b61239291906136de565b61239c9190613905565b6123a691906136de565b5b9050919050565b505050565b6123cd828260405180602001604052806000815250612568565b5050565b60006123f28473ffffffffffffffffffffffffffffffffffffffff166125c3565b1561255b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261241b611b37565b8786866040518563ffffffff1660e01b815260040161243d9493929190613200565b602060405180830381600087803b15801561245757600080fd5b505af192505050801561248857506040513d601f19601f820116820180604052508101906124859190612b80565b60015b61250b573d80600081146124b8576040519150601f19603f3d011682016040523d82523d6000602084013e6124bd565b606091505b50600081511415612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fa906132ab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612560565b600190505b949350505050565b61257283836125d6565b61257f60008484846123d1565b6125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b5906132ab565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d9061340b565b60405180910390fd5b61264f81611acb565b1561268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906132eb565b60405180910390fd5b61269b600083836123ae565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126eb91906136de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546127b09061384f565b90600052602060002090601f0160209004810192826127d25760008555612819565b82601f106127eb57805160ff1916838001178555612819565b82800160010185558215612819579182015b828111156128185782518255916020019190600101906127fd565b5b509050612826919061282a565b5090565b5b8082111561284357600081600090555060010161282b565b5090565b600061285a612855846135eb565b6135c6565b90508281526020810184848401111561287657612875613a26565b5b61288184828561380d565b509392505050565b600061289c6128978461361c565b6135c6565b9050828152602081018484840111156128b8576128b7613a26565b5b6128c384828561380d565b509392505050565b6000813590506128da81614165565b92915050565b6000813590506128ef8161417c565b92915050565b60008135905061290481614193565b92915050565b60008151905061291981614193565b92915050565b600082601f83011261293457612933613a21565b5b8135612944848260208601612847565b91505092915050565b600082601f83011261296257612961613a21565b5b8135612972848260208601612889565b91505092915050565b60008135905061298a816141aa565b92915050565b6000602082840312156129a6576129a5613a30565b5b60006129b4848285016128cb565b91505092915050565b600080604083850312156129d4576129d3613a30565b5b60006129e2858286016128cb565b92505060206129f3858286016128cb565b9150509250929050565b600080600060608486031215612a1657612a15613a30565b5b6000612a24868287016128cb565b9350506020612a35868287016128cb565b9250506040612a468682870161297b565b9150509250925092565b60008060008060808587031215612a6a57612a69613a30565b5b6000612a78878288016128cb565b9450506020612a89878288016128cb565b9350506040612a9a8782880161297b565b925050606085013567ffffffffffffffff811115612abb57612aba613a2b565b5b612ac78782880161291f565b91505092959194509250565b60008060408385031215612aea57612ae9613a30565b5b6000612af8858286016128cb565b9250506020612b09858286016128e0565b9150509250929050565b60008060408385031215612b2a57612b29613a30565b5b6000612b38858286016128cb565b9250506020612b498582860161297b565b9150509250929050565b600060208284031215612b6957612b68613a30565b5b6000612b77848285016128f5565b91505092915050565b600060208284031215612b9657612b95613a30565b5b6000612ba48482850161290a565b91505092915050565b600060208284031215612bc357612bc2613a30565b5b600082013567ffffffffffffffff811115612be157612be0613a2b565b5b612bed8482850161294d565b91505092915050565b600060208284031215612c0c57612c0b613a30565b5b6000612c1a8482850161297b565b91505092915050565b6000612c2f8383613144565b60208301905092915050565b612c4481613799565b82525050565b6000612c5582613672565b612c5f81856136a0565b9350612c6a8361364d565b8060005b83811015612c9b578151612c828882612c23565b9750612c8d83613693565b925050600181019050612c6e565b5085935050505092915050565b612cb1816137ab565b82525050565b6000612cc28261367d565b612ccc81856136b1565b9350612cdc81856020860161381c565b612ce581613a35565b840191505092915050565b6000612cfb82613688565b612d0581856136c2565b9350612d1581856020860161381c565b612d1e81613a35565b840191505092915050565b6000612d3482613688565b612d3e81856136d3565b9350612d4e81856020860161381c565b80840191505092915050565b60008154612d678161384f565b612d7181866136d3565b94506001821660008114612d8c5760018114612d9d57612dd0565b60ff19831686528186019350612dd0565b612da68561365d565b60005b83811015612dc857815481890152600182019150602081019050612da9565b838801955050505b50505092915050565b6000612de66032836136c2565b9150612df182613a46565b604082019050919050565b6000612e096026836136c2565b9150612e1482613a95565b604082019050919050565b6000612e2c601c836136c2565b9150612e3782613ae4565b602082019050919050565b6000612e4f6037836136c2565b9150612e5a82613b0d565b604082019050919050565b6000612e726024836136c2565b9150612e7d82613b5c565b604082019050919050565b6000612e956019836136c2565b9150612ea082613bab565b602082019050919050565b6000612eb8602c836136c2565b9150612ec382613bd4565b604082019050919050565b6000612edb602c836136c2565b9150612ee682613c23565b604082019050919050565b6000612efe6038836136c2565b9150612f0982613c72565b604082019050919050565b6000612f21602a836136c2565b9150612f2c82613cc1565b604082019050919050565b6000612f446029836136c2565b9150612f4f82613d10565b604082019050919050565b6000612f676020836136c2565b9150612f7282613d5f565b602082019050919050565b6000612f8a602c836136c2565b9150612f9582613d88565b604082019050919050565b6000612fad6005836136d3565b9150612fb882613dd7565b600582019050919050565b6000612fd06020836136c2565b9150612fdb82613e00565b602082019050919050565b6000612ff36029836136c2565b9150612ffe82613e29565b604082019050919050565b6000613016602f836136c2565b915061302182613e78565b604082019050919050565b60006130396021836136c2565b915061304482613ec7565b604082019050919050565b600061305c6031836136c2565b915061306782613f16565b604082019050919050565b600061307f602b836136c2565b915061308a82613f65565b604082019050919050565b60006130a26031836136c2565b91506130ad82613fb4565b604082019050919050565b60006130c5602e836136c2565b91506130d082614003565b604082019050919050565b60006130e8603c836136c2565b91506130f382614052565b604082019050919050565b600061310b6029836136c2565b9150613116826140a1565b604082019050919050565b600061312e6047836136c2565b9150613139826140f0565b606082019050919050565b61314d81613803565b82525050565b61315c81613803565b82525050565b61317361316e82613803565b6138fb565b82525050565b60006131858285612d5a565b91506131918284612d29565b915061319c82612fa0565b91508190509392505050565b60006131b48286613162565b6020820191506131c48285613162565b6020820191506131d48284613162565b602082019150819050949350505050565b60006020820190506131fa6000830184612c3b565b92915050565b60006080820190506132156000830187612c3b565b6132226020830186612c3b565b61322f6040830185613153565b81810360608301526132418184612cb7565b905095945050505050565b600060208201905081810360008301526132668184612c4a565b905092915050565b60006020820190506132836000830184612ca8565b92915050565b600060208201905081810360008301526132a38184612cf0565b905092915050565b600060208201905081810360008301526132c481612dd9565b9050919050565b600060208201905081810360008301526132e481612dfc565b9050919050565b6000602082019050818103600083015261330481612e1f565b9050919050565b6000602082019050818103600083015261332481612e42565b9050919050565b6000602082019050818103600083015261334481612e65565b9050919050565b6000602082019050818103600083015261336481612e88565b9050919050565b6000602082019050818103600083015261338481612eab565b9050919050565b600060208201905081810360008301526133a481612ece565b9050919050565b600060208201905081810360008301526133c481612ef1565b9050919050565b600060208201905081810360008301526133e481612f14565b9050919050565b6000602082019050818103600083015261340481612f37565b9050919050565b6000602082019050818103600083015261342481612f5a565b9050919050565b6000602082019050818103600083015261344481612f7d565b9050919050565b6000602082019050818103600083015261346481612fc3565b9050919050565b6000602082019050818103600083015261348481612fe6565b9050919050565b600060208201905081810360008301526134a481613009565b9050919050565b600060208201905081810360008301526134c48161302c565b9050919050565b600060208201905081810360008301526134e48161304f565b9050919050565b6000602082019050818103600083015261350481613072565b9050919050565b6000602082019050818103600083015261352481613095565b9050919050565b60006020820190508181036000830152613544816130b8565b9050919050565b60006020820190508181036000830152613564816130db565b9050919050565b60006020820190508181036000830152613584816130fe565b9050919050565b600060208201905081810360008301526135a481613121565b9050919050565b60006020820190506135c06000830184613153565b92915050565b60006135d06135e1565b90506135dc8282613881565b919050565b6000604051905090565b600067ffffffffffffffff821115613606576136056139f2565b5b61360f82613a35565b9050602081019050919050565b600067ffffffffffffffff821115613637576136366139f2565b5b61364082613a35565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136e982613803565b91506136f483613803565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561372957613728613936565b5b828201905092915050565b600061373f82613803565b915061374a83613803565b92508261375a57613759613965565b5b828204905092915050565b600061377082613803565b915061377b83613803565b92508282101561378e5761378d613936565b5b828203905092915050565b60006137a4826137e3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561383a57808201518184015260208101905061381f565b83811115613849576000848401525b50505050565b6000600282049050600182168061386757607f821691505b6020821081141561387b5761387a613994565b5b50919050565b61388a82613a35565b810181811067ffffffffffffffff821117156138a9576138a86139f2565b5b80604052505050565b60006138bd82613803565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138f0576138ef613936565b5b600182019050919050565b6000819050919050565b600061391082613803565b915061391b83613803565b92508261392b5761392a613965565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f47686574746f536861726b686f6f643a2042617365205552492073686f756c6460008201527f20626520736574206265666f7265206c6f636b696e672e000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f47686574746f5368616b686f6f643a20616d6f756e742073686f756c64206c6160008201527f72676572207468616e20302e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a2047686574746f536861726b686f6f6c60008201527f642061726520616c6c206d696e7465642e000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a206d73672e73656e646572206973206e60008201527f6f742061206d696e746572000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a206f76657220746865206c696d69742060008201527f6f662062617463682073697a652e000000000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a2042617365205552492073686f756c6460008201527f206265206c6f636b6564206265666f72652072657665616c696e672e00000000602082015250565b7f47686574746f536861726b686f6f643a207465616d2068617320636c61696d6560008201527f6420616c72656164790000000000000000000000000000000000000000000000602082015250565b7f47686574746f536861726b686f64643a2042617365555249206861732062656560008201527f6e206c6f636b65642c2069742063616e6e6f74206265206368616e676564206160208201527f6e796d6f72652e00000000000000000000000000000000000000000000000000604082015250565b61416e81613799565b811461417957600080fd5b50565b614185816137ab565b811461419057600080fd5b50565b61419c816137b7565b81146141a757600080fd5b50565b6141b381613803565b81146141be57600080fd5b5056fea2646970667358221220ad155a3bb3769a14772f7311043eef563371b83fdd414bd05992598efe0647e664736f6c63430008070033697066733a2f2f516d515971336763587a707355716f724e77743869426f5535753678567a6a446f66664762563666696a6272794b2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80636a6278421161010f578063a475b5dd116100a2578063cef2427511610071578063cef2427514610583578063cf456ae7146105b3578063e985e9c5146105cf578063f2fde38b146105ff576101f0565b8063a475b5dd146104fd578063aa271e1a14610507578063b88d4fde14610537578063c87b56dd14610553576101f0565b8063715018a6116100de578063715018a61461049b5780638da5cb5b146104a557806395d89b41146104c3578063a22cb465146104e1576101f0565b80636a627842146103ff5780636ae146c21461042f5780636c0360eb1461044d57806370a082311461046b576101f0565b80634ed69eaf1161018757806355f804b31161015657806355f804b3146103775780635618923614610393578063589e47dc146103b15780636352211e146103cf576101f0565b80634ed69eaf146103155780635275e2de1461033157806353df5c7c1461034f57806354214f6914610359576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad57806342842e0e146102c957806343508b05146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612b53565b61061b565b60405161021c919061326e565b60405180910390f35b61022d6106fd565b60405161023a9190613289565b60405180910390f35b61025d60048036038101906102589190612bf6565b61078f565b60405161026a91906131e5565b60405180910390f35b61028d60048036038101906102889190612b13565b610814565b005b61029761092c565b6040516102a491906135ab565b60405180910390f35b6102c760048036038101906102c291906129fd565b610936565b005b6102e360048036038101906102de91906129fd565b610996565b005b6102ff60048036038101906102fa9190612b13565b6109b6565b60405161030c919061324c565b60405180910390f35b61032f600480360381019061032a9190612bad565b610b5d565b005b610339610bf3565b6040516103469190613289565b60405180910390f35b610357610c85565b005b610361610d6f565b60405161036e919061326e565b60405180910390f35b610391600480360381019061038c9190612bad565b610d86565b005b61039b610e6c565b6040516103a891906135ab565b60405180910390f35b6103b9610e76565b6040516103c691906135ab565b60405180910390f35b6103e960048036038101906103e49190612bf6565b610e80565b6040516103f691906131e5565b60405180910390f35b61041960048036038101906104149190612990565b610f32565b60405161042691906135ab565b60405180910390f35b61043761106a565b604051610444919061324c565b60405180910390f35b610455611163565b6040516104629190613289565b60405180910390f35b61048560048036038101906104809190612990565b611172565b60405161049291906135ab565b60405180910390f35b6104a361122a565b005b6104ad6112b2565b6040516104ba91906131e5565b60405180910390f35b6104cb6112dc565b6040516104d89190613289565b60405180910390f35b6104fb60048036038101906104f69190612ad3565b61136e565b005b6105056114ef565b005b610521600480360381019061051c9190612990565b611611565b60405161052e919061326e565b60405180910390f35b610551600480360381019061054c9190612a50565b611667565b005b61056d60048036038101906105689190612bf6565b6116c9565b60405161057a9190613289565b60405180910390f35b61059d60048036038101906105989190612bf6565b6117ec565b6040516105aa91906135ab565b60405180910390f35b6105cd60048036038101906105c89190612ad3565b6117fe565b005b6105e960048036038101906105e491906129bd565b6118d5565b6040516105f6919061326e565b60405180910390f35b61061960048036038101906106149190612990565b611969565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f657506106f582611a61565b5b9050919050565b60606000805461070c9061384f565b80601f01602080910402602001604051908101604052809291908181526020018280546107389061384f565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a82611acb565b6107d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d09061342b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081f82610e80565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610890576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610887906134ab565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108af611b37565b73ffffffffffffffffffffffffffffffffffffffff1614806108de57506108dd816108d8611b37565b6118d5565b5b61091d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610914906133ab565b60405180910390fd5b6109278383611b3f565b505050565b6000600d54905090565b610947610941611b37565b82611bf8565b610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d9061350b565b60405180910390fd5b610991838383611cd6565b505050565b6109b183838360405180602001604052806000815250611667565b505050565b6060600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b906134eb565b60405180910390fd5b81600d548111158015610a655750600e5481600e54610a6391906136de565b115b8015610a805750600d5481600e54610a7d91906136de565b11155b610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab6906134cb565b60405180910390fd5b82600f54811115610b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afc9061352b565b60405180910390fd5b6001841015610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b409061338b565b60405180910390fd5b610b538585611f32565b9250505092915050565b610b65611b37565b73ffffffffffffffffffffffffffffffffffffffff16610b836112b2565b73ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd09061344b565b60405180910390fd5b80600c9080519060200190610bef9291906127a4565b5050565b6060600c8054610c029061384f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e9061384f565b8015610c7b5780601f10610c5057610100808354040283529160200191610c7b565b820191906000526020600020905b815481529060010190602001808311610c5e57829003601f168201915b5050505050905090565b610c8d611b37565b73ffffffffffffffffffffffffffffffffffffffff16610cab6112b2565b73ffffffffffffffffffffffffffffffffffffffff1614610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf89061344b565b60405180910390fd5b6000600b8054610d109061384f565b905011610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d499061330b565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900460ff16905090565b610d8e611b37565b73ffffffffffffffffffffffffffffffffffffffff16610dac6112b2565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df99061344b565b60405180910390fd5b600a60009054906101000a900460ff1615610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061358b565b60405180910390fd5b80600b9080519060200190610e689291906127a4565b5050565b6000600e54905090565b6000600f54905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f20906133eb565b60405180910390fd5b80915050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb7906134eb565b60405180910390fd5b6001600d548111158015610fe25750600e5481600e54610fe091906136de565b115b8015610ffd5750600d5481600e54610ffa91906136de565b11155b61103c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611033906134cb565b60405180910390fd5b611047836001611f32565b60008151811061105a576110596139c3565b5b6020026020010151915050919050565b6060611074611b37565b73ffffffffffffffffffffffffffffffffffffffff166110926112b2565b73ffffffffffffffffffffffffffffffffffffffff16146110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df9061344b565b60405180910390fd5b601060009054906101000a900460ff1615611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f9061356b565b60405180910390fd5b6001601060006101000a81548160ff02191690831515021790555061115e3360c8611f32565b905090565b606061116d61200c565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da906133cb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611232611b37565b73ffffffffffffffffffffffffffffffffffffffff166112506112b2565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061344b565b60405180910390fd5b6112b0600061209e565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112eb9061384f565b80601f01602080910402602001604051908101604052809291908181526020018280546113179061384f565b80156113645780601f1061133957610100808354040283529160200191611364565b820191906000526020600020905b81548152906001019060200180831161134757829003601f168201915b5050505050905090565b611376611b37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db9061334b565b60405180910390fd5b80600560006113f1611b37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149e611b37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114e3919061326e565b60405180910390a35050565b6114f7611b37565b73ffffffffffffffffffffffffffffffffffffffff166115156112b2565b73ffffffffffffffffffffffffffffffffffffffff161461156b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115629061344b565b60405180910390fd5b600a60009054906101000a900460ff166115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b19061354b565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055506115dd612164565b6009819055507fe2a7169cedebe39671840370ae19ca4fc41be6191d4c77f174f189a4d8cd08c860405160405180910390a1565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611678611672611b37565b83611bf8565b6116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae9061350b565b60405180910390fd5b6116c384848484612199565b50505050565b60606116d482611acb565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061348b565b60405180910390fd5b600860009054906101000a900460ff16611785576000600c80546117369061384f565b905011611752576040518060200160405280600081525061177e565b600c61175d836121f5565b60405160200161176e929190613179565b6040516020818303038152906040525b90506117e7565b6000600b80546117949061384f565b9050116117b057604051806020016040528060008152506117e4565b600b6117c36117be84612356565b6121f5565b6040516020016117d4929190613179565b6040516020818303038152906040525b90505b919050565b60006117f782612356565b9050919050565b611806611b37565b73ffffffffffffffffffffffffffffffffffffffff166118246112b2565b73ffffffffffffffffffffffffffffffffffffffff161461187a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118719061344b565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611971611b37565b73ffffffffffffffffffffffffffffffffffffffff1661198f6112b2565b73ffffffffffffffffffffffffffffffffffffffff16146119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc9061344b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c906132cb565b60405180910390fd5b611a5e8161209e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bb283610e80565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0382611acb565b611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c399061336b565b60405180910390fd5b6000611c4d83610e80565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cbc57508373ffffffffffffffffffffffffffffffffffffffff16611ca48461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ccd5750611ccc81856118d5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cf682610e80565b73ffffffffffffffffffffffffffffffffffffffff1614611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d439061346b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db39061332b565b60405180910390fd5b611dc78383836123ae565b611dd2600082611b3f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e229190613765565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7991906136de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008267ffffffffffffffff811115611f5057611f4f6139f2565b5b604051908082528060200260200182016040528015611f7e5781602001602082028036833780820191505090505b50905060005b83811015611fe8576000600182600e54611f9e91906136de565b611fa891906136de565b9050611fb486826123b3565b80838381518110611fc857611fc76139c3565b5b602002602001018181525050508080611fe0906138b2565b915050611f84565b5082600e6000828254611ffb91906136de565b925050819055508091505092915050565b6060600b805461201b9061384f565b80601f01602080910402602001604051908101604052809291908181526020018280546120479061384f565b80156120945780601f1061206957610100808354040283529160200191612094565b820191906000526020600020905b81548152906001019060200180831161207757829003601f168201915b5050505050905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600044424360405160200161217b939291906131a8565b6040516020818303038152906040528051906020012060001c905090565b6121a4848484611cd6565b6121b0848484846123d1565b6121ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e6906132ab565b60405180910390fd5b50505050565b6060600082141561223d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612351565b600082905060005b6000821461226f578080612258906138b2565b915050600a826122689190613734565b9150612245565b60008167ffffffffffffffff81111561228b5761228a6139f2565b5b6040519080825280601f01601f1916602001820160405280156122bd5781602001600182028036833780820191505090505b5090505b6000851461234a576001826122d69190613765565b9150600a856122e59190613905565b60306122f191906136de565b60f81b818381518110612307576123066139c3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123439190613734565b94506122c1565b8093505050505b919050565b6000600860009054906101000a900460ff166123735760006123a7565b6001600d546009546001856123889190613765565b61239291906136de565b61239c9190613905565b6123a691906136de565b5b9050919050565b505050565b6123cd828260405180602001604052806000815250612568565b5050565b60006123f28473ffffffffffffffffffffffffffffffffffffffff166125c3565b1561255b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261241b611b37565b8786866040518563ffffffff1660e01b815260040161243d9493929190613200565b602060405180830381600087803b15801561245757600080fd5b505af192505050801561248857506040513d601f19601f820116820180604052508101906124859190612b80565b60015b61250b573d80600081146124b8576040519150601f19603f3d011682016040523d82523d6000602084013e6124bd565b606091505b50600081511415612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fa906132ab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612560565b600190505b949350505050565b61257283836125d6565b61257f60008484846123d1565b6125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b5906132ab565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d9061340b565b60405180910390fd5b61264f81611acb565b1561268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906132eb565b60405180910390fd5b61269b600083836123ae565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126eb91906136de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546127b09061384f565b90600052602060002090601f0160209004810192826127d25760008555612819565b82601f106127eb57805160ff1916838001178555612819565b82800160010185558215612819579182015b828111156128185782518255916020019190600101906127fd565b5b509050612826919061282a565b5090565b5b8082111561284357600081600090555060010161282b565b5090565b600061285a612855846135eb565b6135c6565b90508281526020810184848401111561287657612875613a26565b5b61288184828561380d565b509392505050565b600061289c6128978461361c565b6135c6565b9050828152602081018484840111156128b8576128b7613a26565b5b6128c384828561380d565b509392505050565b6000813590506128da81614165565b92915050565b6000813590506128ef8161417c565b92915050565b60008135905061290481614193565b92915050565b60008151905061291981614193565b92915050565b600082601f83011261293457612933613a21565b5b8135612944848260208601612847565b91505092915050565b600082601f83011261296257612961613a21565b5b8135612972848260208601612889565b91505092915050565b60008135905061298a816141aa565b92915050565b6000602082840312156129a6576129a5613a30565b5b60006129b4848285016128cb565b91505092915050565b600080604083850312156129d4576129d3613a30565b5b60006129e2858286016128cb565b92505060206129f3858286016128cb565b9150509250929050565b600080600060608486031215612a1657612a15613a30565b5b6000612a24868287016128cb565b9350506020612a35868287016128cb565b9250506040612a468682870161297b565b9150509250925092565b60008060008060808587031215612a6a57612a69613a30565b5b6000612a78878288016128cb565b9450506020612a89878288016128cb565b9350506040612a9a8782880161297b565b925050606085013567ffffffffffffffff811115612abb57612aba613a2b565b5b612ac78782880161291f565b91505092959194509250565b60008060408385031215612aea57612ae9613a30565b5b6000612af8858286016128cb565b9250506020612b09858286016128e0565b9150509250929050565b60008060408385031215612b2a57612b29613a30565b5b6000612b38858286016128cb565b9250506020612b498582860161297b565b9150509250929050565b600060208284031215612b6957612b68613a30565b5b6000612b77848285016128f5565b91505092915050565b600060208284031215612b9657612b95613a30565b5b6000612ba48482850161290a565b91505092915050565b600060208284031215612bc357612bc2613a30565b5b600082013567ffffffffffffffff811115612be157612be0613a2b565b5b612bed8482850161294d565b91505092915050565b600060208284031215612c0c57612c0b613a30565b5b6000612c1a8482850161297b565b91505092915050565b6000612c2f8383613144565b60208301905092915050565b612c4481613799565b82525050565b6000612c5582613672565b612c5f81856136a0565b9350612c6a8361364d565b8060005b83811015612c9b578151612c828882612c23565b9750612c8d83613693565b925050600181019050612c6e565b5085935050505092915050565b612cb1816137ab565b82525050565b6000612cc28261367d565b612ccc81856136b1565b9350612cdc81856020860161381c565b612ce581613a35565b840191505092915050565b6000612cfb82613688565b612d0581856136c2565b9350612d1581856020860161381c565b612d1e81613a35565b840191505092915050565b6000612d3482613688565b612d3e81856136d3565b9350612d4e81856020860161381c565b80840191505092915050565b60008154612d678161384f565b612d7181866136d3565b94506001821660008114612d8c5760018114612d9d57612dd0565b60ff19831686528186019350612dd0565b612da68561365d565b60005b83811015612dc857815481890152600182019150602081019050612da9565b838801955050505b50505092915050565b6000612de66032836136c2565b9150612df182613a46565b604082019050919050565b6000612e096026836136c2565b9150612e1482613a95565b604082019050919050565b6000612e2c601c836136c2565b9150612e3782613ae4565b602082019050919050565b6000612e4f6037836136c2565b9150612e5a82613b0d565b604082019050919050565b6000612e726024836136c2565b9150612e7d82613b5c565b604082019050919050565b6000612e956019836136c2565b9150612ea082613bab565b602082019050919050565b6000612eb8602c836136c2565b9150612ec382613bd4565b604082019050919050565b6000612edb602c836136c2565b9150612ee682613c23565b604082019050919050565b6000612efe6038836136c2565b9150612f0982613c72565b604082019050919050565b6000612f21602a836136c2565b9150612f2c82613cc1565b604082019050919050565b6000612f446029836136c2565b9150612f4f82613d10565b604082019050919050565b6000612f676020836136c2565b9150612f7282613d5f565b602082019050919050565b6000612f8a602c836136c2565b9150612f9582613d88565b604082019050919050565b6000612fad6005836136d3565b9150612fb882613dd7565b600582019050919050565b6000612fd06020836136c2565b9150612fdb82613e00565b602082019050919050565b6000612ff36029836136c2565b9150612ffe82613e29565b604082019050919050565b6000613016602f836136c2565b915061302182613e78565b604082019050919050565b60006130396021836136c2565b915061304482613ec7565b604082019050919050565b600061305c6031836136c2565b915061306782613f16565b604082019050919050565b600061307f602b836136c2565b915061308a82613f65565b604082019050919050565b60006130a26031836136c2565b91506130ad82613fb4565b604082019050919050565b60006130c5602e836136c2565b91506130d082614003565b604082019050919050565b60006130e8603c836136c2565b91506130f382614052565b604082019050919050565b600061310b6029836136c2565b9150613116826140a1565b604082019050919050565b600061312e6047836136c2565b9150613139826140f0565b606082019050919050565b61314d81613803565b82525050565b61315c81613803565b82525050565b61317361316e82613803565b6138fb565b82525050565b60006131858285612d5a565b91506131918284612d29565b915061319c82612fa0565b91508190509392505050565b60006131b48286613162565b6020820191506131c48285613162565b6020820191506131d48284613162565b602082019150819050949350505050565b60006020820190506131fa6000830184612c3b565b92915050565b60006080820190506132156000830187612c3b565b6132226020830186612c3b565b61322f6040830185613153565b81810360608301526132418184612cb7565b905095945050505050565b600060208201905081810360008301526132668184612c4a565b905092915050565b60006020820190506132836000830184612ca8565b92915050565b600060208201905081810360008301526132a38184612cf0565b905092915050565b600060208201905081810360008301526132c481612dd9565b9050919050565b600060208201905081810360008301526132e481612dfc565b9050919050565b6000602082019050818103600083015261330481612e1f565b9050919050565b6000602082019050818103600083015261332481612e42565b9050919050565b6000602082019050818103600083015261334481612e65565b9050919050565b6000602082019050818103600083015261336481612e88565b9050919050565b6000602082019050818103600083015261338481612eab565b9050919050565b600060208201905081810360008301526133a481612ece565b9050919050565b600060208201905081810360008301526133c481612ef1565b9050919050565b600060208201905081810360008301526133e481612f14565b9050919050565b6000602082019050818103600083015261340481612f37565b9050919050565b6000602082019050818103600083015261342481612f5a565b9050919050565b6000602082019050818103600083015261344481612f7d565b9050919050565b6000602082019050818103600083015261346481612fc3565b9050919050565b6000602082019050818103600083015261348481612fe6565b9050919050565b600060208201905081810360008301526134a481613009565b9050919050565b600060208201905081810360008301526134c48161302c565b9050919050565b600060208201905081810360008301526134e48161304f565b9050919050565b6000602082019050818103600083015261350481613072565b9050919050565b6000602082019050818103600083015261352481613095565b9050919050565b60006020820190508181036000830152613544816130b8565b9050919050565b60006020820190508181036000830152613564816130db565b9050919050565b60006020820190508181036000830152613584816130fe565b9050919050565b600060208201905081810360008301526135a481613121565b9050919050565b60006020820190506135c06000830184613153565b92915050565b60006135d06135e1565b90506135dc8282613881565b919050565b6000604051905090565b600067ffffffffffffffff821115613606576136056139f2565b5b61360f82613a35565b9050602081019050919050565b600067ffffffffffffffff821115613637576136366139f2565b5b61364082613a35565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006136e982613803565b91506136f483613803565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561372957613728613936565b5b828201905092915050565b600061373f82613803565b915061374a83613803565b92508261375a57613759613965565b5b828204905092915050565b600061377082613803565b915061377b83613803565b92508282101561378e5761378d613936565b5b828203905092915050565b60006137a4826137e3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561383a57808201518184015260208101905061381f565b83811115613849576000848401525b50505050565b6000600282049050600182168061386757607f821691505b6020821081141561387b5761387a613994565b5b50919050565b61388a82613a35565b810181811067ffffffffffffffff821117156138a9576138a86139f2565b5b80604052505050565b60006138bd82613803565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138f0576138ef613936565b5b600182019050919050565b6000819050919050565b600061391082613803565b915061391b83613803565b92508261392b5761392a613965565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f47686574746f536861726b686f6f643a2042617365205552492073686f756c6460008201527f20626520736574206265666f7265206c6f636b696e672e000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f47686574746f5368616b686f6f643a20616d6f756e742073686f756c64206c6160008201527f72676572207468616e20302e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a2047686574746f536861726b686f6f6c60008201527f642061726520616c6c206d696e7465642e000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a206d73672e73656e646572206973206e60008201527f6f742061206d696e746572000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a206f76657220746865206c696d69742060008201527f6f662062617463682073697a652e000000000000000000000000000000000000602082015250565b7f47686574746f536861726b686f6f643a2042617365205552492073686f756c6460008201527f206265206c6f636b6564206265666f72652072657665616c696e672e00000000602082015250565b7f47686574746f536861726b686f6f643a207465616d2068617320636c61696d6560008201527f6420616c72656164790000000000000000000000000000000000000000000000602082015250565b7f47686574746f536861726b686f64643a2042617365555249206861732062656560008201527f6e206c6f636b65642c2069742063616e6e6f74206265206368616e676564206160208201527f6e796d6f72652e00000000000000000000000000000000000000000000000000604082015250565b61416e81613799565b811461417957600080fd5b50565b614185816137ab565b811461419057600080fd5b50565b61419c816137b7565b81146141a757600080fd5b50565b6141b381613803565b81146141be57600080fd5b5056fea2646970667358221220ad155a3bb3769a14772f7311043eef563371b83fdd414bd05992598efe0647e664736f6c63430008070033

Deployed Bytecode Sourcemap

35792:8175:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20660:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21605:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23164:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22687:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42151:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24054:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24464:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40134:331;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38543:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38741;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37573:187;;;:::i;:::-;;37274:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37858:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42339:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41970:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21299:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39850:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43727:237;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38342:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21029:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34430:94;;;:::i;:::-;;33779:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21774:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23457:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36958:236;;;:::i;:::-;;36243:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24720:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41347:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42867:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36363:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23823:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34679:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20660:305;20762:4;20814:25;20799:40;;;:11;:40;;;;:105;;;;20871:33;20856:48;;;:11;:48;;;;20799:105;:158;;;;20921:36;20945:11;20921:23;:36::i;:::-;20799:158;20779:178;;20660:305;;;:::o;21605:100::-;21659:13;21692:5;21685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21605:100;:::o;23164:221::-;23240:7;23268:16;23276:7;23268;:16::i;:::-;23260:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23353:15;:24;23369:7;23353:24;;;;;;;;;;;;;;;;;;;;;23346:31;;23164:221;;;:::o;22687:411::-;22768:13;22784:23;22799:7;22784:14;:23::i;:::-;22768:39;;22832:5;22826:11;;:2;:11;;;;22818:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22926:5;22910:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22935:37;22952:5;22959:12;:10;:12::i;:::-;22935:16;:37::i;:::-;22910:62;22888:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23069:21;23078:2;23082:7;23069:8;:21::i;:::-;22757:341;22687:411;;:::o;42151:94::-;42197:7;42224:13;;42217:20;;42151:94;:::o;24054:339::-;24249:41;24268:12;:10;:12::i;:::-;24282:7;24249:18;:41::i;:::-;24241:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24357:28;24367:4;24373:2;24377:7;24357:9;:28::i;:::-;24054:339;;;:::o;24464:185::-;24602:39;24619:4;24625:2;24629:7;24602:39;;;;;;;;;;;;:16;:39::i;:::-;24464:185;;;:::o;40134:331::-;40308:16;36056:10;:22;36067:10;36056:22;;;;;;;;;;;;;;;;;;;;;;;;;36048:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40245:6:::1;39278:13;;39268:6;:23;;:85;;;;;39337:16;;39328:6;39309:16;;:25;;;;:::i;:::-;:44;39268:85;:144;;;;;39399:13;;39389:6;39370:16;;:25;;;;:::i;:::-;:42;;39268:144;39246:220;;;;;;;;;;;;:::i;:::-;;;;;;;;;40281:6:::2;39652:10;;39642:6;:20;;39634:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;40355:1:::3;40345:6;:11;;40337:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40423:34;40443:5;40450:6;40423:19;:34::i;:::-;40416:41;;39477:1:::2;36137::::1;40134:331:::0;;;;:::o;38543:112::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38644:3:::1;38621:20;:26;;;;;;;;;;;;:::i;:::-;;38543:112:::0;:::o;38741:::-;38792:13;38825:20;38818:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38741:112;:::o;37573:187::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37658:1:::1;37638:9;37632:23;;;;;:::i;:::-;;;:27;37624:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37748:4;37730:15;;:22;;;;;;;;;;;;;;;;;;37573:187::o:0;37274:98::-;37328:4;37352:12;;;;;;;;;;;37345:19;;37274:98;:::o;37858:201::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37934:15:::1;;;;;;;;;;;37933:16;37925:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38048:3;38036:9;:15;;;;;;;;;;;;:::i;:::-;;37858:201:::0;:::o;42339:103::-;42391:7;42418:16;;42411:23;;42339:103;:::o;41970:97::-;42022:7;42049:10;;42042:17;;41970:97;:::o;21299:239::-;21371:7;21391:13;21407:7;:16;21415:7;21407:16;;;;;;;;;;;;;;;;;;;;;21391:32;;21459:1;21442:19;;:5;:19;;;;21434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21525:5;21518:12;;;21299:239;;;:::o;39850:152::-;39933:7;36056:10;:22;36067:10;36056:22;;;;;;;;;;;;;;;;;;;;;;;;;36048:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39921:1:::1;39278:13;;39268:6;:23;;:85;;;;;39337:16;;39328:6;39309:16;;:25;;;;:::i;:::-;:44;39268:85;:144;;;;;39399:13;;39389:6;39370:16;;:25;;;;:::i;:::-;:42;;39268:144;39246:220;;;;;;;;;;;;:::i;:::-;;;;;;;;;39961:29:::2;39981:5;39988:1;39961:19;:29::i;:::-;39992:1;39960:34;;;;;;;;:::i;:::-;;;;;;;;39953:41;;36137:1:::1;39850:152:::0;;;:::o;43727:237::-;43774:16;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43812:13:::1;;;;;;;;;;;43811:14;43803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43898:4;43882:13;;:20;;;;;;;;;;;;;;;;;;43920:36;43940:10;43952:3;43920:19;:36::i;:::-;43913:43;;43727:237:::0;:::o;38342:91::-;38382:13;38415:10;:8;:10::i;:::-;38408:17;;38342:91;:::o;21029:208::-;21101:7;21146:1;21129:19;;:5;:19;;;;21121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21213:9;:16;21223:5;21213:16;;;;;;;;;;;;;;;;21206:23;;21029:208;;;:::o;34430:94::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34495:21:::1;34513:1;34495:9;:21::i;:::-;34430:94::o:0;33779:87::-;33825:7;33852:6;;;;;;;;;;;33845:13;;33779:87;:::o;21774:104::-;21830:13;21863:7;21856:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21774:104;:::o;23457:295::-;23572:12;:10;:12::i;:::-;23560:24;;:8;:24;;;;23552:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23672:8;23627:18;:32;23646:12;:10;:12::i;:::-;23627:32;;;;;;;;;;;;;;;:42;23660:8;23627:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23725:8;23696:48;;23711:12;:10;:12::i;:::-;23696:48;;;23735:8;23696:48;;;;;;:::i;:::-;;;;;;;;23457:295;;:::o;36958:236::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37012:15:::1;;;;;;;;;;;37004:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;37118:4;37103:12;;:19;;;;;;;;;;;;;;;;;;37144:14;:12;:14::i;:::-;37133:8;:25;;;;37176:10;;;;;;;;;;36958:236::o:0;36243:112::-;36307:4;36331:10;:16;36342:4;36331:16;;;;;;;;;;;;;;;;;;;;;;;;;36324:23;;36243:112;;;:::o;24720:328::-;24895:41;24914:12;:10;:12::i;:::-;24928:7;24895:18;:41::i;:::-;24887:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25001:39;25015:4;25021:2;25025:7;25034:5;25001:13;:39::i;:::-;24720:328;;;;:::o;41347:543::-;41413:13;41447:17;41455:8;41447:7;:17::i;:::-;41439:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41534:12;;;;;;;;;;;41529:200;;41607:1;41576:20;41570:34;;;;;:::i;:::-;;;:38;:147;;;;;;;;;;;;;;;;;41653:20;41675:26;41692:8;41675:16;:26::i;:::-;41636:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41570:147;41563:154;;;;41529:200;41774:1;41754:9;41748:23;;;;;:::i;:::-;;;:27;:134;;;;;;;;;;;;;;;;;41816:9;41827:39;41844:21;41856:8;41844:11;:21::i;:::-;41827:16;:39::i;:::-;41799:77;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41748:134;41741:141;;41347:543;;;;:::o;42867:124::-;42936:7;42963:20;42975:7;42963:11;:20::i;:::-;42956:27;;42867:124;;;:::o;36363:109::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36458:6:::1;36439:10;:16;36450:4;36439:16;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;36363:109:::0;;:::o;23823:164::-;23920:4;23944:18;:25;23963:5;23944:25;;;;;;;;;;;;;;;:35;23970:8;23944:35;;;;;;;;;;;;;;;;;;;;;;;;;23937:42;;23823:164;;;;:::o;34679:192::-;34010:12;:10;:12::i;:::-;33999:23;;:7;:5;:7::i;:::-;:23;;;33991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34788:1:::1;34768:22;;:8;:22;;;;34760:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34844:19;34854:8;34844:9;:19::i;:::-;34679:192:::0;:::o;19166:157::-;19251:4;19290:25;19275:40;;;:11;:40;;;;19268:47;;19166:157;;;:::o;26558:127::-;26623:4;26675:1;26647:30;;:7;:16;26655:7;26647:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26640:37;;26558:127;;;:::o;16088:98::-;16141:7;16168:10;16161:17;;16088:98;:::o;30540:174::-;30642:2;30615:15;:24;30631:7;30615:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30698:7;30694:2;30660:46;;30669:23;30684:7;30669:14;:23::i;:::-;30660:46;;;;;;;;;;;;30540:174;;:::o;26852:348::-;26945:4;26970:16;26978:7;26970;:16::i;:::-;26962:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27046:13;27062:23;27077:7;27062:14;:23::i;:::-;27046:39;;27115:5;27104:16;;:7;:16;;;:51;;;;27148:7;27124:31;;:20;27136:7;27124:11;:20::i;:::-;:31;;;27104:51;:87;;;;27159:32;27176:5;27183:7;27159:16;:32::i;:::-;27104:87;27096:96;;;26852:348;;;;:::o;29844:578::-;30003:4;29976:31;;:23;29991:7;29976:14;:23::i;:::-;:31;;;29968:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30086:1;30072:16;;:2;:16;;;;30064:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30142:39;30163:4;30169:2;30173:7;30142:20;:39::i;:::-;30246:29;30263:1;30267:7;30246:8;:29::i;:::-;30307:1;30288:9;:15;30298:4;30288:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30336:1;30319:9;:13;30329:2;30319:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30367:2;30348:7;:16;30356:7;30348:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30406:7;30402:2;30387:27;;30396:4;30387:27;;;;;;;;;;;;29844:578;;;:::o;40636:440::-;40714:16;40743:24;40784:6;40770:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40743:48;;40808:9;40804:199;40827:6;40823:1;:10;40804:199;;;40856:21;40903:1;40899;40880:16;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;40856:48;;40919:31;40929:5;40936:13;40919:9;:31::i;:::-;40978:13;40965:7;40973:1;40965:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;40841:162;40835:4;;;;;:::i;:::-;;;;40804:199;;;;41035:6;41015:16;;:26;;;;;;;:::i;:::-;;;;;;;;41061:7;41054:14;;;40636:440;;;;:::o;38157:102::-;38209:13;38242:9;38235:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38157:102;:::o;34879:173::-;34935:16;34954:6;;;;;;;;;;;34935:25;;34980:8;34971:6;;:17;;;;;;;;;;;;;;;;;;35035:8;35004:40;;35025:8;35004:40;;;;;;;;;;;;34924:128;34879:173;:::o;42470:175::-;42525:7;42587:16;42605:15;42622:12;42570:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42560:76;;;;;;42552:85;;42545:92;;42470:175;:::o;25930:315::-;26087:28;26097:4;26103:2;26107:7;26087:9;:28::i;:::-;26134:48;26157:4;26163:2;26167:7;26176:5;26134:22;:48::i;:::-;26126:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25930:315;;;;:::o;16611:723::-;16667:13;16897:1;16888:5;:10;16884:53;;;16915:10;;;;;;;;;;;;;;;;;;;;;16884:53;16947:12;16962:5;16947:20;;16978:14;17003:78;17018:1;17010:4;:9;17003:78;;17036:8;;;;;:::i;:::-;;;;17067:2;17059:10;;;;;:::i;:::-;;;17003:78;;;17091:19;17123:6;17113:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17091:39;;17141:154;17157:1;17148:5;:10;17141:154;;17185:1;17175:11;;;;;:::i;:::-;;;17252:2;17244:5;:10;;;;:::i;:::-;17231:2;:24;;;;:::i;:::-;17218:39;;17201:6;17208;17201:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17281:2;17272:11;;;;;:::i;:::-;;;17141:154;;;17319:6;17305:21;;;;;16611:723;;;;:::o;43245:163::-;43306:7;43333:12;;;;;;;;;;;:67;;43399:1;43333:67;;;43394:1;43378:13;;43366:8;;43361:1;43351:7;:11;;;;:::i;:::-;43350:24;;;;:::i;:::-;43349:42;;;;:::i;:::-;:46;;;;:::i;:::-;43333:67;43326:74;;43245:163;;;:::o;32650:126::-;;;;:::o;27542:110::-;27618:26;27628:2;27632:7;27618:26;;;;;;;;;;;;:9;:26::i;:::-;27542:110;;:::o;31279:799::-;31434:4;31455:15;:2;:13;;;:15::i;:::-;31451:620;;;31507:2;31491:36;;;31528:12;:10;:12::i;:::-;31542:4;31548:7;31557:5;31491:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31487:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:1;31733:6;:13;:18;31729:272;;;31776:60;;;;;;;;;;:::i;:::-;;;;;;;;31729:272;31951:6;31945:13;31936:6;31932:2;31928:15;31921:38;31487:529;31624:41;;;31614:51;;;:6;:51;;;;31607:58;;;;;31451:620;32055:4;32048:11;;31279:799;;;;;;;:::o;27879:321::-;28009:18;28015:2;28019:7;28009:5;:18::i;:::-;28060:54;28091:1;28095:2;28099:7;28108:5;28060:22;:54::i;:::-;28038:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27879:321;;;:::o;8134:387::-;8194:4;8402:12;8469:7;8457:20;8449:28;;8512:1;8505:4;:8;8498:15;;;8134:387;;;:::o;28536:382::-;28630:1;28616:16;;:2;:16;;;;28608:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28689:16;28697:7;28689;:16::i;:::-;28688:17;28680:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28751:45;28780:1;28784:2;28788:7;28751:20;:45::i;:::-;28826:1;28809:9;:13;28819:2;28809:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28857:2;28838:7;:16;28846:7;28838:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28902:7;28898:2;28877:33;;28894:1;28877:33;;;;;;;;;;;;28536:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:179::-;7227:10;7248:46;7290:3;7282:6;7248:46;:::i;:::-;7326:4;7321:3;7317:14;7303:28;;7158:179;;;;:::o;7343:118::-;7430:24;7448:5;7430:24;:::i;:::-;7425:3;7418:37;7343:118;;:::o;7497:732::-;7616:3;7645:54;7693:5;7645:54;:::i;:::-;7715:86;7794:6;7789:3;7715:86;:::i;:::-;7708:93;;7825:56;7875:5;7825:56;:::i;:::-;7904:7;7935:1;7920:284;7945:6;7942:1;7939:13;7920:284;;;8021:6;8015:13;8048:63;8107:3;8092:13;8048:63;:::i;:::-;8041:70;;8134:60;8187:6;8134:60;:::i;:::-;8124:70;;7980:224;7967:1;7964;7960:9;7955:14;;7920:284;;;7924:14;8220:3;8213:10;;7621:608;;;7497:732;;;;:::o;8235:109::-;8316:21;8331:5;8316:21;:::i;:::-;8311:3;8304:34;8235:109;;:::o;8350:360::-;8436:3;8464:38;8496:5;8464:38;:::i;:::-;8518:70;8581:6;8576:3;8518:70;:::i;:::-;8511:77;;8597:52;8642:6;8637:3;8630:4;8623:5;8619:16;8597:52;:::i;:::-;8674:29;8696:6;8674:29;:::i;:::-;8669:3;8665:39;8658:46;;8440:270;8350:360;;;;:::o;8716:364::-;8804:3;8832:39;8865:5;8832:39;:::i;:::-;8887:71;8951:6;8946:3;8887:71;:::i;:::-;8880:78;;8967:52;9012:6;9007:3;9000:4;8993:5;8989:16;8967:52;:::i;:::-;9044:29;9066:6;9044:29;:::i;:::-;9039:3;9035:39;9028:46;;8808:272;8716:364;;;;:::o;9086:377::-;9192:3;9220:39;9253:5;9220:39;:::i;:::-;9275:89;9357:6;9352:3;9275:89;:::i;:::-;9268:96;;9373:52;9418:6;9413:3;9406:4;9399:5;9395:16;9373:52;:::i;:::-;9450:6;9445:3;9441:16;9434:23;;9196:267;9086:377;;;;:::o;9493:845::-;9596:3;9633:5;9627:12;9662:36;9688:9;9662:36;:::i;:::-;9714:89;9796:6;9791:3;9714:89;:::i;:::-;9707:96;;9834:1;9823:9;9819:17;9850:1;9845:137;;;;9996:1;9991:341;;;;9812:520;;9845:137;9929:4;9925:9;9914;9910:25;9905:3;9898:38;9965:6;9960:3;9956:16;9949:23;;9845:137;;9991:341;10058:38;10090:5;10058:38;:::i;:::-;10118:1;10132:154;10146:6;10143:1;10140:13;10132:154;;;10220:7;10214:14;10210:1;10205:3;10201:11;10194:35;10270:1;10261:7;10257:15;10246:26;;10168:4;10165:1;10161:12;10156:17;;10132:154;;;10315:6;10310:3;10306:16;10299:23;;9998:334;;9812:520;;9600:738;;9493:845;;;;:::o;10344:366::-;10486:3;10507:67;10571:2;10566:3;10507:67;:::i;:::-;10500:74;;10583:93;10672:3;10583:93;:::i;:::-;10701:2;10696:3;10692:12;10685:19;;10344:366;;;:::o;10716:::-;10858:3;10879:67;10943:2;10938:3;10879:67;:::i;:::-;10872:74;;10955:93;11044:3;10955:93;:::i;:::-;11073:2;11068:3;11064:12;11057:19;;10716:366;;;:::o;11088:::-;11230:3;11251:67;11315:2;11310:3;11251:67;:::i;:::-;11244:74;;11327:93;11416:3;11327:93;:::i;:::-;11445:2;11440:3;11436:12;11429:19;;11088:366;;;:::o;11460:::-;11602:3;11623:67;11687:2;11682:3;11623:67;:::i;:::-;11616:74;;11699:93;11788:3;11699:93;:::i;:::-;11817:2;11812:3;11808:12;11801:19;;11460:366;;;:::o;11832:::-;11974:3;11995:67;12059:2;12054:3;11995:67;:::i;:::-;11988:74;;12071:93;12160:3;12071:93;:::i;:::-;12189:2;12184:3;12180:12;12173:19;;11832:366;;;:::o;12204:::-;12346:3;12367:67;12431:2;12426:3;12367:67;:::i;:::-;12360:74;;12443:93;12532:3;12443:93;:::i;:::-;12561:2;12556:3;12552:12;12545:19;;12204:366;;;:::o;12576:::-;12718:3;12739:67;12803:2;12798:3;12739:67;:::i;:::-;12732:74;;12815:93;12904:3;12815:93;:::i;:::-;12933:2;12928:3;12924:12;12917:19;;12576:366;;;:::o;12948:::-;13090:3;13111:67;13175:2;13170:3;13111:67;:::i;:::-;13104:74;;13187:93;13276:3;13187:93;:::i;:::-;13305:2;13300:3;13296:12;13289:19;;12948:366;;;:::o;13320:::-;13462:3;13483:67;13547:2;13542:3;13483:67;:::i;:::-;13476:74;;13559:93;13648:3;13559:93;:::i;:::-;13677:2;13672:3;13668:12;13661:19;;13320:366;;;:::o;13692:::-;13834:3;13855:67;13919:2;13914:3;13855:67;:::i;:::-;13848:74;;13931:93;14020:3;13931:93;:::i;:::-;14049:2;14044:3;14040:12;14033:19;;13692:366;;;:::o;14064:::-;14206:3;14227:67;14291:2;14286:3;14227:67;:::i;:::-;14220:74;;14303:93;14392:3;14303:93;:::i;:::-;14421:2;14416:3;14412:12;14405:19;;14064:366;;;:::o;14436:::-;14578:3;14599:67;14663:2;14658:3;14599:67;:::i;:::-;14592:74;;14675:93;14764:3;14675:93;:::i;:::-;14793:2;14788:3;14784:12;14777:19;;14436:366;;;:::o;14808:::-;14950:3;14971:67;15035:2;15030:3;14971:67;:::i;:::-;14964:74;;15047:93;15136:3;15047:93;:::i;:::-;15165:2;15160:3;15156:12;15149:19;;14808:366;;;:::o;15180:400::-;15340:3;15361:84;15443:1;15438:3;15361:84;:::i;:::-;15354:91;;15454:93;15543:3;15454:93;:::i;:::-;15572:1;15567:3;15563:11;15556:18;;15180:400;;;:::o;15586:366::-;15728:3;15749:67;15813:2;15808:3;15749:67;:::i;:::-;15742:74;;15825:93;15914:3;15825:93;:::i;:::-;15943:2;15938:3;15934:12;15927:19;;15586:366;;;:::o;15958:::-;16100:3;16121:67;16185:2;16180:3;16121:67;:::i;:::-;16114:74;;16197:93;16286:3;16197:93;:::i;:::-;16315:2;16310:3;16306:12;16299:19;;15958:366;;;:::o;16330:::-;16472:3;16493:67;16557:2;16552:3;16493:67;:::i;:::-;16486:74;;16569:93;16658:3;16569:93;:::i;:::-;16687:2;16682:3;16678:12;16671:19;;16330:366;;;:::o;16702:::-;16844:3;16865:67;16929:2;16924:3;16865:67;:::i;:::-;16858:74;;16941:93;17030:3;16941:93;:::i;:::-;17059:2;17054:3;17050:12;17043:19;;16702:366;;;:::o;17074:::-;17216:3;17237:67;17301:2;17296:3;17237:67;:::i;:::-;17230:74;;17313:93;17402:3;17313:93;:::i;:::-;17431:2;17426:3;17422:12;17415:19;;17074:366;;;:::o;17446:::-;17588:3;17609:67;17673:2;17668:3;17609:67;:::i;:::-;17602:74;;17685:93;17774:3;17685:93;:::i;:::-;17803:2;17798:3;17794:12;17787:19;;17446:366;;;:::o;17818:::-;17960:3;17981:67;18045:2;18040:3;17981:67;:::i;:::-;17974:74;;18057:93;18146:3;18057:93;:::i;:::-;18175:2;18170:3;18166:12;18159:19;;17818:366;;;:::o;18190:::-;18332:3;18353:67;18417:2;18412:3;18353:67;:::i;:::-;18346:74;;18429:93;18518:3;18429:93;:::i;:::-;18547:2;18542:3;18538:12;18531:19;;18190:366;;;:::o;18562:::-;18704:3;18725:67;18789:2;18784:3;18725:67;:::i;:::-;18718:74;;18801:93;18890:3;18801:93;:::i;:::-;18919:2;18914:3;18910:12;18903:19;;18562:366;;;:::o;18934:::-;19076:3;19097:67;19161:2;19156:3;19097:67;:::i;:::-;19090:74;;19173:93;19262:3;19173:93;:::i;:::-;19291:2;19286:3;19282:12;19275:19;;18934:366;;;:::o;19306:::-;19448:3;19469:67;19533:2;19528:3;19469:67;:::i;:::-;19462:74;;19545:93;19634:3;19545:93;:::i;:::-;19663:2;19658:3;19654:12;19647:19;;19306:366;;;:::o;19678:108::-;19755:24;19773:5;19755:24;:::i;:::-;19750:3;19743:37;19678:108;;:::o;19792:118::-;19879:24;19897:5;19879:24;:::i;:::-;19874:3;19867:37;19792:118;;:::o;19916:157::-;20021:45;20041:24;20059:5;20041:24;:::i;:::-;20021:45;:::i;:::-;20016:3;20009:58;19916:157;;:::o;20079:695::-;20357:3;20379:92;20467:3;20458:6;20379:92;:::i;:::-;20372:99;;20488:95;20579:3;20570:6;20488:95;:::i;:::-;20481:102;;20600:148;20744:3;20600:148;:::i;:::-;20593:155;;20765:3;20758:10;;20079:695;;;;;:::o;20780:538::-;20948:3;20963:75;21034:3;21025:6;20963:75;:::i;:::-;21063:2;21058:3;21054:12;21047:19;;21076:75;21147:3;21138:6;21076:75;:::i;:::-;21176:2;21171:3;21167:12;21160:19;;21189:75;21260:3;21251:6;21189:75;:::i;:::-;21289:2;21284:3;21280:12;21273:19;;21309:3;21302:10;;20780:538;;;;;;:::o;21324:222::-;21417:4;21455:2;21444:9;21440:18;21432:26;;21468:71;21536:1;21525:9;21521:17;21512:6;21468:71;:::i;:::-;21324:222;;;;:::o;21552:640::-;21747:4;21785:3;21774:9;21770:19;21762:27;;21799:71;21867:1;21856:9;21852:17;21843:6;21799:71;:::i;:::-;21880:72;21948:2;21937:9;21933:18;21924:6;21880:72;:::i;:::-;21962;22030:2;22019:9;22015:18;22006:6;21962:72;:::i;:::-;22081:9;22075:4;22071:20;22066:2;22055:9;22051:18;22044:48;22109:76;22180:4;22171:6;22109:76;:::i;:::-;22101:84;;21552:640;;;;;;;:::o;22198:373::-;22341:4;22379:2;22368:9;22364:18;22356:26;;22428:9;22422:4;22418:20;22414:1;22403:9;22399:17;22392:47;22456:108;22559:4;22550:6;22456:108;:::i;:::-;22448:116;;22198:373;;;;:::o;22577:210::-;22664:4;22702:2;22691:9;22687:18;22679:26;;22715:65;22777:1;22766:9;22762:17;22753:6;22715:65;:::i;:::-;22577:210;;;;:::o;22793:313::-;22906:4;22944:2;22933:9;22929:18;22921:26;;22993:9;22987:4;22983:20;22979:1;22968:9;22964:17;22957:47;23021:78;23094:4;23085:6;23021:78;:::i;:::-;23013:86;;22793:313;;;;:::o;23112:419::-;23278:4;23316:2;23305:9;23301:18;23293:26;;23365:9;23359:4;23355:20;23351:1;23340:9;23336:17;23329:47;23393:131;23519:4;23393:131;:::i;:::-;23385:139;;23112:419;;;:::o;23537:::-;23703:4;23741:2;23730:9;23726:18;23718:26;;23790:9;23784:4;23780:20;23776:1;23765:9;23761:17;23754:47;23818:131;23944:4;23818:131;:::i;:::-;23810:139;;23537:419;;;:::o;23962:::-;24128:4;24166:2;24155:9;24151:18;24143:26;;24215:9;24209:4;24205:20;24201:1;24190:9;24186:17;24179:47;24243:131;24369:4;24243:131;:::i;:::-;24235:139;;23962:419;;;:::o;24387:::-;24553:4;24591:2;24580:9;24576:18;24568:26;;24640:9;24634:4;24630:20;24626:1;24615:9;24611:17;24604:47;24668:131;24794:4;24668:131;:::i;:::-;24660:139;;24387:419;;;:::o;24812:::-;24978:4;25016:2;25005:9;25001:18;24993:26;;25065:9;25059:4;25055:20;25051:1;25040:9;25036:17;25029:47;25093:131;25219:4;25093:131;:::i;:::-;25085:139;;24812:419;;;:::o;25237:::-;25403:4;25441:2;25430:9;25426:18;25418:26;;25490:9;25484:4;25480:20;25476:1;25465:9;25461:17;25454:47;25518:131;25644:4;25518:131;:::i;:::-;25510:139;;25237:419;;;:::o;25662:::-;25828:4;25866:2;25855:9;25851:18;25843:26;;25915:9;25909:4;25905:20;25901:1;25890:9;25886:17;25879:47;25943:131;26069:4;25943:131;:::i;:::-;25935:139;;25662:419;;;:::o;26087:::-;26253:4;26291:2;26280:9;26276:18;26268:26;;26340:9;26334:4;26330:20;26326:1;26315:9;26311:17;26304:47;26368:131;26494:4;26368:131;:::i;:::-;26360:139;;26087:419;;;:::o;26512:::-;26678:4;26716:2;26705:9;26701:18;26693:26;;26765:9;26759:4;26755:20;26751:1;26740:9;26736:17;26729:47;26793:131;26919:4;26793:131;:::i;:::-;26785:139;;26512:419;;;:::o;26937:::-;27103:4;27141:2;27130:9;27126:18;27118:26;;27190:9;27184:4;27180:20;27176:1;27165:9;27161:17;27154:47;27218:131;27344:4;27218:131;:::i;:::-;27210:139;;26937:419;;;:::o;27362:::-;27528:4;27566:2;27555:9;27551:18;27543:26;;27615:9;27609:4;27605:20;27601:1;27590:9;27586:17;27579:47;27643:131;27769:4;27643:131;:::i;:::-;27635:139;;27362:419;;;:::o;27787:::-;27953:4;27991:2;27980:9;27976:18;27968:26;;28040:9;28034:4;28030:20;28026:1;28015:9;28011:17;28004:47;28068:131;28194:4;28068:131;:::i;:::-;28060:139;;27787:419;;;:::o;28212:::-;28378:4;28416:2;28405:9;28401:18;28393:26;;28465:9;28459:4;28455:20;28451:1;28440:9;28436:17;28429:47;28493:131;28619:4;28493:131;:::i;:::-;28485:139;;28212:419;;;:::o;28637:::-;28803:4;28841:2;28830:9;28826:18;28818:26;;28890:9;28884:4;28880:20;28876:1;28865:9;28861:17;28854:47;28918:131;29044:4;28918:131;:::i;:::-;28910:139;;28637:419;;;:::o;29062:::-;29228:4;29266:2;29255:9;29251:18;29243:26;;29315:9;29309:4;29305:20;29301:1;29290:9;29286:17;29279:47;29343:131;29469:4;29343:131;:::i;:::-;29335:139;;29062:419;;;:::o;29487:::-;29653:4;29691:2;29680:9;29676:18;29668:26;;29740:9;29734:4;29730:20;29726:1;29715:9;29711:17;29704:47;29768:131;29894:4;29768:131;:::i;:::-;29760:139;;29487:419;;;:::o;29912:::-;30078:4;30116:2;30105:9;30101:18;30093:26;;30165:9;30159:4;30155:20;30151:1;30140:9;30136:17;30129:47;30193:131;30319:4;30193:131;:::i;:::-;30185:139;;29912:419;;;:::o;30337:::-;30503:4;30541:2;30530:9;30526:18;30518:26;;30590:9;30584:4;30580:20;30576:1;30565:9;30561:17;30554:47;30618:131;30744:4;30618:131;:::i;:::-;30610:139;;30337:419;;;:::o;30762:::-;30928:4;30966:2;30955:9;30951:18;30943:26;;31015:9;31009:4;31005:20;31001:1;30990:9;30986:17;30979:47;31043:131;31169:4;31043:131;:::i;:::-;31035:139;;30762:419;;;:::o;31187:::-;31353:4;31391:2;31380:9;31376:18;31368:26;;31440:9;31434:4;31430:20;31426:1;31415:9;31411:17;31404:47;31468:131;31594:4;31468:131;:::i;:::-;31460:139;;31187:419;;;:::o;31612:::-;31778:4;31816:2;31805:9;31801:18;31793:26;;31865:9;31859:4;31855:20;31851:1;31840:9;31836:17;31829:47;31893:131;32019:4;31893:131;:::i;:::-;31885:139;;31612:419;;;:::o;32037:::-;32203:4;32241:2;32230:9;32226:18;32218:26;;32290:9;32284:4;32280:20;32276:1;32265:9;32261:17;32254:47;32318:131;32444:4;32318:131;:::i;:::-;32310:139;;32037:419;;;:::o;32462:::-;32628:4;32666:2;32655:9;32651:18;32643:26;;32715:9;32709:4;32705:20;32701:1;32690:9;32686:17;32679:47;32743:131;32869:4;32743:131;:::i;:::-;32735:139;;32462:419;;;:::o;32887:::-;33053:4;33091:2;33080:9;33076:18;33068:26;;33140:9;33134:4;33130:20;33126:1;33115:9;33111:17;33104:47;33168:131;33294:4;33168:131;:::i;:::-;33160:139;;32887:419;;;:::o;33312:222::-;33405:4;33443:2;33432:9;33428:18;33420:26;;33456:71;33524:1;33513:9;33509:17;33500:6;33456:71;:::i;:::-;33312:222;;;;:::o;33540:129::-;33574:6;33601:20;;:::i;:::-;33591:30;;33630:33;33658:4;33650:6;33630:33;:::i;:::-;33540:129;;;:::o;33675:75::-;33708:6;33741:2;33735:9;33725:19;;33675:75;:::o;33756:307::-;33817:4;33907:18;33899:6;33896:30;33893:56;;;33929:18;;:::i;:::-;33893:56;33967:29;33989:6;33967:29;:::i;:::-;33959:37;;34051:4;34045;34041:15;34033:23;;33756:307;;;:::o;34069:308::-;34131:4;34221:18;34213:6;34210:30;34207:56;;;34243:18;;:::i;:::-;34207:56;34281:29;34303:6;34281:29;:::i;:::-;34273:37;;34365:4;34359;34355:15;34347:23;;34069:308;;;:::o;34383:132::-;34450:4;34473:3;34465:11;;34503:4;34498:3;34494:14;34486:22;;34383:132;;;:::o;34521:141::-;34570:4;34593:3;34585:11;;34616:3;34613:1;34606:14;34650:4;34647:1;34637:18;34629:26;;34521:141;;;:::o;34668:114::-;34735:6;34769:5;34763:12;34753:22;;34668:114;;;:::o;34788:98::-;34839:6;34873:5;34867:12;34857:22;;34788:98;;;:::o;34892:99::-;34944:6;34978:5;34972:12;34962:22;;34892:99;;;:::o;34997:113::-;35067:4;35099;35094:3;35090:14;35082:22;;34997:113;;;:::o;35116:184::-;35215:11;35249:6;35244:3;35237:19;35289:4;35284:3;35280:14;35265:29;;35116:184;;;;:::o;35306:168::-;35389:11;35423:6;35418:3;35411:19;35463:4;35458:3;35454:14;35439:29;;35306:168;;;;:::o;35480:169::-;35564:11;35598:6;35593:3;35586:19;35638:4;35633:3;35629:14;35614:29;;35480:169;;;;:::o;35655:148::-;35757:11;35794:3;35779:18;;35655:148;;;;:::o;35809:305::-;35849:3;35868:20;35886:1;35868:20;:::i;:::-;35863:25;;35902:20;35920:1;35902:20;:::i;:::-;35897:25;;36056:1;35988:66;35984:74;35981:1;35978:81;35975:107;;;36062:18;;:::i;:::-;35975:107;36106:1;36103;36099:9;36092:16;;35809:305;;;;:::o;36120:185::-;36160:1;36177:20;36195:1;36177:20;:::i;:::-;36172:25;;36211:20;36229:1;36211:20;:::i;:::-;36206:25;;36250:1;36240:35;;36255:18;;:::i;:::-;36240:35;36297:1;36294;36290:9;36285:14;;36120:185;;;;:::o;36311:191::-;36351:4;36371:20;36389:1;36371:20;:::i;:::-;36366:25;;36405:20;36423:1;36405:20;:::i;:::-;36400:25;;36444:1;36441;36438:8;36435:34;;;36449:18;;:::i;:::-;36435:34;36494:1;36491;36487:9;36479:17;;36311:191;;;;:::o;36508:96::-;36545:7;36574:24;36592:5;36574:24;:::i;:::-;36563:35;;36508:96;;;:::o;36610:90::-;36644:7;36687:5;36680:13;36673:21;36662:32;;36610:90;;;:::o;36706:149::-;36742:7;36782:66;36775:5;36771:78;36760:89;;36706:149;;;:::o;36861:126::-;36898:7;36938:42;36931:5;36927:54;36916:65;;36861:126;;;:::o;36993:77::-;37030:7;37059:5;37048:16;;36993:77;;;:::o;37076:154::-;37160:6;37155:3;37150;37137:30;37222:1;37213:6;37208:3;37204:16;37197:27;37076:154;;;:::o;37236:307::-;37304:1;37314:113;37328:6;37325:1;37322:13;37314:113;;;37413:1;37408:3;37404:11;37398:18;37394:1;37389:3;37385:11;37378:39;37350:2;37347:1;37343:10;37338:15;;37314:113;;;37445:6;37442:1;37439:13;37436:101;;;37525:1;37516:6;37511:3;37507:16;37500:27;37436:101;37285:258;37236:307;;;:::o;37549:320::-;37593:6;37630:1;37624:4;37620:12;37610:22;;37677:1;37671:4;37667:12;37698:18;37688:81;;37754:4;37746:6;37742:17;37732:27;;37688:81;37816:2;37808:6;37805:14;37785:18;37782:38;37779:84;;;37835:18;;:::i;:::-;37779:84;37600:269;37549:320;;;:::o;37875:281::-;37958:27;37980:4;37958:27;:::i;:::-;37950:6;37946:40;38088:6;38076:10;38073:22;38052:18;38040:10;38037:34;38034:62;38031:88;;;38099:18;;:::i;:::-;38031:88;38139:10;38135:2;38128:22;37918:238;37875:281;;:::o;38162:233::-;38201:3;38224:24;38242:5;38224:24;:::i;:::-;38215:33;;38270:66;38263:5;38260:77;38257:103;;;38340:18;;:::i;:::-;38257:103;38387:1;38380:5;38376:13;38369:20;;38162:233;;;:::o;38401:79::-;38440:7;38469:5;38458:16;;38401:79;;;:::o;38486:176::-;38518:1;38535:20;38553:1;38535:20;:::i;:::-;38530:25;;38569:20;38587:1;38569:20;:::i;:::-;38564:25;;38608:1;38598:35;;38613:18;;:::i;:::-;38598:35;38654:1;38651;38647:9;38642:14;;38486:176;;;;:::o;38668:180::-;38716:77;38713:1;38706:88;38813:4;38810:1;38803:15;38837:4;38834:1;38827:15;38854:180;38902:77;38899:1;38892:88;38999:4;38996:1;38989:15;39023:4;39020:1;39013:15;39040:180;39088:77;39085:1;39078:88;39185:4;39182:1;39175:15;39209:4;39206:1;39199:15;39226:180;39274:77;39271:1;39264:88;39371:4;39368:1;39361:15;39395:4;39392:1;39385:15;39412:180;39460:77;39457:1;39450:88;39557:4;39554:1;39547:15;39581:4;39578:1;39571:15;39598:117;39707:1;39704;39697:12;39721:117;39830:1;39827;39820:12;39844:117;39953:1;39950;39943:12;39967:117;40076:1;40073;40066:12;40090:102;40131:6;40182:2;40178:7;40173:2;40166:5;40162:14;40158:28;40148:38;;40090:102;;;:::o;40198:237::-;40338:34;40334:1;40326:6;40322:14;40315:58;40407:20;40402:2;40394:6;40390:15;40383:45;40198:237;:::o;40441:225::-;40581:34;40577:1;40569:6;40565:14;40558:58;40650:8;40645:2;40637:6;40633:15;40626:33;40441:225;:::o;40672:178::-;40812:30;40808:1;40800:6;40796:14;40789:54;40672:178;:::o;40856:242::-;40996:34;40992:1;40984:6;40980:14;40973:58;41065:25;41060:2;41052:6;41048:15;41041:50;40856:242;:::o;41104:223::-;41244:34;41240:1;41232:6;41228:14;41221:58;41313:6;41308:2;41300:6;41296:15;41289:31;41104:223;:::o;41333:175::-;41473:27;41469:1;41461:6;41457:14;41450:51;41333:175;:::o;41514:231::-;41654:34;41650:1;41642:6;41638:14;41631:58;41723:14;41718:2;41710:6;41706:15;41699:39;41514:231;:::o;41751:::-;41891:34;41887:1;41879:6;41875:14;41868:58;41960:14;41955:2;41947:6;41943:15;41936:39;41751:231;:::o;41988:243::-;42128:34;42124:1;42116:6;42112:14;42105:58;42197:26;42192:2;42184:6;42180:15;42173:51;41988:243;:::o;42237:229::-;42377:34;42373:1;42365:6;42361:14;42354:58;42446:12;42441:2;42433:6;42429:15;42422:37;42237:229;:::o;42472:228::-;42612:34;42608:1;42600:6;42596:14;42589:58;42681:11;42676:2;42668:6;42664:15;42657:36;42472:228;:::o;42706:182::-;42846:34;42842:1;42834:6;42830:14;42823:58;42706:182;:::o;42894:231::-;43034:34;43030:1;43022:6;43018:14;43011:58;43103:14;43098:2;43090:6;43086:15;43079:39;42894:231;:::o;43131:155::-;43271:7;43267:1;43259:6;43255:14;43248:31;43131:155;:::o;43292:182::-;43432:34;43428:1;43420:6;43416:14;43409:58;43292:182;:::o;43480:228::-;43620:34;43616:1;43608:6;43604:14;43597:58;43689:11;43684:2;43676:6;43672:15;43665:36;43480:228;:::o;43714:234::-;43854:34;43850:1;43842:6;43838:14;43831:58;43923:17;43918:2;43910:6;43906:15;43899:42;43714:234;:::o;43954:220::-;44094:34;44090:1;44082:6;44078:14;44071:58;44163:3;44158:2;44150:6;44146:15;44139:28;43954:220;:::o;44180:236::-;44320:34;44316:1;44308:6;44304:14;44297:58;44389:19;44384:2;44376:6;44372:15;44365:44;44180:236;:::o;44422:230::-;44562:34;44558:1;44550:6;44546:14;44539:58;44631:13;44626:2;44618:6;44614:15;44607:38;44422:230;:::o;44658:236::-;44798:34;44794:1;44786:6;44782:14;44775:58;44867:19;44862:2;44854:6;44850:15;44843:44;44658:236;:::o;44900:233::-;45040:34;45036:1;45028:6;45024:14;45017:58;45109:16;45104:2;45096:6;45092:15;45085:41;44900:233;:::o;45139:247::-;45279:34;45275:1;45267:6;45263:14;45256:58;45348:30;45343:2;45335:6;45331:15;45324:55;45139:247;:::o;45392:228::-;45532:34;45528:1;45520:6;45516:14;45509:58;45601:11;45596:2;45588:6;45584:15;45577:36;45392:228;:::o;45626:295::-;45766:34;45762:1;45754:6;45750:14;45743:58;45835:34;45830:2;45822:6;45818:15;45811:59;45904:9;45899:2;45891:6;45887:15;45880:34;45626:295;:::o;45927:122::-;46000:24;46018:5;46000:24;:::i;:::-;45993:5;45990:35;45980:63;;46039:1;46036;46029:12;45980:63;45927:122;:::o;46055:116::-;46125:21;46140:5;46125:21;:::i;:::-;46118:5;46115:32;46105:60;;46161:1;46158;46151:12;46105:60;46055:116;:::o;46177:120::-;46249:23;46266:5;46249:23;:::i;:::-;46242:5;46239:34;46229:62;;46287:1;46284;46277:12;46229:62;46177:120;:::o;46303:122::-;46376:24;46394:5;46376:24;:::i;:::-;46369:5;46366:35;46356:63;;46415:1;46412;46405:12;46356:63;46303:122;:::o

Swarm Source

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