ETH Price: $3,292.16 (+1.41%)
Gas: 1 Gwei

Token

GlobalGoats (GOAT)
 

Overview

Max Total Supply

1,025 GOAT

Holders

276

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 GOAT
0x0cd3a4d3a40618f44513b11992e121b97792e433
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GlobalGoats

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 2022-01-06
*/

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

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

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





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

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

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



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

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

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

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

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

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

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

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

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

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

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

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



/**
 * @title ERC-721 Non-Fungible Token Standard, optional 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);
}





abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns(bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}






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

            // Token name
            string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

























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




















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









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

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

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




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







// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

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

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

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

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

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

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

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

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

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

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

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

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

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





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

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

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

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

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

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

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

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









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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




//Global Goats Main Contract

contract GlobalGoats is ERC721Enumerable, Ownable {

    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public constant collection_Supply = 2323;

    uint256 public constant MAX_PURCHASE = 20;

    uint256 public constant MAX_MintedForPromotion = 25;

    uint256 public goatsMintedForPromotion;

    uint256 public preSaleGoatsMinted;

    uint256 public constant MAX_MintedGoldenGoats = 100;

    uint256 public constant MAX_PreSaleMintedGoats = 350;

    uint256 public constant PRICE_PER_GOAT = 150000000000000000 wei;  //0.15 ETH

    uint256 public constant PreSale_PRICE_PER_GOAT = 110000000000000000 wei;  //0.11 ETH

    bool private _saleIsActive;

    mapping(uint256 => uint256) private _tokenPriceWei;

    mapping (uint256 => address) private _tokenListOwner;

    bool private _preSaleIsActive;

    string private _metaBaseUri = "https://assets.globalgoats.io/";


//Index of Golden Goats
    uint[] GoldenGoats = [283, 107, 44, 344, 9, 23, 40, 218, 349, 165, 74, 2, 19, 227, 215, 315, 4, 303, 237, 209, 27, 199, 336, 256, 280, 312, 7, 317, 89, 169, 37, 204, 144, 133, 342, 156, 201, 196, 101, 164, 265, 275, 173, 228, 79, 277, 41, 292, 230, 337, 1619, 480, 1551, 1400, 1678, 1658, 2222, 1461, 2323, 2125, 981, 1639, 712, 1230, 1645, 1083, 976, 2244, 939, 786, 1223, 2022, 585, 2261, 926, 1985, 893, 1571, 1098, 792, 1944, 1754, 1352, 821, 1771, 931, 2018, 432, 1901, 1919, 867, 1295, 1697, 667, 2175, 1926, 1100, 1166, 1978, 2085];

    uint[] getOnSale;
    //Alternative Option 
    struct GoldenGoat {
        address userAddress;
        uint tokenId;
    }
    

    constructor() ERC721("GlobalGoats", "GOAT") {

        _saleIsActive = true;
        _preSaleIsActive = true;
        goatsMintedForPromotion = 0;
    }

    //public mint
    function mint(uint16 numberOfTokens) public payable {
        require(saleIsActive(), "Sale is not active");
        require(numberOfTokens <= MAX_PURCHASE, "Can only mint max 20 tokens per transaction");
        require(PRICE_PER_GOAT.mul(numberOfTokens) == msg.value, "Ether value sent is incorrect.Need 0.15 ETH for each GOAT");
        require(totalSupply() < collection_Supply, "collection sold out");
        require(totalSupply().add(numberOfTokens) < collection_Supply, "Insufficient supply");

        _mintTokens(numberOfTokens,msg.sender);

    }

    //Pre-Sale Mint
    function preSalemint(uint16 numberOfTokens) public payable {
        require(saleIsActive(), "Sale is not active");
        require(numberOfTokens <= MAX_PURCHASE, "Can only mint max 20 tokens per transaction");
        require(preSaleGoatsMinted.add(numberOfTokens) <= MAX_PreSaleMintedGoats, "Cannot mint more Pre-sale mintgoats for promotion");
        require(PreSale_PRICE_PER_GOAT.mul(numberOfTokens) == msg.value, "Ether value sent is incorrect.Need 0.11 ETH For Presale for each GOAT");
        require(totalSupply().add(numberOfTokens) < collection_Supply, "Insufficient supply");
        preSaleGoatsMinted += numberOfTokens;

        _mintTokens(numberOfTokens,msg.sender);

    }


    /* Owner functions */

    /**
     * Reserve a few Goats e.g. for giveaways
     */
    function reserveMint(uint16 numberOfTokens , address _to) external onlyOwner {
        require(goatsMintedForPromotion.add(numberOfTokens) <= MAX_MintedForPromotion, "Cannot mint more goats for promotion");
        require(totalSupply().add(numberOfTokens) < collection_Supply, "Insufficient supply");
        goatsMintedForPromotion += numberOfTokens;
        _mintTokens(numberOfTokens,_to);
    }

    
    function setSaleIsActive(bool active) external onlyOwner {
        _saleIsActive = active;
    }

    function setPreSaleIsActive(bool active) external onlyOwner {
        _preSaleIsActive = active;
    }


    function setMetaBaseURI(string memory baseURI) external onlyOwner {
        _metaBaseUri = baseURI;
    }

    function withdraw(uint256 amount) external onlyOwner {
        require(amount <= address(this).balance, 'Insufficient balance');
        payable(msg.sender).transfer(amount);
    }

    function withdrawAll() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    /* View functions */
    function saleIsActive() public view returns(bool) {
        return _saleIsActive;
    }

    function presaleIsActive() public view returns(bool) {
        return _preSaleIsActive;
    }
    //get array of golden goats TokenIds
    function _getGGTokens() external view returns(uint[] memory) {

        uint[] memory goats = new uint[](GoldenGoats.length);
        
        for (uint j = 0; j < GoldenGoats.length; j++) {
        
            goats[j] = GoldenGoats[j];
        }

        return goats;
    }


 function _getOnSalePlatformTokens() external view returns(uint[] memory) {

        uint[] memory goats = new uint[](getOnSale.length);
        uint256 tokenId;

        for (uint j = 0; j < getOnSale.length; j++) {
            tokenId = getOnSale[j];
        if (_exists(tokenId)) {
        address listowneraddress = _tokenListOwner[tokenId];
        address currentOnweraddress = ownerOf(tokenId);

         if( listowneraddress == currentOnweraddress) {   // if else statement
         goats[j] = getOnSale[j];
         } 
        }
        }

        return goats;
    }


    function IsGGToken(uint256 tokenId) public view returns(bool status) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        status = false;
        for (uint l = 0; l < GoldenGoats.length; l++) {
            
            if (GoldenGoats[l] == tokenId) {
                status = true;
                break;
            }
        }
         return status;

    }

 function IsonSaleToken(uint256 tokenId) public view returns(bool status) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        status = false;
        for (uint k = 0; k < getOnSale.length; k++) {
            if (getOnSale[k] == tokenId) {
                status = true;
                break;
            }
        }
        return status;

    }


    function getCurrentPriceOfToken(uint256 tokenId) public view virtual returns(uint256) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        require(_tokenListOwner[tokenId] == ownerOf(tokenId) , "Not For Sale Currently on GlobalGoats.io");
        uint256 Price = _tokenPriceWei[tokenId];

        return Price;
    }

    function tokenURI(uint256 tokenId) override public view returns(string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        return string(abi.encodePacked(_baseURI(), "tokens/", uint256(tokenId).toString(), "/metadata.json"));
    }

    /* Internal functions */
    function _mintTokens(uint16 numberOfTokens , address _to) internal {
        for (uint16 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = totalSupply() + 1;
            //uint256 tokenId = _tokenIdTracker.current();
            _safeMint(_to, tokenId);
        }
    }


    function approve(uint256 _tokenId, address _from) internal virtual {
        require(ownerOf(_tokenId) == msg.sender, "NOT OWNER");
        isApprovedForAll(_from, address(this));
    }


    //send Price in wei
    function _setTokenPrice(uint256 tokenId, uint256 tokenPrice) external  {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _tokenPriceWei[tokenId] = tokenPrice;
        getOnSale.push(tokenId);
        _tokenListOwner[tokenId] = msg.sender;
        approve(tokenId, msg.sender);

    }

    /* Only for Global Goats Platform */
    function transfergg(uint256 tokenId) external payable{
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        require(msg.value > 0, "Price must be greater than zero");
        require(_tokenListOwner[tokenId] == ownerOf(tokenId) , "Not For Sale Currently on GlobalGoats.io");
        uint256 amountReceived = (msg.value * 1000000000000000000);

        require(amountReceived >= _tokenPriceWei[tokenId], "Invalid amount sent up");
    
        uint256 Platformpercentage = 8;

        //Give royalties to original contract owner
        uint256 ownerCut = (msg.value * Platformpercentage) / 100;
        
        address owner = owner();
        payable(owner).transfer(ownerCut);

        //Give royalties to NPort (2%)
        uint256 nportCut = (msg.value * 2) / 100;

        //token Current Owner
        address tokencurrentOwner = ownerOf(tokenId);

        //send royalty to 100 GG 
        uint256 ggtokenId;
        //divide nportcut by GG Lengths
        uint pricepergoat = nportCut / GoldenGoats.length;
        if (GoldenGoats.length > 0) {
            for (uint j = 0; j < GoldenGoats.length; j++) {
                ggtokenId = GoldenGoats[j];
                if (_exists(ggtokenId)) {
                   address GGtokenowner = ownerOf(ggtokenId);
                    payable(GGtokenowner).transfer(pricepergoat);
                }
            }
        }

        //Give current owner the rest
        payable(tokencurrentOwner).transfer(msg.value - ownerCut - nportCut);
        _transfer(tokencurrentOwner, msg.sender, tokenId);
        _tokenPriceWei[tokenId] = 0;

        if (getOnSale.length > 0) {
            for (uint j = 0; j < getOnSale.length; j++) {
                ggtokenId = getOnSale[j];
                if (ggtokenId == tokenId) {
                    delete getOnSale[j];
                }
            }
        }
    }


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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IsGGToken","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IsonSaleToken","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MintedForPromotion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MintedGoldenGoats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PreSaleMintedGoats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_GOAT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PreSale_PRICE_PER_GOAT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getGGTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getOnSalePlatformTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"name":"_setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collection_Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrentPriceOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goatsMintedForPromotion","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":"uint16","name":"numberOfTokens","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"preSaleGoatsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfTokens","type":"uint16"}],"name":"preSalemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfTokens","type":"uint16"},{"internalType":"address","name":"_to","type":"address"}],"name":"reserveMint","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setMetaBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setPreSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfergg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601e81526020017f68747470733a2f2f6173736574732e676c6f62616c676f6174732e696f2f00008152506011908051906020019062000051929190620006dd565b5060405180610c80016040528061011b61ffff168152602001606b61ffff168152602001602c61ffff16815260200161015861ffff168152602001600961ffff168152602001601761ffff168152602001602861ffff16815260200160da61ffff16815260200161015d61ffff16815260200160a561ffff168152602001604a61ffff168152602001600261ffff168152602001601361ffff16815260200160e361ffff16815260200160d761ffff16815260200161013b61ffff168152602001600461ffff16815260200161012f61ffff16815260200160ed61ffff16815260200160d161ffff168152602001601b61ffff16815260200160c761ffff16815260200161015061ffff16815260200161010061ffff16815260200161011861ffff16815260200161013861ffff168152602001600761ffff16815260200161013d61ffff168152602001605961ffff16815260200160a961ffff168152602001602561ffff16815260200160cc61ffff168152602001609061ffff168152602001608561ffff16815260200161015661ffff168152602001609c61ffff16815260200160c961ffff16815260200160c461ffff168152602001606561ffff16815260200160a461ffff16815260200161010961ffff16815260200161011361ffff16815260200160ad61ffff16815260200160e461ffff168152602001604f61ffff16815260200161011561ffff168152602001602961ffff16815260200161012461ffff16815260200160e661ffff16815260200161015161ffff16815260200161065361ffff1681526020016101e061ffff16815260200161060f61ffff16815260200161057861ffff16815260200161068e61ffff16815260200161067a61ffff1681526020016108ae61ffff1681526020016105b561ffff16815260200161091361ffff16815260200161084d61ffff1681526020016103d561ffff16815260200161066761ffff1681526020016102c861ffff1681526020016104ce61ffff16815260200161066d61ffff16815260200161043b61ffff1681526020016103d061ffff1681526020016108c461ffff1681526020016103ab61ffff16815260200161031261ffff1681526020016104c761ffff1681526020016107e661ffff16815260200161024961ffff1681526020016108d561ffff16815260200161039e61ffff1681526020016107c161ffff16815260200161037d61ffff16815260200161062361ffff16815260200161044a61ffff16815260200161031861ffff16815260200161079861ffff1681526020016106da61ffff16815260200161054861ffff16815260200161033561ffff1681526020016106eb61ffff1681526020016103a361ffff1681526020016107e261ffff1681526020016101b061ffff16815260200161076d61ffff16815260200161077f61ffff16815260200161036361ffff16815260200161050f61ffff1681526020016106a161ffff16815260200161029b61ffff16815260200161087f61ffff16815260200161078661ffff16815260200161044c61ffff16815260200161048e61ffff1681526020016107ba61ffff16815260200161082561ffff168152506012906064620004fc9291906200076e565b503480156200050a57600080fd5b506040518060400160405280600b81526020017f476c6f62616c476f6174730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474f41540000000000000000000000000000000000000000000000000000000081525081600090805190602001906200058f929190620006dd565b508060019080519060200190620005a8929190620006dd565b505050620005cb620005bf6200060f60201b60201c565b6200061760201b60201c565b6001600d60006101000a81548160ff0219169083151502179055506001601060006101000a81548160ff0219169083151502179055506000600b819055506200084a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620006eb90620007e5565b90600052602060002090601f0160209004810192826200070f57600085556200075b565b82601f106200072a57805160ff19168380011785556200075b565b828001600101855582156200075b579182015b828111156200075a5782518255916020019190600101906200073d565b5b5090506200076a9190620007c6565b5090565b828054828255906000526020600020908101928215620007b3579160200282015b82811115620007b2578251829061ffff169055916020019190600101906200078f565b5b509050620007c29190620007c6565b5090565b5b80821115620007e1576000816000905550600101620007c7565b5090565b60006002820490506001821680620007fe57607f821691505b602082108114156200081557620008146200081b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6158ec806200085a6000396000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063b88d4fde116100c1578063d5646cca1161007a578063d5646cca1461094f578063e985e9c51461097a578063ea21feda146109b7578063eb8d2444146109e2578063f23272be14610a0d578063f2fde38b14610a3657610272565b8063b88d4fde1461083f578063bfb4a2d414610868578063c87b56dd14610893578063c996bb61146108d0578063caf518ab146108fb578063cb1eb1331461092657610272565b8063853828b611610113578063853828b6146107535780638da5cb5b1461076a57806395d89b411461079557806399b9b98f146107c05780639f4e3cb1146107eb578063a22cb4651461081657610272565b806370a082311461066e5780637146bd08146106ab578063715018a6146106d65780637babaeef146106ed5780637dcb4f5e1461071657610272565b806323cf0a22116101e857806342842e0e116101ac57806342842e0e146105385780634ef0708e146105615780634f6ccce71461058c57806350088701146105c95780636352211e146106065780636c4aa99e1461064357610272565b806323cf0a221461044e5780632e1a7d4d1461046a5780632f745c591461049357806330f72cd4146104d057806332da7869146104fb57610272565b8063095ea7b31161023a578063095ea7b31461037057806311b8b92f1461039957806315c4acb9146103b557806318160ddd146103d157806318d272eb146103fc57806323b872dd1461042557610272565b80630106e0ee1461027757806301ffc9a7146102a257806302c88989146102df57806306fdde0314610308578063081812fc14610333575b600080fd5b34801561028357600080fd5b5061028c610a5f565b6040516102999190614a4f565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190613dd7565b610a65565b6040516102d69190614612565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613daa565b610adf565b005b34801561031457600080fd5b5061031d610b78565b60405161032a919061462d565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190613ee7565b610c0a565b6040516103679190614589565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613d6a565b610c8f565b005b6103b360048036038101906103ae9190613ee7565b610da7565b005b6103cf60048036038101906103ca9190613e7a565b6111c1565b005b3480156103dd57600080fd5b506103e6611398565b6040516103f39190614a4f565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190613e31565b6113a5565b005b34801561043157600080fd5b5061044c60048036038101906104479190613c54565b61143b565b005b61046860048036038101906104639190613e7a565b61149b565b005b34801561047657600080fd5b50610491600480360381019061048c9190613ee7565b611643565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190613d6a565b61174c565b6040516104c79190614a4f565b60405180910390f35b3480156104dc57600080fd5b506104e56117f1565b6040516104f29190614612565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d9190613ee7565b611808565b60405161052f9190614612565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613c54565b6118ae565b005b34801561056d57600080fd5b506105766118ce565b6040516105839190614a4f565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190613ee7565b6118da565b6040516105c09190614a4f565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613ee7565b61194b565b6040516105fd9190614612565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190613ee7565b6119f1565b60405161063a9190614589565b60405180910390f35b34801561064f57600080fd5b50610658611aa3565b6040516106659190614a4f565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613be7565b611aa9565b6040516106a29190614a4f565b60405180910390f35b3480156106b757600080fd5b506106c0611b61565b6040516106cd9190614a4f565b60405180910390f35b3480156106e257600080fd5b506106eb611b66565b005b3480156106f957600080fd5b50610714600480360381019061070f9190613daa565b611bee565b005b34801561072257600080fd5b5061073d60048036038101906107389190613ee7565b611c87565b60405161074a9190614a4f565b60405180910390f35b34801561075f57600080fd5b50610768611d9b565b005b34801561077657600080fd5b5061077f611e60565b60405161078c9190614589565b60405180910390f35b3480156107a157600080fd5b506107aa611e8a565b6040516107b7919061462d565b60405180910390f35b3480156107cc57600080fd5b506107d5611f1c565b6040516107e29190614a4f565b60405180910390f35b3480156107f757600080fd5b50610800611f22565b60405161080d9190614a4f565b60405180910390f35b34801561082257600080fd5b5061083d60048036038101906108389190613d2a565b611f27565b005b34801561084b57600080fd5b5061086660048036038101906108619190613ca7565b6120a8565b005b34801561087457600080fd5b5061087d61210a565b60405161088a91906145f0565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613ee7565b6121c7565b6040516108c7919061462d565b60405180910390f35b3480156108dc57600080fd5b506108e5612249565b6040516108f29190614a4f565b60405180910390f35b34801561090757600080fd5b5061091061224f565b60405161091d9190614a4f565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613f14565b61225b565b005b34801561095b57600080fd5b50610964612394565b6040516109719190614a4f565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c9190613c14565b612399565b6040516109ae9190614612565b60405180910390f35b3480156109c357600080fd5b506109cc61242d565b6040516109d991906145f0565b60405180910390f35b3480156109ee57600080fd5b506109f761259c565b604051610a049190614612565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190613ea7565b6125b3565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190613be7565b612717565b005b61091381565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad85750610ad78261280f565b5b9050919050565b610ae76128f1565b73ffffffffffffffffffffffffffffffffffffffff16610b05611e60565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b52906148ef565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b606060008054610b8790614d46565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb390614d46565b8015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050505050905090565b6000610c15826128f9565b610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b9061488f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9a826119f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d02906149af565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d2a6128f1565b73ffffffffffffffffffffffffffffffffffffffff161480610d595750610d5881610d536128f1565b612399565b5b610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f906147cf565b60405180910390fd5b610da28383612965565b505050565b610db0816128f9565b610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de69061494f565b60405180910390fd5b60003411610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061466f565b60405180910390fd5b610e3b816119f1565b73ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290614a0f565b60405180910390fd5b6000670de0b6b3a764000034610ef19190614bf4565b9050600e600083815260200190815260200160002054811015610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f409061492f565b60405180910390fd5b600060089050600060648234610f5f9190614bf4565b610f699190614bc3565b90506000610f75611e60565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610fbd573d6000803e3d6000fd5b5060006064600234610fcf9190614bf4565b610fd99190614bc3565b90506000610fe6876119f1565b905060008060128054905084610ffc9190614bc3565b9050600060128054905011156110b65760005b6012805490508110156110b457601281815481106110305761102f614f0a565b5b90600052602060002001549250611046836128f9565b156110a1576000611056846119f1565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561109e573d6000803e3d6000fd5b50505b80806110ac90614dd4565b91505061100f565b505b8273ffffffffffffffffffffffffffffffffffffffff166108fc8588346110dd9190614c4e565b6110e79190614c4e565b9081150290604051600060405180830381858888f19350505050158015611112573d6000803e3d6000fd5b5061111e83338b612a1e565b6000600e60008b815260200190815260200160002081905550600060138054905011156111b65760005b6013805490508110156111b4576013818154811061116957611168614f0a565b5b90600052602060002001549250898314156111a1576013818154811061119257611191614f0a565b5b90600052602060002001600090555b80806111ac90614dd4565b915050611148565b505b505050505050505050565b6111c961259c565b611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff9061476f565b60405180910390fd5b60148161ffff161115611250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112479061498f565b60405180910390fd5b61015e61126c8261ffff16600c54612c7a90919063ffffffff16565b11156112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a49061484f565b60405180910390fd5b346112cd8261ffff16670186cc6acd4b0000612c9090919063ffffffff16565b1461130d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611304906146ef565b60405180910390fd5b61091361132e8261ffff16611320611398565b612c7a90919063ffffffff16565b1061136e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611365906148cf565b60405180910390fd5b8061ffff16600c60008282546113849190614b6d565b925050819055506113958133612ca6565b50565b6000600880549050905090565b6113ad6128f1565b73ffffffffffffffffffffffffffffffffffffffff166113cb611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611418906148ef565b60405180910390fd5b80601190805190602001906114379291906139e6565b5050565b61144c6114466128f1565b82612cf4565b61148b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611482906149cf565b60405180910390fd5b611496838383612a1e565b505050565b6114a361259c565b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d99061476f565b60405180910390fd5b60148161ffff16111561152a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115219061498f565b60405180910390fd5b3461154a8261ffff16670214e8348c4f0000612c9090919063ffffffff16565b1461158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115819061496f565b60405180910390fd5b610913611595611398565b106115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061478f565b60405180910390fd5b6109136115f68261ffff166115e8611398565b612c7a90919063ffffffff16565b10611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906148cf565b60405180910390fd5b6116408133612ca6565b50565b61164b6128f1565b73ffffffffffffffffffffffffffffffffffffffff16611669611e60565b73ffffffffffffffffffffffffffffffffffffffff16146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b6906148ef565b60405180910390fd5b47811115611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f99061474f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611748573d6000803e3d6000fd5b5050565b600061175783611aa9565b8210611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f9061464f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601060009054906101000a900460ff16905090565b6000611813826128f9565b611852576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118499061494f565b60405180910390fd5b6000905060005b6012805490508110156118a857826012828154811061187b5761187a614f0a565b5b9060005260206000200154141561189557600191506118a8565b80806118a090614dd4565b915050611859565b50919050565b6118c9838383604051806020016040528060008152506120a8565b505050565b670186cc6acd4b000081565b60006118e4611398565b8210611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c906149ef565b60405180910390fd5b6008828154811061193957611938614f0a565b5b90600052602060002001549050919050565b6000611956826128f9565b611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c9061494f565b60405180910390fd5b6000905060005b6013805490508110156119eb5782601382815481106119be576119bd614f0a565b5b906000526020600020015414156119d857600191506119eb565b80806119e390614dd4565b91505061199c565b50919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a919061480f565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b11906147ef565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601481565b611b6e6128f1565b73ffffffffffffffffffffffffffffffffffffffff16611b8c611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd9906148ef565b60405180910390fd5b611bec6000612dd2565b565b611bf66128f1565b73ffffffffffffffffffffffffffffffffffffffff16611c14611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c61906148ef565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000611c92826128f9565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc89061494f565b60405180910390fd5b611cda826119f1565b73ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190614a0f565b60405180910390fd5b6000600e600084815260200190815260200160002054905080915050919050565b611da36128f1565b73ffffffffffffffffffffffffffffffffffffffff16611dc1611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e906148ef565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611e5d573d6000803e3d6000fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e9990614d46565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec590614d46565b8015611f125780601f10611ee757610100808354040283529160200191611f12565b820191906000526020600020905b815481529060010190602001808311611ef557829003601f168201915b5050505050905090565b600c5481565b601981565b611f2f6128f1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f949061472f565b60405180910390fd5b8060056000611faa6128f1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120576128f1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161209c9190614612565b60405180910390a35050565b6120b96120b36128f1565b83612cf4565b6120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149cf565b60405180910390fd5b61210484848484612e98565b50505050565b6060600060128054905067ffffffffffffffff81111561212d5761212c614f39565b5b60405190808252806020026020018201604052801561215b5781602001602082028036833780820191505090505b50905060005b6012805490508110156121bf576012818154811061218257612181614f0a565b5b90600052602060002001548282815181106121a05761219f614f0a565b5b60200260200101818152505080806121b790614dd4565b915050612161565b508091505090565b60606121d2826128f9565b612211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612208906148af565b60405180910390fd5b612219612ef4565b61222283612f86565b60405160200161223392919061454f565b6040516020818303038152906040529050919050565b61015e81565b670214e8348c4f000081565b612264826128f9565b6122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906148af565b60405180910390fd5b6122b46122ae6128f1565b83612cf4565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea906149cf565b60405180910390fd5b80600e600084815260200190815260200160002081905550601382908060018154018082558091505060019003906000526020600020016000909190919091505533600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061239082336130e7565b5050565b606481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600060138054905067ffffffffffffffff8111156124505761244f614f39565b5b60405190808252806020026020018201604052801561247e5781602001602082028036833780820191505090505b509050600080600090505b60138054905081101561259357601381815481106124aa576124a9614f0a565b5b906000526020600020015491506124c0826128f9565b15612580576000600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000612508846119f1565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561257d576013838154811061255257612551614f0a565b5b90600052602060002001548584815181106125705761256f614f0a565b5b6020026020010181815250505b50505b808061258b90614dd4565b915050612489565b50819250505090565b6000600d60009054906101000a900460ff16905090565b6125bb6128f1565b73ffffffffffffffffffffffffffffffffffffffff166125d9611e60565b73ffffffffffffffffffffffffffffffffffffffff161461262f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612626906148ef565b60405180910390fd5b601961264a8361ffff16600b54612c7a90919063ffffffff16565b111561268b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126829061482f565b60405180910390fd5b6109136126ac8361ffff1661269e611398565b612c7a90919063ffffffff16565b106126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e3906148cf565b60405180910390fd5b8161ffff16600b60008282546127029190614b6d565b925050819055506127138282612ca6565b5050565b61271f6128f1565b73ffffffffffffffffffffffffffffffffffffffff1661273d611e60565b73ffffffffffffffffffffffffffffffffffffffff1614612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a906148ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fa906146af565b60405180910390fd5b61280c81612dd2565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128ea57506128e98261316c565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129d8836119f1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff16612a3e826119f1565b73ffffffffffffffffffffffffffffffffffffffff1614612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b9061490f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb9061470f565b60405180910390fd5b612b0f8383836131d6565b612b1a600082612965565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b6a9190614c4e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc19190614b6d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612c889190614b6d565b905092915050565b60008183612c9e9190614bf4565b905092915050565b60005b8261ffff168161ffff161015612cef5760006001612cc5611398565b612ccf9190614b6d565b9050612cdb83826132ea565b508080612ce790614da9565b915050612ca9565b505050565b6000612cff826128f9565b612d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d35906147af565b60405180910390fd5b6000612d49836119f1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612db857508373ffffffffffffffffffffffffffffffffffffffff16612da084610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dc95750612dc88185612399565b5b91505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ea3848484612a1e565b612eaf84848484613308565b612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee59061468f565b60405180910390fd5b50505050565b606060118054612f0390614d46565b80601f0160208091040260200160405190810160405280929190818152602001828054612f2f90614d46565b8015612f7c5780601f10612f5157610100808354040283529160200191612f7c565b820191906000526020600020905b815481529060010190602001808311612f5f57829003601f168201915b5050505050905090565b60606000821415612fce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130e2565b600082905060005b60008214613000578080612fe990614dd4565b915050600a82612ff99190614bc3565b9150612fd6565b60008167ffffffffffffffff81111561301c5761301b614f39565b5b6040519080825280601f01601f19166020018201604052801561304e5781602001600182028036833780820191505090505b5090505b600085146130db576001826130679190614c4e565b9150600a856130769190614e1d565b60306130829190614b6d565b60f81b81838151811061309857613097614f0a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130d49190614bc3565b9450613052565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16613107836119f1565b73ffffffffffffffffffffffffffffffffffffffff161461315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490614a2f565b60405180910390fd5b6131678130612399565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131e183838361349f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132245761321f816134a4565b613263565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132625761326183826134ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a6576132a18161365a565b6132e5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132e4576132e3828261372b565b5b5b505050565b6133048282604051806020016040528060008152506137aa565b5050565b60006133298473ffffffffffffffffffffffffffffffffffffffff16613805565b15613492578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133526128f1565b8786866040518563ffffffff1660e01b815260040161337494939291906145a4565b602060405180830381600087803b15801561338e57600080fd5b505af19250505080156133bf57506040513d601f19601f820116820180604052508101906133bc9190613e04565b60015b613442573d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b5060008151141561343a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134319061468f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613497565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134fa84611aa9565b6135049190614c4e565b90506000600760008481526020019081526020016000205490508181146135e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061366e9190614c4e565b905060006009600084815260200190815260200160002054905060006008838154811061369e5761369d614f0a565b5b9060005260206000200154905080600883815481106136c0576136bf614f0a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061370f5761370e614edb565b5b6001900381819060005260206000200160009055905550505050565b600061373683611aa9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6137b48383613818565b6137c16000848484613308565b613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f79061468f565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387f9061486f565b60405180910390fd5b613891816128f9565b156138d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c8906146cf565b60405180910390fd5b6138dd600083836131d6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461392d9190614b6d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546139f290614d46565b90600052602060002090601f016020900481019282613a145760008555613a5b565b82601f10613a2d57805160ff1916838001178555613a5b565b82800160010185558215613a5b579182015b82811115613a5a578251825591602001919060010190613a3f565b5b509050613a689190613a6c565b5090565b5b80821115613a85576000816000905550600101613a6d565b5090565b6000613a9c613a9784614a8f565b614a6a565b905082815260208101848484011115613ab857613ab7614f6d565b5b613ac3848285614d04565b509392505050565b6000613ade613ad984614ac0565b614a6a565b905082815260208101848484011115613afa57613af9614f6d565b5b613b05848285614d04565b509392505050565b600081359050613b1c81615843565b92915050565b600081359050613b318161585a565b92915050565b600081359050613b4681615871565b92915050565b600081519050613b5b81615871565b92915050565b600082601f830112613b7657613b75614f68565b5b8135613b86848260208601613a89565b91505092915050565b600082601f830112613ba457613ba3614f68565b5b8135613bb4848260208601613acb565b91505092915050565b600081359050613bcc81615888565b92915050565b600081359050613be18161589f565b92915050565b600060208284031215613bfd57613bfc614f77565b5b6000613c0b84828501613b0d565b91505092915050565b60008060408385031215613c2b57613c2a614f77565b5b6000613c3985828601613b0d565b9250506020613c4a85828601613b0d565b9150509250929050565b600080600060608486031215613c6d57613c6c614f77565b5b6000613c7b86828701613b0d565b9350506020613c8c86828701613b0d565b9250506040613c9d86828701613bd2565b9150509250925092565b60008060008060808587031215613cc157613cc0614f77565b5b6000613ccf87828801613b0d565b9450506020613ce087828801613b0d565b9350506040613cf187828801613bd2565b925050606085013567ffffffffffffffff811115613d1257613d11614f72565b5b613d1e87828801613b61565b91505092959194509250565b60008060408385031215613d4157613d40614f77565b5b6000613d4f85828601613b0d565b9250506020613d6085828601613b22565b9150509250929050565b60008060408385031215613d8157613d80614f77565b5b6000613d8f85828601613b0d565b9250506020613da085828601613bd2565b9150509250929050565b600060208284031215613dc057613dbf614f77565b5b6000613dce84828501613b22565b91505092915050565b600060208284031215613ded57613dec614f77565b5b6000613dfb84828501613b37565b91505092915050565b600060208284031215613e1a57613e19614f77565b5b6000613e2884828501613b4c565b91505092915050565b600060208284031215613e4757613e46614f77565b5b600082013567ffffffffffffffff811115613e6557613e64614f72565b5b613e7184828501613b8f565b91505092915050565b600060208284031215613e9057613e8f614f77565b5b6000613e9e84828501613bbd565b91505092915050565b60008060408385031215613ebe57613ebd614f77565b5b6000613ecc85828601613bbd565b9250506020613edd85828601613b0d565b9150509250929050565b600060208284031215613efd57613efc614f77565b5b6000613f0b84828501613bd2565b91505092915050565b60008060408385031215613f2b57613f2a614f77565b5b6000613f3985828601613bd2565b9250506020613f4a85828601613bd2565b9150509250929050565b6000613f608383614531565b60208301905092915050565b613f7581614c82565b82525050565b6000613f8682614b01565b613f908185614b2f565b9350613f9b83614af1565b8060005b83811015613fcc578151613fb38882613f54565b9750613fbe83614b22565b925050600181019050613f9f565b5085935050505092915050565b613fe281614c94565b82525050565b6000613ff382614b0c565b613ffd8185614b40565b935061400d818560208601614d13565b61401681614f7c565b840191505092915050565b600061402c82614b17565b6140368185614b51565b9350614046818560208601614d13565b61404f81614f7c565b840191505092915050565b600061406582614b17565b61406f8185614b62565b935061407f818560208601614d13565b80840191505092915050565b6000614098602b83614b51565b91506140a382614f8d565b604082019050919050565b60006140bb601f83614b51565b91506140c682614fdc565b602082019050919050565b60006140de603283614b51565b91506140e982615005565b604082019050919050565b6000614101602683614b51565b915061410c82615054565b604082019050919050565b6000614124601c83614b51565b915061412f826150a3565b602082019050919050565b6000614147604583614b51565b9150614152826150cc565b606082019050919050565b600061416a600e83614b62565b915061417582615141565b600e82019050919050565b600061418d602483614b51565b91506141988261516a565b604082019050919050565b60006141b0601983614b51565b91506141bb826151b9565b602082019050919050565b60006141d3601483614b51565b91506141de826151e2565b602082019050919050565b60006141f6601283614b51565b91506142018261520b565b602082019050919050565b6000614219601383614b51565b915061422482615234565b602082019050919050565b600061423c602c83614b51565b91506142478261525d565b604082019050919050565b600061425f603883614b51565b915061426a826152ac565b604082019050919050565b6000614282602a83614b51565b915061428d826152fb565b604082019050919050565b60006142a5602983614b51565b91506142b08261534a565b604082019050919050565b60006142c8602483614b51565b91506142d382615399565b604082019050919050565b60006142eb603183614b51565b91506142f6826153e8565b604082019050919050565b600061430e602083614b51565b915061431982615437565b602082019050919050565b6000614331600783614b62565b915061433c82615460565b600782019050919050565b6000614354602c83614b51565b915061435f82615489565b604082019050919050565b6000614377602c83614b51565b9150614382826154d8565b604082019050919050565b600061439a601383614b51565b91506143a582615527565b602082019050919050565b60006143bd602083614b51565b91506143c882615550565b602082019050919050565b60006143e0602983614b51565b91506143eb82615579565b604082019050919050565b6000614403601683614b51565b915061440e826155c8565b602082019050919050565b6000614426602f83614b51565b9150614431826155f1565b604082019050919050565b6000614449603983614b51565b915061445482615640565b604082019050919050565b600061446c602b83614b51565b91506144778261568f565b604082019050919050565b600061448f602183614b51565b915061449a826156de565b604082019050919050565b60006144b2603183614b51565b91506144bd8261572d565b604082019050919050565b60006144d5602c83614b51565b91506144e08261577c565b604082019050919050565b60006144f8602883614b51565b9150614503826157cb565b604082019050919050565b600061451b600983614b51565b91506145268261581a565b602082019050919050565b61453a81614cfa565b82525050565b61454981614cfa565b82525050565b600061455b828561405a565b915061456682614324565b9150614572828461405a565b915061457d8261415d565b91508190509392505050565b600060208201905061459e6000830184613f6c565b92915050565b60006080820190506145b96000830187613f6c565b6145c66020830186613f6c565b6145d36040830185614540565b81810360608301526145e58184613fe8565b905095945050505050565b6000602082019050818103600083015261460a8184613f7b565b905092915050565b60006020820190506146276000830184613fd9565b92915050565b600060208201905081810360008301526146478184614021565b905092915050565b600060208201905081810360008301526146688161408b565b9050919050565b60006020820190508181036000830152614688816140ae565b9050919050565b600060208201905081810360008301526146a8816140d1565b9050919050565b600060208201905081810360008301526146c8816140f4565b9050919050565b600060208201905081810360008301526146e881614117565b9050919050565b600060208201905081810360008301526147088161413a565b9050919050565b6000602082019050818103600083015261472881614180565b9050919050565b60006020820190508181036000830152614748816141a3565b9050919050565b60006020820190508181036000830152614768816141c6565b9050919050565b60006020820190508181036000830152614788816141e9565b9050919050565b600060208201905081810360008301526147a88161420c565b9050919050565b600060208201905081810360008301526147c88161422f565b9050919050565b600060208201905081810360008301526147e881614252565b9050919050565b6000602082019050818103600083015261480881614275565b9050919050565b6000602082019050818103600083015261482881614298565b9050919050565b60006020820190508181036000830152614848816142bb565b9050919050565b60006020820190508181036000830152614868816142de565b9050919050565b6000602082019050818103600083015261488881614301565b9050919050565b600060208201905081810360008301526148a881614347565b9050919050565b600060208201905081810360008301526148c88161436a565b9050919050565b600060208201905081810360008301526148e88161438d565b9050919050565b60006020820190508181036000830152614908816143b0565b9050919050565b60006020820190508181036000830152614928816143d3565b9050919050565b60006020820190508181036000830152614948816143f6565b9050919050565b6000602082019050818103600083015261496881614419565b9050919050565b600060208201905081810360008301526149888161443c565b9050919050565b600060208201905081810360008301526149a88161445f565b9050919050565b600060208201905081810360008301526149c881614482565b9050919050565b600060208201905081810360008301526149e8816144a5565b9050919050565b60006020820190508181036000830152614a08816144c8565b9050919050565b60006020820190508181036000830152614a28816144eb565b9050919050565b60006020820190508181036000830152614a488161450e565b9050919050565b6000602082019050614a646000830184614540565b92915050565b6000614a74614a85565b9050614a808282614d78565b919050565b6000604051905090565b600067ffffffffffffffff821115614aaa57614aa9614f39565b5b614ab382614f7c565b9050602081019050919050565b600067ffffffffffffffff821115614adb57614ada614f39565b5b614ae482614f7c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7882614cfa565b9150614b8383614cfa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb857614bb7614e4e565b5b828201905092915050565b6000614bce82614cfa565b9150614bd983614cfa565b925082614be957614be8614e7d565b5b828204905092915050565b6000614bff82614cfa565b9150614c0a83614cfa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4357614c42614e4e565b5b828202905092915050565b6000614c5982614cfa565b9150614c6483614cfa565b925082821015614c7757614c76614e4e565b5b828203905092915050565b6000614c8d82614cda565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d31578082015181840152602081019050614d16565b83811115614d40576000848401525b50505050565b60006002820490506001821680614d5e57607f821691505b60208210811415614d7257614d71614eac565b5b50919050565b614d8182614f7c565b810181811067ffffffffffffffff82111715614da057614d9f614f39565b5b80604052505050565b6000614db482614ccc565b915061ffff821415614dc957614dc8614e4e565b5b600182019050919050565b6000614ddf82614cfa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e1257614e11614e4e565b5b600182019050919050565b6000614e2882614cfa565b9150614e3383614cfa565b925082614e4357614e42614e7d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f5072696365206d7573742062652067726561746572207468616e207a65726f00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f45746865722076616c75652073656e7420697320696e636f72726563742e4e6560008201527f656420302e31312045544820466f722050726573616c6520666f72206561636860208201527f20474f4154000000000000000000000000000000000000000000000000000000604082015250565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f636f6c6c656374696f6e20736f6c64206f757400000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f726520676f61747320666f722070726f6d6f60008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265205072652d73616c65206d696e74676f60008201527f61747320666f722070726f6d6f74696f6e000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f746f6b656e732f00000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420616d6f756e742073656e7420757000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e7420697320696e636f72726563742e4e6560008201527f656420302e31352045544820666f72206561636820474f415400000000000000602082015250565b7f43616e206f6e6c79206d696e74206d617820323020746f6b656e73207065722060008201527f7472616e73616374696f6e000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420466f722053616c652043757272656e746c79206f6e20476c6f62616c60008201527f476f6174732e696f000000000000000000000000000000000000000000000000602082015250565b7f4e4f54204f574e45520000000000000000000000000000000000000000000000600082015250565b61584c81614c82565b811461585757600080fd5b50565b61586381614c94565b811461586e57600080fd5b50565b61587a81614ca0565b811461588557600080fd5b50565b61589181614ccc565b811461589c57600080fd5b50565b6158a881614cfa565b81146158b357600080fd5b5056fea2646970667358221220fd32999d72c8307e0c6a4fe1fdfd81dff2852019ba06d5d999183daa1daed40e64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102725760003560e01c806370a082311161014f578063b88d4fde116100c1578063d5646cca1161007a578063d5646cca1461094f578063e985e9c51461097a578063ea21feda146109b7578063eb8d2444146109e2578063f23272be14610a0d578063f2fde38b14610a3657610272565b8063b88d4fde1461083f578063bfb4a2d414610868578063c87b56dd14610893578063c996bb61146108d0578063caf518ab146108fb578063cb1eb1331461092657610272565b8063853828b611610113578063853828b6146107535780638da5cb5b1461076a57806395d89b411461079557806399b9b98f146107c05780639f4e3cb1146107eb578063a22cb4651461081657610272565b806370a082311461066e5780637146bd08146106ab578063715018a6146106d65780637babaeef146106ed5780637dcb4f5e1461071657610272565b806323cf0a22116101e857806342842e0e116101ac57806342842e0e146105385780634ef0708e146105615780634f6ccce71461058c57806350088701146105c95780636352211e146106065780636c4aa99e1461064357610272565b806323cf0a221461044e5780632e1a7d4d1461046a5780632f745c591461049357806330f72cd4146104d057806332da7869146104fb57610272565b8063095ea7b31161023a578063095ea7b31461037057806311b8b92f1461039957806315c4acb9146103b557806318160ddd146103d157806318d272eb146103fc57806323b872dd1461042557610272565b80630106e0ee1461027757806301ffc9a7146102a257806302c88989146102df57806306fdde0314610308578063081812fc14610333575b600080fd5b34801561028357600080fd5b5061028c610a5f565b6040516102999190614a4f565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190613dd7565b610a65565b6040516102d69190614612565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613daa565b610adf565b005b34801561031457600080fd5b5061031d610b78565b60405161032a919061462d565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190613ee7565b610c0a565b6040516103679190614589565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613d6a565b610c8f565b005b6103b360048036038101906103ae9190613ee7565b610da7565b005b6103cf60048036038101906103ca9190613e7a565b6111c1565b005b3480156103dd57600080fd5b506103e6611398565b6040516103f39190614a4f565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190613e31565b6113a5565b005b34801561043157600080fd5b5061044c60048036038101906104479190613c54565b61143b565b005b61046860048036038101906104639190613e7a565b61149b565b005b34801561047657600080fd5b50610491600480360381019061048c9190613ee7565b611643565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190613d6a565b61174c565b6040516104c79190614a4f565b60405180910390f35b3480156104dc57600080fd5b506104e56117f1565b6040516104f29190614612565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d9190613ee7565b611808565b60405161052f9190614612565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190613c54565b6118ae565b005b34801561056d57600080fd5b506105766118ce565b6040516105839190614a4f565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190613ee7565b6118da565b6040516105c09190614a4f565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613ee7565b61194b565b6040516105fd9190614612565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190613ee7565b6119f1565b60405161063a9190614589565b60405180910390f35b34801561064f57600080fd5b50610658611aa3565b6040516106659190614a4f565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613be7565b611aa9565b6040516106a29190614a4f565b60405180910390f35b3480156106b757600080fd5b506106c0611b61565b6040516106cd9190614a4f565b60405180910390f35b3480156106e257600080fd5b506106eb611b66565b005b3480156106f957600080fd5b50610714600480360381019061070f9190613daa565b611bee565b005b34801561072257600080fd5b5061073d60048036038101906107389190613ee7565b611c87565b60405161074a9190614a4f565b60405180910390f35b34801561075f57600080fd5b50610768611d9b565b005b34801561077657600080fd5b5061077f611e60565b60405161078c9190614589565b60405180910390f35b3480156107a157600080fd5b506107aa611e8a565b6040516107b7919061462d565b60405180910390f35b3480156107cc57600080fd5b506107d5611f1c565b6040516107e29190614a4f565b60405180910390f35b3480156107f757600080fd5b50610800611f22565b60405161080d9190614a4f565b60405180910390f35b34801561082257600080fd5b5061083d60048036038101906108389190613d2a565b611f27565b005b34801561084b57600080fd5b5061086660048036038101906108619190613ca7565b6120a8565b005b34801561087457600080fd5b5061087d61210a565b60405161088a91906145f0565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613ee7565b6121c7565b6040516108c7919061462d565b60405180910390f35b3480156108dc57600080fd5b506108e5612249565b6040516108f29190614a4f565b60405180910390f35b34801561090757600080fd5b5061091061224f565b60405161091d9190614a4f565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613f14565b61225b565b005b34801561095b57600080fd5b50610964612394565b6040516109719190614a4f565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c9190613c14565b612399565b6040516109ae9190614612565b60405180910390f35b3480156109c357600080fd5b506109cc61242d565b6040516109d991906145f0565b60405180910390f35b3480156109ee57600080fd5b506109f761259c565b604051610a049190614612565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190613ea7565b6125b3565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190613be7565b612717565b005b61091381565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad85750610ad78261280f565b5b9050919050565b610ae76128f1565b73ffffffffffffffffffffffffffffffffffffffff16610b05611e60565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b52906148ef565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b606060008054610b8790614d46565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb390614d46565b8015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050505050905090565b6000610c15826128f9565b610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b9061488f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9a826119f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d02906149af565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d2a6128f1565b73ffffffffffffffffffffffffffffffffffffffff161480610d595750610d5881610d536128f1565b612399565b5b610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f906147cf565b60405180910390fd5b610da28383612965565b505050565b610db0816128f9565b610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de69061494f565b60405180910390fd5b60003411610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061466f565b60405180910390fd5b610e3b816119f1565b73ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290614a0f565b60405180910390fd5b6000670de0b6b3a764000034610ef19190614bf4565b9050600e600083815260200190815260200160002054811015610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f409061492f565b60405180910390fd5b600060089050600060648234610f5f9190614bf4565b610f699190614bc3565b90506000610f75611e60565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610fbd573d6000803e3d6000fd5b5060006064600234610fcf9190614bf4565b610fd99190614bc3565b90506000610fe6876119f1565b905060008060128054905084610ffc9190614bc3565b9050600060128054905011156110b65760005b6012805490508110156110b457601281815481106110305761102f614f0a565b5b90600052602060002001549250611046836128f9565b156110a1576000611056846119f1565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561109e573d6000803e3d6000fd5b50505b80806110ac90614dd4565b91505061100f565b505b8273ffffffffffffffffffffffffffffffffffffffff166108fc8588346110dd9190614c4e565b6110e79190614c4e565b9081150290604051600060405180830381858888f19350505050158015611112573d6000803e3d6000fd5b5061111e83338b612a1e565b6000600e60008b815260200190815260200160002081905550600060138054905011156111b65760005b6013805490508110156111b4576013818154811061116957611168614f0a565b5b90600052602060002001549250898314156111a1576013818154811061119257611191614f0a565b5b90600052602060002001600090555b80806111ac90614dd4565b915050611148565b505b505050505050505050565b6111c961259c565b611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff9061476f565b60405180910390fd5b60148161ffff161115611250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112479061498f565b60405180910390fd5b61015e61126c8261ffff16600c54612c7a90919063ffffffff16565b11156112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a49061484f565b60405180910390fd5b346112cd8261ffff16670186cc6acd4b0000612c9090919063ffffffff16565b1461130d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611304906146ef565b60405180910390fd5b61091361132e8261ffff16611320611398565b612c7a90919063ffffffff16565b1061136e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611365906148cf565b60405180910390fd5b8061ffff16600c60008282546113849190614b6d565b925050819055506113958133612ca6565b50565b6000600880549050905090565b6113ad6128f1565b73ffffffffffffffffffffffffffffffffffffffff166113cb611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611418906148ef565b60405180910390fd5b80601190805190602001906114379291906139e6565b5050565b61144c6114466128f1565b82612cf4565b61148b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611482906149cf565b60405180910390fd5b611496838383612a1e565b505050565b6114a361259c565b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d99061476f565b60405180910390fd5b60148161ffff16111561152a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115219061498f565b60405180910390fd5b3461154a8261ffff16670214e8348c4f0000612c9090919063ffffffff16565b1461158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115819061496f565b60405180910390fd5b610913611595611398565b106115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061478f565b60405180910390fd5b6109136115f68261ffff166115e8611398565b612c7a90919063ffffffff16565b10611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906148cf565b60405180910390fd5b6116408133612ca6565b50565b61164b6128f1565b73ffffffffffffffffffffffffffffffffffffffff16611669611e60565b73ffffffffffffffffffffffffffffffffffffffff16146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b6906148ef565b60405180910390fd5b47811115611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f99061474f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611748573d6000803e3d6000fd5b5050565b600061175783611aa9565b8210611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f9061464f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601060009054906101000a900460ff16905090565b6000611813826128f9565b611852576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118499061494f565b60405180910390fd5b6000905060005b6012805490508110156118a857826012828154811061187b5761187a614f0a565b5b9060005260206000200154141561189557600191506118a8565b80806118a090614dd4565b915050611859565b50919050565b6118c9838383604051806020016040528060008152506120a8565b505050565b670186cc6acd4b000081565b60006118e4611398565b8210611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c906149ef565b60405180910390fd5b6008828154811061193957611938614f0a565b5b90600052602060002001549050919050565b6000611956826128f9565b611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c9061494f565b60405180910390fd5b6000905060005b6013805490508110156119eb5782601382815481106119be576119bd614f0a565b5b906000526020600020015414156119d857600191506119eb565b80806119e390614dd4565b91505061199c565b50919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a919061480f565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b11906147ef565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601481565b611b6e6128f1565b73ffffffffffffffffffffffffffffffffffffffff16611b8c611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd9906148ef565b60405180910390fd5b611bec6000612dd2565b565b611bf66128f1565b73ffffffffffffffffffffffffffffffffffffffff16611c14611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c61906148ef565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000611c92826128f9565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc89061494f565b60405180910390fd5b611cda826119f1565b73ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190614a0f565b60405180910390fd5b6000600e600084815260200190815260200160002054905080915050919050565b611da36128f1565b73ffffffffffffffffffffffffffffffffffffffff16611dc1611e60565b73ffffffffffffffffffffffffffffffffffffffff1614611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e906148ef565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611e5d573d6000803e3d6000fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e9990614d46565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec590614d46565b8015611f125780601f10611ee757610100808354040283529160200191611f12565b820191906000526020600020905b815481529060010190602001808311611ef557829003601f168201915b5050505050905090565b600c5481565b601981565b611f2f6128f1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f949061472f565b60405180910390fd5b8060056000611faa6128f1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120576128f1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161209c9190614612565b60405180910390a35050565b6120b96120b36128f1565b83612cf4565b6120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149cf565b60405180910390fd5b61210484848484612e98565b50505050565b6060600060128054905067ffffffffffffffff81111561212d5761212c614f39565b5b60405190808252806020026020018201604052801561215b5781602001602082028036833780820191505090505b50905060005b6012805490508110156121bf576012818154811061218257612181614f0a565b5b90600052602060002001548282815181106121a05761219f614f0a565b5b60200260200101818152505080806121b790614dd4565b915050612161565b508091505090565b60606121d2826128f9565b612211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612208906148af565b60405180910390fd5b612219612ef4565b61222283612f86565b60405160200161223392919061454f565b6040516020818303038152906040529050919050565b61015e81565b670214e8348c4f000081565b612264826128f9565b6122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906148af565b60405180910390fd5b6122b46122ae6128f1565b83612cf4565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea906149cf565b60405180910390fd5b80600e600084815260200190815260200160002081905550601382908060018154018082558091505060019003906000526020600020016000909190919091505533600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061239082336130e7565b5050565b606481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600060138054905067ffffffffffffffff8111156124505761244f614f39565b5b60405190808252806020026020018201604052801561247e5781602001602082028036833780820191505090505b509050600080600090505b60138054905081101561259357601381815481106124aa576124a9614f0a565b5b906000526020600020015491506124c0826128f9565b15612580576000600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000612508846119f1565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561257d576013838154811061255257612551614f0a565b5b90600052602060002001548584815181106125705761256f614f0a565b5b6020026020010181815250505b50505b808061258b90614dd4565b915050612489565b50819250505090565b6000600d60009054906101000a900460ff16905090565b6125bb6128f1565b73ffffffffffffffffffffffffffffffffffffffff166125d9611e60565b73ffffffffffffffffffffffffffffffffffffffff161461262f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612626906148ef565b60405180910390fd5b601961264a8361ffff16600b54612c7a90919063ffffffff16565b111561268b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126829061482f565b60405180910390fd5b6109136126ac8361ffff1661269e611398565b612c7a90919063ffffffff16565b106126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e3906148cf565b60405180910390fd5b8161ffff16600b60008282546127029190614b6d565b925050819055506127138282612ca6565b5050565b61271f6128f1565b73ffffffffffffffffffffffffffffffffffffffff1661273d611e60565b73ffffffffffffffffffffffffffffffffffffffff1614612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a906148ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fa906146af565b60405180910390fd5b61280c81612dd2565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128ea57506128e98261316c565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129d8836119f1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff16612a3e826119f1565b73ffffffffffffffffffffffffffffffffffffffff1614612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b9061490f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb9061470f565b60405180910390fd5b612b0f8383836131d6565b612b1a600082612965565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b6a9190614c4e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc19190614b6d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612c889190614b6d565b905092915050565b60008183612c9e9190614bf4565b905092915050565b60005b8261ffff168161ffff161015612cef5760006001612cc5611398565b612ccf9190614b6d565b9050612cdb83826132ea565b508080612ce790614da9565b915050612ca9565b505050565b6000612cff826128f9565b612d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d35906147af565b60405180910390fd5b6000612d49836119f1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612db857508373ffffffffffffffffffffffffffffffffffffffff16612da084610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dc95750612dc88185612399565b5b91505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ea3848484612a1e565b612eaf84848484613308565b612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee59061468f565b60405180910390fd5b50505050565b606060118054612f0390614d46565b80601f0160208091040260200160405190810160405280929190818152602001828054612f2f90614d46565b8015612f7c5780601f10612f5157610100808354040283529160200191612f7c565b820191906000526020600020905b815481529060010190602001808311612f5f57829003601f168201915b5050505050905090565b60606000821415612fce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130e2565b600082905060005b60008214613000578080612fe990614dd4565b915050600a82612ff99190614bc3565b9150612fd6565b60008167ffffffffffffffff81111561301c5761301b614f39565b5b6040519080825280601f01601f19166020018201604052801561304e5781602001600182028036833780820191505090505b5090505b600085146130db576001826130679190614c4e565b9150600a856130769190614e1d565b60306130829190614b6d565b60f81b81838151811061309857613097614f0a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130d49190614bc3565b9450613052565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16613107836119f1565b73ffffffffffffffffffffffffffffffffffffffff161461315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490614a2f565b60405180910390fd5b6131678130612399565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131e183838361349f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132245761321f816134a4565b613263565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132625761326183826134ed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a6576132a18161365a565b6132e5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132e4576132e3828261372b565b5b5b505050565b6133048282604051806020016040528060008152506137aa565b5050565b60006133298473ffffffffffffffffffffffffffffffffffffffff16613805565b15613492578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133526128f1565b8786866040518563ffffffff1660e01b815260040161337494939291906145a4565b602060405180830381600087803b15801561338e57600080fd5b505af19250505080156133bf57506040513d601f19601f820116820180604052508101906133bc9190613e04565b60015b613442573d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b5060008151141561343a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134319061468f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613497565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134fa84611aa9565b6135049190614c4e565b90506000600760008481526020019081526020016000205490508181146135e9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061366e9190614c4e565b905060006009600084815260200190815260200160002054905060006008838154811061369e5761369d614f0a565b5b9060005260206000200154905080600883815481106136c0576136bf614f0a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061370f5761370e614edb565b5b6001900381819060005260206000200160009055905550505050565b600061373683611aa9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6137b48383613818565b6137c16000848484613308565b613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f79061468f565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387f9061486f565b60405180910390fd5b613891816128f9565b156138d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c8906146cf565b60405180910390fd5b6138dd600083836131d6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461392d9190614b6d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546139f290614d46565b90600052602060002090601f016020900481019282613a145760008555613a5b565b82601f10613a2d57805160ff1916838001178555613a5b565b82800160010185558215613a5b579182015b82811115613a5a578251825591602001919060010190613a3f565b5b509050613a689190613a6c565b5090565b5b80821115613a85576000816000905550600101613a6d565b5090565b6000613a9c613a9784614a8f565b614a6a565b905082815260208101848484011115613ab857613ab7614f6d565b5b613ac3848285614d04565b509392505050565b6000613ade613ad984614ac0565b614a6a565b905082815260208101848484011115613afa57613af9614f6d565b5b613b05848285614d04565b509392505050565b600081359050613b1c81615843565b92915050565b600081359050613b318161585a565b92915050565b600081359050613b4681615871565b92915050565b600081519050613b5b81615871565b92915050565b600082601f830112613b7657613b75614f68565b5b8135613b86848260208601613a89565b91505092915050565b600082601f830112613ba457613ba3614f68565b5b8135613bb4848260208601613acb565b91505092915050565b600081359050613bcc81615888565b92915050565b600081359050613be18161589f565b92915050565b600060208284031215613bfd57613bfc614f77565b5b6000613c0b84828501613b0d565b91505092915050565b60008060408385031215613c2b57613c2a614f77565b5b6000613c3985828601613b0d565b9250506020613c4a85828601613b0d565b9150509250929050565b600080600060608486031215613c6d57613c6c614f77565b5b6000613c7b86828701613b0d565b9350506020613c8c86828701613b0d565b9250506040613c9d86828701613bd2565b9150509250925092565b60008060008060808587031215613cc157613cc0614f77565b5b6000613ccf87828801613b0d565b9450506020613ce087828801613b0d565b9350506040613cf187828801613bd2565b925050606085013567ffffffffffffffff811115613d1257613d11614f72565b5b613d1e87828801613b61565b91505092959194509250565b60008060408385031215613d4157613d40614f77565b5b6000613d4f85828601613b0d565b9250506020613d6085828601613b22565b9150509250929050565b60008060408385031215613d8157613d80614f77565b5b6000613d8f85828601613b0d565b9250506020613da085828601613bd2565b9150509250929050565b600060208284031215613dc057613dbf614f77565b5b6000613dce84828501613b22565b91505092915050565b600060208284031215613ded57613dec614f77565b5b6000613dfb84828501613b37565b91505092915050565b600060208284031215613e1a57613e19614f77565b5b6000613e2884828501613b4c565b91505092915050565b600060208284031215613e4757613e46614f77565b5b600082013567ffffffffffffffff811115613e6557613e64614f72565b5b613e7184828501613b8f565b91505092915050565b600060208284031215613e9057613e8f614f77565b5b6000613e9e84828501613bbd565b91505092915050565b60008060408385031215613ebe57613ebd614f77565b5b6000613ecc85828601613bbd565b9250506020613edd85828601613b0d565b9150509250929050565b600060208284031215613efd57613efc614f77565b5b6000613f0b84828501613bd2565b91505092915050565b60008060408385031215613f2b57613f2a614f77565b5b6000613f3985828601613bd2565b9250506020613f4a85828601613bd2565b9150509250929050565b6000613f608383614531565b60208301905092915050565b613f7581614c82565b82525050565b6000613f8682614b01565b613f908185614b2f565b9350613f9b83614af1565b8060005b83811015613fcc578151613fb38882613f54565b9750613fbe83614b22565b925050600181019050613f9f565b5085935050505092915050565b613fe281614c94565b82525050565b6000613ff382614b0c565b613ffd8185614b40565b935061400d818560208601614d13565b61401681614f7c565b840191505092915050565b600061402c82614b17565b6140368185614b51565b9350614046818560208601614d13565b61404f81614f7c565b840191505092915050565b600061406582614b17565b61406f8185614b62565b935061407f818560208601614d13565b80840191505092915050565b6000614098602b83614b51565b91506140a382614f8d565b604082019050919050565b60006140bb601f83614b51565b91506140c682614fdc565b602082019050919050565b60006140de603283614b51565b91506140e982615005565b604082019050919050565b6000614101602683614b51565b915061410c82615054565b604082019050919050565b6000614124601c83614b51565b915061412f826150a3565b602082019050919050565b6000614147604583614b51565b9150614152826150cc565b606082019050919050565b600061416a600e83614b62565b915061417582615141565b600e82019050919050565b600061418d602483614b51565b91506141988261516a565b604082019050919050565b60006141b0601983614b51565b91506141bb826151b9565b602082019050919050565b60006141d3601483614b51565b91506141de826151e2565b602082019050919050565b60006141f6601283614b51565b91506142018261520b565b602082019050919050565b6000614219601383614b51565b915061422482615234565b602082019050919050565b600061423c602c83614b51565b91506142478261525d565b604082019050919050565b600061425f603883614b51565b915061426a826152ac565b604082019050919050565b6000614282602a83614b51565b915061428d826152fb565b604082019050919050565b60006142a5602983614b51565b91506142b08261534a565b604082019050919050565b60006142c8602483614b51565b91506142d382615399565b604082019050919050565b60006142eb603183614b51565b91506142f6826153e8565b604082019050919050565b600061430e602083614b51565b915061431982615437565b602082019050919050565b6000614331600783614b62565b915061433c82615460565b600782019050919050565b6000614354602c83614b51565b915061435f82615489565b604082019050919050565b6000614377602c83614b51565b9150614382826154d8565b604082019050919050565b600061439a601383614b51565b91506143a582615527565b602082019050919050565b60006143bd602083614b51565b91506143c882615550565b602082019050919050565b60006143e0602983614b51565b91506143eb82615579565b604082019050919050565b6000614403601683614b51565b915061440e826155c8565b602082019050919050565b6000614426602f83614b51565b9150614431826155f1565b604082019050919050565b6000614449603983614b51565b915061445482615640565b604082019050919050565b600061446c602b83614b51565b91506144778261568f565b604082019050919050565b600061448f602183614b51565b915061449a826156de565b604082019050919050565b60006144b2603183614b51565b91506144bd8261572d565b604082019050919050565b60006144d5602c83614b51565b91506144e08261577c565b604082019050919050565b60006144f8602883614b51565b9150614503826157cb565b604082019050919050565b600061451b600983614b51565b91506145268261581a565b602082019050919050565b61453a81614cfa565b82525050565b61454981614cfa565b82525050565b600061455b828561405a565b915061456682614324565b9150614572828461405a565b915061457d8261415d565b91508190509392505050565b600060208201905061459e6000830184613f6c565b92915050565b60006080820190506145b96000830187613f6c565b6145c66020830186613f6c565b6145d36040830185614540565b81810360608301526145e58184613fe8565b905095945050505050565b6000602082019050818103600083015261460a8184613f7b565b905092915050565b60006020820190506146276000830184613fd9565b92915050565b600060208201905081810360008301526146478184614021565b905092915050565b600060208201905081810360008301526146688161408b565b9050919050565b60006020820190508181036000830152614688816140ae565b9050919050565b600060208201905081810360008301526146a8816140d1565b9050919050565b600060208201905081810360008301526146c8816140f4565b9050919050565b600060208201905081810360008301526146e881614117565b9050919050565b600060208201905081810360008301526147088161413a565b9050919050565b6000602082019050818103600083015261472881614180565b9050919050565b60006020820190508181036000830152614748816141a3565b9050919050565b60006020820190508181036000830152614768816141c6565b9050919050565b60006020820190508181036000830152614788816141e9565b9050919050565b600060208201905081810360008301526147a88161420c565b9050919050565b600060208201905081810360008301526147c88161422f565b9050919050565b600060208201905081810360008301526147e881614252565b9050919050565b6000602082019050818103600083015261480881614275565b9050919050565b6000602082019050818103600083015261482881614298565b9050919050565b60006020820190508181036000830152614848816142bb565b9050919050565b60006020820190508181036000830152614868816142de565b9050919050565b6000602082019050818103600083015261488881614301565b9050919050565b600060208201905081810360008301526148a881614347565b9050919050565b600060208201905081810360008301526148c88161436a565b9050919050565b600060208201905081810360008301526148e88161438d565b9050919050565b60006020820190508181036000830152614908816143b0565b9050919050565b60006020820190508181036000830152614928816143d3565b9050919050565b60006020820190508181036000830152614948816143f6565b9050919050565b6000602082019050818103600083015261496881614419565b9050919050565b600060208201905081810360008301526149888161443c565b9050919050565b600060208201905081810360008301526149a88161445f565b9050919050565b600060208201905081810360008301526149c881614482565b9050919050565b600060208201905081810360008301526149e8816144a5565b9050919050565b60006020820190508181036000830152614a08816144c8565b9050919050565b60006020820190508181036000830152614a28816144eb565b9050919050565b60006020820190508181036000830152614a488161450e565b9050919050565b6000602082019050614a646000830184614540565b92915050565b6000614a74614a85565b9050614a808282614d78565b919050565b6000604051905090565b600067ffffffffffffffff821115614aaa57614aa9614f39565b5b614ab382614f7c565b9050602081019050919050565b600067ffffffffffffffff821115614adb57614ada614f39565b5b614ae482614f7c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7882614cfa565b9150614b8383614cfa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb857614bb7614e4e565b5b828201905092915050565b6000614bce82614cfa565b9150614bd983614cfa565b925082614be957614be8614e7d565b5b828204905092915050565b6000614bff82614cfa565b9150614c0a83614cfa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4357614c42614e4e565b5b828202905092915050565b6000614c5982614cfa565b9150614c6483614cfa565b925082821015614c7757614c76614e4e565b5b828203905092915050565b6000614c8d82614cda565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d31578082015181840152602081019050614d16565b83811115614d40576000848401525b50505050565b60006002820490506001821680614d5e57607f821691505b60208210811415614d7257614d71614eac565b5b50919050565b614d8182614f7c565b810181811067ffffffffffffffff82111715614da057614d9f614f39565b5b80604052505050565b6000614db482614ccc565b915061ffff821415614dc957614dc8614e4e565b5b600182019050919050565b6000614ddf82614cfa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e1257614e11614e4e565b5b600182019050919050565b6000614e2882614cfa565b9150614e3383614cfa565b925082614e4357614e42614e7d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f5072696365206d7573742062652067726561746572207468616e207a65726f00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f45746865722076616c75652073656e7420697320696e636f72726563742e4e6560008201527f656420302e31312045544820466f722050726573616c6520666f72206561636860208201527f20474f4154000000000000000000000000000000000000000000000000000000604082015250565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f636f6c6c656374696f6e20736f6c64206f757400000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f726520676f61747320666f722070726f6d6f60008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265205072652d73616c65206d696e74676f60008201527f61747320666f722070726f6d6f74696f6e000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f746f6b656e732f00000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420616d6f756e742073656e7420757000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e7420697320696e636f72726563742e4e6560008201527f656420302e31352045544820666f72206561636820474f415400000000000000602082015250565b7f43616e206f6e6c79206d696e74206d617820323020746f6b656e73207065722060008201527f7472616e73616374696f6e000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420466f722053616c652043757272656e746c79206f6e20476c6f62616c60008201527f476f6174732e696f000000000000000000000000000000000000000000000000602082015250565b7f4e4f54204f574e45520000000000000000000000000000000000000000000000600082015250565b61584c81614c82565b811461585757600080fd5b50565b61586381614c94565b811461586e57600080fd5b50565b61587a81614ca0565b811461588557600080fd5b50565b61589181614ccc565b811461589c57600080fd5b50565b6158a881614cfa565b81146158b357600080fd5b5056fea2646970667358221220fd32999d72c8307e0c6a4fe1fdfd81dff2852019ba06d5d999183daa1daed40e64736f6c63430008070033

Deployed Bytecode Sourcemap

48566:10077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48692:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42384:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52228:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9513:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11068:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10591:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56582:1942;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51005:701;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43022:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52448:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11956:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50410:566;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52563:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42691:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52997:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54037:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12366:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49153:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43211:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54457:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9208:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48859:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8939:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48749:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40925:94;;;;;;;;;;;;;:::i;:::-;;52334:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54867:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52754:112;;;;;;;;;;;;;:::i;:::-;;40275:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9681:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48906:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48799:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11360:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12622:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53140:287;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55240:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49008:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49069:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56083:449;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48948:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11726:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53434:593;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52900:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51810:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41174:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48692:48;48736:4;48692:48;:::o;42384:223::-;42485:4;42524:35;42509:50;;;:11;:50;;;;:90;;;;42563:36;42587:11;42563:23;:36::i;:::-;42509:90;42502:97;;42384:223;;;:::o;52228:98::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52312:6:::1;52296:13;;:22;;;;;;;;;;;;;;;;;;52228:98:::0;:::o;9513:99::-;9566:13;9599:5;9592:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9513:99;:::o;11068:220::-;11143:7;11171:16;11179:7;11171;:16::i;:::-;11163:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11256:15;:24;11272:7;11256:24;;;;;;;;;;;;;;;;;;;;;11249:31;;11068:220;;;:::o;10591:411::-;10672:13;10688:23;10703:7;10688:14;:23::i;:::-;10672:39;;10736:5;10730:11;;:2;:11;;;;10722:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;10830:5;10814:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;10839:37;10856:5;10863:12;:10;:12::i;:::-;10839:16;:37::i;:::-;10814:62;10792:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;10973:21;10982:2;10986:7;10973:8;:21::i;:::-;10661:341;10591:411;;:::o;56582:1942::-;56654:16;56662:7;56654;:16::i;:::-;56646:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56753:1;56741:9;:13;56733:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56837:16;56845:7;56837;:16::i;:::-;56809:44;;:15;:24;56825:7;56809:24;;;;;;;;;;;;;;;;;;;;;:44;;;56801:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;56910:22;56948:19;56936:9;:31;;;;:::i;:::-;56910:58;;57007:14;:23;57022:7;57007:23;;;;;;;;;;;;56989:14;:41;;56981:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57074:26;57103:1;57074:30;;57170:16;57224:3;57202:18;57190:9;:30;;;;:::i;:::-;57189:38;;;;:::i;:::-;57170:57;;57248:13;57264:7;:5;:7::i;:::-;57248:23;;57290:5;57282:23;;:33;57306:8;57282:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57368:16;57405:3;57400:1;57388:9;:13;;;;:::i;:::-;57387:21;;;;:::i;:::-;57368:40;;57452:25;57480:16;57488:7;57480;:16::i;:::-;57452:44;;57544:17;57613;57644:11;:18;;;;57633:8;:29;;;;:::i;:::-;57613:49;;57698:1;57677:11;:18;;;;:22;57673:353;;;57721:6;57716:299;57737:11;:18;;;;57733:1;:22;57716:299;;;57793:11;57805:1;57793:14;;;;;;;;:::i;:::-;;;;;;;;;;57781:26;;57830:18;57838:9;57830:7;:18::i;:::-;57826:174;;;57872:20;57895:18;57903:9;57895:7;:18::i;:::-;57872:41;;57944:12;57936:30;;:44;57967:12;57936:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57850:150;57826:174;57757:3;;;;;:::i;:::-;;;;57716:299;;;;57673:353;58085:17;58077:35;;:68;58136:8;58125;58113:9;:20;;;;:::i;:::-;:31;;;;:::i;:::-;58077:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58156:49;58166:17;58185:10;58197:7;58156:9;:49::i;:::-;58242:1;58216:14;:23;58231:7;58216:23;;;;;;;;;;;:27;;;;58279:1;58260:9;:16;;;;:20;58256:261;;;58302:6;58297:209;58318:9;:16;;;;58314:1;:20;58297:209;;;58372:9;58382:1;58372:12;;;;;;;;:::i;:::-;;;;;;;;;;58360:24;;58420:7;58407:9;:20;58403:88;;;58459:9;58469:1;58459:12;;;;;;;;:::i;:::-;;;;;;;;;58452:19;;;58403:88;58336:3;;;;;:::i;:::-;;;;58297:209;;;;58256:261;56635:1889;;;;;;;;56582:1942;:::o;51005:701::-;51083:14;:12;:14::i;:::-;51075:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;48788:2;51139:14;:30;;;;51131:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;49057:3;51236:38;51259:14;51236:38;;:18;;:22;;:38;;;;:::i;:::-;:64;;51228:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;51419:9;51373:42;51400:14;51373:42;;49202:22;51373:26;;:42;;;;:::i;:::-;:55;51365:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;48736:4;51521:33;51539:14;51521:33;;:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:53;51513:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;51631:14;51609:36;;:18;;:36;;;;;;;:::i;:::-;;;;;;;;51658:38;51670:14;51685:10;51658:11;:38::i;:::-;51005:701;:::o;43022:112::-;43082:7;43109:10;:17;;;;43102:24;;43022:112;:::o;52448:107::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52540:7:::1;52525:12;:22;;;;;;;;;;;;:::i;:::-;;52448:107:::0;:::o;11956:339::-;12151:41;12170:12;:10;:12::i;:::-;12184:7;12151:18;:41::i;:::-;12143:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;12259:28;12269:4;12275:2;12279:7;12259:9;:28::i;:::-;11956:339;;;:::o;50410:566::-;50481:14;:12;:14::i;:::-;50473:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;48788:2;50537:14;:30;;;;50529:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;50672:9;50634:34;50653:14;50634:34;;49110:22;50634:18;;:34;;;;:::i;:::-;:47;50626:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;48736:4;50762:13;:11;:13::i;:::-;:33;50754:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48736:4;50838:33;50856:14;50838:33;;:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:53;50830:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50928:38;50940:14;50955:10;50928:11;:38::i;:::-;50410:566;:::o;52563:183::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52645:21:::1;52635:6;:31;;52627:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;52710:10;52702:28;;:36;52731:6;52702:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52563:183:::0;:::o;42691:255::-;42787:7;42823:23;42840:5;42823:16;:23::i;:::-;42815:5;:31;42807:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42912:12;:19;42925:5;42912:19;;;;;;;;;;;;;;;:26;42932:5;42912:26;;;;;;;;;;;;42905:33;;42691:255;;;;:::o;52997:95::-;53044:4;53068:16;;;;;;;;;;;53061:23;;52997:95;:::o;54037:415::-;54093:11;54125:16;54133:7;54125;:16::i;:::-;54117:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54213:5;54204:14;;54234:6;54229:189;54250:11;:18;;;;54246:1;:22;54229:189;;;54326:7;54308:11;54320:1;54308:14;;;;;;;;:::i;:::-;;;;;;;;;;:25;54304:103;;;54363:4;54354:13;;54386:5;;54304:103;54270:3;;;;;:::i;:::-;;;;54229:189;;;;54037:415;;;:::o;12366:185::-;12504:39;12521:4;12527:2;12531:7;12504:39;;;;;;;;;;;;:16;:39::i;:::-;12366:185;;;:::o;49153:71::-;49202:22;49153:71;:::o;43211:232::-;43285:7;43321:30;:28;:30::i;:::-;43313:5;:38;43305:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43418:10;43429:5;43418:17;;;;;;;;:::i;:::-;;;;;;;;;;43411:24;;43211:232;;;:::o;54457:400::-;54517:11;54549:16;54557:7;54549;:16::i;:::-;54541:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54637:5;54628:14;;54658:6;54653:171;54674:9;:16;;;;54670:1;:20;54653:171;;;54732:7;54716:9;54726:1;54716:12;;;;;;;;:::i;:::-;;;;;;;;;;:23;54712:101;;;54769:4;54760:13;;54792:5;;54712:101;54692:3;;;;;:::i;:::-;;;;54653:171;;;;54457:400;;;:::o;9208:238::-;9279:7;9299:13;9315:7;:16;9323:7;9315:16;;;;;;;;;;;;;;;;;;;;;9299:32;;9367:1;9350:19;;:5;:19;;;;9342:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9433:5;9426:12;;;9208:238;;;:::o;48859:38::-;;;;:::o;8939:207::-;9010:7;9055:1;9038:19;;:5;:19;;;;9030:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9122:9;:16;9132:5;9122:16;;;;;;;;;;;;;;;;9115:23;;8939:207;;;:::o;48749:41::-;48788:2;48749:41;:::o;40925:94::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40990:21:::1;41008:1;40990:9;:21::i;:::-;40925:94::o:0;52334:104::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52424:6:::1;52405:16;;:25;;;;;;;;;;;;;;;;;;52334:104:::0;:::o;54867:365::-;54944:7;54972:16;54980:7;54972;:16::i;:::-;54964:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55087:16;55095:7;55087;:16::i;:::-;55059:44;;:15;:24;55075:7;55059:24;;;;;;;;;;;;;;;;;;;;;:44;;;55051:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;55160:13;55176:14;:23;55191:7;55176:23;;;;;;;;;;;;55160:39;;55219:5;55212:12;;;54867:365;;;:::o;52754:112::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52815:10:::1;52807:28;;:51;52836:21;52807:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52754:112::o:0;40275:86::-;40320:7;40347:6;;;;;;;;;;;40340:13;;40275:86;:::o;9681:103::-;9736:13;9769:7;9762:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9681:103;:::o;48906:33::-;;;;:::o;48799:51::-;48848:2;48799:51;:::o;11360:295::-;11475:12;:10;:12::i;:::-;11463:24;;:8;:24;;;;11455:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;11575:8;11530:18;:32;11549:12;:10;:12::i;:::-;11530:32;;;;;;;;;;;;;;;:42;11563:8;11530:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;11628:8;11599:48;;11614:12;:10;:12::i;:::-;11599:48;;;11638:8;11599:48;;;;;;:::i;:::-;;;;;;;;11360:295;;:::o;12622:328::-;12797:41;12816:12;:10;:12::i;:::-;12830:7;12797:18;:41::i;:::-;12789:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;12903:39;12917:4;12923:2;12927:7;12936:5;12903:13;:39::i;:::-;12622:328;;;;:::o;53140:287::-;53186:13;53214:19;53247:11;:18;;;;53236:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53214:52;;53292:6;53287:108;53308:11;:18;;;;53304:1;:22;53287:108;;;53369:11;53381:1;53369:14;;;;;;;;:::i;:::-;;;;;;;;;;53358:5;53364:1;53358:8;;;;;;;;:::i;:::-;;;;;;;:25;;;;;53328:3;;;;;:::i;:::-;;;;53287:108;;;;53414:5;53407:12;;;53140:287;:::o;55240:283::-;55304:13;55338:16;55346:7;55338;:16::i;:::-;55330:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55445:10;:8;:10::i;:::-;55468:27;55476:7;55468:25;:27::i;:::-;55428:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55414:101;;55240:283;;;:::o;49008:52::-;49057:3;49008:52;:::o;49069:63::-;49110:22;49069:63;:::o;56083:449::-;56173:16;56181:7;56173;:16::i;:::-;56165:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56257:41;56276:12;:10;:12::i;:::-;56290:7;56257:18;:41::i;:::-;56249:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56391:10;56365:14;:23;56380:7;56365:23;;;;;;;;;;;:36;;;;56412:9;56427:7;56412:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56473:10;56446:15;:24;56462:7;56446:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;56494:28;56502:7;56511:10;56494:7;:28::i;:::-;56083:449;;:::o;48948:51::-;48996:3;48948:51;:::o;11726:163::-;11822:4;11846:18;:25;11865:5;11846:25;;;;;;;;;;;;;;;:35;11872:8;11846:35;;;;;;;;;;;;;;;;;;;;;;;;;11839:42;;11726:163;;;;:::o;53434:593::-;53492:13;53520:19;53553:9;:16;;;;53542:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53520:50;;53581:15;53614:6;53623:1;53614:10;;53609:386;53630:9;:16;;;;53626:1;:20;53609:386;;;53678:9;53688:1;53678:12;;;;;;;;:::i;:::-;;;;;;;;;;53668:22;;53705:16;53713:7;53705;:16::i;:::-;53701:283;;;53734:24;53761:15;:24;53777:7;53761:24;;;;;;;;;;;;;;;;;;;;;53734:51;;53796:27;53826:16;53834:7;53826;:16::i;:::-;53796:46;;53880:19;53860:39;;:16;:39;;;53856:116;;;53947:9;53957:1;53947:12;;;;;;;;:::i;:::-;;;;;;;;;;53936:5;53942:1;53936:8;;;;;;;;:::i;:::-;;;;;;;:23;;;;;53856:116;53723:261;;53701:283;53648:3;;;;;:::i;:::-;;;;53609:386;;;;54014:5;54007:12;;;;53434:593;:::o;52900:89::-;52944:4;52968:13;;;;;;;;;;;52961:20;;52900:89;:::o;51810:404::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48848:2:::1;51906:43;51934:14;51906:43;;:23;;:27;;:43;;;;:::i;:::-;:69;;51898:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48736:4;52035:33;52053:14;52035:33;;:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:53;52027:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52150:14;52123:41;;:23;;:41;;;;;;;:::i;:::-;;;;;;;;52175:31;52187:14;52202:3;52175:11;:31::i;:::-;51810:404:::0;;:::o;41174:192::-;40505:12;:10;:12::i;:::-;40494:23;;:7;:5;:7::i;:::-;:23;;;40486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41283:1:::1;41263:22;;:8;:22;;;;41255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41339:19;41349:8;41339:9;:19::i;:::-;41174:192:::0;:::o;8575:300::-;8676:4;8724:25;8709:40;;;:11;:40;;;;:105;;;;8781:33;8766:48;;;:11;:48;;;;8709:105;:158;;;;8831:36;8855:11;8831:23;:36::i;:::-;8709:158;8693:174;;8575:300;;;:::o;751:97::-;803:7;830:10;823:17;;751:97;:::o;14460:126::-;14524:4;14576:1;14548:30;;:7;:16;14556:7;14548:16;;;;;;;;;;;;;;;;;;;;;:30;;;;14541:37;;14460:126;;;:::o;18440:174::-;18542:2;18515:15;:24;18531:7;18515:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;18598:7;18594:2;18560:46;;18569:23;18584:7;18569:14;:23::i;:::-;18560:46;;;;;;;;;;;;18440:174;;:::o;17744:578::-;17903:4;17876:31;;:23;17891:7;17876:14;:23::i;:::-;:31;;;17868:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;17986:1;17972:16;;:2;:16;;;;17964:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18042:39;18063:4;18069:2;18073:7;18042:20;:39::i;:::-;18146:29;18163:1;18167:7;18146:8;:29::i;:::-;18207:1;18188:9;:15;18198:4;18188:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;18236:1;18219:9;:13;18229:2;18219:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;18267:2;18248:7;:16;18256:7;18248:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;18306:7;18302:2;18287:27;;18296:4;18287:27;;;;;;;;;;;;17744:578;;;:::o;35200:97::-;35257:7;35288:1;35284;:5;;;;:::i;:::-;35277:12;;35200:97;;;;:::o;35936:::-;35993:7;36024:1;36020;:5;;;;:::i;:::-;36013:12;;35936:97;;;;:::o;55561:289::-;55644:8;55639:204;55662:14;55658:18;;:1;:18;;;55639:204;;;55698:15;55732:1;55716:13;:11;:13::i;:::-;:17;;;;:::i;:::-;55698:35;;55808:23;55818:3;55823:7;55808:9;:23::i;:::-;55683:160;55678:3;;;;;:::i;:::-;;;;55639:204;;;;55561:289;;:::o;14753:347::-;14845:4;14870:16;14878:7;14870;:16::i;:::-;14862:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14946:13;14962:23;14977:7;14962:14;:23::i;:::-;14946:39;;15015:5;15004:16;;:7;:16;;;:51;;;;15048:7;15024:31;;:20;15036:7;15024:11;:20::i;:::-;:31;;;15004:51;:87;;;;15059:32;15076:5;15083:7;15059:16;:32::i;:::-;15004:87;14996:96;;;14753:347;;;;:::o;41374:173::-;41430:16;41449:6;;;;;;;;;;;41430:25;;41475:8;41466:6;;:17;;;;;;;;;;;;;;;;;;41530:8;41499:40;;41520:8;41499:40;;;;;;;;;;;;41419:128;41374:173;:::o;13832:315::-;13989:28;13999:4;14005:2;14009:7;13989:9;:28::i;:::-;14036:48;14059:4;14065:2;14069:7;14078:5;14036:22;:48::i;:::-;14028:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;13832:315;;;;:::o;58534:104::-;58585:13;58618:12;58611:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58534:104;:::o;30736:722::-;30791:13;31021:1;31012:5;:10;31008:53;;;31039:10;;;;;;;;;;;;;;;;;;;;;31008:53;31071:12;31086:5;31071:20;;31102:14;31127:78;31142:1;31134:4;:9;31127:78;;31160:8;;;;;:::i;:::-;;;;31191:2;31183:10;;;;;:::i;:::-;;;31127:78;;;31215:19;31247:6;31237:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31215:39;;31265:154;31281:1;31272:5;:10;31265:154;;31309:1;31299:11;;;;;:::i;:::-;;;31376:2;31368:5;:10;;;;:::i;:::-;31355:2;:24;;;;:::i;:::-;31342:39;;31325:6;31332;31325:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;31405:2;31396:11;;;;;:::i;:::-;;;31265:154;;;31443:6;31429:21;;;;;30736:722;;;;:::o;55860:188::-;55967:10;55946:31;;:17;55954:8;55946:7;:17::i;:::-;:31;;;55938:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56002:38;56019:5;56034:4;56002:16;:38::i;:::-;;55860:188;;:::o;7155:156::-;7239:4;7278:25;7263:40;;;:11;:40;;;;7256:47;;7155:156;;;:::o;44056:589::-;44200:45;44227:4;44233:2;44237:7;44200:26;:45::i;:::-;44278:1;44262:18;;:4;:18;;;44258:187;;;44297:40;44329:7;44297:31;:40::i;:::-;44258:187;;;44367:2;44359:10;;:4;:10;;;44355:90;;44386:47;44419:4;44425:7;44386:32;:47::i;:::-;44355:90;44258:187;44473:1;44459:16;;:2;:16;;;44455:183;;;44492:45;44529:7;44492:36;:45::i;:::-;44455:183;;;44565:4;44559:10;;:2;:10;;;44555:83;;44586:40;44614:2;44618:7;44586:27;:40::i;:::-;44555:83;44455:183;44056:589;;;:::o;15442:110::-;15518:26;15528:2;15532:7;15518:26;;;;;;;;;;;;:9;:26::i;:::-;15442:110;;:::o;19179:797::-;19333:4;19354:15;:2;:13;;;:15::i;:::-;19350:619;;;19406:2;19390:36;;;19427:12;:10;:12::i;:::-;19441:4;19447:7;19456:5;19390:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19386:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19648:1;19631:6;:13;:18;19627:272;;;19674:60;;;;;;;;;;:::i;:::-;;;;;;;;19627:272;19849:6;19843:13;19834:6;19830:2;19826:15;19819:38;19386:528;19522:41;;;19512:51;;;:6;:51;;;;19505:58;;;;;19350:619;19953:4;19946:11;;19179:797;;;;;;;:::o;20548:127::-;;;;:::o;45368:164::-;45472:10;:17;;;;45445:15;:24;45461:7;45445:24;;;;;;;;;;;:44;;;;45500:10;45516:7;45500:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45368:164;:::o;46159:988::-;46425:22;46475:1;46450:22;46467:4;46450:16;:22::i;:::-;:26;;;;:::i;:::-;46425:51;;46487:18;46508:17;:26;46526:7;46508:26;;;;;;;;;;;;46487:47;;46655:14;46641:10;:28;46637:328;;46686:19;46708:12;:18;46721:4;46708:18;;;;;;;;;;;;;;;:34;46727:14;46708:34;;;;;;;;;;;;46686:56;;46792:11;46759:12;:18;46772:4;46759:18;;;;;;;;;;;;;;;:30;46778:10;46759:30;;;;;;;;;;;:44;;;;46909:10;46876:17;:30;46894:11;46876:30;;;;;;;;;;;:43;;;;46671:294;46637:328;47061:17;:26;47079:7;47061:26;;;;;;;;;;;47054:33;;;47105:12;:18;47118:4;47105:18;;;;;;;;;;;;;;;:34;47124:14;47105:34;;;;;;;;;;;47098:41;;;46240:907;;46159:988;;:::o;47442:1079::-;47695:22;47740:1;47720:10;:17;;;;:21;;;;:::i;:::-;47695:46;;47752:18;47773:15;:24;47789:7;47773:24;;;;;;;;;;;;47752:45;;48124:19;48146:10;48157:14;48146:26;;;;;;;;:::i;:::-;;;;;;;;;;48124:48;;48210:11;48185:10;48196;48185:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48321:10;48290:15;:28;48306:11;48290:28;;;;;;;;;;;:41;;;;48462:15;:24;48478:7;48462:24;;;;;;;;;;;48455:31;;;48497:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47513:1008;;;47442:1079;:::o;44946:221::-;45031:14;45048:20;45065:2;45048:16;:20::i;:::-;45031:37;;45106:7;45079:12;:16;45092:2;45079:16;;;;;;;;;;;;;;;:24;45096:6;45079:24;;;;;;;;;;;:34;;;;45153:6;45124:17;:26;45142:7;45124:26;;;;;;;;;;;:35;;;;45020:147;44946:221;;:::o;15779:321::-;15909:18;15915:2;15919:7;15909:5;:18::i;:::-;15960:54;15991:1;15995:2;15999:7;16008:5;15960:22;:54::i;:::-;15938:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;15779:321;;;:::o;21411:385::-;21470:4;21678:12;21744:7;21732:20;21725:27;;21787:1;21780:4;:8;21773:15;;;21411:385;;;:::o;16436:382::-;16530:1;16516:16;;:2;:16;;;;16508:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;16589:16;16597:7;16589;:16::i;:::-;16588:17;16580:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;16651:45;16680:1;16684:2;16688:7;16651:20;:45::i;:::-;16726:1;16709:9;:13;16719:2;16709:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;16757:2;16738:7;:16;16746:7;16738:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;16802:7;16798:2;16777:33;;16794:1;16777:33;;;;;;;;;;;;16436: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:137::-;2177:5;2215:6;2202:20;2193:29;;2231:32;2257:5;2231:32;:::i;:::-;2132:137;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:327::-;6150:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:119;;;6205:79;;:::i;:::-;6167:119;6325:1;6350:52;6394:7;6385:6;6374:9;6370:22;6350:52;:::i;:::-;6340:62;;6296:116;6092:327;;;;:::o;6425:349::-;6494:6;6543:2;6531:9;6522:7;6518:23;6514:32;6511:119;;;6549:79;;:::i;:::-;6511:119;6669:1;6694:63;6749:7;6740:6;6729:9;6725:22;6694:63;:::i;:::-;6684:73;;6640:127;6425:349;;;;:::o;6780:509::-;6849:6;6898:2;6886:9;6877:7;6873:23;6869:32;6866:119;;;6904:79;;:::i;:::-;6866:119;7052:1;7041:9;7037:17;7024:31;7082:18;7074:6;7071:30;7068:117;;;7104:79;;:::i;:::-;7068:117;7209:63;7264:7;7255:6;7244:9;7240:22;7209:63;:::i;:::-;7199:73;;6995:287;6780:509;;;;:::o;7295:327::-;7353:6;7402:2;7390:9;7381:7;7377:23;7373:32;7370:119;;;7408:79;;:::i;:::-;7370:119;7528:1;7553:52;7597:7;7588:6;7577:9;7573:22;7553:52;:::i;:::-;7543:62;;7499:116;7295:327;;;;:::o;7628:472::-;7695:6;7703;7752:2;7740:9;7731:7;7727:23;7723:32;7720:119;;;7758:79;;:::i;:::-;7720:119;7878:1;7903:52;7947:7;7938:6;7927:9;7923:22;7903:52;:::i;:::-;7893:62;;7849:116;8004:2;8030:53;8075:7;8066:6;8055:9;8051:22;8030:53;:::i;:::-;8020:63;;7975:118;7628:472;;;;;:::o;8106:329::-;8165:6;8214:2;8202:9;8193:7;8189:23;8185:32;8182:119;;;8220:79;;:::i;:::-;8182:119;8340:1;8365:53;8410:7;8401:6;8390:9;8386:22;8365:53;:::i;:::-;8355:63;;8311:117;8106:329;;;;:::o;8441:474::-;8509:6;8517;8566:2;8554:9;8545:7;8541:23;8537:32;8534:119;;;8572:79;;:::i;:::-;8534:119;8692:1;8717:53;8762:7;8753:6;8742:9;8738:22;8717:53;:::i;:::-;8707:63;;8663:117;8819:2;8845:53;8890:7;8881:6;8870:9;8866:22;8845:53;:::i;:::-;8835:63;;8790:118;8441:474;;;;;:::o;8921:179::-;8990:10;9011:46;9053:3;9045:6;9011:46;:::i;:::-;9089:4;9084:3;9080:14;9066:28;;8921:179;;;;:::o;9106:118::-;9193:24;9211:5;9193:24;:::i;:::-;9188:3;9181:37;9106:118;;:::o;9260:732::-;9379:3;9408:54;9456:5;9408:54;:::i;:::-;9478:86;9557:6;9552:3;9478:86;:::i;:::-;9471:93;;9588:56;9638:5;9588:56;:::i;:::-;9667:7;9698:1;9683:284;9708:6;9705:1;9702:13;9683:284;;;9784:6;9778:13;9811:63;9870:3;9855:13;9811:63;:::i;:::-;9804:70;;9897:60;9950:6;9897:60;:::i;:::-;9887:70;;9743:224;9730:1;9727;9723:9;9718:14;;9683:284;;;9687:14;9983:3;9976:10;;9384:608;;;9260:732;;;;:::o;9998:109::-;10079:21;10094:5;10079:21;:::i;:::-;10074:3;10067:34;9998:109;;:::o;10113:360::-;10199:3;10227:38;10259:5;10227:38;:::i;:::-;10281:70;10344:6;10339:3;10281:70;:::i;:::-;10274:77;;10360:52;10405:6;10400:3;10393:4;10386:5;10382:16;10360:52;:::i;:::-;10437:29;10459:6;10437:29;:::i;:::-;10432:3;10428:39;10421:46;;10203:270;10113:360;;;;:::o;10479:364::-;10567:3;10595:39;10628:5;10595:39;:::i;:::-;10650:71;10714:6;10709:3;10650:71;:::i;:::-;10643:78;;10730:52;10775:6;10770:3;10763:4;10756:5;10752:16;10730:52;:::i;:::-;10807:29;10829:6;10807:29;:::i;:::-;10802:3;10798:39;10791:46;;10571:272;10479:364;;;;:::o;10849:377::-;10955:3;10983:39;11016:5;10983:39;:::i;:::-;11038:89;11120:6;11115:3;11038:89;:::i;:::-;11031:96;;11136:52;11181:6;11176:3;11169:4;11162:5;11158:16;11136:52;:::i;:::-;11213:6;11208:3;11204:16;11197:23;;10959:267;10849:377;;;;:::o;11232:366::-;11374:3;11395:67;11459:2;11454:3;11395:67;:::i;:::-;11388:74;;11471:93;11560:3;11471:93;:::i;:::-;11589:2;11584:3;11580:12;11573:19;;11232:366;;;:::o;11604:::-;11746:3;11767:67;11831:2;11826:3;11767:67;:::i;:::-;11760:74;;11843:93;11932:3;11843:93;:::i;:::-;11961:2;11956:3;11952:12;11945:19;;11604:366;;;:::o;11976:::-;12118:3;12139:67;12203:2;12198:3;12139:67;:::i;:::-;12132:74;;12215:93;12304:3;12215:93;:::i;:::-;12333:2;12328:3;12324:12;12317:19;;11976:366;;;:::o;12348:::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:::-;12862:3;12883:67;12947:2;12942:3;12883:67;:::i;:::-;12876:74;;12959:93;13048:3;12959:93;:::i;:::-;13077:2;13072:3;13068:12;13061:19;;12720:366;;;:::o;13092:::-;13234:3;13255:67;13319:2;13314:3;13255:67;:::i;:::-;13248:74;;13331:93;13420:3;13331:93;:::i;:::-;13449:2;13444:3;13440:12;13433:19;;13092:366;;;:::o;13464:402::-;13624:3;13645:85;13727:2;13722:3;13645:85;:::i;:::-;13638:92;;13739:93;13828:3;13739:93;:::i;:::-;13857:2;13852:3;13848:12;13841:19;;13464:402;;;:::o;13872:366::-;14014:3;14035:67;14099:2;14094:3;14035:67;:::i;:::-;14028:74;;14111:93;14200:3;14111:93;:::i;:::-;14229:2;14224:3;14220:12;14213:19;;13872:366;;;:::o;14244:::-;14386:3;14407:67;14471:2;14466:3;14407:67;:::i;:::-;14400:74;;14483:93;14572:3;14483:93;:::i;:::-;14601:2;14596:3;14592:12;14585:19;;14244:366;;;:::o;14616:::-;14758:3;14779:67;14843:2;14838:3;14779:67;:::i;:::-;14772:74;;14855:93;14944:3;14855:93;:::i;:::-;14973:2;14968:3;14964:12;14957:19;;14616:366;;;:::o;14988:::-;15130:3;15151:67;15215:2;15210:3;15151:67;:::i;:::-;15144:74;;15227:93;15316:3;15227:93;:::i;:::-;15345:2;15340:3;15336:12;15329:19;;14988:366;;;:::o;15360:::-;15502:3;15523:67;15587:2;15582:3;15523:67;:::i;:::-;15516:74;;15599:93;15688:3;15599:93;:::i;:::-;15717:2;15712:3;15708:12;15701:19;;15360:366;;;:::o;15732:::-;15874:3;15895:67;15959:2;15954:3;15895:67;:::i;:::-;15888:74;;15971:93;16060:3;15971:93;:::i;:::-;16089:2;16084:3;16080:12;16073:19;;15732:366;;;:::o;16104:::-;16246:3;16267:67;16331:2;16326:3;16267:67;:::i;:::-;16260:74;;16343:93;16432:3;16343:93;:::i;:::-;16461:2;16456:3;16452:12;16445:19;;16104:366;;;:::o;16476:::-;16618:3;16639:67;16703:2;16698:3;16639:67;:::i;:::-;16632:74;;16715:93;16804:3;16715:93;:::i;:::-;16833:2;16828:3;16824:12;16817:19;;16476:366;;;:::o;16848:::-;16990:3;17011:67;17075:2;17070:3;17011:67;:::i;:::-;17004:74;;17087:93;17176:3;17087:93;:::i;:::-;17205:2;17200:3;17196:12;17189:19;;16848:366;;;:::o;17220:::-;17362:3;17383:67;17447:2;17442:3;17383:67;:::i;:::-;17376:74;;17459:93;17548:3;17459:93;:::i;:::-;17577:2;17572:3;17568:12;17561:19;;17220:366;;;:::o;17592:::-;17734:3;17755:67;17819:2;17814:3;17755:67;:::i;:::-;17748:74;;17831:93;17920:3;17831:93;:::i;:::-;17949:2;17944:3;17940:12;17933:19;;17592:366;;;:::o;17964:::-;18106:3;18127:67;18191:2;18186:3;18127:67;:::i;:::-;18120:74;;18203:93;18292:3;18203:93;:::i;:::-;18321:2;18316:3;18312:12;18305:19;;17964:366;;;:::o;18336:400::-;18496:3;18517:84;18599:1;18594:3;18517:84;:::i;:::-;18510:91;;18610:93;18699:3;18610:93;:::i;:::-;18728:1;18723:3;18719:11;18712:18;;18336:400;;;:::o;18742:366::-;18884:3;18905:67;18969:2;18964:3;18905:67;:::i;:::-;18898:74;;18981:93;19070:3;18981:93;:::i;:::-;19099:2;19094:3;19090:12;19083:19;;18742:366;;;:::o;19114:::-;19256:3;19277:67;19341:2;19336:3;19277:67;:::i;:::-;19270:74;;19353:93;19442:3;19353:93;:::i;:::-;19471:2;19466:3;19462:12;19455:19;;19114:366;;;:::o;19486:::-;19628:3;19649:67;19713:2;19708:3;19649:67;:::i;:::-;19642:74;;19725:93;19814:3;19725:93;:::i;:::-;19843:2;19838:3;19834:12;19827:19;;19486:366;;;:::o;19858:::-;20000:3;20021:67;20085:2;20080:3;20021:67;:::i;:::-;20014:74;;20097:93;20186:3;20097:93;:::i;:::-;20215:2;20210:3;20206:12;20199:19;;19858:366;;;:::o;20230:::-;20372:3;20393:67;20457:2;20452:3;20393:67;:::i;:::-;20386:74;;20469:93;20558:3;20469:93;:::i;:::-;20587:2;20582:3;20578:12;20571:19;;20230:366;;;:::o;20602:::-;20744:3;20765:67;20829:2;20824:3;20765:67;:::i;:::-;20758:74;;20841:93;20930:3;20841:93;:::i;:::-;20959:2;20954:3;20950:12;20943:19;;20602:366;;;:::o;20974:::-;21116:3;21137:67;21201:2;21196:3;21137:67;:::i;:::-;21130:74;;21213:93;21302:3;21213:93;:::i;:::-;21331:2;21326:3;21322:12;21315:19;;20974:366;;;:::o;21346:::-;21488:3;21509:67;21573:2;21568:3;21509:67;:::i;:::-;21502:74;;21585:93;21674:3;21585:93;:::i;:::-;21703:2;21698:3;21694:12;21687:19;;21346:366;;;:::o;21718:::-;21860:3;21881:67;21945:2;21940:3;21881:67;:::i;:::-;21874:74;;21957:93;22046:3;21957:93;:::i;:::-;22075:2;22070:3;22066:12;22059:19;;21718:366;;;:::o;22090:::-;22232:3;22253:67;22317:2;22312:3;22253:67;:::i;:::-;22246:74;;22329:93;22418:3;22329:93;:::i;:::-;22447:2;22442:3;22438:12;22431:19;;22090:366;;;:::o;22462:::-;22604:3;22625:67;22689:2;22684:3;22625:67;:::i;:::-;22618:74;;22701:93;22790:3;22701:93;:::i;:::-;22819:2;22814:3;22810:12;22803:19;;22462:366;;;:::o;22834:::-;22976:3;22997:67;23061:2;23056:3;22997:67;:::i;:::-;22990:74;;23073:93;23162:3;23073:93;:::i;:::-;23191:2;23186:3;23182:12;23175:19;;22834:366;;;:::o;23206:::-;23348:3;23369:67;23433:2;23428:3;23369:67;:::i;:::-;23362:74;;23445:93;23534:3;23445:93;:::i;:::-;23563:2;23558:3;23554:12;23547:19;;23206:366;;;:::o;23578:365::-;23720:3;23741:66;23805:1;23800:3;23741:66;:::i;:::-;23734:73;;23816:93;23905:3;23816:93;:::i;:::-;23934:2;23929:3;23925:12;23918:19;;23578:365;;;:::o;23949:108::-;24026:24;24044:5;24026:24;:::i;:::-;24021:3;24014:37;23949:108;;:::o;24063:118::-;24150:24;24168:5;24150:24;:::i;:::-;24145:3;24138:37;24063:118;;:::o;24187:967::-;24569:3;24591:95;24682:3;24673:6;24591:95;:::i;:::-;24584:102;;24703:148;24847:3;24703:148;:::i;:::-;24696:155;;24868:95;24959:3;24950:6;24868:95;:::i;:::-;24861:102;;24980:148;25124:3;24980:148;:::i;:::-;24973:155;;25145:3;25138:10;;24187:967;;;;;:::o;25160:222::-;25253:4;25291:2;25280:9;25276:18;25268:26;;25304:71;25372:1;25361:9;25357:17;25348:6;25304:71;:::i;:::-;25160:222;;;;:::o;25388:640::-;25583:4;25621:3;25610:9;25606:19;25598:27;;25635:71;25703:1;25692:9;25688:17;25679:6;25635:71;:::i;:::-;25716:72;25784:2;25773:9;25769:18;25760:6;25716:72;:::i;:::-;25798;25866:2;25855:9;25851:18;25842:6;25798:72;:::i;:::-;25917:9;25911:4;25907:20;25902:2;25891:9;25887:18;25880:48;25945:76;26016:4;26007:6;25945:76;:::i;:::-;25937:84;;25388:640;;;;;;;:::o;26034:373::-;26177:4;26215:2;26204:9;26200:18;26192:26;;26264:9;26258:4;26254:20;26250:1;26239:9;26235:17;26228:47;26292:108;26395:4;26386:6;26292:108;:::i;:::-;26284:116;;26034:373;;;;:::o;26413:210::-;26500:4;26538:2;26527:9;26523:18;26515:26;;26551:65;26613:1;26602:9;26598:17;26589:6;26551:65;:::i;:::-;26413:210;;;;:::o;26629:313::-;26742:4;26780:2;26769:9;26765:18;26757:26;;26829:9;26823:4;26819:20;26815:1;26804:9;26800:17;26793:47;26857:78;26930:4;26921:6;26857:78;:::i;:::-;26849:86;;26629:313;;;;:::o;26948:419::-;27114:4;27152:2;27141:9;27137:18;27129:26;;27201:9;27195:4;27191:20;27187:1;27176:9;27172:17;27165:47;27229:131;27355:4;27229:131;:::i;:::-;27221:139;;26948:419;;;:::o;27373:::-;27539:4;27577:2;27566:9;27562:18;27554:26;;27626:9;27620:4;27616:20;27612:1;27601:9;27597:17;27590:47;27654:131;27780:4;27654:131;:::i;:::-;27646:139;;27373:419;;;:::o;27798:::-;27964:4;28002:2;27991:9;27987:18;27979:26;;28051:9;28045:4;28041:20;28037:1;28026:9;28022:17;28015:47;28079:131;28205:4;28079:131;:::i;:::-;28071:139;;27798:419;;;:::o;28223:::-;28389:4;28427:2;28416:9;28412:18;28404:26;;28476:9;28470:4;28466:20;28462:1;28451:9;28447:17;28440:47;28504:131;28630:4;28504:131;:::i;:::-;28496:139;;28223:419;;;:::o;28648:::-;28814:4;28852:2;28841:9;28837:18;28829:26;;28901:9;28895:4;28891:20;28887:1;28876:9;28872:17;28865:47;28929:131;29055:4;28929:131;:::i;:::-;28921:139;;28648:419;;;:::o;29073:::-;29239:4;29277:2;29266:9;29262:18;29254:26;;29326:9;29320:4;29316:20;29312:1;29301:9;29297:17;29290:47;29354:131;29480:4;29354:131;:::i;:::-;29346:139;;29073:419;;;:::o;29498:::-;29664:4;29702:2;29691:9;29687:18;29679:26;;29751:9;29745:4;29741:20;29737:1;29726:9;29722:17;29715:47;29779:131;29905:4;29779:131;:::i;:::-;29771:139;;29498:419;;;:::o;29923:::-;30089:4;30127:2;30116:9;30112:18;30104:26;;30176:9;30170:4;30166:20;30162:1;30151:9;30147:17;30140:47;30204:131;30330:4;30204:131;:::i;:::-;30196:139;;29923:419;;;:::o;30348:::-;30514:4;30552:2;30541:9;30537:18;30529:26;;30601:9;30595:4;30591:20;30587:1;30576:9;30572:17;30565:47;30629:131;30755:4;30629:131;:::i;:::-;30621:139;;30348:419;;;:::o;30773:::-;30939:4;30977:2;30966:9;30962:18;30954:26;;31026:9;31020:4;31016:20;31012:1;31001:9;30997:17;30990:47;31054:131;31180:4;31054:131;:::i;:::-;31046:139;;30773:419;;;:::o;31198:::-;31364:4;31402:2;31391:9;31387:18;31379:26;;31451:9;31445:4;31441:20;31437:1;31426:9;31422:17;31415:47;31479:131;31605:4;31479:131;:::i;:::-;31471:139;;31198:419;;;:::o;31623:::-;31789:4;31827:2;31816:9;31812:18;31804:26;;31876:9;31870:4;31866:20;31862:1;31851:9;31847:17;31840:47;31904:131;32030:4;31904:131;:::i;:::-;31896:139;;31623:419;;;:::o;32048:::-;32214:4;32252:2;32241:9;32237:18;32229:26;;32301:9;32295:4;32291:20;32287:1;32276:9;32272:17;32265:47;32329:131;32455:4;32329:131;:::i;:::-;32321:139;;32048:419;;;:::o;32473:::-;32639:4;32677:2;32666:9;32662:18;32654:26;;32726:9;32720:4;32716:20;32712:1;32701:9;32697:17;32690:47;32754:131;32880:4;32754:131;:::i;:::-;32746:139;;32473:419;;;:::o;32898:::-;33064:4;33102:2;33091:9;33087:18;33079:26;;33151:9;33145:4;33141:20;33137:1;33126:9;33122:17;33115:47;33179:131;33305:4;33179:131;:::i;:::-;33171:139;;32898:419;;;:::o;33323:::-;33489:4;33527:2;33516:9;33512:18;33504:26;;33576:9;33570:4;33566:20;33562:1;33551:9;33547:17;33540:47;33604:131;33730:4;33604:131;:::i;:::-;33596:139;;33323:419;;;:::o;33748:::-;33914:4;33952:2;33941:9;33937:18;33929:26;;34001:9;33995:4;33991:20;33987:1;33976:9;33972:17;33965:47;34029:131;34155:4;34029:131;:::i;:::-;34021:139;;33748:419;;;:::o;34173:::-;34339:4;34377:2;34366:9;34362:18;34354:26;;34426:9;34420:4;34416:20;34412:1;34401:9;34397:17;34390:47;34454:131;34580:4;34454:131;:::i;:::-;34446:139;;34173:419;;;:::o;34598:::-;34764:4;34802:2;34791:9;34787:18;34779:26;;34851:9;34845:4;34841:20;34837:1;34826:9;34822:17;34815:47;34879:131;35005:4;34879:131;:::i;:::-;34871:139;;34598:419;;;:::o;35023:::-;35189:4;35227:2;35216:9;35212:18;35204:26;;35276:9;35270:4;35266:20;35262:1;35251:9;35247:17;35240:47;35304:131;35430:4;35304:131;:::i;:::-;35296:139;;35023:419;;;:::o;35448:::-;35614:4;35652:2;35641:9;35637:18;35629:26;;35701:9;35695:4;35691:20;35687:1;35676:9;35672:17;35665:47;35729:131;35855:4;35729:131;:::i;:::-;35721:139;;35448:419;;;:::o;35873:::-;36039:4;36077:2;36066:9;36062:18;36054:26;;36126:9;36120:4;36116:20;36112:1;36101:9;36097:17;36090:47;36154:131;36280:4;36154:131;:::i;:::-;36146:139;;35873:419;;;:::o;36298:::-;36464:4;36502:2;36491:9;36487:18;36479:26;;36551:9;36545:4;36541:20;36537:1;36526:9;36522:17;36515:47;36579:131;36705:4;36579:131;:::i;:::-;36571:139;;36298:419;;;:::o;36723:::-;36889:4;36927:2;36916:9;36912:18;36904:26;;36976:9;36970:4;36966:20;36962:1;36951:9;36947:17;36940:47;37004:131;37130:4;37004:131;:::i;:::-;36996:139;;36723:419;;;:::o;37148:::-;37314:4;37352:2;37341:9;37337:18;37329:26;;37401:9;37395:4;37391:20;37387:1;37376:9;37372:17;37365:47;37429:131;37555:4;37429:131;:::i;:::-;37421:139;;37148:419;;;:::o;37573:::-;37739:4;37777:2;37766:9;37762:18;37754:26;;37826:9;37820:4;37816:20;37812:1;37801:9;37797:17;37790:47;37854:131;37980:4;37854:131;:::i;:::-;37846:139;;37573:419;;;:::o;37998:::-;38164:4;38202:2;38191:9;38187:18;38179:26;;38251:9;38245:4;38241:20;38237:1;38226:9;38222:17;38215:47;38279:131;38405:4;38279:131;:::i;:::-;38271:139;;37998:419;;;:::o;38423:::-;38589:4;38627:2;38616:9;38612:18;38604:26;;38676:9;38670:4;38666:20;38662:1;38651:9;38647:17;38640:47;38704:131;38830:4;38704:131;:::i;:::-;38696:139;;38423:419;;;:::o;38848:::-;39014:4;39052:2;39041:9;39037:18;39029:26;;39101:9;39095:4;39091:20;39087:1;39076:9;39072:17;39065:47;39129:131;39255:4;39129:131;:::i;:::-;39121:139;;38848:419;;;:::o;39273:::-;39439:4;39477:2;39466:9;39462:18;39454:26;;39526:9;39520:4;39516:20;39512:1;39501:9;39497:17;39490:47;39554:131;39680:4;39554:131;:::i;:::-;39546:139;;39273:419;;;:::o;39698:::-;39864:4;39902:2;39891:9;39887:18;39879:26;;39951:9;39945:4;39941:20;39937:1;39926:9;39922:17;39915:47;39979:131;40105:4;39979:131;:::i;:::-;39971:139;;39698:419;;;:::o;40123:::-;40289:4;40327:2;40316:9;40312:18;40304:26;;40376:9;40370:4;40366:20;40362:1;40351:9;40347:17;40340:47;40404:131;40530:4;40404:131;:::i;:::-;40396:139;;40123:419;;;:::o;40548:222::-;40641:4;40679:2;40668:9;40664:18;40656:26;;40692:71;40760:1;40749:9;40745:17;40736:6;40692:71;:::i;:::-;40548:222;;;;:::o;40776:129::-;40810:6;40837:20;;:::i;:::-;40827:30;;40866:33;40894:4;40886:6;40866:33;:::i;:::-;40776:129;;;:::o;40911:75::-;40944:6;40977:2;40971:9;40961:19;;40911:75;:::o;40992:307::-;41053:4;41143:18;41135:6;41132:30;41129:56;;;41165:18;;:::i;:::-;41129:56;41203:29;41225:6;41203:29;:::i;:::-;41195:37;;41287:4;41281;41277:15;41269:23;;40992:307;;;:::o;41305:308::-;41367:4;41457:18;41449:6;41446:30;41443:56;;;41479:18;;:::i;:::-;41443:56;41517:29;41539:6;41517:29;:::i;:::-;41509:37;;41601:4;41595;41591:15;41583:23;;41305:308;;;:::o;41619:132::-;41686:4;41709:3;41701:11;;41739:4;41734:3;41730:14;41722:22;;41619:132;;;:::o;41757:114::-;41824:6;41858:5;41852:12;41842:22;;41757:114;;;:::o;41877:98::-;41928:6;41962:5;41956:12;41946:22;;41877:98;;;:::o;41981:99::-;42033:6;42067:5;42061:12;42051:22;;41981:99;;;:::o;42086:113::-;42156:4;42188;42183:3;42179:14;42171:22;;42086:113;;;:::o;42205:184::-;42304:11;42338:6;42333:3;42326:19;42378:4;42373:3;42369:14;42354:29;;42205:184;;;;:::o;42395:168::-;42478:11;42512:6;42507:3;42500:19;42552:4;42547:3;42543:14;42528:29;;42395:168;;;;:::o;42569:169::-;42653:11;42687:6;42682:3;42675:19;42727:4;42722:3;42718:14;42703:29;;42569:169;;;;:::o;42744:148::-;42846:11;42883:3;42868:18;;42744:148;;;;:::o;42898:305::-;42938:3;42957:20;42975:1;42957:20;:::i;:::-;42952:25;;42991:20;43009:1;42991:20;:::i;:::-;42986:25;;43145:1;43077:66;43073:74;43070:1;43067:81;43064:107;;;43151:18;;:::i;:::-;43064:107;43195:1;43192;43188:9;43181:16;;42898:305;;;;:::o;43209:185::-;43249:1;43266:20;43284:1;43266:20;:::i;:::-;43261:25;;43300:20;43318:1;43300:20;:::i;:::-;43295:25;;43339:1;43329:35;;43344:18;;:::i;:::-;43329:35;43386:1;43383;43379:9;43374:14;;43209:185;;;;:::o;43400:348::-;43440:7;43463:20;43481:1;43463:20;:::i;:::-;43458:25;;43497:20;43515:1;43497:20;:::i;:::-;43492:25;;43685:1;43617:66;43613:74;43610:1;43607:81;43602:1;43595:9;43588:17;43584:105;43581:131;;;43692:18;;:::i;:::-;43581:131;43740:1;43737;43733:9;43722:20;;43400:348;;;;:::o;43754:191::-;43794:4;43814:20;43832:1;43814:20;:::i;:::-;43809:25;;43848:20;43866:1;43848:20;:::i;:::-;43843:25;;43887:1;43884;43881:8;43878:34;;;43892:18;;:::i;:::-;43878:34;43937:1;43934;43930:9;43922:17;;43754:191;;;;:::o;43951:96::-;43988:7;44017:24;44035:5;44017:24;:::i;:::-;44006:35;;43951:96;;;:::o;44053:90::-;44087:7;44130:5;44123:13;44116:21;44105:32;;44053:90;;;:::o;44149:149::-;44185:7;44225:66;44218:5;44214:78;44203:89;;44149:149;;;:::o;44304:89::-;44340:7;44380:6;44373:5;44369:18;44358:29;;44304:89;;;:::o;44399:126::-;44436:7;44476:42;44469:5;44465:54;44454:65;;44399:126;;;:::o;44531:77::-;44568:7;44597:5;44586:16;;44531:77;;;:::o;44614:154::-;44698:6;44693:3;44688;44675:30;44760:1;44751:6;44746:3;44742:16;44735:27;44614:154;;;:::o;44774:307::-;44842:1;44852:113;44866:6;44863:1;44860:13;44852:113;;;44951:1;44946:3;44942:11;44936:18;44932:1;44927:3;44923:11;44916:39;44888:2;44885:1;44881:10;44876:15;;44852:113;;;44983:6;44980:1;44977:13;44974:101;;;45063:1;45054:6;45049:3;45045:16;45038:27;44974:101;44823:258;44774:307;;;:::o;45087:320::-;45131:6;45168:1;45162:4;45158:12;45148:22;;45215:1;45209:4;45205:12;45236:18;45226:81;;45292:4;45284:6;45280:17;45270:27;;45226:81;45354:2;45346:6;45343:14;45323:18;45320:38;45317:84;;;45373:18;;:::i;:::-;45317:84;45138:269;45087:320;;;:::o;45413:281::-;45496:27;45518:4;45496:27;:::i;:::-;45488:6;45484:40;45626:6;45614:10;45611:22;45590:18;45578:10;45575:34;45572:62;45569:88;;;45637:18;;:::i;:::-;45569:88;45677:10;45673:2;45666:22;45456:238;45413:281;;:::o;45700:171::-;45738:3;45761:23;45778:5;45761:23;:::i;:::-;45752:32;;45806:6;45799:5;45796:17;45793:43;;;45816:18;;:::i;:::-;45793:43;45863:1;45856:5;45852:13;45845:20;;45700:171;;;:::o;45877:233::-;45916:3;45939:24;45957:5;45939:24;:::i;:::-;45930:33;;45985:66;45978:5;45975:77;45972:103;;;46055:18;;:::i;:::-;45972:103;46102:1;46095:5;46091:13;46084:20;;45877:233;;;:::o;46116:176::-;46148:1;46165:20;46183:1;46165:20;:::i;:::-;46160:25;;46199:20;46217:1;46199:20;:::i;:::-;46194:25;;46238:1;46228:35;;46243:18;;:::i;:::-;46228:35;46284:1;46281;46277:9;46272:14;;46116:176;;;;:::o;46298:180::-;46346:77;46343:1;46336:88;46443:4;46440:1;46433:15;46467:4;46464:1;46457:15;46484:180;46532:77;46529:1;46522:88;46629:4;46626:1;46619:15;46653:4;46650:1;46643:15;46670:180;46718:77;46715:1;46708:88;46815:4;46812:1;46805:15;46839:4;46836:1;46829:15;46856:180;46904:77;46901:1;46894:88;47001:4;46998:1;46991:15;47025:4;47022:1;47015:15;47042:180;47090:77;47087:1;47080:88;47187:4;47184:1;47177:15;47211:4;47208:1;47201:15;47228:180;47276:77;47273:1;47266:88;47373:4;47370:1;47363:15;47397:4;47394:1;47387:15;47414:117;47523:1;47520;47513:12;47537:117;47646:1;47643;47636:12;47660:117;47769:1;47766;47759:12;47783:117;47892:1;47889;47882:12;47906:102;47947:6;47998:2;47994:7;47989:2;47982:5;47978:14;47974:28;47964:38;;47906:102;;;:::o;48014:230::-;48154:34;48150:1;48142:6;48138:14;48131:58;48223:13;48218:2;48210:6;48206:15;48199:38;48014:230;:::o;48250:181::-;48390:33;48386:1;48378:6;48374:14;48367:57;48250:181;:::o;48437:237::-;48577:34;48573:1;48565:6;48561:14;48554:58;48646:20;48641:2;48633:6;48629:15;48622:45;48437:237;:::o;48680:225::-;48820:34;48816:1;48808:6;48804:14;48797:58;48889:8;48884:2;48876:6;48872:15;48865:33;48680:225;:::o;48911:178::-;49051:30;49047:1;49039:6;49035:14;49028:54;48911:178;:::o;49095:293::-;49235:34;49231:1;49223:6;49219:14;49212:58;49304:34;49299:2;49291:6;49287:15;49280:59;49373:7;49368:2;49360:6;49356:15;49349:32;49095:293;:::o;49394:164::-;49534:16;49530:1;49522:6;49518:14;49511:40;49394:164;:::o;49564:223::-;49704:34;49700:1;49692:6;49688:14;49681:58;49773:6;49768:2;49760:6;49756:15;49749:31;49564:223;:::o;49793:175::-;49933:27;49929:1;49921:6;49917:14;49910:51;49793:175;:::o;49974:170::-;50114:22;50110:1;50102:6;50098:14;50091:46;49974:170;:::o;50150:168::-;50290:20;50286:1;50278:6;50274:14;50267:44;50150:168;:::o;50324:169::-;50464:21;50460:1;50452:6;50448:14;50441:45;50324:169;:::o;50499:231::-;50639:34;50635:1;50627:6;50623:14;50616:58;50708:14;50703:2;50695:6;50691:15;50684:39;50499:231;:::o;50736:243::-;50876:34;50872:1;50864:6;50860:14;50853:58;50945:26;50940:2;50932:6;50928:15;50921:51;50736:243;:::o;50985:229::-;51125:34;51121:1;51113:6;51109:14;51102:58;51194:12;51189:2;51181:6;51177:15;51170:37;50985:229;:::o;51220:228::-;51360:34;51356:1;51348:6;51344:14;51337:58;51429:11;51424:2;51416:6;51412:15;51405:36;51220:228;:::o;51454:223::-;51594:34;51590:1;51582:6;51578:14;51571:58;51663:6;51658:2;51650:6;51646:15;51639:31;51454:223;:::o;51683:236::-;51823:34;51819:1;51811:6;51807:14;51800:58;51892:19;51887:2;51879:6;51875:15;51868:44;51683:236;:::o;51925:182::-;52065:34;52061:1;52053:6;52049:14;52042:58;51925:182;:::o;52113:157::-;52253:9;52249:1;52241:6;52237:14;52230:33;52113:157;:::o;52276:231::-;52416:34;52412:1;52404:6;52400:14;52393:58;52485:14;52480:2;52472:6;52468:15;52461:39;52276:231;:::o;52513:::-;52653:34;52649:1;52641:6;52637:14;52630:58;52722:14;52717:2;52709:6;52705:15;52698:39;52513:231;:::o;52750:169::-;52890:21;52886:1;52878:6;52874:14;52867:45;52750:169;:::o;52925:182::-;53065:34;53061:1;53053:6;53049:14;53042:58;52925:182;:::o;53113:228::-;53253:34;53249:1;53241:6;53237:14;53230:58;53322:11;53317:2;53309:6;53305:15;53298:36;53113:228;:::o;53347:172::-;53487:24;53483:1;53475:6;53471:14;53464:48;53347:172;:::o;53525:234::-;53665:34;53661:1;53653:6;53649:14;53642:58;53734:17;53729:2;53721:6;53717:15;53710:42;53525:234;:::o;53765:244::-;53905:34;53901:1;53893:6;53889:14;53882:58;53974:27;53969:2;53961:6;53957:15;53950:52;53765:244;:::o;54015:230::-;54155:34;54151:1;54143:6;54139:14;54132:58;54224:13;54219:2;54211:6;54207:15;54200:38;54015:230;:::o;54251:220::-;54391:34;54387:1;54379:6;54375:14;54368:58;54460:3;54455:2;54447:6;54443:15;54436:28;54251:220;:::o;54477:236::-;54617:34;54613:1;54605:6;54601:14;54594:58;54686:19;54681:2;54673:6;54669:15;54662:44;54477:236;:::o;54719:231::-;54859:34;54855:1;54847:6;54843:14;54836:58;54928:14;54923:2;54915:6;54911:15;54904:39;54719:231;:::o;54956:227::-;55096:34;55092:1;55084:6;55080:14;55073:58;55165:10;55160:2;55152:6;55148:15;55141:35;54956:227;:::o;55189:159::-;55329:11;55325:1;55317:6;55313:14;55306:35;55189:159;:::o;55354:122::-;55427:24;55445:5;55427:24;:::i;:::-;55420:5;55417:35;55407:63;;55466:1;55463;55456:12;55407:63;55354:122;:::o;55482:116::-;55552:21;55567:5;55552:21;:::i;:::-;55545:5;55542:32;55532:60;;55588:1;55585;55578:12;55532:60;55482:116;:::o;55604:120::-;55676:23;55693:5;55676:23;:::i;:::-;55669:5;55666:34;55656:62;;55714:1;55711;55704:12;55656:62;55604:120;:::o;55730:::-;55802:23;55819:5;55802:23;:::i;:::-;55795:5;55792:34;55782:62;;55840:1;55837;55830:12;55782:62;55730:120;:::o;55856:122::-;55929:24;55947:5;55929:24;:::i;:::-;55922:5;55919:35;55909:63;;55968:1;55965;55958:12;55909:63;55856:122;:::o

Swarm Source

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