ETH Price: $3,488.45 (+0.96%)

Token

Wicked Hounds (WKDHND)
 

Overview

Max Total Supply

11,111 WKDHND

Holders

4,197

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 WKDHND
0x82d8a9cd75bc994fc28e2241002b069e836f19b1
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

11,111 Skeletal Hounds living on the Ethereum blockchain as ERC-721 Non-Fungible Tokens. > - [Click to View Wicked Apes](https://opensea.io/collection/wicked-ape-bone-club) > - [Click to View Wicked Monsters](https://opensea.io/collection/wicked-monsters) [CLICK FOR SALES BOT](https://twitter.com/WickedBoneBot) | [CLICK FOR TWITTER](https://twitter.com/wickedboneclub)

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WickedHounds

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/utils/structs/[email protected]
pragma solidity ^0.8.0;

/**
 * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
 * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
 */
library BitMaps {
    struct BitMap {
        mapping(uint256 => uint256) _data;
    }

    /**
     * @dev Returns whether the bit at `index` is set.
     */
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }

    /**
     * @dev Sets the bit at `index` to the boolean `value`.
     */
    function setTo(
        BitMap storage bitmap,
        uint256 index,
        bool value
    ) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }

    /**
     * @dev Sets the bit at `index`.
     */
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] |= mask;
    }

    /**
     * @dev Unsets the bit at `index`.
     */
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/WickedHounds.sol
pragma solidity ^0.8.0;








contract WickedHounds is Ownable, ERC721Enumerable {
    // Libraries
    using Counters for Counters.Counter;
    using Strings for uint256;

    // Private fields
    Counters.Counter private _tokenIds;
    string private ipfsUri = "https://ipfs.io/ipfs/";

    // Public constants
    uint256 public constant BUYABLE_SUPPLY = 1000;

    address public constant WICKED_APES =
        0xbe6e3669464E7dB1e1528212F0BfF5039461CB82;

    // Public fields
    bool public open = false;

    bool public openFree = false;

    string public folder = "";

    string public provenance = "";

    string public provenanceURI = "";

    bool public locked = false;

    uint256 public mintPrice = 0.125 ether;

    uint256 public mintAmount = 3;

    uint256 public bought = 0;

    string public baseURI = "";

    mapping(uint256 => bool) public seen;

    modifier notLocked() {
        require(!locked, "Contract has been locked");
        _;
    }

    constructor() ERC721("Wicked Hounds", "WKDHND") {
        baseURI = "https://us-central1-wicked-apes.cloudfunctions.net/app/v1/hounds/";
        ownerMint(111);
    }

    // Public methods
    function mint(uint256 quantity) public payable {
        require(open, "Drop not open yet");
        require(quantity > 0, "Quantity must be at least 1");

        // Limit buys
        if (quantity > mintAmount) {
            quantity = mintAmount;
        }

        // Limit buys that exceed BUYABLE_SUPPLY
        if (quantity + bought > BUYABLE_SUPPLY) {
            quantity = BUYABLE_SUPPLY - bought;
        }

        uint256 price = getPrice(quantity);

        // Ensure enough ETH
        require(msg.value >= price, "Not enough ETH sent");

        for (uint256 i = 0; i < quantity; i++) {
            _mintInternal(msg.sender);
            bought += 1;
        }

        // Return any remaining ether after the buy
        uint256 remaining = msg.value - price;

        if (remaining > 0) {
            (bool success, ) = msg.sender.call{value: remaining}("");
            require(success);
        }
    }

    function mintFree() public {
        require(openFree, "Drop not open yet");
        ERC721Enumerable apes = ERC721Enumerable(WICKED_APES);
        uint256 numApes = apes.balanceOf(msg.sender);
        for (uint256 i = 0; i < numApes; i++) {
            uint256 apeId = apes.tokenOfOwnerByIndex(msg.sender, i);
            if (seen[apeId]) {
                continue;
            }
            seen[apeId] = true;
            _mintInternal(msg.sender);
        }
    }

    function freeMints(address owner) external view returns (uint256) {
        uint256 total = 0;
        ERC721Enumerable apes = ERC721Enumerable(WICKED_APES);
        uint256 numApes = apes.balanceOf(owner);
        for (uint256 i = 0; i < numApes; i++) {
            uint256 apeId = apes.tokenOfOwnerByIndex(owner, i);
            if (seen[apeId]) {
                continue;
            }
            total += 1;
        }
        return total;
    }

    function getQuantityFromValue(uint256 value) public view returns (uint256) {
        return value / mintPrice;
    }

    function getPrice(uint256 quantity) public view returns (uint256) {
        require(quantity <= BUYABLE_SUPPLY);
        return quantity * (mintPrice);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            tokenId > 0 && tokenId <= totalSupply(),
            "URI query for nonexistent token"
        );
        if (bytes(folder).length > 0) {
            return
                string(
                    abi.encodePacked(ipfsUri, folder, "/", tokenId.toString())
                );
        }
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }

    // Admin methods
    function ownerMint(uint256 quantity) public onlyOwner {
        for (uint256 i = 0; i < quantity; i++) {
            _mintInternal(msg.sender);
        }
    }

    function setMintAmount(uint256 amount) external onlyOwner {
        mintAmount = amount;
    }

    function setMintPrice(uint256 price) external onlyOwner {
        mintPrice = price;
    }

    function setOpen(bool shouldOpen) external onlyOwner {
        open = shouldOpen;
    }

    function setOpenFree(bool shouldOpen) external onlyOwner {
        openFree = shouldOpen;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner notLocked {
        baseURI = newBaseURI;
    }

    function setIpfsURI(string memory _ipfsUri) external onlyOwner notLocked {
        ipfsUri = _ipfsUri;
    }

    function setFolder(string memory _folder) external onlyOwner notLocked {
        folder = _folder;
    }

    function setProvenanceURI(string memory _provenanceURI)
        external
        onlyOwner
        notLocked
    {
        provenanceURI = _provenanceURI;
    }

    function setProvenance(string memory _provenance)
        external
        onlyOwner
        notLocked
    {
        provenance = _provenance;
    }

    function lock() external onlyOwner {
        locked = true;
    }

    function withdraw() external {
        require(
            msg.sender == 0xc7903eCE1Dc696EcF0c1A123A1ea17283ae6bF85 ||
                msg.sender == 0xd880e1494bfBE60f221B8a8506b5a1959c36127C ||
                msg.sender == 0xF1e000b6fE51AeD56a8d162A95B0C7A8a7511922 ||
                msg.sender == 0x6928aE2F8F1695559b5bf1c21C16E1390dD13144 ||
                msg.sender == 0x3AD232dDE2e84b782e2Ff044C6e3832Eb9e78A21 ||
                msg.sender == 0xda6776bfbA3252E6720911c4ed6a317e98d4954F
        );

        uint256 bal = address(this).balance;

        uint256 a0 = bal * 25 / 100;
        payable(address(0xc7903eCE1Dc696EcF0c1A123A1ea17283ae6bF85)).call{value: a0}("");

        uint256 a1 = bal * 25 / 100;
        payable(address(0xd880e1494bfBE60f221B8a8506b5a1959c36127C)).call{value: a1}("");

        uint256 a2 = bal * 25 / 100;
        payable(address(0xF1e000b6fE51AeD56a8d162A95B0C7A8a7511922)).call{value: a2}("");

        uint256 a3 = bal * 15 / 100;
        payable(address(0x6928aE2F8F1695559b5bf1c21C16E1390dD13144)).call{value: a3}("");

        uint256 a4 = bal * 8 / 100;
        payable(address(0x3AD232dDE2e84b782e2Ff044C6e3832Eb9e78A21)).call{value: a4}("");

        uint256 a5 = bal * 2 / 100;
        payable(address(0xda6776bfbA3252E6720911c4ed6a317e98d4954F)).call{
            value: a5
        }("");

        uint256 remaining = address(this).balance;
        payable(address(0x6928aE2F8F1695559b5bf1c21C16E1390dD13144)).call{
            value: remaining
        }("");
    }

    function emergencyWithdraw() external {
        require(msg.sender == 0x6928aE2F8F1695559b5bf1c21C16E1390dD13144);
        (bool success, ) = payable(0x6928aE2F8F1695559b5bf1c21C16E1390dD13144)
            .call{value: address(this).balance}("");
        require(success);
    }

    // Private Methods
    function _mintInternal(address owner) private {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(owner, newItemId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUYABLE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WICKED_APES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"folder","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMints","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":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getQuantityFromValue","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":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seen","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_folder","type":"string"}],"name":"setFolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ipfsUri","type":"string"}],"name":"setIpfsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldOpen","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldOpen","type":"bool"}],"name":"setOpenFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceURI","type":"string"}],"name":"setProvenanceURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601581526020017f68747470733a2f2f697066732e696f2f697066732f0000000000000000000000815250600c90805190602001906200005192919062000c8b565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600e9080519060200190620000af92919062000c8b565b5060405180602001604052806000815250600f9080519060200190620000d792919062000c8b565b506040518060200160405280600081525060109080519060200190620000ff92919062000c8b565b506000601160006101000a81548160ff0219169083151502179055506701bc16d674ec80006012556003601355600060145560405180602001604052806000815250601590805190602001906200015892919062000c8b565b503480156200016657600080fd5b506040518060400160405280600d81526020017f5769636b656420486f756e6473000000000000000000000000000000000000008152506040518060400160405280600681526020017f574b44484e440000000000000000000000000000000000000000000000000000815250620001f3620001e76200027160201b60201c565b6200027960201b60201c565b81600190805190602001906200020b92919062000c8b565b5080600290805190602001906200022492919062000c8b565b5050506040518060800160405280604181526020016200664a60419139601590805190602001906200025892919062000c8b565b506200026b606f6200033d60201b60201c565b62001086565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200034d6200027160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003736200040360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c39062000ecf565b60405180910390fd5b60005b81811015620003ff57620003e9336200042c60201b60201c565b8080620003f69062000fda565b915050620003cf565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000443600b6200047460201b62002e3d1760201c565b60006200045c600b6200048a60201b62002e531760201c565b90506200047082826200049860201b60201c565b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200050b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005029062000ead565b60405180910390fd5b6200051c816200067e60201b60201c565b156200055f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005569062000e69565b60405180910390fd5b6200057360008383620006ea60201b60201c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005c5919062000f02565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620007028383836200083160201b62002e611760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200074f5762000749816200083660201b60201c565b62000797565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000796576200079583826200087f60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007e457620007de81620009fc60201b60201c565b6200082c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200082b576200082a828262000b4460201b60201c565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620008998462000bd060201b62001c8e1760201c565b620008a5919062000f5f565b90506000600860008481526020019081526020016000205490508181146200098b576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905062000a12919062000f5f565b90506000600a600084815260200190815260200160002054905060006009838154811062000a69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806009838154811062000ab2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548062000b28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000b5c8362000bd060201b62001c8e1760201c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c3b9062000e8b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000c999062000fa4565b90600052602060002090601f01602090048101928262000cbd576000855562000d09565b82601f1062000cd857805160ff191683800117855562000d09565b8280016001018555821562000d09579182015b8281111562000d0857825182559160200191906001019062000ceb565b5b50905062000d18919062000d1c565b5090565b5b8082111562000d3757600081600090555060010162000d1d565b5090565b600062000d4a601c8362000ef1565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600062000d8c602a8362000ef1565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600062000df460208362000ef1565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062000e3660208362000ef1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000602082019050818103600083015262000e848162000d3b565b9050919050565b6000602082019050818103600083015262000ea68162000d7d565b9050919050565b6000602082019050818103600083015262000ec88162000de5565b9050919050565b6000602082019050818103600083015262000eea8162000e27565b9050919050565b600082825260208201905092915050565b600062000f0f8262000f9a565b915062000f1c8362000f9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000f545762000f5362001028565b5b828201905092915050565b600062000f6c8262000f9a565b915062000f798362000f9a565b92508282101562000f8f5762000f8e62001028565b5b828203905092915050565b6000819050919050565b6000600282049050600182168062000fbd57607f821691505b6020821081141562000fd45762000fd362001057565b5b50919050565b600062000fe78262000f9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200101d576200101c62001028565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6155b480620010966000396000f3fe6080604052600436106102c95760003560e01c806371356d4711610175578063b88d4fde116100dc578063e985e9c511610095578063f4a0a5281161006f578063f4a0a52814610ae5578063f83d08ba14610b0e578063fcfff16f14610b25578063ffe630b514610b50576102c9565b8063e985e9c514610a56578063f19e75d414610a93578063f2fde38b14610abc576102c9565b8063b88d4fde14610948578063c7cd997f14610971578063c87b56dd1461099a578063cf309012146109d7578063db2e21bc14610a02578063e757223014610a19576102c9565b8063987fa94f1161012e578063987fa94f1461085b57806399a2e7a114610884578063a00501a4146108af578063a0712d68146108da578063a22cb465146108f6578063a9373d941461091f576102c9565b806371356d4714610771578063715018a61461079a5780637f501d04146107b15780638ab53447146107ee5780638da5cb5b1461080557806395d89b4114610830576102c9565b80633ccfd60b116102345780636352211e116101ed5780636c0360eb116101c75780636c0360eb146106a35780636d41d4fb146106ce5780636fdca5e01461070b57806370a0823114610734576102c9565b80636352211e1461061057806365477dc01461064d5780636817c76c14610678576102c9565b80633ccfd60b1461051457806342842e0e1461052b5780634f6ccce71461055457806355f804b3146105915780635a2bcc18146105ba57806361f30e92146105e5576102c9565b806318160ddd1161028657806318160ddd146103f257806323b872dd1461041d57806329ed3f74146104465780632f745c591461048357806331690734146104c057806334976b9b146104e9576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc14610336578063095ea7b3146103735780630f7309e81461039c5780631644fa8e146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906142d1565b610b79565b6040516103029190614dd2565b60405180910390f35b34801561031757600080fd5b50610320610bf3565b60405161032d9190614ded565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190614364565b610c85565b60405161036a9190614d42565b60405180910390f35b34801561037f57600080fd5b5061039a6004803603810190610395919061426c565b610d0a565b005b3480156103a857600080fd5b506103b1610e22565b6040516103be9190614ded565b60405180910390f35b3480156103d357600080fd5b506103dc610eb0565b6040516103e99190614dd2565b60405180910390f35b3480156103fe57600080fd5b50610407610ec3565b60405161041491906150cf565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190614166565b610ed0565b005b34801561045257600080fd5b5061046d60048036038101906104689190614364565b610f30565b60405161047a91906150cf565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061426c565b610f47565b6040516104b791906150cf565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190614323565b610fec565b005b3480156104f557600080fd5b506104fe6110d2565b60405161050b91906150cf565b60405180910390f35b34801561052057600080fd5b506105296110d8565b005b34801561053757600080fd5b50610552600480360381019061054d9190614166565b6116c3565b005b34801561056057600080fd5b5061057b60048036038101906105769190614364565b6116e3565b60405161058891906150cf565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190614323565b61177a565b005b3480156105c657600080fd5b506105cf611860565b6040516105dc91906150cf565b60405180910390f35b3480156105f157600080fd5b506105fa611866565b6040516106079190614d42565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190614364565b61187e565b6040516106449190614d42565b60405180910390f35b34801561065957600080fd5b50610662611930565b60405161066f9190614ded565b60405180910390f35b34801561068457600080fd5b5061068d6119be565b60405161069a91906150cf565b60405180910390f35b3480156106af57600080fd5b506106b86119c4565b6040516106c59190614ded565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190614101565b611a52565b60405161070291906150cf565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d91906142a8565b611bf5565b005b34801561074057600080fd5b5061075b60048036038101906107569190614101565b611c8e565b60405161076891906150cf565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190614323565b611d46565b005b3480156107a657600080fd5b506107af611e2c565b005b3480156107bd57600080fd5b506107d860048036038101906107d39190614364565b611eb4565b6040516107e59190614dd2565b60405180910390f35b3480156107fa57600080fd5b50610803611ed4565b005b34801561081157600080fd5b5061081a6120de565b6040516108279190614d42565b60405180910390f35b34801561083c57600080fd5b50610845612107565b6040516108529190614ded565b60405180910390f35b34801561086757600080fd5b50610882600480360381019061087d91906142a8565b612199565b005b34801561089057600080fd5b50610899612232565b6040516108a691906150cf565b60405180910390f35b3480156108bb57600080fd5b506108c4612238565b6040516108d19190614ded565b60405180910390f35b6108f460048036038101906108ef9190614364565b6122c6565b005b34801561090257600080fd5b5061091d60048036038101906109189190614230565b6124ba565b005b34801561092b57600080fd5b5061094660048036038101906109419190614323565b61263b565b005b34801561095457600080fd5b5061096f600480360381019061096a91906141b5565b612721565b005b34801561097d57600080fd5b5061099860048036038101906109939190614364565b612783565b005b3480156109a657600080fd5b506109c160048036038101906109bc9190614364565b612809565b6040516109ce9190614ded565b60405180910390f35b3480156109e357600080fd5b506109ec6128e0565b6040516109f99190614dd2565b60405180910390f35b348015610a0e57600080fd5b50610a176128f3565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190614364565b6129cc565b604051610a4d91906150cf565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a78919061412a565b6129f2565b604051610a8a9190614dd2565b60405180910390f35b348015610a9f57600080fd5b50610aba6004803603810190610ab59190614364565b612a86565b005b348015610ac857600080fd5b50610ae36004803603810190610ade9190614101565b612b2d565b005b348015610af157600080fd5b50610b0c6004803603810190610b079190614364565b612c25565b005b348015610b1a57600080fd5b50610b23612cab565b005b348015610b3157600080fd5b50610b3a612d44565b604051610b479190614dd2565b60405180910390f35b348015610b5c57600080fd5b50610b776004803603810190610b729190614323565b612d57565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bec5750610beb82612e66565b5b9050919050565b606060018054610c02906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e906153a9565b8015610c7b5780601f10610c5057610100808354040283529160200191610c7b565b820191906000526020600020905b815481529060010190602001808311610c5e57829003601f168201915b5050505050905090565b6000610c9082612f48565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690614faf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d158261187e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d9061502f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da5612fb4565b73ffffffffffffffffffffffffffffffffffffffff161480610dd45750610dd381610dce612fb4565b6129f2565b5b610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90614f2f565b60405180910390fd5b610e1d8383612fbc565b505050565b600f8054610e2f906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5b906153a9565b8015610ea85780601f10610e7d57610100808354040283529160200191610ea8565b820191906000526020600020905b815481529060010190602001808311610e8b57829003601f168201915b505050505081565b600d60019054906101000a900460ff1681565b6000600980549050905090565b610ee1610edb612fb4565b82613075565b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f179061508f565b60405180910390fd5b610f2b838383613153565b505050565b600060125482610f409190615234565b9050919050565b6000610f5283611c8e565b8210610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614e4f565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ff4612fb4565b73ffffffffffffffffffffffffffffffffffffffff166110126120de565b73ffffffffffffffffffffffffffffffffffffffff1614611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90614fcf565b60405180910390fd5b601160009054906101000a900460ff16156110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90614e0f565b60405180910390fd5b80600c90805190602001906110ce929190613f10565b5050565b60145481565b73c7903ece1dc696ecf0c1a123a1ea17283ae6bf8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611165575073d880e1494bfbe60f221b8a8506b5a1959c36127c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806111af575073f1e000b6fe51aed56a8d162a95b0c7a8a751192273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806111f95750736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806112435750733ad232dde2e84b782e2ff044c6e3832eb9e78a2173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061128d575073da6776bfba3252e6720911c4ed6a317e98d4954f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61129657600080fd5b6000479050600060646019836112ac9190615265565b6112b69190615234565b905073c7903ece1dc696ecf0c1a123a1ea17283ae6bf8573ffffffffffffffffffffffffffffffffffffffff16816040516112f090614d2d565b60006040518083038185875af1925050503d806000811461132d576040519150601f19603f3d011682016040523d82523d6000602084013e611332565b606091505b505050600060646019846113469190615265565b6113509190615234565b905073d880e1494bfbe60f221b8a8506b5a1959c36127c73ffffffffffffffffffffffffffffffffffffffff168160405161138a90614d2d565b60006040518083038185875af1925050503d80600081146113c7576040519150601f19603f3d011682016040523d82523d6000602084013e6113cc565b606091505b505050600060646019856113e09190615265565b6113ea9190615234565b905073f1e000b6fe51aed56a8d162a95b0c7a8a751192273ffffffffffffffffffffffffffffffffffffffff168160405161142490614d2d565b60006040518083038185875af1925050503d8060008114611461576040519150601f19603f3d011682016040523d82523d6000602084013e611466565b606091505b50505060006064600f8661147a9190615265565b6114849190615234565b9050736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff16816040516114be90614d2d565b60006040518083038185875af1925050503d80600081146114fb576040519150601f19603f3d011682016040523d82523d6000602084013e611500565b606091505b505050600060646008876115149190615265565b61151e9190615234565b9050733ad232dde2e84b782e2ff044c6e3832eb9e78a2173ffffffffffffffffffffffffffffffffffffffff168160405161155890614d2d565b60006040518083038185875af1925050503d8060008114611595576040519150601f19603f3d011682016040523d82523d6000602084013e61159a565b606091505b505050600060646002886115ae9190615265565b6115b89190615234565b905073da6776bfba3252e6720911c4ed6a317e98d4954f73ffffffffffffffffffffffffffffffffffffffff16816040516115f290614d2d565b60006040518083038185875af1925050503d806000811461162f576040519150601f19603f3d011682016040523d82523d6000602084013e611634565b606091505b5050506000479050736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff168160405161167490614d2d565b60006040518083038185875af1925050503d80600081146116b1576040519150601f19603f3d011682016040523d82523d6000602084013e6116b6565b606091505b5050505050505050505050565b6116de83838360405180602001604052806000815250612721565b505050565b60006116ed610ec3565b821061172e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611725906150af565b60405180910390fd5b60098281548110611768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611782612fb4565b73ffffffffffffffffffffffffffffffffffffffff166117a06120de565b73ffffffffffffffffffffffffffffffffffffffff16146117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed90614fcf565b60405180910390fd5b601160009054906101000a900460ff1615611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90614e0f565b60405180910390fd5b806015908051906020019061185c929190613f10565b5050565b60135481565b73be6e3669464e7db1e1528212f0bff5039461cb8281565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90614f6f565b60405180910390fd5b80915050919050565b6010805461193d906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611969906153a9565b80156119b65780601f1061198b576101008083540402835291602001916119b6565b820191906000526020600020905b81548152906001019060200180831161199957829003601f168201915b505050505081565b60125481565b601580546119d1906153a9565b80601f01602080910402602001604051908101604052809291908181526020018280546119fd906153a9565b8015611a4a5780601f10611a1f57610100808354040283529160200191611a4a565b820191906000526020600020905b815481529060010190602001808311611a2d57829003601f168201915b505050505081565b60008060009050600073be6e3669464e7db1e1528212f0bff5039461cb82905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401611aad9190614d42565b60206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd919061438d565b905060005b81811015611be95760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5988846040518363ffffffff1660e01b8152600401611b47929190614da9565b60206040518083038186803b158015611b5f57600080fd5b505afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b97919061438d565b90506016600082815260200190815260200160002060009054906101000a900460ff1615611bc55750611bd6565b600185611bd291906151de565b9450505b8080611be1906153db565b915050611b02565b50829350505050919050565b611bfd612fb4565b73ffffffffffffffffffffffffffffffffffffffff16611c1b6120de565b73ffffffffffffffffffffffffffffffffffffffff1614611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6890614fcf565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf690614f4f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d4e612fb4565b73ffffffffffffffffffffffffffffffffffffffff16611d6c6120de565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990614fcf565b60405180910390fd5b601160009054906101000a900460ff1615611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614e0f565b60405180910390fd5b80600e9080519060200190611e28929190613f10565b5050565b611e34612fb4565b73ffffffffffffffffffffffffffffffffffffffff16611e526120de565b73ffffffffffffffffffffffffffffffffffffffff1614611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f90614fcf565b60405180910390fd5b611eb260006133af565b565b60166020528060005260406000206000915054906101000a900460ff1681565b600d60019054906101000a900460ff16611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a9061504f565b60405180910390fd5b600073be6e3669464e7db1e1528212f0bff5039461cb82905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611f779190614d42565b60206040518083038186803b158015611f8f57600080fd5b505afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc7919061438d565b905060005b818110156120d95760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401612011929190614da9565b60206040518083038186803b15801561202957600080fd5b505afa15801561203d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612061919061438d565b90506016600082815260200190815260200160002060009054906101000a900460ff161561208f57506120c6565b60016016600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506120c433613473565b505b80806120d1906153db565b915050611fcc565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054612116906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054612142906153a9565b801561218f5780601f106121645761010080835404028352916020019161218f565b820191906000526020600020905b81548152906001019060200180831161217257829003601f168201915b5050505050905090565b6121a1612fb4565b73ffffffffffffffffffffffffffffffffffffffff166121bf6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220c90614fcf565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6103e881565b600e8054612245906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054612271906153a9565b80156122be5780601f10612293576101008083540402835291602001916122be565b820191906000526020600020905b8154815290600101906020018083116122a157829003601f168201915b505050505081565b600d60009054906101000a900460ff16612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c9061504f565b60405180910390fd5b60008111612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f9061506f565b60405180910390fd5b6013548111156123685760135490505b6103e86014548261237991906151de565b1115612392576014546103e861238f91906152bf565b90505b600061239d826129cc565b9050803410156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d99061500f565b60405180910390fd5b60005b82811015612423576123f633613473565b60016014600082825461240991906151de565b92505081905550808061241b906153db565b9150506123e5565b506000813461243291906152bf565b905060008111156124b55760003373ffffffffffffffffffffffffffffffffffffffff168260405161246390614d2d565b60006040518083038185875af1925050503d80600081146124a0576040519150601f19603f3d011682016040523d82523d6000602084013e6124a5565b606091505b50509050806124b357600080fd5b505b505050565b6124c2612fb4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252790614eef565b60405180910390fd5b806006600061253d612fb4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166125ea612fb4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161262f9190614dd2565b60405180910390a35050565b612643612fb4565b73ffffffffffffffffffffffffffffffffffffffff166126616120de565b73ffffffffffffffffffffffffffffffffffffffff16146126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90614fcf565b60405180910390fd5b601160009054906101000a900460ff1615612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90614e0f565b60405180910390fd5b806010908051906020019061271d929190613f10565b5050565b61273261272c612fb4565b83613075565b612771576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127689061508f565b60405180910390fd5b61277d84848484613499565b50505050565b61278b612fb4565b73ffffffffffffffffffffffffffffffffffffffff166127a96120de565b73ffffffffffffffffffffffffffffffffffffffff16146127ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f690614fcf565b60405180910390fd5b8060138190555050565b6060600082118015612822575061281e610ec3565b8211155b612861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890614e2f565b60405180910390fd5b6000600e8054612870906153a9565b905011156128ad57600c600e612885846134f5565b60405160200161289793929190614cf1565b60405160208183030381529060405290506128db565b60156128b8836134f5565b6040516020016128c9929190614ccd565b60405160208183030381529060405290505b919050565b601160009054906101000a900460ff1681565b736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461293f57600080fd5b6000736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff164760405161297990614d2d565b60006040518083038185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b50509050806129c957600080fd5b50565b60006103e88211156129dd57600080fd5b601254826129eb9190615265565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a8e612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612aac6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990614fcf565b60405180910390fd5b60005b81811015612b2957612b1633613473565b8080612b21906153db565b915050612b05565b5050565b612b35612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612b536120de565b73ffffffffffffffffffffffffffffffffffffffff1614612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614fcf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1090614e8f565b60405180910390fd5b612c22816133af565b50565b612c2d612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612c4b6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9890614fcf565b60405180910390fd5b8060128190555050565b612cb3612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612cd16120de565b73ffffffffffffffffffffffffffffffffffffffff1614612d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1e90614fcf565b60405180910390fd5b6001601160006101000a81548160ff021916908315150217905550565b600d60009054906101000a900460ff1681565b612d5f612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612d7d6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dca90614fcf565b60405180910390fd5b601160009054906101000a900460ff1615612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90614e0f565b60405180910390fd5b80600f9080519060200190612e39929190613f10565b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f3157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f415750612f40826136a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661302f8361187e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061308082612f48565b6130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690614f0f565b60405180910390fd5b60006130ca8361187e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061313957508373ffffffffffffffffffffffffffffffffffffffff1661312184610c85565b73ffffffffffffffffffffffffffffffffffffffff16145b8061314a575061314981856129f2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166131738261187e565b73ffffffffffffffffffffffffffffffffffffffff16146131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c090614fef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323090614ecf565b60405180910390fd5b61324483838361370c565b61324f600082612fbc565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461329f91906152bf565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132f691906151de565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61347d600b612e3d565b6000613489600b612e53565b90506134958282613820565b5050565b6134a4848484613153565b6134b0848484846139ee565b6134ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e690614e6f565b60405180910390fd5b50505050565b6060600082141561353d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061369d565b600082905060005b6000821461356f578080613558906153db565b915050600a826135689190615234565b9150613545565b60008167ffffffffffffffff8111156135b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135e35781602001600182028036833780820191505090505b5090505b60008514613696576001826135fc91906152bf565b9150600a8561360b9190615424565b603061361791906151de565b60f81b818381518110613653577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561368f9190615234565b94506135e7565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613717838383612e61565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561375a5761375581613b85565b613799565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613798576137978382613bce565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137dc576137d781613d3b565b61381b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461381a576138198282613e7e565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388790614f8f565b60405180910390fd5b61389981612f48565b156138d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d090614eaf565b60405180910390fd5b6138e56000838361370c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461393591906151de565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613a0f8473ffffffffffffffffffffffffffffffffffffffff16613efd565b15613b78578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a38612fb4565b8786866040518563ffffffff1660e01b8152600401613a5a9493929190614d5d565b602060405180830381600087803b158015613a7457600080fd5b505af1925050508015613aa557506040513d601f19601f82011682018060405250810190613aa291906142fa565b60015b613b28573d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b50600081511415613b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1790614e6f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b7d565b600190505b949350505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613bdb84611c8e565b613be591906152bf565b9050600060086000848152602001908152602001600020549050818114613cca576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613d4f91906152bf565b90506000600a6000848152602001908152602001600020549050600060098381548110613da5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613ded577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613e62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613e8983611c8e565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613f1c906153a9565b90600052602060002090601f016020900481019282613f3e5760008555613f85565b82601f10613f5757805160ff1916838001178555613f85565b82800160010185558215613f85579182015b82811115613f84578251825591602001919060010190613f69565b5b509050613f929190613f96565b5090565b5b80821115613faf576000816000905550600101613f97565b5090565b6000613fc6613fc18461511b565b6150ea565b905082815260208101848484011115613fde57600080fd5b613fe9848285615367565b509392505050565b6000614004613fff8461514b565b6150ea565b90508281526020810184848401111561401c57600080fd5b614027848285615367565b509392505050565b60008135905061403e81615522565b92915050565b60008135905061405381615539565b92915050565b60008135905061406881615550565b92915050565b60008151905061407d81615550565b92915050565b600082601f83011261409457600080fd5b81356140a4848260208601613fb3565b91505092915050565b600082601f8301126140be57600080fd5b81356140ce848260208601613ff1565b91505092915050565b6000813590506140e681615567565b92915050565b6000815190506140fb81615567565b92915050565b60006020828403121561411357600080fd5b60006141218482850161402f565b91505092915050565b6000806040838503121561413d57600080fd5b600061414b8582860161402f565b925050602061415c8582860161402f565b9150509250929050565b60008060006060848603121561417b57600080fd5b60006141898682870161402f565b935050602061419a8682870161402f565b92505060406141ab868287016140d7565b9150509250925092565b600080600080608085870312156141cb57600080fd5b60006141d98782880161402f565b94505060206141ea8782880161402f565b93505060406141fb878288016140d7565b925050606085013567ffffffffffffffff81111561421857600080fd5b61422487828801614083565b91505092959194509250565b6000806040838503121561424357600080fd5b60006142518582860161402f565b925050602061426285828601614044565b9150509250929050565b6000806040838503121561427f57600080fd5b600061428d8582860161402f565b925050602061429e858286016140d7565b9150509250929050565b6000602082840312156142ba57600080fd5b60006142c884828501614044565b91505092915050565b6000602082840312156142e357600080fd5b60006142f184828501614059565b91505092915050565b60006020828403121561430c57600080fd5b600061431a8482850161406e565b91505092915050565b60006020828403121561433557600080fd5b600082013567ffffffffffffffff81111561434f57600080fd5b61435b848285016140ad565b91505092915050565b60006020828403121561437657600080fd5b6000614384848285016140d7565b91505092915050565b60006020828403121561439f57600080fd5b60006143ad848285016140ec565b91505092915050565b6143bf816152f3565b82525050565b6143ce81615305565b82525050565b60006143df82615190565b6143e981856151a6565b93506143f9818560208601615376565b61440281615511565b840191505092915050565b60006144188261519b565b61442281856151c2565b9350614432818560208601615376565b61443b81615511565b840191505092915050565b60006144518261519b565b61445b81856151d3565b935061446b818560208601615376565b80840191505092915050565b60008154614484816153a9565b61448e81866151d3565b945060018216600081146144a957600181146144ba576144ed565b60ff198316865281860193506144ed565b6144c38561517b565b60005b838110156144e5578154818901526001820191506020810190506144c6565b838801955050505b50505092915050565b60006145036018836151c2565b91507f436f6e747261637420686173206265656e206c6f636b656400000000000000006000830152602082019050919050565b6000614543601f836151c2565b91507f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006000830152602082019050919050565b6000614583602b836151c2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006145e96032836151c2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061464f6026836151c2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146b5601c836151c2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006146f56024836151c2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475b6019836151c2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061479b602c836151c2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006148016038836151c2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614867602a836151c2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148cd6029836151c2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149336020836151c2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614973602c836151c2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149d96020836151c2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a196029836151c2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a7f6013836151c2565b91507f4e6f7420656e6f756768204554482073656e74000000000000000000000000006000830152602082019050919050565b6000614abf6021836151c2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b256011836151c2565b91507f44726f70206e6f74206f70656e207965740000000000000000000000000000006000830152602082019050919050565b6000614b65601b836151c2565b91507f5175616e74697479206d757374206265206174206c65617374203100000000006000830152602082019050919050565b6000614ba56000836151b7565b9150600082019050919050565b6000614bbf6031836151c2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614c25602c836151c2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614c8b6001836151d3565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b614cc78161535d565b82525050565b6000614cd98285614477565b9150614ce58284614446565b91508190509392505050565b6000614cfd8286614477565b9150614d098285614477565b9150614d1482614c7e565b9150614d208284614446565b9150819050949350505050565b6000614d3882614b98565b9150819050919050565b6000602082019050614d5760008301846143b6565b92915050565b6000608082019050614d7260008301876143b6565b614d7f60208301866143b6565b614d8c6040830185614cbe565b8181036060830152614d9e81846143d4565b905095945050505050565b6000604082019050614dbe60008301856143b6565b614dcb6020830184614cbe565b9392505050565b6000602082019050614de760008301846143c5565b92915050565b60006020820190508181036000830152614e07818461440d565b905092915050565b60006020820190508181036000830152614e28816144f6565b9050919050565b60006020820190508181036000830152614e4881614536565b9050919050565b60006020820190508181036000830152614e6881614576565b9050919050565b60006020820190508181036000830152614e88816145dc565b9050919050565b60006020820190508181036000830152614ea881614642565b9050919050565b60006020820190508181036000830152614ec8816146a8565b9050919050565b60006020820190508181036000830152614ee8816146e8565b9050919050565b60006020820190508181036000830152614f088161474e565b9050919050565b60006020820190508181036000830152614f288161478e565b9050919050565b60006020820190508181036000830152614f48816147f4565b9050919050565b60006020820190508181036000830152614f688161485a565b9050919050565b60006020820190508181036000830152614f88816148c0565b9050919050565b60006020820190508181036000830152614fa881614926565b9050919050565b60006020820190508181036000830152614fc881614966565b9050919050565b60006020820190508181036000830152614fe8816149cc565b9050919050565b6000602082019050818103600083015261500881614a0c565b9050919050565b6000602082019050818103600083015261502881614a72565b9050919050565b6000602082019050818103600083015261504881614ab2565b9050919050565b6000602082019050818103600083015261506881614b18565b9050919050565b6000602082019050818103600083015261508881614b58565b9050919050565b600060208201905081810360008301526150a881614bb2565b9050919050565b600060208201905081810360008301526150c881614c18565b9050919050565b60006020820190506150e46000830184614cbe565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615111576151106154e2565b5b8060405250919050565b600067ffffffffffffffff821115615136576151356154e2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615166576151656154e2565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006151e98261535d565b91506151f48361535d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561522957615228615455565b5b828201905092915050565b600061523f8261535d565b915061524a8361535d565b92508261525a57615259615484565b5b828204905092915050565b60006152708261535d565b915061527b8361535d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b4576152b3615455565b5b828202905092915050565b60006152ca8261535d565b91506152d58361535d565b9250828210156152e8576152e7615455565b5b828203905092915050565b60006152fe8261533d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615394578082015181840152602081019050615379565b838111156153a3576000848401525b50505050565b600060028204905060018216806153c157607f821691505b602082108114156153d5576153d46154b3565b5b50919050565b60006153e68261535d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561541957615418615455565b5b600182019050919050565b600061542f8261535d565b915061543a8361535d565b92508261544a57615449615484565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61552b816152f3565b811461553657600080fd5b50565b61554281615305565b811461554d57600080fd5b50565b61555981615311565b811461556457600080fd5b50565b6155708161535d565b811461557b57600080fd5b5056fea2646970667358221220a0fc00879773c85537a6d8e4d71dbef6bada37da0f16b468a4fb96a59a76803a64736f6c6343000800003368747470733a2f2f75732d63656e7472616c312d7769636b65642d617065732e636c6f756466756e6374696f6e732e6e65742f6170702f76312f686f756e64732f

Deployed Bytecode

0x6080604052600436106102c95760003560e01c806371356d4711610175578063b88d4fde116100dc578063e985e9c511610095578063f4a0a5281161006f578063f4a0a52814610ae5578063f83d08ba14610b0e578063fcfff16f14610b25578063ffe630b514610b50576102c9565b8063e985e9c514610a56578063f19e75d414610a93578063f2fde38b14610abc576102c9565b8063b88d4fde14610948578063c7cd997f14610971578063c87b56dd1461099a578063cf309012146109d7578063db2e21bc14610a02578063e757223014610a19576102c9565b8063987fa94f1161012e578063987fa94f1461085b57806399a2e7a114610884578063a00501a4146108af578063a0712d68146108da578063a22cb465146108f6578063a9373d941461091f576102c9565b806371356d4714610771578063715018a61461079a5780637f501d04146107b15780638ab53447146107ee5780638da5cb5b1461080557806395d89b4114610830576102c9565b80633ccfd60b116102345780636352211e116101ed5780636c0360eb116101c75780636c0360eb146106a35780636d41d4fb146106ce5780636fdca5e01461070b57806370a0823114610734576102c9565b80636352211e1461061057806365477dc01461064d5780636817c76c14610678576102c9565b80633ccfd60b1461051457806342842e0e1461052b5780634f6ccce71461055457806355f804b3146105915780635a2bcc18146105ba57806361f30e92146105e5576102c9565b806318160ddd1161028657806318160ddd146103f257806323b872dd1461041d57806329ed3f74146104465780632f745c591461048357806331690734146104c057806334976b9b146104e9576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc14610336578063095ea7b3146103735780630f7309e81461039c5780631644fa8e146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906142d1565b610b79565b6040516103029190614dd2565b60405180910390f35b34801561031757600080fd5b50610320610bf3565b60405161032d9190614ded565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190614364565b610c85565b60405161036a9190614d42565b60405180910390f35b34801561037f57600080fd5b5061039a6004803603810190610395919061426c565b610d0a565b005b3480156103a857600080fd5b506103b1610e22565b6040516103be9190614ded565b60405180910390f35b3480156103d357600080fd5b506103dc610eb0565b6040516103e99190614dd2565b60405180910390f35b3480156103fe57600080fd5b50610407610ec3565b60405161041491906150cf565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190614166565b610ed0565b005b34801561045257600080fd5b5061046d60048036038101906104689190614364565b610f30565b60405161047a91906150cf565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061426c565b610f47565b6040516104b791906150cf565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190614323565b610fec565b005b3480156104f557600080fd5b506104fe6110d2565b60405161050b91906150cf565b60405180910390f35b34801561052057600080fd5b506105296110d8565b005b34801561053757600080fd5b50610552600480360381019061054d9190614166565b6116c3565b005b34801561056057600080fd5b5061057b60048036038101906105769190614364565b6116e3565b60405161058891906150cf565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190614323565b61177a565b005b3480156105c657600080fd5b506105cf611860565b6040516105dc91906150cf565b60405180910390f35b3480156105f157600080fd5b506105fa611866565b6040516106079190614d42565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190614364565b61187e565b6040516106449190614d42565b60405180910390f35b34801561065957600080fd5b50610662611930565b60405161066f9190614ded565b60405180910390f35b34801561068457600080fd5b5061068d6119be565b60405161069a91906150cf565b60405180910390f35b3480156106af57600080fd5b506106b86119c4565b6040516106c59190614ded565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f09190614101565b611a52565b60405161070291906150cf565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d91906142a8565b611bf5565b005b34801561074057600080fd5b5061075b60048036038101906107569190614101565b611c8e565b60405161076891906150cf565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190614323565b611d46565b005b3480156107a657600080fd5b506107af611e2c565b005b3480156107bd57600080fd5b506107d860048036038101906107d39190614364565b611eb4565b6040516107e59190614dd2565b60405180910390f35b3480156107fa57600080fd5b50610803611ed4565b005b34801561081157600080fd5b5061081a6120de565b6040516108279190614d42565b60405180910390f35b34801561083c57600080fd5b50610845612107565b6040516108529190614ded565b60405180910390f35b34801561086757600080fd5b50610882600480360381019061087d91906142a8565b612199565b005b34801561089057600080fd5b50610899612232565b6040516108a691906150cf565b60405180910390f35b3480156108bb57600080fd5b506108c4612238565b6040516108d19190614ded565b60405180910390f35b6108f460048036038101906108ef9190614364565b6122c6565b005b34801561090257600080fd5b5061091d60048036038101906109189190614230565b6124ba565b005b34801561092b57600080fd5b5061094660048036038101906109419190614323565b61263b565b005b34801561095457600080fd5b5061096f600480360381019061096a91906141b5565b612721565b005b34801561097d57600080fd5b5061099860048036038101906109939190614364565b612783565b005b3480156109a657600080fd5b506109c160048036038101906109bc9190614364565b612809565b6040516109ce9190614ded565b60405180910390f35b3480156109e357600080fd5b506109ec6128e0565b6040516109f99190614dd2565b60405180910390f35b348015610a0e57600080fd5b50610a176128f3565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190614364565b6129cc565b604051610a4d91906150cf565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a78919061412a565b6129f2565b604051610a8a9190614dd2565b60405180910390f35b348015610a9f57600080fd5b50610aba6004803603810190610ab59190614364565b612a86565b005b348015610ac857600080fd5b50610ae36004803603810190610ade9190614101565b612b2d565b005b348015610af157600080fd5b50610b0c6004803603810190610b079190614364565b612c25565b005b348015610b1a57600080fd5b50610b23612cab565b005b348015610b3157600080fd5b50610b3a612d44565b604051610b479190614dd2565b60405180910390f35b348015610b5c57600080fd5b50610b776004803603810190610b729190614323565b612d57565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bec5750610beb82612e66565b5b9050919050565b606060018054610c02906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e906153a9565b8015610c7b5780601f10610c5057610100808354040283529160200191610c7b565b820191906000526020600020905b815481529060010190602001808311610c5e57829003601f168201915b5050505050905090565b6000610c9082612f48565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690614faf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d158261187e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d9061502f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da5612fb4565b73ffffffffffffffffffffffffffffffffffffffff161480610dd45750610dd381610dce612fb4565b6129f2565b5b610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90614f2f565b60405180910390fd5b610e1d8383612fbc565b505050565b600f8054610e2f906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5b906153a9565b8015610ea85780601f10610e7d57610100808354040283529160200191610ea8565b820191906000526020600020905b815481529060010190602001808311610e8b57829003601f168201915b505050505081565b600d60019054906101000a900460ff1681565b6000600980549050905090565b610ee1610edb612fb4565b82613075565b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f179061508f565b60405180910390fd5b610f2b838383613153565b505050565b600060125482610f409190615234565b9050919050565b6000610f5283611c8e565b8210610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614e4f565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ff4612fb4565b73ffffffffffffffffffffffffffffffffffffffff166110126120de565b73ffffffffffffffffffffffffffffffffffffffff1614611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90614fcf565b60405180910390fd5b601160009054906101000a900460ff16156110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90614e0f565b60405180910390fd5b80600c90805190602001906110ce929190613f10565b5050565b60145481565b73c7903ece1dc696ecf0c1a123a1ea17283ae6bf8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611165575073d880e1494bfbe60f221b8a8506b5a1959c36127c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806111af575073f1e000b6fe51aed56a8d162a95b0c7a8a751192273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806111f95750736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806112435750733ad232dde2e84b782e2ff044c6e3832eb9e78a2173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061128d575073da6776bfba3252e6720911c4ed6a317e98d4954f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61129657600080fd5b6000479050600060646019836112ac9190615265565b6112b69190615234565b905073c7903ece1dc696ecf0c1a123a1ea17283ae6bf8573ffffffffffffffffffffffffffffffffffffffff16816040516112f090614d2d565b60006040518083038185875af1925050503d806000811461132d576040519150601f19603f3d011682016040523d82523d6000602084013e611332565b606091505b505050600060646019846113469190615265565b6113509190615234565b905073d880e1494bfbe60f221b8a8506b5a1959c36127c73ffffffffffffffffffffffffffffffffffffffff168160405161138a90614d2d565b60006040518083038185875af1925050503d80600081146113c7576040519150601f19603f3d011682016040523d82523d6000602084013e6113cc565b606091505b505050600060646019856113e09190615265565b6113ea9190615234565b905073f1e000b6fe51aed56a8d162a95b0c7a8a751192273ffffffffffffffffffffffffffffffffffffffff168160405161142490614d2d565b60006040518083038185875af1925050503d8060008114611461576040519150601f19603f3d011682016040523d82523d6000602084013e611466565b606091505b50505060006064600f8661147a9190615265565b6114849190615234565b9050736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff16816040516114be90614d2d565b60006040518083038185875af1925050503d80600081146114fb576040519150601f19603f3d011682016040523d82523d6000602084013e611500565b606091505b505050600060646008876115149190615265565b61151e9190615234565b9050733ad232dde2e84b782e2ff044c6e3832eb9e78a2173ffffffffffffffffffffffffffffffffffffffff168160405161155890614d2d565b60006040518083038185875af1925050503d8060008114611595576040519150601f19603f3d011682016040523d82523d6000602084013e61159a565b606091505b505050600060646002886115ae9190615265565b6115b89190615234565b905073da6776bfba3252e6720911c4ed6a317e98d4954f73ffffffffffffffffffffffffffffffffffffffff16816040516115f290614d2d565b60006040518083038185875af1925050503d806000811461162f576040519150601f19603f3d011682016040523d82523d6000602084013e611634565b606091505b5050506000479050736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff168160405161167490614d2d565b60006040518083038185875af1925050503d80600081146116b1576040519150601f19603f3d011682016040523d82523d6000602084013e6116b6565b606091505b5050505050505050505050565b6116de83838360405180602001604052806000815250612721565b505050565b60006116ed610ec3565b821061172e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611725906150af565b60405180910390fd5b60098281548110611768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611782612fb4565b73ffffffffffffffffffffffffffffffffffffffff166117a06120de565b73ffffffffffffffffffffffffffffffffffffffff16146117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed90614fcf565b60405180910390fd5b601160009054906101000a900460ff1615611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90614e0f565b60405180910390fd5b806015908051906020019061185c929190613f10565b5050565b60135481565b73be6e3669464e7db1e1528212f0bff5039461cb8281565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90614f6f565b60405180910390fd5b80915050919050565b6010805461193d906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611969906153a9565b80156119b65780601f1061198b576101008083540402835291602001916119b6565b820191906000526020600020905b81548152906001019060200180831161199957829003601f168201915b505050505081565b60125481565b601580546119d1906153a9565b80601f01602080910402602001604051908101604052809291908181526020018280546119fd906153a9565b8015611a4a5780601f10611a1f57610100808354040283529160200191611a4a565b820191906000526020600020905b815481529060010190602001808311611a2d57829003601f168201915b505050505081565b60008060009050600073be6e3669464e7db1e1528212f0bff5039461cb82905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401611aad9190614d42565b60206040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd919061438d565b905060005b81811015611be95760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5988846040518363ffffffff1660e01b8152600401611b47929190614da9565b60206040518083038186803b158015611b5f57600080fd5b505afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b97919061438d565b90506016600082815260200190815260200160002060009054906101000a900460ff1615611bc55750611bd6565b600185611bd291906151de565b9450505b8080611be1906153db565b915050611b02565b50829350505050919050565b611bfd612fb4565b73ffffffffffffffffffffffffffffffffffffffff16611c1b6120de565b73ffffffffffffffffffffffffffffffffffffffff1614611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6890614fcf565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf690614f4f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d4e612fb4565b73ffffffffffffffffffffffffffffffffffffffff16611d6c6120de565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990614fcf565b60405180910390fd5b601160009054906101000a900460ff1615611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614e0f565b60405180910390fd5b80600e9080519060200190611e28929190613f10565b5050565b611e34612fb4565b73ffffffffffffffffffffffffffffffffffffffff16611e526120de565b73ffffffffffffffffffffffffffffffffffffffff1614611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f90614fcf565b60405180910390fd5b611eb260006133af565b565b60166020528060005260406000206000915054906101000a900460ff1681565b600d60019054906101000a900460ff16611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a9061504f565b60405180910390fd5b600073be6e3669464e7db1e1528212f0bff5039461cb82905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611f779190614d42565b60206040518083038186803b158015611f8f57600080fd5b505afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc7919061438d565b905060005b818110156120d95760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401612011929190614da9565b60206040518083038186803b15801561202957600080fd5b505afa15801561203d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612061919061438d565b90506016600082815260200190815260200160002060009054906101000a900460ff161561208f57506120c6565b60016016600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506120c433613473565b505b80806120d1906153db565b915050611fcc565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054612116906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054612142906153a9565b801561218f5780601f106121645761010080835404028352916020019161218f565b820191906000526020600020905b81548152906001019060200180831161217257829003601f168201915b5050505050905090565b6121a1612fb4565b73ffffffffffffffffffffffffffffffffffffffff166121bf6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220c90614fcf565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6103e881565b600e8054612245906153a9565b80601f0160208091040260200160405190810160405280929190818152602001828054612271906153a9565b80156122be5780601f10612293576101008083540402835291602001916122be565b820191906000526020600020905b8154815290600101906020018083116122a157829003601f168201915b505050505081565b600d60009054906101000a900460ff16612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c9061504f565b60405180910390fd5b60008111612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f9061506f565b60405180910390fd5b6013548111156123685760135490505b6103e86014548261237991906151de565b1115612392576014546103e861238f91906152bf565b90505b600061239d826129cc565b9050803410156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d99061500f565b60405180910390fd5b60005b82811015612423576123f633613473565b60016014600082825461240991906151de565b92505081905550808061241b906153db565b9150506123e5565b506000813461243291906152bf565b905060008111156124b55760003373ffffffffffffffffffffffffffffffffffffffff168260405161246390614d2d565b60006040518083038185875af1925050503d80600081146124a0576040519150601f19603f3d011682016040523d82523d6000602084013e6124a5565b606091505b50509050806124b357600080fd5b505b505050565b6124c2612fb4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252790614eef565b60405180910390fd5b806006600061253d612fb4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166125ea612fb4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161262f9190614dd2565b60405180910390a35050565b612643612fb4565b73ffffffffffffffffffffffffffffffffffffffff166126616120de565b73ffffffffffffffffffffffffffffffffffffffff16146126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90614fcf565b60405180910390fd5b601160009054906101000a900460ff1615612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90614e0f565b60405180910390fd5b806010908051906020019061271d929190613f10565b5050565b61273261272c612fb4565b83613075565b612771576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127689061508f565b60405180910390fd5b61277d84848484613499565b50505050565b61278b612fb4565b73ffffffffffffffffffffffffffffffffffffffff166127a96120de565b73ffffffffffffffffffffffffffffffffffffffff16146127ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f690614fcf565b60405180910390fd5b8060138190555050565b6060600082118015612822575061281e610ec3565b8211155b612861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890614e2f565b60405180910390fd5b6000600e8054612870906153a9565b905011156128ad57600c600e612885846134f5565b60405160200161289793929190614cf1565b60405160208183030381529060405290506128db565b60156128b8836134f5565b6040516020016128c9929190614ccd565b60405160208183030381529060405290505b919050565b601160009054906101000a900460ff1681565b736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461293f57600080fd5b6000736928ae2f8f1695559b5bf1c21c16e1390dd1314473ffffffffffffffffffffffffffffffffffffffff164760405161297990614d2d565b60006040518083038185875af1925050503d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b50509050806129c957600080fd5b50565b60006103e88211156129dd57600080fd5b601254826129eb9190615265565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a8e612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612aac6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990614fcf565b60405180910390fd5b60005b81811015612b2957612b1633613473565b8080612b21906153db565b915050612b05565b5050565b612b35612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612b536120de565b73ffffffffffffffffffffffffffffffffffffffff1614612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614fcf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1090614e8f565b60405180910390fd5b612c22816133af565b50565b612c2d612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612c4b6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9890614fcf565b60405180910390fd5b8060128190555050565b612cb3612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612cd16120de565b73ffffffffffffffffffffffffffffffffffffffff1614612d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1e90614fcf565b60405180910390fd5b6001601160006101000a81548160ff021916908315150217905550565b600d60009054906101000a900460ff1681565b612d5f612fb4565b73ffffffffffffffffffffffffffffffffffffffff16612d7d6120de565b73ffffffffffffffffffffffffffffffffffffffff1614612dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dca90614fcf565b60405180910390fd5b601160009054906101000a900460ff1615612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90614e0f565b60405180910390fd5b80600f9080519060200190612e39929190613f10565b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f3157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f415750612f40826136a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661302f8361187e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061308082612f48565b6130bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b690614f0f565b60405180910390fd5b60006130ca8361187e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061313957508373ffffffffffffffffffffffffffffffffffffffff1661312184610c85565b73ffffffffffffffffffffffffffffffffffffffff16145b8061314a575061314981856129f2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166131738261187e565b73ffffffffffffffffffffffffffffffffffffffff16146131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c090614fef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323090614ecf565b60405180910390fd5b61324483838361370c565b61324f600082612fbc565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461329f91906152bf565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132f691906151de565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61347d600b612e3d565b6000613489600b612e53565b90506134958282613820565b5050565b6134a4848484613153565b6134b0848484846139ee565b6134ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e690614e6f565b60405180910390fd5b50505050565b6060600082141561353d576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061369d565b600082905060005b6000821461356f578080613558906153db565b915050600a826135689190615234565b9150613545565b60008167ffffffffffffffff8111156135b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135e35781602001600182028036833780820191505090505b5090505b60008514613696576001826135fc91906152bf565b9150600a8561360b9190615424565b603061361791906151de565b60f81b818381518110613653577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561368f9190615234565b94506135e7565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613717838383612e61565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561375a5761375581613b85565b613799565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613798576137978382613bce565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137dc576137d781613d3b565b61381b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461381a576138198282613e7e565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388790614f8f565b60405180910390fd5b61389981612f48565b156138d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d090614eaf565b60405180910390fd5b6138e56000838361370c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461393591906151de565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613a0f8473ffffffffffffffffffffffffffffffffffffffff16613efd565b15613b78578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a38612fb4565b8786866040518563ffffffff1660e01b8152600401613a5a9493929190614d5d565b602060405180830381600087803b158015613a7457600080fd5b505af1925050508015613aa557506040513d601f19601f82011682018060405250810190613aa291906142fa565b60015b613b28573d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b50600081511415613b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1790614e6f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b7d565b600190505b949350505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613bdb84611c8e565b613be591906152bf565b9050600060086000848152602001908152602001600020549050818114613cca576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613d4f91906152bf565b90506000600a6000848152602001908152602001600020549050600060098381548110613da5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613ded577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613e62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613e8983611c8e565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613f1c906153a9565b90600052602060002090601f016020900481019282613f3e5760008555613f85565b82601f10613f5757805160ff1916838001178555613f85565b82800160010185558215613f85579182015b82811115613f84578251825591602001919060010190613f69565b5b509050613f929190613f96565b5090565b5b80821115613faf576000816000905550600101613f97565b5090565b6000613fc6613fc18461511b565b6150ea565b905082815260208101848484011115613fde57600080fd5b613fe9848285615367565b509392505050565b6000614004613fff8461514b565b6150ea565b90508281526020810184848401111561401c57600080fd5b614027848285615367565b509392505050565b60008135905061403e81615522565b92915050565b60008135905061405381615539565b92915050565b60008135905061406881615550565b92915050565b60008151905061407d81615550565b92915050565b600082601f83011261409457600080fd5b81356140a4848260208601613fb3565b91505092915050565b600082601f8301126140be57600080fd5b81356140ce848260208601613ff1565b91505092915050565b6000813590506140e681615567565b92915050565b6000815190506140fb81615567565b92915050565b60006020828403121561411357600080fd5b60006141218482850161402f565b91505092915050565b6000806040838503121561413d57600080fd5b600061414b8582860161402f565b925050602061415c8582860161402f565b9150509250929050565b60008060006060848603121561417b57600080fd5b60006141898682870161402f565b935050602061419a8682870161402f565b92505060406141ab868287016140d7565b9150509250925092565b600080600080608085870312156141cb57600080fd5b60006141d98782880161402f565b94505060206141ea8782880161402f565b93505060406141fb878288016140d7565b925050606085013567ffffffffffffffff81111561421857600080fd5b61422487828801614083565b91505092959194509250565b6000806040838503121561424357600080fd5b60006142518582860161402f565b925050602061426285828601614044565b9150509250929050565b6000806040838503121561427f57600080fd5b600061428d8582860161402f565b925050602061429e858286016140d7565b9150509250929050565b6000602082840312156142ba57600080fd5b60006142c884828501614044565b91505092915050565b6000602082840312156142e357600080fd5b60006142f184828501614059565b91505092915050565b60006020828403121561430c57600080fd5b600061431a8482850161406e565b91505092915050565b60006020828403121561433557600080fd5b600082013567ffffffffffffffff81111561434f57600080fd5b61435b848285016140ad565b91505092915050565b60006020828403121561437657600080fd5b6000614384848285016140d7565b91505092915050565b60006020828403121561439f57600080fd5b60006143ad848285016140ec565b91505092915050565b6143bf816152f3565b82525050565b6143ce81615305565b82525050565b60006143df82615190565b6143e981856151a6565b93506143f9818560208601615376565b61440281615511565b840191505092915050565b60006144188261519b565b61442281856151c2565b9350614432818560208601615376565b61443b81615511565b840191505092915050565b60006144518261519b565b61445b81856151d3565b935061446b818560208601615376565b80840191505092915050565b60008154614484816153a9565b61448e81866151d3565b945060018216600081146144a957600181146144ba576144ed565b60ff198316865281860193506144ed565b6144c38561517b565b60005b838110156144e5578154818901526001820191506020810190506144c6565b838801955050505b50505092915050565b60006145036018836151c2565b91507f436f6e747261637420686173206265656e206c6f636b656400000000000000006000830152602082019050919050565b6000614543601f836151c2565b91507f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006000830152602082019050919050565b6000614583602b836151c2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006145e96032836151c2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061464f6026836151c2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146b5601c836151c2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006146f56024836151c2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475b6019836151c2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061479b602c836151c2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006148016038836151c2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614867602a836151c2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148cd6029836151c2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149336020836151c2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614973602c836151c2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149d96020836151c2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a196029836151c2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a7f6013836151c2565b91507f4e6f7420656e6f756768204554482073656e74000000000000000000000000006000830152602082019050919050565b6000614abf6021836151c2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b256011836151c2565b91507f44726f70206e6f74206f70656e207965740000000000000000000000000000006000830152602082019050919050565b6000614b65601b836151c2565b91507f5175616e74697479206d757374206265206174206c65617374203100000000006000830152602082019050919050565b6000614ba56000836151b7565b9150600082019050919050565b6000614bbf6031836151c2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614c25602c836151c2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614c8b6001836151d3565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b614cc78161535d565b82525050565b6000614cd98285614477565b9150614ce58284614446565b91508190509392505050565b6000614cfd8286614477565b9150614d098285614477565b9150614d1482614c7e565b9150614d208284614446565b9150819050949350505050565b6000614d3882614b98565b9150819050919050565b6000602082019050614d5760008301846143b6565b92915050565b6000608082019050614d7260008301876143b6565b614d7f60208301866143b6565b614d8c6040830185614cbe565b8181036060830152614d9e81846143d4565b905095945050505050565b6000604082019050614dbe60008301856143b6565b614dcb6020830184614cbe565b9392505050565b6000602082019050614de760008301846143c5565b92915050565b60006020820190508181036000830152614e07818461440d565b905092915050565b60006020820190508181036000830152614e28816144f6565b9050919050565b60006020820190508181036000830152614e4881614536565b9050919050565b60006020820190508181036000830152614e6881614576565b9050919050565b60006020820190508181036000830152614e88816145dc565b9050919050565b60006020820190508181036000830152614ea881614642565b9050919050565b60006020820190508181036000830152614ec8816146a8565b9050919050565b60006020820190508181036000830152614ee8816146e8565b9050919050565b60006020820190508181036000830152614f088161474e565b9050919050565b60006020820190508181036000830152614f288161478e565b9050919050565b60006020820190508181036000830152614f48816147f4565b9050919050565b60006020820190508181036000830152614f688161485a565b9050919050565b60006020820190508181036000830152614f88816148c0565b9050919050565b60006020820190508181036000830152614fa881614926565b9050919050565b60006020820190508181036000830152614fc881614966565b9050919050565b60006020820190508181036000830152614fe8816149cc565b9050919050565b6000602082019050818103600083015261500881614a0c565b9050919050565b6000602082019050818103600083015261502881614a72565b9050919050565b6000602082019050818103600083015261504881614ab2565b9050919050565b6000602082019050818103600083015261506881614b18565b9050919050565b6000602082019050818103600083015261508881614b58565b9050919050565b600060208201905081810360008301526150a881614bb2565b9050919050565b600060208201905081810360008301526150c881614c18565b9050919050565b60006020820190506150e46000830184614cbe565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615111576151106154e2565b5b8060405250919050565b600067ffffffffffffffff821115615136576151356154e2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615166576151656154e2565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006151e98261535d565b91506151f48361535d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561522957615228615455565b5b828201905092915050565b600061523f8261535d565b915061524a8361535d565b92508261525a57615259615484565b5b828204905092915050565b60006152708261535d565b915061527b8361535d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b4576152b3615455565b5b828202905092915050565b60006152ca8261535d565b91506152d58361535d565b9250828210156152e8576152e7615455565b5b828203905092915050565b60006152fe8261533d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615394578082015181840152602081019050615379565b838111156153a3576000848401525b50505050565b600060028204905060018216806153c157607f821691505b602082108114156153d5576153d46154b3565b5b50919050565b60006153e68261535d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561541957615418615455565b5b600182019050919050565b600061542f8261535d565b915061543a8361535d565b92508261544a57615449615484565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61552b816152f3565b811461553657600080fd5b50565b61554281615305565b811461554d57600080fd5b50565b61555981615311565b811461556457600080fd5b50565b6155708161535d565b811461557b57600080fd5b5056fea2646970667358221220a0fc00879773c85537a6d8e4d71dbef6bada37da0f16b468a4fb96a59a76803a64736f6c63430008000033

Deployed Bytecode Sourcemap

49151:7374:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42924:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21680:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23239:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22762:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49727:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49656:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43564:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24129:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52264:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43232:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53832:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49926:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54475:1554;;;;;;;;;;;;;:::i;:::-;;24539:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43754:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53710:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49888:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49503:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21374:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49765:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49841:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49960:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51793:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53508:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21104:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53950:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37350:94;;;;;;;;;;;;;:::i;:::-;;49995:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51305:480;;;;;;;;;;;;;:::i;:::-;;36699:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21849:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53605:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49449:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49693:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50344:953;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23532:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54064:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24795:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53304:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52558:545;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49806:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56037:283;;;;;;;;;;;;;:::i;:::-;;52390:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23898:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53133:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37599:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53408:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54400:67;;;;;;;;;;;;;:::i;:::-;;49623:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54238:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42924:224;43026:4;43065:35;43050:50;;;:11;:50;;;;:90;;;;43104:36;43128:11;43104:23;:36::i;:::-;43050:90;43043:97;;42924:224;;;:::o;21680:100::-;21734:13;21767:5;21760:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21680:100;:::o;23239:221::-;23315:7;23343:16;23351:7;23343;:16::i;:::-;23335:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23428:15;:24;23444:7;23428:24;;;;;;;;;;;;;;;;;;;;;23421:31;;23239:221;;;:::o;22762:411::-;22843:13;22859:23;22874:7;22859:14;:23::i;:::-;22843:39;;22907:5;22901:11;;:2;:11;;;;22893:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23001:5;22985:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23010:37;23027:5;23034:12;:10;:12::i;:::-;23010:16;:37::i;:::-;22985:62;22963:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23144:21;23153:2;23157:7;23144:8;:21::i;:::-;22762:411;;;:::o;49727:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49656:28::-;;;;;;;;;;;;;:::o;43564:113::-;43625:7;43652:10;:17;;;;43645:24;;43564:113;:::o;24129:339::-;24324:41;24343:12;:10;:12::i;:::-;24357:7;24324:18;:41::i;:::-;24316:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24432:28;24442:4;24448:2;24452:7;24432:9;:28::i;:::-;24129:339;;;:::o;52264:118::-;52330:7;52365:9;;52357:5;:17;;;;:::i;:::-;52350:24;;52264:118;;;:::o;43232:256::-;43329:7;43365:23;43382:5;43365:16;:23::i;:::-;43357:5;:31;43349:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43454:12;:19;43467:5;43454:19;;;;;;;;;;;;;;;:26;43474:5;43454:26;;;;;;;;;;;;43447:33;;43232:256;;;;:::o;53832:110::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50081:6:::1;;;;;;;;;;;50080:7;50072:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;53926:8:::2;53916:7;:18;;;;;;;;;;;;:::i;:::-;;53832:110:::0;:::o;49926:25::-;;;;:::o;54475:1554::-;54551:42;54537:56;;:10;:56;;;:133;;;;54628:42;54614:56;;:10;:56;;;54537:133;:210;;;;54705:42;54691:56;;:10;:56;;;54537:210;:287;;;;54782:42;54768:56;;:10;:56;;;54537:287;:364;;;;54859:42;54845:56;;:10;:56;;;54537:364;:441;;;;54936:42;54922:56;;:10;:56;;;54537:441;54515:474;;;;;;55002:11;55016:21;55002:35;;55050:10;55074:3;55069:2;55063:3;:8;;;;:::i;:::-;:14;;;;:::i;:::-;55050:27;;55104:42;55088:65;;55161:2;55088:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55181:10;55205:3;55200:2;55194:3;:8;;;;:::i;:::-;:14;;;;:::i;:::-;55181:27;;55235:42;55219:65;;55292:2;55219:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55312:10;55336:3;55331:2;55325:3;:8;;;;:::i;:::-;:14;;;;:::i;:::-;55312:27;;55366:42;55350:65;;55423:2;55350:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55443:10;55467:3;55462:2;55456:3;:8;;;;:::i;:::-;:14;;;;:::i;:::-;55443:27;;55497:42;55481:65;;55554:2;55481:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55574:10;55597:3;55593:1;55587:3;:7;;;;:::i;:::-;:13;;;;:::i;:::-;55574:26;;55627:42;55611:65;;55684:2;55611:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55704:10;55727:3;55723:1;55717:3;:7;;;;:::i;:::-;:13;;;;:::i;:::-;55704:26;;55757:42;55741:65;;55828:2;55741:104;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55858:17;55878:21;55858:41;;55926:42;55910:65;;55997:9;55910:111;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54475:1554;;;;;;;;:::o;24539:185::-;24677:39;24694:4;24700:2;24704:7;24677:39;;;;;;;;;;;;:16;:39::i;:::-;24539:185;;;:::o;43754:233::-;43829:7;43865:30;:28;:30::i;:::-;43857:5;:38;43849:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43962:10;43973:5;43962:17;;;;;;;;;;;;;;;;;;;;;;;;43955:24;;43754:233;;;:::o;53710:114::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50081:6:::1;;;;;;;;;;;50080:7;50072:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;53806:10:::2;53796:7;:20;;;;;;;;;;;;:::i;:::-;;53710:114:::0;:::o;49888:29::-;;;;:::o;49503:89::-;49550:42;49503:89;:::o;21374:239::-;21446:7;21466:13;21482:7;:16;21490:7;21482:16;;;;;;;;;;;;;;;;;;;;;21466:32;;21534:1;21517:19;;:5;:19;;;;21509:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21600:5;21593:12;;;21374:239;;;:::o;49765:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49841:38::-;;;;:::o;49960:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51793:463::-;51850:7;51870:13;51886:1;51870:17;;51898:21;49550:42;51898:53;;51962:15;51980:4;:14;;;51995:5;51980:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51962:39;;52017:9;52012:214;52036:7;52032:1;:11;52012:214;;;52065:13;52081:4;:24;;;52106:5;52113:1;52081:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52065:50;;52134:4;:11;52139:5;52134:11;;;;;;;;;;;;;;;;;;;;;52130:60;;;52166:8;;;52130:60;52213:1;52204:10;;;;;:::i;:::-;;;52012:214;;52045:3;;;;;:::i;:::-;;;;52012:214;;;;52243:5;52236:12;;;;;51793:463;;;:::o;53508:89::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53579:10:::1;53572:4;;:17;;;;;;;;;;;;;;;;;;53508:89:::0;:::o;21104:208::-;21176:7;21221:1;21204:19;;:5;:19;;;;21196:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21288:9;:16;21298:5;21288:16;;;;;;;;;;;;;;;;21281:23;;21104:208;;;:::o;53950:106::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50081:6:::1;;;;;;;;;;;50080:7;50072:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54041:7:::2;54032:6;:16;;;;;;;;;;;;:::i;:::-;;53950:106:::0;:::o;37350:94::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37415:21:::1;37433:1;37415:9;:21::i;:::-;37350:94::o:0;49995:36::-;;;;;;;;;;;;;;;;;;;;;;:::o;51305:480::-;51351:8;;;;;;;;;;;51343:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51392:21;49550:42;51392:53;;51456:15;51474:4;:14;;;51489:10;51474:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51456:44;;51516:9;51511:267;51535:7;51531:1;:11;51511:267;;;51564:13;51580:4;:24;;;51605:10;51617:1;51580:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51564:55;;51638:4;:11;51643:5;51638:11;;;;;;;;;;;;;;;;;;;;;51634:60;;;51670:8;;;51634:60;51722:4;51708;:11;51713:5;51708:11;;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;51741:25;51755:10;51741:13;:25::i;:::-;51511:267;;51544:3;;;;;:::i;:::-;;;;51511:267;;;;51305:480;;:::o;36699:87::-;36745:7;36772:6;;;;;;;;;;;36765:13;;36699:87;:::o;21849:104::-;21905:13;21938:7;21931:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21849:104;:::o;53605:97::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53684:10:::1;53673:8;;:21;;;;;;;;;;;;;;;;;;53605:97:::0;:::o;49449:45::-;49490:4;49449:45;:::o;49693:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50344:953::-;50410:4;;;;;;;;;;;50402:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;50466:1;50455:8;:12;50447:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50550:10;;50539:8;:21;50535:75;;;50588:10;;50577:21;;50535:75;49490:4;50687:6;;50676:8;:17;;;;:::i;:::-;:34;50672:101;;;50755:6;;49490:4;50738:23;;;;:::i;:::-;50727:34;;50672:101;50785:13;50801:18;50810:8;50801;:18::i;:::-;50785:34;;50883:5;50870:9;:18;;50862:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;50930:9;50925:117;50949:8;50945:1;:12;50925:117;;;50979:25;50993:10;50979:13;:25::i;:::-;51029:1;51019:6;;:11;;;;;;;:::i;:::-;;;;;;;;50959:3;;;;;:::i;:::-;;;;50925:117;;;;51107:17;51139:5;51127:9;:17;;;;:::i;:::-;51107:37;;51173:1;51161:9;:13;51157:133;;;51192:12;51210:10;:15;;51233:9;51210:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51191:56;;;51270:7;51262:16;;;;;;51157:133;;50344:953;;;:::o;23532:295::-;23647:12;:10;:12::i;:::-;23635:24;;:8;:24;;;;23627:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23747:8;23702:18;:32;23721:12;:10;:12::i;:::-;23702:32;;;;;;;;;;;;;;;:42;23735:8;23702:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23800:8;23771:48;;23786:12;:10;:12::i;:::-;23771:48;;;23810:8;23771:48;;;;;;:::i;:::-;;;;;;;;23532:295;;:::o;54064:166::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50081:6:::1;;;;;;;;;;;50080:7;50072:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54208:14:::2;54192:13;:30;;;;;;;;;;;;:::i;:::-;;54064:166:::0;:::o;24795:328::-;24970:41;24989:12;:10;:12::i;:::-;25003:7;24970:18;:41::i;:::-;24962:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25076:39;25090:4;25096:2;25100:7;25109:5;25076:13;:39::i;:::-;24795:328;;;;:::o;53304:96::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53386:6:::1;53373:10;:19;;;;53304:96:::0;:::o;52558:545::-;52676:13;52739:1;52729:7;:11;:39;;;;;52755:13;:11;:13::i;:::-;52744:7;:24;;52729:39;52707:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;52865:1;52848:6;52842:20;;;;;:::i;:::-;;;:24;52838:187;;;52953:7;52962:6;52975:18;:7;:16;:18::i;:::-;52936:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52883:130;;;;52838:187;53066:7;53075:18;:7;:16;:18::i;:::-;53049:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53035:60;;52558:545;;;;:::o;49806:26::-;;;;;;;;;;;;;:::o;56037:283::-;56108:42;56094:56;;:10;:56;;;56086:65;;;;;;56163:12;56189:42;56181:70;;56259:21;56181:104;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56162:123;;;56304:7;56296:16;;;;;;56037:283;:::o;52390:160::-;52447:7;49490:4;52475:8;:26;;52467:35;;;;;;52532:9;;52520:8;:22;;;;:::i;:::-;52513:29;;52390:160;;;:::o;23898:164::-;23995:4;24019:18;:25;24038:5;24019:25;;;;;;;;;;;;;;;:35;24045:8;24019:35;;;;;;;;;;;;;;;;;;;;;;;;;24012:42;;23898:164;;;;:::o;53133:163::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53203:9:::1;53198:91;53222:8;53218:1;:12;53198:91;;;53252:25;53266:10;53252:13;:25::i;:::-;53232:3;;;;;:::i;:::-;;;;53198:91;;;;53133:163:::0;:::o;37599:192::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37708:1:::1;37688:22;;:8;:22;;;;37680:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37764:19;37774:8;37764:9;:19::i;:::-;37599:192:::0;:::o;53408:92::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53487:5:::1;53475:9;:17;;;;53408:92:::0;:::o;54400:67::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54455:4:::1;54446:6;;:13;;;;;;;;;;;;;;;;;;54400:67::o:0;49623:24::-;;;;;;;;;;;;;:::o;54238:154::-;36930:12;:10;:12::i;:::-;36919:23;;:7;:5;:7::i;:::-;:23;;;36911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50081:6:::1;;;;;;;;;;;50080:7;50072:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54373:11:::2;54360:10;:24;;;;;;;;;;;;:::i;:::-;;54238:154:::0;:::o;38922:127::-;39029:1;39011:7;:14;;;:19;;;;;;;;;;;38922:127;:::o;38800:114::-;38865:7;38892;:14;;;38885:21;;38800:114;;;:::o;32725:126::-;;;;:::o;20735:305::-;20837:4;20889:25;20874:40;;;:11;:40;;;;:105;;;;20946:33;20931:48;;;:11;:48;;;;20874:105;:158;;;;20996:36;21020:11;20996:23;:36::i;:::-;20874:158;20854:178;;20735:305;;;:::o;26633:127::-;26698:4;26750:1;26722:30;;:7;:16;26730:7;26722:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26715:37;;26633:127;;;:::o;16149:98::-;16202:7;16229:10;16222:17;;16149:98;:::o;30615:174::-;30717:2;30690:15;:24;30706:7;30690:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30773:7;30769:2;30735:46;;30744:23;30759:7;30744:14;:23::i;:::-;30735:46;;;;;;;;;;;;30615:174;;:::o;26927:348::-;27020:4;27045:16;27053:7;27045;:16::i;:::-;27037:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27121:13;27137:23;27152:7;27137:14;:23::i;:::-;27121:39;;27190:5;27179:16;;:7;:16;;;:51;;;;27223:7;27199:31;;:20;27211:7;27199:11;:20::i;:::-;:31;;;27179:51;:87;;;;27234:32;27251:5;27258:7;27234:16;:32::i;:::-;27179:87;27171:96;;;26927:348;;;;:::o;29919:578::-;30078:4;30051:31;;:23;30066:7;30051:14;:23::i;:::-;:31;;;30043:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30161:1;30147:16;;:2;:16;;;;30139:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30217:39;30238:4;30244:2;30248:7;30217:20;:39::i;:::-;30321:29;30338:1;30342:7;30321:8;:29::i;:::-;30382:1;30363:9;:15;30373:4;30363:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30411:1;30394:9;:13;30404:2;30394:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30442:2;30423:7;:16;30431:7;30423:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30481:7;30477:2;30462:27;;30471:4;30462:27;;;;;;;;;;;;29919:578;;;:::o;37799:173::-;37855:16;37874:6;;;;;;;;;;;37855:25;;37900:8;37891:6;;:17;;;;;;;;;;;;;;;;;;37955:8;37924:40;;37945:8;37924:40;;;;;;;;;;;;37799:173;;:::o;56352:170::-;56409:21;:9;:19;:21::i;:::-;56441:17;56461:19;:9;:17;:19::i;:::-;56441:39;;56491:23;56497:5;56504:9;56491:5;:23::i;:::-;56352:170;;:::o;26005:315::-;26162:28;26172:4;26178:2;26182:7;26162:9;:28::i;:::-;26209:48;26232:4;26238:2;26242:7;26251:5;26209:22;:48::i;:::-;26201:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26005:315;;;;:::o;16678:723::-;16734:13;16964:1;16955:5;:10;16951:53;;;16982:10;;;;;;;;;;;;;;;;;;;;;16951:53;17014:12;17029:5;17014:20;;17045:14;17070:78;17085:1;17077:4;:9;17070:78;;17103:8;;;;;:::i;:::-;;;;17134:2;17126:10;;;;;:::i;:::-;;;17070:78;;;17158:19;17190:6;17180:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17158:39;;17208:154;17224:1;17215:5;:10;17208:154;;17252:1;17242:11;;;;;:::i;:::-;;;17319:2;17311:5;:10;;;;:::i;:::-;17298:2;:24;;;;:::i;:::-;17285:39;;17268:6;17275;17268:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17348:2;17339:11;;;;;:::i;:::-;;;17208:154;;;17386:6;17372:21;;;;;16678:723;;;;:::o;19237:157::-;19322:4;19361:25;19346:40;;;:11;:40;;;;19339:47;;19237:157;;;:::o;44600:589::-;44744:45;44771:4;44777:2;44781:7;44744:26;:45::i;:::-;44822:1;44806:18;;:4;:18;;;44802:187;;;44841:40;44873:7;44841:31;:40::i;:::-;44802:187;;;44911:2;44903:10;;:4;:10;;;44899:90;;44930:47;44963:4;44969:7;44930:32;:47::i;:::-;44899:90;44802:187;45017:1;45003:16;;:2;:16;;;44999:183;;;45036:45;45073:7;45036:36;:45::i;:::-;44999:183;;;45109:4;45103:10;;:2;:10;;;45099:83;;45130:40;45158:2;45162:7;45130:27;:40::i;:::-;45099:83;44999:183;44600:589;;;:::o;28611:382::-;28705:1;28691:16;;:2;:16;;;;28683:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28764:16;28772:7;28764;:16::i;:::-;28763:17;28755:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28826:45;28855:1;28859:2;28863:7;28826:20;:45::i;:::-;28901:1;28884:9;:13;28894:2;28884:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28932:2;28913:7;:16;28921:7;28913:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28977:7;28973:2;28952:33;;28969:1;28952:33;;;;;;;;;;;;28611:382;;:::o;31354:799::-;31509:4;31530:15;:2;:13;;;:15::i;:::-;31526:620;;;31582:2;31566:36;;;31603:12;:10;:12::i;:::-;31617:4;31623:7;31632:5;31566:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31562:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31825:1;31808:6;:13;:18;31804:272;;;31851:60;;;;;;;;;;:::i;:::-;;;;;;;;31804:272;32026:6;32020:13;32011:6;32007:2;32003:15;31996:38;31562:529;31699:41;;;31689:51;;;:6;:51;;;;31682:58;;;;;31526:620;32130:4;32123:11;;31354:799;;;;;;;:::o;45912:164::-;46016:10;:17;;;;45989:15;:24;46005:7;45989:24;;;;;;;;;;;:44;;;;46044:10;46060:7;46044:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45912:164;:::o;46703:988::-;46969:22;47019:1;46994:22;47011:4;46994:16;:22::i;:::-;:26;;;;:::i;:::-;46969:51;;47031:18;47052:17;:26;47070:7;47052:26;;;;;;;;;;;;47031:47;;47199:14;47185:10;:28;47181:328;;47230:19;47252:12;:18;47265:4;47252:18;;;;;;;;;;;;;;;:34;47271:14;47252:34;;;;;;;;;;;;47230:56;;47336:11;47303:12;:18;47316:4;47303:18;;;;;;;;;;;;;;;:30;47322:10;47303:30;;;;;;;;;;;:44;;;;47453:10;47420:17;:30;47438:11;47420:30;;;;;;;;;;;:43;;;;47181:328;;47605:17;:26;47623:7;47605:26;;;;;;;;;;;47598:33;;;47649:12;:18;47662:4;47649:18;;;;;;;;;;;;;;;:34;47668:14;47649:34;;;;;;;;;;;47642:41;;;46703:988;;;;:::o;47986:1079::-;48239:22;48284:1;48264:10;:17;;;;:21;;;;:::i;:::-;48239:46;;48296:18;48317:15;:24;48333:7;48317:24;;;;;;;;;;;;48296:45;;48668:19;48690:10;48701:14;48690:26;;;;;;;;;;;;;;;;;;;;;;;;48668:48;;48754:11;48729:10;48740;48729:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48865:10;48834:15;:28;48850:11;48834:28;;;;;;;;;;;:41;;;;49006:15;:24;49022:7;49006:24;;;;;;;;;;;48999:31;;;49041:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47986:1079;;;;:::o;45490:221::-;45575:14;45592:20;45609:2;45592:16;:20::i;:::-;45575:37;;45650:7;45623:12;:16;45636:2;45623:16;;;;;;;;;;;;;;;:24;45640:6;45623:24;;;;;;;;;;;:34;;;;45697:6;45668:17;:26;45686:7;45668:26;;;;;;;;;;;:35;;;;45490:221;;;:::o;8189:387::-;8249:4;8457:12;8524:7;8512:20;8504:28;;8567:1;8560:4;:8;8553:15;;;8189:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:143::-;;2095:6;2089:13;2080:22;;2111:33;2138:5;2111:33;:::i;:::-;2070:80;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:256::-;;5135:2;5123:9;5114:7;5110:23;5106:32;5103:2;;;5151:1;5148;5141:12;5103:2;5194:1;5219:50;5261:7;5252:6;5241:9;5237:22;5219:50;:::i;:::-;5209:60;;5165:114;5093:193;;;;:::o;5292:260::-;;5399:2;5387:9;5378:7;5374:23;5370:32;5367:2;;;5415:1;5412;5405:12;5367:2;5458:1;5483:52;5527:7;5518:6;5507:9;5503:22;5483:52;:::i;:::-;5473:62;;5429:116;5357:195;;;;:::o;5558:282::-;;5676:2;5664:9;5655:7;5651:23;5647:32;5644:2;;;5692:1;5689;5682:12;5644:2;5735:1;5760:63;5815:7;5806:6;5795:9;5791:22;5760:63;:::i;:::-;5750:73;;5706:127;5634:206;;;;:::o;5846:375::-;;5964:2;5952:9;5943:7;5939:23;5935:32;5932:2;;;5980:1;5977;5970:12;5932:2;6051:1;6040:9;6036:17;6023:31;6081:18;6073:6;6070:30;6067:2;;;6113:1;6110;6103:12;6067:2;6141:63;6196:7;6187:6;6176:9;6172:22;6141:63;:::i;:::-;6131:73;;5994:220;5922:299;;;;:::o;6227:262::-;;6335:2;6323:9;6314:7;6310:23;6306:32;6303:2;;;6351:1;6348;6341:12;6303:2;6394:1;6419:53;6464:7;6455:6;6444:9;6440:22;6419:53;:::i;:::-;6409:63;;6365:117;6293:196;;;;:::o;6495:284::-;;6614:2;6602:9;6593:7;6589:23;6585:32;6582:2;;;6630:1;6627;6620:12;6582:2;6673:1;6698:64;6754:7;6745:6;6734:9;6730:22;6698:64;:::i;:::-;6688:74;;6644:128;6572:207;;;;:::o;6785:118::-;6872:24;6890:5;6872:24;:::i;:::-;6867:3;6860:37;6850:53;;:::o;6909:109::-;6990:21;7005:5;6990:21;:::i;:::-;6985:3;6978:34;6968:50;;:::o;7024:360::-;;7138:38;7170:5;7138:38;:::i;:::-;7192:70;7255:6;7250:3;7192:70;:::i;:::-;7185:77;;7271:52;7316:6;7311:3;7304:4;7297:5;7293:16;7271:52;:::i;:::-;7348:29;7370:6;7348:29;:::i;:::-;7343:3;7339:39;7332:46;;7114:270;;;;;:::o;7390:364::-;;7506:39;7539:5;7506:39;:::i;:::-;7561:71;7625:6;7620:3;7561:71;:::i;:::-;7554:78;;7641:52;7686:6;7681:3;7674:4;7667:5;7663:16;7641:52;:::i;:::-;7718:29;7740:6;7718:29;:::i;:::-;7713:3;7709:39;7702:46;;7482:272;;;;;:::o;7760:377::-;;7894:39;7927:5;7894:39;:::i;:::-;7949:89;8031:6;8026:3;7949:89;:::i;:::-;7942:96;;8047:52;8092:6;8087:3;8080:4;8073:5;8069:16;8047:52;:::i;:::-;8124:6;8119:3;8115:16;8108:23;;7870:267;;;;;:::o;8167:845::-;;8307:5;8301:12;8336:36;8362:9;8336:36;:::i;:::-;8388:89;8470:6;8465:3;8388:89;:::i;:::-;8381:96;;8508:1;8497:9;8493:17;8524:1;8519:137;;;;8670:1;8665:341;;;;8486:520;;8519:137;8603:4;8599:9;8588;8584:25;8579:3;8572:38;8639:6;8634:3;8630:16;8623:23;;8519:137;;8665:341;8732:38;8764:5;8732:38;:::i;:::-;8792:1;8806:154;8820:6;8817:1;8814:13;8806:154;;;8894:7;8888:14;8884:1;8879:3;8875:11;8868:35;8944:1;8935:7;8931:15;8920:26;;8842:4;8839:1;8835:12;8830:17;;8806:154;;;8989:6;8984:3;8980:16;8973:23;;8672:334;;8486:520;;8274:738;;;;;;:::o;9018:322::-;;9181:67;9245:2;9240:3;9181:67;:::i;:::-;9174:74;;9278:26;9274:1;9269:3;9265:11;9258:47;9331:2;9326:3;9322:12;9315:19;;9164:176;;;:::o;9346:329::-;;9509:67;9573:2;9568:3;9509:67;:::i;:::-;9502:74;;9606:33;9602:1;9597:3;9593:11;9586:54;9666:2;9661:3;9657:12;9650:19;;9492:183;;;:::o;9681:375::-;;9844:67;9908:2;9903:3;9844:67;:::i;:::-;9837:74;;9941:34;9937:1;9932:3;9928:11;9921:55;10007:13;10002:2;9997:3;9993:12;9986:35;10047:2;10042:3;10038:12;10031:19;;9827:229;;;:::o;10062:382::-;;10225:67;10289:2;10284:3;10225:67;:::i;:::-;10218:74;;10322:34;10318:1;10313:3;10309:11;10302:55;10388:20;10383:2;10378:3;10374:12;10367:42;10435:2;10430:3;10426:12;10419:19;;10208:236;;;:::o;10450:370::-;;10613:67;10677:2;10672:3;10613:67;:::i;:::-;10606:74;;10710:34;10706:1;10701:3;10697:11;10690:55;10776:8;10771:2;10766:3;10762:12;10755:30;10811:2;10806:3;10802:12;10795:19;;10596:224;;;:::o;10826:326::-;;10989:67;11053:2;11048:3;10989:67;:::i;:::-;10982:74;;11086:30;11082:1;11077:3;11073:11;11066:51;11143:2;11138:3;11134:12;11127:19;;10972:180;;;:::o;11158:368::-;;11321:67;11385:2;11380:3;11321:67;:::i;:::-;11314:74;;11418:34;11414:1;11409:3;11405:11;11398:55;11484:6;11479:2;11474:3;11470:12;11463:28;11517:2;11512:3;11508:12;11501:19;;11304:222;;;:::o;11532:323::-;;11695:67;11759:2;11754:3;11695:67;:::i;:::-;11688:74;;11792:27;11788:1;11783:3;11779:11;11772:48;11846:2;11841:3;11837:12;11830:19;;11678:177;;;:::o;11861:376::-;;12024:67;12088:2;12083:3;12024:67;:::i;:::-;12017:74;;12121:34;12117:1;12112:3;12108:11;12101:55;12187:14;12182:2;12177:3;12173:12;12166:36;12228:2;12223:3;12219:12;12212:19;;12007:230;;;:::o;12243:388::-;;12406:67;12470:2;12465:3;12406:67;:::i;:::-;12399:74;;12503:34;12499:1;12494:3;12490:11;12483:55;12569:26;12564:2;12559:3;12555:12;12548:48;12622:2;12617:3;12613:12;12606:19;;12389:242;;;:::o;12637:374::-;;12800:67;12864:2;12859:3;12800:67;:::i;:::-;12793:74;;12897:34;12893:1;12888:3;12884:11;12877:55;12963:12;12958:2;12953:3;12949:12;12942:34;13002:2;12997:3;12993:12;12986:19;;12783:228;;;:::o;13017:373::-;;13180:67;13244:2;13239:3;13180:67;:::i;:::-;13173:74;;13277:34;13273:1;13268:3;13264:11;13257:55;13343:11;13338:2;13333:3;13329:12;13322:33;13381:2;13376:3;13372:12;13365:19;;13163:227;;;:::o;13396:330::-;;13559:67;13623:2;13618:3;13559:67;:::i;:::-;13552:74;;13656:34;13652:1;13647:3;13643:11;13636:55;13717:2;13712:3;13708:12;13701:19;;13542:184;;;:::o;13732:376::-;;13895:67;13959:2;13954:3;13895:67;:::i;:::-;13888:74;;13992:34;13988:1;13983:3;13979:11;13972:55;14058:14;14053:2;14048:3;14044:12;14037:36;14099:2;14094:3;14090:12;14083:19;;13878:230;;;:::o;14114:330::-;;14277:67;14341:2;14336:3;14277:67;:::i;:::-;14270:74;;14374:34;14370:1;14365:3;14361:11;14354:55;14435:2;14430:3;14426:12;14419:19;;14260:184;;;:::o;14450:373::-;;14613:67;14677:2;14672:3;14613:67;:::i;:::-;14606:74;;14710:34;14706:1;14701:3;14697:11;14690:55;14776:11;14771:2;14766:3;14762:12;14755:33;14814:2;14809:3;14805:12;14798:19;;14596:227;;;:::o;14829:317::-;;14992:67;15056:2;15051:3;14992:67;:::i;:::-;14985:74;;15089:21;15085:1;15080:3;15076:11;15069:42;15137:2;15132:3;15128:12;15121:19;;14975:171;;;:::o;15152:365::-;;15315:67;15379:2;15374:3;15315:67;:::i;:::-;15308:74;;15412:34;15408:1;15403:3;15399:11;15392:55;15478:3;15473:2;15468:3;15464:12;15457:25;15508:2;15503:3;15499:12;15492:19;;15298:219;;;:::o;15523:315::-;;15686:67;15750:2;15745:3;15686:67;:::i;:::-;15679:74;;15783:19;15779:1;15774:3;15770:11;15763:40;15829:2;15824:3;15820:12;15813:19;;15669:169;;;:::o;15844:325::-;;16007:67;16071:2;16066:3;16007:67;:::i;:::-;16000:74;;16104:29;16100:1;16095:3;16091:11;16084:50;16160:2;16155:3;16151:12;16144:19;;15990:179;;;:::o;16175:297::-;;16355:83;16436:1;16431:3;16355:83;:::i;:::-;16348:90;;16464:1;16459:3;16455:11;16448:18;;16338:134;;;:::o;16478:381::-;;16641:67;16705:2;16700:3;16641:67;:::i;:::-;16634:74;;16738:34;16734:1;16729:3;16725:11;16718:55;16804:19;16799:2;16794:3;16790:12;16783:41;16850:2;16845:3;16841:12;16834:19;;16624:235;;;:::o;16865:376::-;;17028:67;17092:2;17087:3;17028:67;:::i;:::-;17021:74;;17125:34;17121:1;17116:3;17112:11;17105:55;17191:14;17186:2;17181:3;17177:12;17170:36;17232:2;17227:3;17223:12;17216:19;;17011:230;;;:::o;17247:333::-;;17428:84;17510:1;17505:3;17428:84;:::i;:::-;17421:91;;17542:3;17538:1;17533:3;17529:11;17522:24;17572:1;17567:3;17563:11;17556:18;;17411:169;;;:::o;17586:118::-;17673:24;17691:5;17673:24;:::i;:::-;17668:3;17661:37;17651:53;;:::o;17710:429::-;;17909:92;17997:3;17988:6;17909:92;:::i;:::-;17902:99;;18018:95;18109:3;18100:6;18018:95;:::i;:::-;18011:102;;18130:3;18123:10;;17891:248;;;;;:::o;18145:849::-;;18490:92;18578:3;18569:6;18490:92;:::i;:::-;18483:99;;18599:92;18687:3;18678:6;18599:92;:::i;:::-;18592:99;;18708:148;18852:3;18708:148;:::i;:::-;18701:155;;18873:95;18964:3;18955:6;18873:95;:::i;:::-;18866:102;;18985:3;18978:10;;18472:522;;;;;;:::o;19000:379::-;;19206:147;19349:3;19206:147;:::i;:::-;19199:154;;19370:3;19363:10;;19188:191;;;:::o;19385:222::-;;19516:2;19505:9;19501:18;19493:26;;19529:71;19597:1;19586:9;19582:17;19573:6;19529:71;:::i;:::-;19483:124;;;;:::o;19613:640::-;;19846:3;19835:9;19831:19;19823:27;;19860:71;19928:1;19917:9;19913:17;19904:6;19860:71;:::i;:::-;19941:72;20009:2;19998:9;19994:18;19985:6;19941:72;:::i;:::-;20023;20091:2;20080:9;20076:18;20067:6;20023:72;:::i;:::-;20142:9;20136:4;20132:20;20127:2;20116:9;20112:18;20105:48;20170:76;20241:4;20232:6;20170:76;:::i;:::-;20162:84;;19813:440;;;;;;;:::o;20259:332::-;;20418:2;20407:9;20403:18;20395:26;;20431:71;20499:1;20488:9;20484:17;20475:6;20431:71;:::i;:::-;20512:72;20580:2;20569:9;20565:18;20556:6;20512:72;:::i;:::-;20385:206;;;;;:::o;20597:210::-;;20722:2;20711:9;20707:18;20699:26;;20735:65;20797:1;20786:9;20782:17;20773:6;20735:65;:::i;:::-;20689:118;;;;:::o;20813:313::-;;20964:2;20953:9;20949:18;20941:26;;21013:9;21007:4;21003:20;20999:1;20988:9;20984:17;20977:47;21041:78;21114:4;21105:6;21041:78;:::i;:::-;21033:86;;20931:195;;;;:::o;21132:419::-;;21336:2;21325:9;21321:18;21313:26;;21385:9;21379:4;21375:20;21371:1;21360:9;21356:17;21349:47;21413:131;21539:4;21413:131;:::i;:::-;21405:139;;21303:248;;;:::o;21557:419::-;;21761:2;21750:9;21746:18;21738:26;;21810:9;21804:4;21800:20;21796:1;21785:9;21781:17;21774:47;21838:131;21964:4;21838:131;:::i;:::-;21830:139;;21728:248;;;:::o;21982:419::-;;22186:2;22175:9;22171:18;22163:26;;22235:9;22229:4;22225:20;22221:1;22210:9;22206:17;22199:47;22263:131;22389:4;22263:131;:::i;:::-;22255:139;;22153:248;;;:::o;22407:419::-;;22611:2;22600:9;22596:18;22588:26;;22660:9;22654:4;22650:20;22646:1;22635:9;22631:17;22624:47;22688:131;22814:4;22688:131;:::i;:::-;22680:139;;22578:248;;;:::o;22832:419::-;;23036:2;23025:9;23021:18;23013:26;;23085:9;23079:4;23075:20;23071:1;23060:9;23056:17;23049:47;23113:131;23239:4;23113:131;:::i;:::-;23105:139;;23003:248;;;:::o;23257:419::-;;23461:2;23450:9;23446:18;23438:26;;23510:9;23504:4;23500:20;23496:1;23485:9;23481:17;23474:47;23538:131;23664:4;23538:131;:::i;:::-;23530:139;;23428:248;;;:::o;23682:419::-;;23886:2;23875:9;23871:18;23863:26;;23935:9;23929:4;23925:20;23921:1;23910:9;23906:17;23899:47;23963:131;24089:4;23963:131;:::i;:::-;23955:139;;23853:248;;;:::o;24107:419::-;;24311:2;24300:9;24296:18;24288:26;;24360:9;24354:4;24350:20;24346:1;24335:9;24331:17;24324:47;24388:131;24514:4;24388:131;:::i;:::-;24380:139;;24278:248;;;:::o;24532:419::-;;24736:2;24725:9;24721:18;24713:26;;24785:9;24779:4;24775:20;24771:1;24760:9;24756:17;24749:47;24813:131;24939:4;24813:131;:::i;:::-;24805:139;;24703:248;;;:::o;24957:419::-;;25161:2;25150:9;25146:18;25138:26;;25210:9;25204:4;25200:20;25196:1;25185:9;25181:17;25174:47;25238:131;25364:4;25238:131;:::i;:::-;25230:139;;25128:248;;;:::o;25382:419::-;;25586:2;25575:9;25571:18;25563:26;;25635:9;25629:4;25625:20;25621:1;25610:9;25606:17;25599:47;25663:131;25789:4;25663:131;:::i;:::-;25655:139;;25553:248;;;:::o;25807:419::-;;26011:2;26000:9;25996:18;25988:26;;26060:9;26054:4;26050:20;26046:1;26035:9;26031:17;26024:47;26088:131;26214:4;26088:131;:::i;:::-;26080:139;;25978:248;;;:::o;26232:419::-;;26436:2;26425:9;26421:18;26413:26;;26485:9;26479:4;26475:20;26471:1;26460:9;26456:17;26449:47;26513:131;26639:4;26513:131;:::i;:::-;26505:139;;26403:248;;;:::o;26657:419::-;;26861:2;26850:9;26846:18;26838:26;;26910:9;26904:4;26900:20;26896:1;26885:9;26881:17;26874:47;26938:131;27064:4;26938:131;:::i;:::-;26930:139;;26828:248;;;:::o;27082:419::-;;27286:2;27275:9;27271:18;27263:26;;27335:9;27329:4;27325:20;27321:1;27310:9;27306:17;27299:47;27363:131;27489:4;27363:131;:::i;:::-;27355:139;;27253:248;;;:::o;27507:419::-;;27711:2;27700:9;27696:18;27688:26;;27760:9;27754:4;27750:20;27746:1;27735:9;27731:17;27724:47;27788:131;27914:4;27788:131;:::i;:::-;27780:139;;27678:248;;;:::o;27932:419::-;;28136:2;28125:9;28121:18;28113:26;;28185:9;28179:4;28175:20;28171:1;28160:9;28156:17;28149:47;28213:131;28339:4;28213:131;:::i;:::-;28205:139;;28103:248;;;:::o;28357:419::-;;28561:2;28550:9;28546:18;28538:26;;28610:9;28604:4;28600:20;28596:1;28585:9;28581:17;28574:47;28638:131;28764:4;28638:131;:::i;:::-;28630:139;;28528:248;;;:::o;28782:419::-;;28986:2;28975:9;28971:18;28963:26;;29035:9;29029:4;29025:20;29021:1;29010:9;29006:17;28999:47;29063:131;29189:4;29063:131;:::i;:::-;29055:139;;28953:248;;;:::o;29207:419::-;;29411:2;29400:9;29396:18;29388:26;;29460:9;29454:4;29450:20;29446:1;29435:9;29431:17;29424:47;29488:131;29614:4;29488:131;:::i;:::-;29480:139;;29378:248;;;:::o;29632:419::-;;29836:2;29825:9;29821:18;29813:26;;29885:9;29879:4;29875:20;29871:1;29860:9;29856:17;29849:47;29913:131;30039:4;29913:131;:::i;:::-;29905:139;;29803:248;;;:::o;30057:419::-;;30261:2;30250:9;30246:18;30238:26;;30310:9;30304:4;30300:20;30296:1;30285:9;30281:17;30274:47;30338:131;30464:4;30338:131;:::i;:::-;30330:139;;30228:248;;;:::o;30482:222::-;;30613:2;30602:9;30598:18;30590:26;;30626:71;30694:1;30683:9;30679:17;30670:6;30626:71;:::i;:::-;30580:124;;;;:::o;30710:283::-;;30776:2;30770:9;30760:19;;30818:4;30810:6;30806:17;30925:6;30913:10;30910:22;30889:18;30877:10;30874:34;30871:62;30868:2;;;30936:18;;:::i;:::-;30868:2;30976:10;30972:2;30965:22;30750:243;;;;:::o;30999:331::-;;31150:18;31142:6;31139:30;31136:2;;;31172:18;;:::i;:::-;31136:2;31257:4;31253:9;31246:4;31238:6;31234:17;31230:33;31222:41;;31318:4;31312;31308:15;31300:23;;31065:265;;;:::o;31336:332::-;;31488:18;31480:6;31477:30;31474:2;;;31510:18;;:::i;:::-;31474:2;31595:4;31591:9;31584:4;31576:6;31572:17;31568:33;31560:41;;31656:4;31650;31646:15;31638:23;;31403:265;;;:::o;31674:141::-;;31746:3;31738:11;;31769:3;31766:1;31759:14;31803:4;31800:1;31790:18;31782:26;;31728:87;;;:::o;31821:98::-;;31906:5;31900:12;31890:22;;31879:40;;;:::o;31925:99::-;;32011:5;32005:12;31995:22;;31984:40;;;:::o;32030:168::-;;32147:6;32142:3;32135:19;32187:4;32182:3;32178:14;32163:29;;32125:73;;;;:::o;32204:147::-;;32342:3;32327:18;;32317:34;;;;:::o;32357:169::-;;32475:6;32470:3;32463:19;32515:4;32510:3;32506:14;32491:29;;32453:73;;;;:::o;32532:148::-;;32671:3;32656:18;;32646:34;;;;:::o;32686:305::-;;32745:20;32763:1;32745:20;:::i;:::-;32740:25;;32779:20;32797:1;32779:20;:::i;:::-;32774:25;;32933:1;32865:66;32861:74;32858:1;32855:81;32852:2;;;32939:18;;:::i;:::-;32852:2;32983:1;32980;32976:9;32969:16;;32730:261;;;;:::o;32997:185::-;;33054:20;33072:1;33054:20;:::i;:::-;33049:25;;33088:20;33106:1;33088:20;:::i;:::-;33083:25;;33127:1;33117:2;;33132:18;;:::i;:::-;33117:2;33174:1;33171;33167:9;33162:14;;33039:143;;;;:::o;33188:348::-;;33251:20;33269:1;33251:20;:::i;:::-;33246:25;;33285:20;33303:1;33285:20;:::i;:::-;33280:25;;33473:1;33405:66;33401:74;33398:1;33395:81;33390:1;33383:9;33376:17;33372:105;33369:2;;;33480:18;;:::i;:::-;33369:2;33528:1;33525;33521:9;33510:20;;33236:300;;;;:::o;33542:191::-;;33602:20;33620:1;33602:20;:::i;:::-;33597:25;;33636:20;33654:1;33636:20;:::i;:::-;33631:25;;33675:1;33672;33669:8;33666:2;;;33680:18;;:::i;:::-;33666:2;33725:1;33722;33718:9;33710:17;;33587:146;;;;:::o;33739:96::-;;33805:24;33823:5;33805:24;:::i;:::-;33794:35;;33784:51;;;:::o;33841:90::-;;33918:5;33911:13;33904:21;33893:32;;33883:48;;;:::o;33937:149::-;;34013:66;34006:5;34002:78;33991:89;;33981:105;;;:::o;34092:126::-;;34169:42;34162:5;34158:54;34147:65;;34137:81;;;:::o;34224:77::-;;34290:5;34279:16;;34269:32;;;:::o;34307:154::-;34391:6;34386:3;34381;34368:30;34453:1;34444:6;34439:3;34435:16;34428:27;34358:103;;;:::o;34467:307::-;34535:1;34545:113;34559:6;34556:1;34553:13;34545:113;;;34644:1;34639:3;34635:11;34629:18;34625:1;34620:3;34616:11;34609:39;34581:2;34578:1;34574:10;34569:15;;34545:113;;;34676:6;34673:1;34670:13;34667:2;;;34756:1;34747:6;34742:3;34738:16;34731:27;34667:2;34516:258;;;;:::o;34780:320::-;;34861:1;34855:4;34851:12;34841:22;;34908:1;34902:4;34898:12;34929:18;34919:2;;34985:4;34977:6;34973:17;34963:27;;34919:2;35047;35039:6;35036:14;35016:18;35013:38;35010:2;;;35066:18;;:::i;:::-;35010:2;34831:269;;;;:::o;35106:233::-;;35168:24;35186:5;35168:24;:::i;:::-;35159:33;;35214:66;35207:5;35204:77;35201:2;;;35284:18;;:::i;:::-;35201:2;35331:1;35324:5;35320:13;35313:20;;35149:190;;;:::o;35345:176::-;;35394:20;35412:1;35394:20;:::i;:::-;35389:25;;35428:20;35446:1;35428:20;:::i;:::-;35423:25;;35467:1;35457:2;;35472:18;;:::i;:::-;35457:2;35513:1;35510;35506:9;35501:14;;35379:142;;;;:::o;35527:180::-;35575:77;35572:1;35565:88;35672:4;35669:1;35662:15;35696:4;35693:1;35686:15;35713:180;35761:77;35758:1;35751:88;35858:4;35855:1;35848:15;35882:4;35879:1;35872:15;35899:180;35947:77;35944:1;35937:88;36044:4;36041:1;36034:15;36068:4;36065:1;36058:15;36085:180;36133:77;36130:1;36123:88;36230:4;36227:1;36220:15;36254:4;36251:1;36244:15;36271:102;;36363:2;36359:7;36354:2;36347:5;36343:14;36339:28;36329:38;;36319:54;;;:::o;36379:122::-;36452:24;36470:5;36452:24;:::i;:::-;36445:5;36442:35;36432:2;;36491:1;36488;36481:12;36432:2;36422:79;:::o;36507:116::-;36577:21;36592:5;36577:21;:::i;:::-;36570:5;36567:32;36557:2;;36613:1;36610;36603:12;36557:2;36547:76;:::o;36629:120::-;36701:23;36718:5;36701:23;:::i;:::-;36694:5;36691:34;36681:2;;36739:1;36736;36729:12;36681:2;36671:78;:::o;36755:122::-;36828:24;36846:5;36828:24;:::i;:::-;36821:5;36818:35;36808:2;;36867:1;36864;36857:12;36808:2;36798:79;:::o

Swarm Source

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