ETH Price: $3,919.16 (+0.93%)

Token

The Club of Cool Apes (coca)
 

Overview

Max Total Supply

0 coca

Holders

766

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*花开堪折直须折.eth
Balance
1 coca
0xfdcd504b7697496f8DBEA8d0aB7b2617665060DC
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
coca

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-05
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface iYield {
    function updateReward(address from_, address to_, uint256 tokenId_) external;
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {

    /**
     * @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 String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

/**
 * @dev 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/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev 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/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev 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(), ".json")) : "";
    }

    /**
     * @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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

contract coca is ERC721, Ownable {

    bool public saleActive;
    bool public burnActive;
    
    uint16 public tokenIdCounter = 1;
    uint public tokenPrice;
    uint16 public maxSupply = 3000;
    uint8 public maxMintsPerTx;
    uint8 public maxTokensPerWallet;

    string public baseURI;

    mapping(address => uint8) public _tokensMintedPerWallet;

    iYield public yieldToken;

    constructor() ERC721("The Club of Cool Apes", "coca") {}

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

    function publicMint(uint8 amount) external payable {
        require(msg.value == tokenPrice * amount, "Incorrect value!");
        require(tokenIdCounter + amount <= maxSupply, "Not enough tokens!");
        require(saleActive, "Sale not active!");
        require(amount <= maxMintsPerTx, "Exceeds max mints per transaction!");
        require(_tokensMintedPerWallet[msg.sender] < maxTokensPerWallet, "Exceeds max tokens per account!");
        for(uint8 i = 0; i < amount; i++){
            _safeMint(msg.sender, tokenIdCounter);
            tokenIdCounter++;
            _tokensMintedPerWallet[msg.sender]++;
        }
    }

    function burnRemint(uint16 tokenId) external {
        require(burnActive, "Burning not active!");
        require(tokenIdCounter < maxSupply, "Sale finished!");
        _burn(tokenId);
        _safeMint(msg.sender, tokenIdCounter);
        tokenIdCounter++;
    }

    // Transfer Hooks 
    function transferFrom(address from_, address to_, uint256 tokenId_) public override {
        if ( yieldToken != iYield(address(0x0)) ) {
            yieldToken.updateReward(from_, to_, tokenId_);
        }
        ERC721.transferFrom(from_, to_, tokenId_);
    }

    function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public override {
        if ( yieldToken != iYield(address(0x0)) ) {
            yieldToken.updateReward(from_, to_, tokenId_);
        }
        ERC721.safeTransferFrom(from_, to_, tokenId_, data_);
    }

    function flipBurnStatus() external onlyOwner {
        burnActive = !burnActive;
    }

    function flipSaleStatus() external onlyOwner {
        saleActive = !saleActive;
    }

    function setMaxTokensPerWallet(uint8 _maxTokensPerWallet) external onlyOwner {
        maxTokensPerWallet = _maxTokensPerWallet;
    }

    function setMaxSupply(uint16 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

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

    function setTokenPrice(uint _tokenPrice) external onlyOwner {
        tokenPrice = _tokenPrice;
    }

    function setMaxMintsPerTx(uint8 _maxMintsPerTx) external onlyOwner {
        maxMintsPerTx = _maxMintsPerTx;
    }

    function setYieldToken(address _address) external onlyOwner {
        yieldToken = iYield(_address); }

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

    function withdrawERC20(address token, uint amount) external onlyOwner {
        IERC20(token).transfer(msg.sender, amount);
    }

    function withdrawERC721(address token, uint id) external onlyOwner {
        IERC721(token).transferFrom(address(this), msg.sender, id);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokensMintedPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"burnActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"burnRemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipBurnStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":[],"name":"saleActive","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":"uint8","name":"_maxMintsPerTx","type":"uint8"}],"name":"setMaxMintsPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxTokensPerWallet","type":"uint8"}],"name":"setMaxTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setYieldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","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":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldToken","outputs":[{"internalType":"contract iYield","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526001600660166101000a81548161ffff021916908361ffff160217905550610bb8600860006101000a81548161ffff021916908361ffff1602179055503480156200004e57600080fd5b506040518060400160405280601581526020017f54686520436c7562206f6620436f6f6c204170657300000000000000000000008152506040518060400160405280600481526020017f636f6361000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d3929190620001e3565b508060019080519060200190620000ec929190620001e3565b5050506200010f620001036200011560201b60201c565b6200011d60201b60201c565b620002f8565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f19062000293565b90600052602060002090601f01602090048101928262000215576000855562000261565b82601f106200023057805160ff191683800117855562000261565b8280016001018555821562000261579182015b828111156200026057825182559160200191906001019062000243565b5b50905062000270919062000274565b5090565b5b808211156200028f57600081600090555060010162000275565b5090565b60006002820490506001821680620002ac57607f821691505b60208210811415620002c357620002c2620002c9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6147a780620003086000396000f3fe6080604052600436106102305760003560e01c8063723376af1161012e578063a1db9782116100ab578063d5abeb011161006f578063d5abeb01146107de578063dc30158b14610809578063e985e9c514610834578063f2fde38b14610871578063f3e414f81461089a57610230565b8063a1db97821461070f578063a22cb46514610738578063b88d4fde14610761578063c87b56dd1461078a578063ce03ec93146107c757610230565b80638da5cb5b116100f25780638da5cb5b146106285780638dd5da7e1461065357806392d525e91461069057806395d89b41146106b957806398bdf6f5146106e457610230565b8063723376af1461057457806376d5de851461058b5780637ff9b596146105b6578063858e83b5146105e1578063864ef3e5146105fd57610230565b806342842e0e116101bc57806368428a1b1161018057806368428a1b146104a15780636a61e5fc146104cc5780636c0360eb146104f557806370a0823114610520578063715018a61461055d57610230565b806342842e0e146103be578063469132ce146103e75780634f0c212c1461041257806355f804b31461043b5780636352211e1461046457610230565b8063095ea7b311610203578063095ea7b314610303578063141129f91461032c57806323b872dd1461035557806323ffce851461037e57806324600fc3146103a757610230565b806301ffc9a71461023557806306421c2f1461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061338b565b6108c3565b6040516102699190613e7a565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061341e565b6108d5565b005b3480156102a757600080fd5b506102b0610971565b6040516102bd9190613eb0565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613447565b610a03565b6040516102fa9190613db3565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613326565b610a88565b005b34801561033857600080fd5b50610353600480360381019061034e9190613470565b610ba0565b005b34801561036157600080fd5b5061037c60048036038101906103779190613220565b610c3a565b005b34801561038a57600080fd5b506103a560048036038101906103a091906131bb565b610d32565b005b3480156103b357600080fd5b506103bc610df2565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613220565b610eb7565b005b3480156103f357600080fd5b506103fc610ed7565b60405161040991906141e8565b60405180910390f35b34801561041e57600080fd5b5061043960048036038101906104349190613470565b610eea565b005b34801561044757600080fd5b50610462600480360381019061045d91906133dd565b610f84565b005b34801561047057600080fd5b5061048b60048036038101906104869190613447565b61101a565b6040516104989190613db3565b60405180910390f35b3480156104ad57600080fd5b506104b66110cc565b6040516104c39190613e7a565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613447565b6110df565b005b34801561050157600080fd5b5061050a611165565b6040516105179190613eb0565b60405180910390f35b34801561052c57600080fd5b50610547600480360381019061054291906131bb565b6111f3565b60405161055491906141cd565b60405180910390f35b34801561056957600080fd5b506105726112ab565b005b34801561058057600080fd5b50610589611333565b005b34801561059757600080fd5b506105a06113db565b6040516105ad9190613e95565b60405180910390f35b3480156105c257600080fd5b506105cb611401565b6040516105d891906141cd565b60405180910390f35b6105fb60048036038101906105f69190613470565b611407565b005b34801561060957600080fd5b50610612611712565b60405161061f9190613e7a565b60405180910390f35b34801561063457600080fd5b5061063d611725565b60405161064a9190613db3565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906131bb565b61174f565b60405161068791906141e8565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b2919061341e565b61176f565b005b3480156106c557600080fd5b506106ce611891565b6040516106db9190613eb0565b60405180910390f35b3480156106f057600080fd5b506106f9611923565b60405161070691906141b2565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190613326565b611937565b005b34801561074457600080fd5b5061075f600480360381019061075a91906132ea565b611a45565b005b34801561076d57600080fd5b506107886004803603810190610783919061326f565b611a5b565b005b34801561079657600080fd5b506107b160048036038101906107ac9190613447565b611b55565b6040516107be9190613eb0565b60405180910390f35b3480156107d357600080fd5b506107dc611bfc565b005b3480156107ea57600080fd5b506107f3611ca4565b60405161080091906141b2565b60405180910390f35b34801561081557600080fd5b5061081e611cb8565b60405161082b91906141e8565b60405180910390f35b34801561084057600080fd5b5061085b600480360381019061085691906131e4565b611ccb565b6040516108689190613e7a565b60405180910390f35b34801561087d57600080fd5b50610898600480360381019061089391906131bb565b611d5f565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613326565b611e57565b005b60006108ce82611f46565b9050919050565b6108dd612028565b73ffffffffffffffffffffffffffffffffffffffff166108fb611725565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906140d2565b60405180910390fd5b80600860006101000a81548161ffff021916908361ffff16021790555050565b60606000805461098090614519565b80601f01602080910402602001604051908101604052809291908181526020018280546109ac90614519565b80156109f95780601f106109ce576101008083540402835291602001916109f9565b820191906000526020600020905b8154815290600101906020018083116109dc57829003601f168201915b5050505050905090565b6000610a0e82612030565b610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a44906140b2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a938261101a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb90614152565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b23612028565b73ffffffffffffffffffffffffffffffffffffffff161480610b525750610b5181610b4c612028565b611ccb565b5b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614032565b60405180910390fd5b610b9b838361209c565b505050565b610ba8612028565b73ffffffffffffffffffffffffffffffffffffffff16610bc6611725565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c13906140d2565b60405180910390fd5b80600860036101000a81548160ff021916908360ff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d2257600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8484846040518463ffffffff1660e01b8152600401610cef93929190613dce565b600060405180830381600087803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050505b610d2d838383612155565b505050565b610d3a612028565b73ffffffffffffffffffffffffffffffffffffffff16610d58611725565b73ffffffffffffffffffffffffffffffffffffffff1614610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906140d2565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dfa612028565b73ffffffffffffffffffffffffffffffffffffffff16610e18611725565b73ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e65906140d2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eb4573d6000803e3d6000fd5b50565b610ed283838360405180602001604052806000815250611a5b565b505050565b600860039054906101000a900460ff1681565b610ef2612028565b73ffffffffffffffffffffffffffffffffffffffff16610f10611725565b73ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d906140d2565b60405180910390fd5b80600860026101000a81548160ff021916908360ff16021790555050565b610f8c612028565b73ffffffffffffffffffffffffffffffffffffffff16610faa611725565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff7906140d2565b60405180910390fd5b8060099080519060200190611016929190612fa0565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba90614072565b60405180910390fd5b80915050919050565b600660149054906101000a900460ff1681565b6110e7612028565b73ffffffffffffffffffffffffffffffffffffffff16611105611725565b73ffffffffffffffffffffffffffffffffffffffff161461115b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611152906140d2565b60405180910390fd5b8060078190555050565b6009805461117290614519565b80601f016020809104026020016040519081016040528092919081815260200182805461119e90614519565b80156111eb5780601f106111c0576101008083540402835291602001916111eb565b820191906000526020600020905b8154815290600101906020018083116111ce57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614052565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112b3612028565b73ffffffffffffffffffffffffffffffffffffffff166112d1611725565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906140d2565b60405180910390fd5b61133160006121b5565b565b61133b612028565b73ffffffffffffffffffffffffffffffffffffffff16611359611725565b73ffffffffffffffffffffffffffffffffffffffff16146113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a6906140d2565b60405180910390fd5b600660159054906101000a900460ff1615600660156101000a81548160ff021916908315150217905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b8060ff166007546114189190614396565b3414611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614172565b60405180910390fd5b600860009054906101000a900461ffff1661ffff168160ff16600660169054906101000a900461ffff1661148d91906142d7565b61ffff1611156114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613fd2565b60405180910390fd5b600660149054906101000a900460ff16611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890613fb2565b60405180910390fd5b600860029054906101000a900460ff1660ff168160ff161115611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614132565b60405180910390fd5b600860039054906101000a900460ff1660ff16600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161061161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390613f72565b60405180910390fd5b60005b8160ff168160ff16101561170e5761164b33600660169054906101000a900461ffff1661ffff1661227b565b6006601681819054906101000a900461ffff168092919061166b9061454b565b91906101000a81548161ffff021916908361ffff16021790555050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906116e2906145bf565b91906101000a81548160ff021916908360ff160217905550508080611706906145bf565b91505061161f565b5050565b600660159054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a6020528060005260406000206000915054906101000a900460ff1681565b600660159054906101000a900460ff166117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590613f92565b60405180910390fd5b600860009054906101000a900461ffff1661ffff16600660169054906101000a900461ffff1661ffff1610611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f90614012565b60405180910390fd5b6118358161ffff16612299565b61185333600660169054906101000a900461ffff1661ffff1661227b565b6006601681819054906101000a900461ffff16809291906118739061454b565b91906101000a81548161ffff021916908361ffff1602179055505050565b6060600180546118a090614519565b80601f01602080910402602001604051908101604052809291908181526020018280546118cc90614519565b80156119195780601f106118ee57610100808354040283529160200191611919565b820191906000526020600020905b8154815290600101906020018083116118fc57829003601f168201915b5050505050905090565b600660169054906101000a900461ffff1681565b61193f612028565b73ffffffffffffffffffffffffffffffffffffffff1661195d611725565b73ffffffffffffffffffffffffffffffffffffffff16146119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa906140d2565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016119ee929190613e51565b602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a409190613362565b505050565b611a57611a50612028565b83836123aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b4357600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8585856040518463ffffffff1660e01b8152600401611b1093929190613dce565b600060405180830381600087803b158015611b2a57600080fd5b505af1158015611b3e573d6000803e3d6000fd5b505050505b611b4f84848484612517565b50505050565b6060611b6082612030565b611b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9690614112565b60405180910390fd5b6000611ba9612579565b90506000815111611bc95760405180602001604052806000815250611bf4565b80611bd38461260b565b604051602001611be4929190613d84565b6040516020818303038152906040525b915050919050565b611c04612028565b73ffffffffffffffffffffffffffffffffffffffff16611c22611725565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f906140d2565b60405180910390fd5b600660149054906101000a900460ff1615600660146101000a81548160ff021916908315150217905550565b600860009054906101000a900461ffff1681565b600860029054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d67612028565b73ffffffffffffffffffffffffffffffffffffffff16611d85611725565b73ffffffffffffffffffffffffffffffffffffffff1614611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906140d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290613ef2565b60405180910390fd5b611e54816121b5565b50565b611e5f612028565b73ffffffffffffffffffffffffffffffffffffffff16611e7d611725565b73ffffffffffffffffffffffffffffffffffffffff1614611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca906140d2565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611f1093929190613dce565b600060405180830381600087803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120215750612020826127b8565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661210f8361101a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612166612160612028565b82612822565b6121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614192565b60405180910390fd5b6121b0838383612900565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612295828260405180602001604052806000815250612b5c565b5050565b60006122a48261101a565b90506122b281600084612bb7565b6122bd60008361209c565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230d91906143f0565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090613f52565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161250a9190613e7a565b60405180910390a3505050565b612528612522612028565b83612822565b612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e90614192565b60405180910390fd5b61257384848484612bc7565b50505050565b60606009805461258890614519565b80601f01602080910402602001604051908101604052809291908181526020018280546125b490614519565b80156126015780601f106125d657610100808354040283529160200191612601565b820191906000526020600020905b8154815290600101906020018083116125e457829003601f168201915b5050505050905090565b60606000821415612653576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127b3565b600082905060005b6000821461268557808061266e90614576565b915050600a8261267e9190614365565b915061265b565b60008167ffffffffffffffff8111156126c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126f95781602001600182028036833780820191505090505b5090505b600085146127ac5760018261271291906143f0565b9150600a8561272191906145e9565b603061272d919061430f565b60f81b818381518110612769577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127a59190614365565b94506126fd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600061282d82612030565b61286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390613ff2565b60405180910390fd5b60006128778361101a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128e657508373ffffffffffffffffffffffffffffffffffffffff166128ce84610a03565b73ffffffffffffffffffffffffffffffffffffffff16145b806128f757506128f68185611ccb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129208261101a565b73ffffffffffffffffffffffffffffffffffffffff1614612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d906140f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129dd90613f32565b60405180910390fd5b6129f1838383612bb7565b6129fc60008261209c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4c91906143f0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa3919061430f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612b668383612c23565b612b736000848484612df1565b612bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba990613ed2565b60405180910390fd5b505050565b612bc2838383612f88565b505050565b612bd2848484612900565b612bde84848484612df1565b612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1490613ed2565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614092565b60405180910390fd5b612c9c81612030565b15612cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd390613f12565b60405180910390fd5b612ce860008383612bb7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d38919061430f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612e128473ffffffffffffffffffffffffffffffffffffffff16612f8d565b15612f7b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e3b612028565b8786866040518563ffffffff1660e01b8152600401612e5d9493929190613e05565b602060405180830381600087803b158015612e7757600080fd5b505af1925050508015612ea857506040513d601f19601f82011682018060405250810190612ea591906133b4565b60015b612f2b573d8060008114612ed8576040519150601f19603f3d011682016040523d82523d6000602084013e612edd565b606091505b50600081511415612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90613ed2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f80565b600190505b949350505050565b505050565b600080823b905060008111915050919050565b828054612fac90614519565b90600052602060002090601f016020900481019282612fce5760008555613015565b82601f10612fe757805160ff1916838001178555613015565b82800160010185558215613015579182015b82811115613014578251825591602001919060010190612ff9565b5b5090506130229190613026565b5090565b5b8082111561303f576000816000905550600101613027565b5090565b600061305661305184614234565b614203565b90508281526020810184848401111561306e57600080fd5b6130798482856144d7565b509392505050565b600061309461308f84614264565b614203565b9050828152602081018484840111156130ac57600080fd5b6130b78482856144d7565b509392505050565b6000813590506130ce816146e7565b92915050565b6000813590506130e3816146fe565b92915050565b6000815190506130f8816146fe565b92915050565b60008135905061310d81614715565b92915050565b60008151905061312281614715565b92915050565b600082601f83011261313957600080fd5b8135613149848260208601613043565b91505092915050565b600082601f83011261316357600080fd5b8135613173848260208601613081565b91505092915050565b60008135905061318b8161472c565b92915050565b6000813590506131a081614743565b92915050565b6000813590506131b58161475a565b92915050565b6000602082840312156131cd57600080fd5b60006131db848285016130bf565b91505092915050565b600080604083850312156131f757600080fd5b6000613205858286016130bf565b9250506020613216858286016130bf565b9150509250929050565b60008060006060848603121561323557600080fd5b6000613243868287016130bf565b9350506020613254868287016130bf565b925050604061326586828701613191565b9150509250925092565b6000806000806080858703121561328557600080fd5b6000613293878288016130bf565b94505060206132a4878288016130bf565b93505060406132b587828801613191565b925050606085013567ffffffffffffffff8111156132d257600080fd5b6132de87828801613128565b91505092959194509250565b600080604083850312156132fd57600080fd5b600061330b858286016130bf565b925050602061331c858286016130d4565b9150509250929050565b6000806040838503121561333957600080fd5b6000613347858286016130bf565b925050602061335885828601613191565b9150509250929050565b60006020828403121561337457600080fd5b6000613382848285016130e9565b91505092915050565b60006020828403121561339d57600080fd5b60006133ab848285016130fe565b91505092915050565b6000602082840312156133c657600080fd5b60006133d484828501613113565b91505092915050565b6000602082840312156133ef57600080fd5b600082013567ffffffffffffffff81111561340957600080fd5b61341584828501613152565b91505092915050565b60006020828403121561343057600080fd5b600061343e8482850161317c565b91505092915050565b60006020828403121561345957600080fd5b600061346784828501613191565b91505092915050565b60006020828403121561348257600080fd5b6000613490848285016131a6565b91505092915050565b6134a281614424565b82525050565b6134b181614436565b82525050565b60006134c282614294565b6134cc81856142aa565b93506134dc8185602086016144e6565b6134e5816146d6565b840191505092915050565b6134f9816144b3565b82525050565b600061350a8261429f565b61351481856142bb565b93506135248185602086016144e6565b61352d816146d6565b840191505092915050565b60006135438261429f565b61354d81856142cc565b935061355d8185602086016144e6565b80840191505092915050565b60006135766032836142bb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006135dc6026836142bb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613642601c836142bb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006136826024836142bb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e86019836142bb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613728601f836142bb565b91507f45786365656473206d617820746f6b656e7320706572206163636f756e7421006000830152602082019050919050565b60006137686013836142bb565b91507f4275726e696e67206e6f742061637469766521000000000000000000000000006000830152602082019050919050565b60006137a86010836142bb565b91507f53616c65206e6f742061637469766521000000000000000000000000000000006000830152602082019050919050565b60006137e86012836142bb565b91507f4e6f7420656e6f75676820746f6b656e732100000000000000000000000000006000830152602082019050919050565b6000613828602c836142bb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061388e600e836142bb565b91507f53616c652066696e6973686564210000000000000000000000000000000000006000830152602082019050919050565b60006138ce6038836142bb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613934602a836142bb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061399a6029836142bb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a006020836142bb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613a40602c836142bb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aa66005836142cc565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613ae66020836142bb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b266029836142bb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b8c602f836142bb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613bf26022836142bb565b91507f45786365656473206d6178206d696e747320706572207472616e73616374696f60008301527f6e210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c586021836142bb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cbe6010836142bb565b91507f496e636f72726563742076616c756521000000000000000000000000000000006000830152602082019050919050565b6000613cfe6031836142bb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b613d608161446e565b82525050565b613d6f8161449c565b82525050565b613d7e816144a6565b82525050565b6000613d908285613538565b9150613d9c8284613538565b9150613da782613a99565b91508190509392505050565b6000602082019050613dc86000830184613499565b92915050565b6000606082019050613de36000830186613499565b613df06020830185613499565b613dfd6040830184613d66565b949350505050565b6000608082019050613e1a6000830187613499565b613e276020830186613499565b613e346040830185613d66565b8181036060830152613e4681846134b7565b905095945050505050565b6000604082019050613e666000830185613499565b613e736020830184613d66565b9392505050565b6000602082019050613e8f60008301846134a8565b92915050565b6000602082019050613eaa60008301846134f0565b92915050565b60006020820190508181036000830152613eca81846134ff565b905092915050565b60006020820190508181036000830152613eeb81613569565b9050919050565b60006020820190508181036000830152613f0b816135cf565b9050919050565b60006020820190508181036000830152613f2b81613635565b9050919050565b60006020820190508181036000830152613f4b81613675565b9050919050565b60006020820190508181036000830152613f6b816136db565b9050919050565b60006020820190508181036000830152613f8b8161371b565b9050919050565b60006020820190508181036000830152613fab8161375b565b9050919050565b60006020820190508181036000830152613fcb8161379b565b9050919050565b60006020820190508181036000830152613feb816137db565b9050919050565b6000602082019050818103600083015261400b8161381b565b9050919050565b6000602082019050818103600083015261402b81613881565b9050919050565b6000602082019050818103600083015261404b816138c1565b9050919050565b6000602082019050818103600083015261406b81613927565b9050919050565b6000602082019050818103600083015261408b8161398d565b9050919050565b600060208201905081810360008301526140ab816139f3565b9050919050565b600060208201905081810360008301526140cb81613a33565b9050919050565b600060208201905081810360008301526140eb81613ad9565b9050919050565b6000602082019050818103600083015261410b81613b19565b9050919050565b6000602082019050818103600083015261412b81613b7f565b9050919050565b6000602082019050818103600083015261414b81613be5565b9050919050565b6000602082019050818103600083015261416b81613c4b565b9050919050565b6000602082019050818103600083015261418b81613cb1565b9050919050565b600060208201905081810360008301526141ab81613cf1565b9050919050565b60006020820190506141c76000830184613d57565b92915050565b60006020820190506141e26000830184613d66565b92915050565b60006020820190506141fd6000830184613d75565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561422a576142296146a7565b5b8060405250919050565b600067ffffffffffffffff82111561424f5761424e6146a7565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561427f5761427e6146a7565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142e28261446e565b91506142ed8361446e565b92508261ffff038211156143045761430361461a565b5b828201905092915050565b600061431a8261449c565b91506143258361449c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561435a5761435961461a565b5b828201905092915050565b60006143708261449c565b915061437b8361449c565b92508261438b5761438a614649565b5b828204905092915050565b60006143a18261449c565b91506143ac8361449c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e5576143e461461a565b5b828202905092915050565b60006143fb8261449c565b91506144068361449c565b9250828210156144195761441861461a565b5b828203905092915050565b600061442f8261447c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144be826144c5565b9050919050565b60006144d08261447c565b9050919050565b82818337600083830152505050565b60005b838110156145045780820151818401526020810190506144e9565b83811115614513576000848401525b50505050565b6000600282049050600182168061453157607f821691505b6020821081141561454557614544614678565b5b50919050565b60006145568261446e565b915061ffff82141561456b5761456a61461a565b5b600182019050919050565b60006145818261449c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145b4576145b361461a565b5b600182019050919050565b60006145ca826144a6565b915060ff8214156145de576145dd61461a565b5b600182019050919050565b60006145f48261449c565b91506145ff8361449c565b92508261460f5761460e614649565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6146f081614424565b81146146fb57600080fd5b50565b61470781614436565b811461471257600080fd5b50565b61471e81614442565b811461472957600080fd5b50565b6147358161446e565b811461474057600080fd5b50565b61474c8161449c565b811461475757600080fd5b50565b614763816144a6565b811461476e57600080fd5b5056fea26469706673582212206969df219d72a5719d5a2c6901d71e6038fa6a87e16d0dcdf2b0150d3e07627b64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063723376af1161012e578063a1db9782116100ab578063d5abeb011161006f578063d5abeb01146107de578063dc30158b14610809578063e985e9c514610834578063f2fde38b14610871578063f3e414f81461089a57610230565b8063a1db97821461070f578063a22cb46514610738578063b88d4fde14610761578063c87b56dd1461078a578063ce03ec93146107c757610230565b80638da5cb5b116100f25780638da5cb5b146106285780638dd5da7e1461065357806392d525e91461069057806395d89b41146106b957806398bdf6f5146106e457610230565b8063723376af1461057457806376d5de851461058b5780637ff9b596146105b6578063858e83b5146105e1578063864ef3e5146105fd57610230565b806342842e0e116101bc57806368428a1b1161018057806368428a1b146104a15780636a61e5fc146104cc5780636c0360eb146104f557806370a0823114610520578063715018a61461055d57610230565b806342842e0e146103be578063469132ce146103e75780634f0c212c1461041257806355f804b31461043b5780636352211e1461046457610230565b8063095ea7b311610203578063095ea7b314610303578063141129f91461032c57806323b872dd1461035557806323ffce851461037e57806324600fc3146103a757610230565b806301ffc9a71461023557806306421c2f1461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061338b565b6108c3565b6040516102699190613e7a565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061341e565b6108d5565b005b3480156102a757600080fd5b506102b0610971565b6040516102bd9190613eb0565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613447565b610a03565b6040516102fa9190613db3565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613326565b610a88565b005b34801561033857600080fd5b50610353600480360381019061034e9190613470565b610ba0565b005b34801561036157600080fd5b5061037c60048036038101906103779190613220565b610c3a565b005b34801561038a57600080fd5b506103a560048036038101906103a091906131bb565b610d32565b005b3480156103b357600080fd5b506103bc610df2565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613220565b610eb7565b005b3480156103f357600080fd5b506103fc610ed7565b60405161040991906141e8565b60405180910390f35b34801561041e57600080fd5b5061043960048036038101906104349190613470565b610eea565b005b34801561044757600080fd5b50610462600480360381019061045d91906133dd565b610f84565b005b34801561047057600080fd5b5061048b60048036038101906104869190613447565b61101a565b6040516104989190613db3565b60405180910390f35b3480156104ad57600080fd5b506104b66110cc565b6040516104c39190613e7a565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613447565b6110df565b005b34801561050157600080fd5b5061050a611165565b6040516105179190613eb0565b60405180910390f35b34801561052c57600080fd5b50610547600480360381019061054291906131bb565b6111f3565b60405161055491906141cd565b60405180910390f35b34801561056957600080fd5b506105726112ab565b005b34801561058057600080fd5b50610589611333565b005b34801561059757600080fd5b506105a06113db565b6040516105ad9190613e95565b60405180910390f35b3480156105c257600080fd5b506105cb611401565b6040516105d891906141cd565b60405180910390f35b6105fb60048036038101906105f69190613470565b611407565b005b34801561060957600080fd5b50610612611712565b60405161061f9190613e7a565b60405180910390f35b34801561063457600080fd5b5061063d611725565b60405161064a9190613db3565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906131bb565b61174f565b60405161068791906141e8565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b2919061341e565b61176f565b005b3480156106c557600080fd5b506106ce611891565b6040516106db9190613eb0565b60405180910390f35b3480156106f057600080fd5b506106f9611923565b60405161070691906141b2565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190613326565b611937565b005b34801561074457600080fd5b5061075f600480360381019061075a91906132ea565b611a45565b005b34801561076d57600080fd5b506107886004803603810190610783919061326f565b611a5b565b005b34801561079657600080fd5b506107b160048036038101906107ac9190613447565b611b55565b6040516107be9190613eb0565b60405180910390f35b3480156107d357600080fd5b506107dc611bfc565b005b3480156107ea57600080fd5b506107f3611ca4565b60405161080091906141b2565b60405180910390f35b34801561081557600080fd5b5061081e611cb8565b60405161082b91906141e8565b60405180910390f35b34801561084057600080fd5b5061085b600480360381019061085691906131e4565b611ccb565b6040516108689190613e7a565b60405180910390f35b34801561087d57600080fd5b50610898600480360381019061089391906131bb565b611d5f565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613326565b611e57565b005b60006108ce82611f46565b9050919050565b6108dd612028565b73ffffffffffffffffffffffffffffffffffffffff166108fb611725565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906140d2565b60405180910390fd5b80600860006101000a81548161ffff021916908361ffff16021790555050565b60606000805461098090614519565b80601f01602080910402602001604051908101604052809291908181526020018280546109ac90614519565b80156109f95780601f106109ce576101008083540402835291602001916109f9565b820191906000526020600020905b8154815290600101906020018083116109dc57829003601f168201915b5050505050905090565b6000610a0e82612030565b610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a44906140b2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a938261101a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb90614152565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b23612028565b73ffffffffffffffffffffffffffffffffffffffff161480610b525750610b5181610b4c612028565b611ccb565b5b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614032565b60405180910390fd5b610b9b838361209c565b505050565b610ba8612028565b73ffffffffffffffffffffffffffffffffffffffff16610bc6611725565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c13906140d2565b60405180910390fd5b80600860036101000a81548160ff021916908360ff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d2257600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8484846040518463ffffffff1660e01b8152600401610cef93929190613dce565b600060405180830381600087803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050505b610d2d838383612155565b505050565b610d3a612028565b73ffffffffffffffffffffffffffffffffffffffff16610d58611725565b73ffffffffffffffffffffffffffffffffffffffff1614610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906140d2565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dfa612028565b73ffffffffffffffffffffffffffffffffffffffff16610e18611725565b73ffffffffffffffffffffffffffffffffffffffff1614610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e65906140d2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610eb4573d6000803e3d6000fd5b50565b610ed283838360405180602001604052806000815250611a5b565b505050565b600860039054906101000a900460ff1681565b610ef2612028565b73ffffffffffffffffffffffffffffffffffffffff16610f10611725565b73ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d906140d2565b60405180910390fd5b80600860026101000a81548160ff021916908360ff16021790555050565b610f8c612028565b73ffffffffffffffffffffffffffffffffffffffff16610faa611725565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff7906140d2565b60405180910390fd5b8060099080519060200190611016929190612fa0565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba90614072565b60405180910390fd5b80915050919050565b600660149054906101000a900460ff1681565b6110e7612028565b73ffffffffffffffffffffffffffffffffffffffff16611105611725565b73ffffffffffffffffffffffffffffffffffffffff161461115b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611152906140d2565b60405180910390fd5b8060078190555050565b6009805461117290614519565b80601f016020809104026020016040519081016040528092919081815260200182805461119e90614519565b80156111eb5780601f106111c0576101008083540402835291602001916111eb565b820191906000526020600020905b8154815290600101906020018083116111ce57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614052565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112b3612028565b73ffffffffffffffffffffffffffffffffffffffff166112d1611725565b73ffffffffffffffffffffffffffffffffffffffff1614611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906140d2565b60405180910390fd5b61133160006121b5565b565b61133b612028565b73ffffffffffffffffffffffffffffffffffffffff16611359611725565b73ffffffffffffffffffffffffffffffffffffffff16146113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a6906140d2565b60405180910390fd5b600660159054906101000a900460ff1615600660156101000a81548160ff021916908315150217905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b8060ff166007546114189190614396565b3414611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614172565b60405180910390fd5b600860009054906101000a900461ffff1661ffff168160ff16600660169054906101000a900461ffff1661148d91906142d7565b61ffff1611156114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613fd2565b60405180910390fd5b600660149054906101000a900460ff16611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890613fb2565b60405180910390fd5b600860029054906101000a900460ff1660ff168160ff161115611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614132565b60405180910390fd5b600860039054906101000a900460ff1660ff16600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161061161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390613f72565b60405180910390fd5b60005b8160ff168160ff16101561170e5761164b33600660169054906101000a900461ffff1661ffff1661227b565b6006601681819054906101000a900461ffff168092919061166b9061454b565b91906101000a81548161ffff021916908361ffff16021790555050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906116e2906145bf565b91906101000a81548160ff021916908360ff160217905550508080611706906145bf565b91505061161f565b5050565b600660159054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a6020528060005260406000206000915054906101000a900460ff1681565b600660159054906101000a900460ff166117be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b590613f92565b60405180910390fd5b600860009054906101000a900461ffff1661ffff16600660169054906101000a900461ffff1661ffff1610611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f90614012565b60405180910390fd5b6118358161ffff16612299565b61185333600660169054906101000a900461ffff1661ffff1661227b565b6006601681819054906101000a900461ffff16809291906118739061454b565b91906101000a81548161ffff021916908361ffff1602179055505050565b6060600180546118a090614519565b80601f01602080910402602001604051908101604052809291908181526020018280546118cc90614519565b80156119195780601f106118ee57610100808354040283529160200191611919565b820191906000526020600020905b8154815290600101906020018083116118fc57829003601f168201915b5050505050905090565b600660169054906101000a900461ffff1681565b61193f612028565b73ffffffffffffffffffffffffffffffffffffffff1661195d611725565b73ffffffffffffffffffffffffffffffffffffffff16146119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119aa906140d2565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016119ee929190613e51565b602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a409190613362565b505050565b611a57611a50612028565b83836123aa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b4357600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8585856040518463ffffffff1660e01b8152600401611b1093929190613dce565b600060405180830381600087803b158015611b2a57600080fd5b505af1158015611b3e573d6000803e3d6000fd5b505050505b611b4f84848484612517565b50505050565b6060611b6082612030565b611b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9690614112565b60405180910390fd5b6000611ba9612579565b90506000815111611bc95760405180602001604052806000815250611bf4565b80611bd38461260b565b604051602001611be4929190613d84565b6040516020818303038152906040525b915050919050565b611c04612028565b73ffffffffffffffffffffffffffffffffffffffff16611c22611725565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f906140d2565b60405180910390fd5b600660149054906101000a900460ff1615600660146101000a81548160ff021916908315150217905550565b600860009054906101000a900461ffff1681565b600860029054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d67612028565b73ffffffffffffffffffffffffffffffffffffffff16611d85611725565b73ffffffffffffffffffffffffffffffffffffffff1614611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906140d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290613ef2565b60405180910390fd5b611e54816121b5565b50565b611e5f612028565b73ffffffffffffffffffffffffffffffffffffffff16611e7d611725565b73ffffffffffffffffffffffffffffffffffffffff1614611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca906140d2565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611f1093929190613dce565b600060405180830381600087803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120215750612020826127b8565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661210f8361101a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612166612160612028565b82612822565b6121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614192565b60405180910390fd5b6121b0838383612900565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612295828260405180602001604052806000815250612b5c565b5050565b60006122a48261101a565b90506122b281600084612bb7565b6122bd60008361209c565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230d91906143f0565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090613f52565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161250a9190613e7a565b60405180910390a3505050565b612528612522612028565b83612822565b612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255e90614192565b60405180910390fd5b61257384848484612bc7565b50505050565b60606009805461258890614519565b80601f01602080910402602001604051908101604052809291908181526020018280546125b490614519565b80156126015780601f106125d657610100808354040283529160200191612601565b820191906000526020600020905b8154815290600101906020018083116125e457829003601f168201915b5050505050905090565b60606000821415612653576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127b3565b600082905060005b6000821461268557808061266e90614576565b915050600a8261267e9190614365565b915061265b565b60008167ffffffffffffffff8111156126c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126f95781602001600182028036833780820191505090505b5090505b600085146127ac5760018261271291906143f0565b9150600a8561272191906145e9565b603061272d919061430f565b60f81b818381518110612769577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127a59190614365565b94506126fd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600061282d82612030565b61286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390613ff2565b60405180910390fd5b60006128778361101a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128e657508373ffffffffffffffffffffffffffffffffffffffff166128ce84610a03565b73ffffffffffffffffffffffffffffffffffffffff16145b806128f757506128f68185611ccb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129208261101a565b73ffffffffffffffffffffffffffffffffffffffff1614612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d906140f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129dd90613f32565b60405180910390fd5b6129f1838383612bb7565b6129fc60008261209c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4c91906143f0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa3919061430f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612b668383612c23565b612b736000848484612df1565b612bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba990613ed2565b60405180910390fd5b505050565b612bc2838383612f88565b505050565b612bd2848484612900565b612bde84848484612df1565b612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1490613ed2565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614092565b60405180910390fd5b612c9c81612030565b15612cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd390613f12565b60405180910390fd5b612ce860008383612bb7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d38919061430f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612e128473ffffffffffffffffffffffffffffffffffffffff16612f8d565b15612f7b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e3b612028565b8786866040518563ffffffff1660e01b8152600401612e5d9493929190613e05565b602060405180830381600087803b158015612e7757600080fd5b505af1925050508015612ea857506040513d601f19601f82011682018060405250810190612ea591906133b4565b60015b612f2b573d8060008114612ed8576040519150601f19603f3d011682016040523d82523d6000602084013e612edd565b606091505b50600081511415612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90613ed2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f80565b600190505b949350505050565b505050565b600080823b905060008111915050919050565b828054612fac90614519565b90600052602060002090601f016020900481019282612fce5760008555613015565b82601f10612fe757805160ff1916838001178555613015565b82800160010185558215613015579182015b82811115613014578251825591602001919060010190612ff9565b5b5090506130229190613026565b5090565b5b8082111561303f576000816000905550600101613027565b5090565b600061305661305184614234565b614203565b90508281526020810184848401111561306e57600080fd5b6130798482856144d7565b509392505050565b600061309461308f84614264565b614203565b9050828152602081018484840111156130ac57600080fd5b6130b78482856144d7565b509392505050565b6000813590506130ce816146e7565b92915050565b6000813590506130e3816146fe565b92915050565b6000815190506130f8816146fe565b92915050565b60008135905061310d81614715565b92915050565b60008151905061312281614715565b92915050565b600082601f83011261313957600080fd5b8135613149848260208601613043565b91505092915050565b600082601f83011261316357600080fd5b8135613173848260208601613081565b91505092915050565b60008135905061318b8161472c565b92915050565b6000813590506131a081614743565b92915050565b6000813590506131b58161475a565b92915050565b6000602082840312156131cd57600080fd5b60006131db848285016130bf565b91505092915050565b600080604083850312156131f757600080fd5b6000613205858286016130bf565b9250506020613216858286016130bf565b9150509250929050565b60008060006060848603121561323557600080fd5b6000613243868287016130bf565b9350506020613254868287016130bf565b925050604061326586828701613191565b9150509250925092565b6000806000806080858703121561328557600080fd5b6000613293878288016130bf565b94505060206132a4878288016130bf565b93505060406132b587828801613191565b925050606085013567ffffffffffffffff8111156132d257600080fd5b6132de87828801613128565b91505092959194509250565b600080604083850312156132fd57600080fd5b600061330b858286016130bf565b925050602061331c858286016130d4565b9150509250929050565b6000806040838503121561333957600080fd5b6000613347858286016130bf565b925050602061335885828601613191565b9150509250929050565b60006020828403121561337457600080fd5b6000613382848285016130e9565b91505092915050565b60006020828403121561339d57600080fd5b60006133ab848285016130fe565b91505092915050565b6000602082840312156133c657600080fd5b60006133d484828501613113565b91505092915050565b6000602082840312156133ef57600080fd5b600082013567ffffffffffffffff81111561340957600080fd5b61341584828501613152565b91505092915050565b60006020828403121561343057600080fd5b600061343e8482850161317c565b91505092915050565b60006020828403121561345957600080fd5b600061346784828501613191565b91505092915050565b60006020828403121561348257600080fd5b6000613490848285016131a6565b91505092915050565b6134a281614424565b82525050565b6134b181614436565b82525050565b60006134c282614294565b6134cc81856142aa565b93506134dc8185602086016144e6565b6134e5816146d6565b840191505092915050565b6134f9816144b3565b82525050565b600061350a8261429f565b61351481856142bb565b93506135248185602086016144e6565b61352d816146d6565b840191505092915050565b60006135438261429f565b61354d81856142cc565b935061355d8185602086016144e6565b80840191505092915050565b60006135766032836142bb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006135dc6026836142bb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613642601c836142bb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006136826024836142bb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e86019836142bb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613728601f836142bb565b91507f45786365656473206d617820746f6b656e7320706572206163636f756e7421006000830152602082019050919050565b60006137686013836142bb565b91507f4275726e696e67206e6f742061637469766521000000000000000000000000006000830152602082019050919050565b60006137a86010836142bb565b91507f53616c65206e6f742061637469766521000000000000000000000000000000006000830152602082019050919050565b60006137e86012836142bb565b91507f4e6f7420656e6f75676820746f6b656e732100000000000000000000000000006000830152602082019050919050565b6000613828602c836142bb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061388e600e836142bb565b91507f53616c652066696e6973686564210000000000000000000000000000000000006000830152602082019050919050565b60006138ce6038836142bb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613934602a836142bb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061399a6029836142bb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a006020836142bb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613a40602c836142bb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aa66005836142cc565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613ae66020836142bb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b266029836142bb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b8c602f836142bb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613bf26022836142bb565b91507f45786365656473206d6178206d696e747320706572207472616e73616374696f60008301527f6e210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c586021836142bb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cbe6010836142bb565b91507f496e636f72726563742076616c756521000000000000000000000000000000006000830152602082019050919050565b6000613cfe6031836142bb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b613d608161446e565b82525050565b613d6f8161449c565b82525050565b613d7e816144a6565b82525050565b6000613d908285613538565b9150613d9c8284613538565b9150613da782613a99565b91508190509392505050565b6000602082019050613dc86000830184613499565b92915050565b6000606082019050613de36000830186613499565b613df06020830185613499565b613dfd6040830184613d66565b949350505050565b6000608082019050613e1a6000830187613499565b613e276020830186613499565b613e346040830185613d66565b8181036060830152613e4681846134b7565b905095945050505050565b6000604082019050613e666000830185613499565b613e736020830184613d66565b9392505050565b6000602082019050613e8f60008301846134a8565b92915050565b6000602082019050613eaa60008301846134f0565b92915050565b60006020820190508181036000830152613eca81846134ff565b905092915050565b60006020820190508181036000830152613eeb81613569565b9050919050565b60006020820190508181036000830152613f0b816135cf565b9050919050565b60006020820190508181036000830152613f2b81613635565b9050919050565b60006020820190508181036000830152613f4b81613675565b9050919050565b60006020820190508181036000830152613f6b816136db565b9050919050565b60006020820190508181036000830152613f8b8161371b565b9050919050565b60006020820190508181036000830152613fab8161375b565b9050919050565b60006020820190508181036000830152613fcb8161379b565b9050919050565b60006020820190508181036000830152613feb816137db565b9050919050565b6000602082019050818103600083015261400b8161381b565b9050919050565b6000602082019050818103600083015261402b81613881565b9050919050565b6000602082019050818103600083015261404b816138c1565b9050919050565b6000602082019050818103600083015261406b81613927565b9050919050565b6000602082019050818103600083015261408b8161398d565b9050919050565b600060208201905081810360008301526140ab816139f3565b9050919050565b600060208201905081810360008301526140cb81613a33565b9050919050565b600060208201905081810360008301526140eb81613ad9565b9050919050565b6000602082019050818103600083015261410b81613b19565b9050919050565b6000602082019050818103600083015261412b81613b7f565b9050919050565b6000602082019050818103600083015261414b81613be5565b9050919050565b6000602082019050818103600083015261416b81613c4b565b9050919050565b6000602082019050818103600083015261418b81613cb1565b9050919050565b600060208201905081810360008301526141ab81613cf1565b9050919050565b60006020820190506141c76000830184613d57565b92915050565b60006020820190506141e26000830184613d66565b92915050565b60006020820190506141fd6000830184613d75565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561422a576142296146a7565b5b8060405250919050565b600067ffffffffffffffff82111561424f5761424e6146a7565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561427f5761427e6146a7565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142e28261446e565b91506142ed8361446e565b92508261ffff038211156143045761430361461a565b5b828201905092915050565b600061431a8261449c565b91506143258361449c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561435a5761435961461a565b5b828201905092915050565b60006143708261449c565b915061437b8361449c565b92508261438b5761438a614649565b5b828204905092915050565b60006143a18261449c565b91506143ac8361449c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e5576143e461461a565b5b828202905092915050565b60006143fb8261449c565b91506144068361449c565b9250828210156144195761441861461a565b5b828203905092915050565b600061442f8261447c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144be826144c5565b9050919050565b60006144d08261447c565b9050919050565b82818337600083830152505050565b60005b838110156145045780820151818401526020810190506144e9565b83811115614513576000848401525b50505050565b6000600282049050600182168061453157607f821691505b6020821081141561454557614544614678565b5b50919050565b60006145568261446e565b915061ffff82141561456b5761456a61461a565b5b600182019050919050565b60006145818261449c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145b4576145b361461a565b5b600182019050919050565b60006145ca826144a6565b915060ff8214156145de576145dd61461a565b5b600182019050919050565b60006145f48261449c565b91506145ff8361449c565b92508261460f5761460e614649565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6146f081614424565b81146146fb57600080fd5b50565b61470781614436565b811461471257600080fd5b50565b61471e81614442565b811461472957600080fd5b50565b6147358161446e565b811461474057600080fd5b50565b61474c8161449c565b811461475757600080fd5b50565b614763816144a6565b811461476e57600080fd5b5056fea26469706673582212206969df219d72a5719d5a2c6901d71e6038fa6a87e16d0dcdf2b0150d3e07627b64736f6c63430008000033

Deployed Bytecode Sourcemap

35490:3898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39191:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37945:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23986:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25554:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25077:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37801:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37022:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38403:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38514:114;;;;;;;;;;;;;:::i;:::-;;26714:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35734:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38279:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38054:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23680:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35532:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38168:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35774:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23410:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5029:103;;;;;;;;;;;;;:::i;:::-;;37609:88;;;;;;;;;;;;;:::i;:::-;;35868:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35635:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36073:639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35561:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4378:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35804:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36720:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24155:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35596:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38636:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25847:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37298:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24330:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37705:88;;;;;;;;;;;;;:::i;:::-;;35664:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35701:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26073:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5287:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38775:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39191:194;39312:4;39341:36;39365:11;39341:23;:36::i;:::-;39334:43;;39191:194;;;:::o;37945:101::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38028:10:::1;38016:9;;:22;;;;;;;;;;;;;;;;;;37945:101:::0;:::o;23986:100::-;24040:13;24073:5;24066:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23986:100;:::o;25554:221::-;25630:7;25658:16;25666:7;25658;:16::i;:::-;25650:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25743:15;:24;25759:7;25743:24;;;;;;;;;;;;;;;;;;;;;25736:31;;25554:221;;;:::o;25077:411::-;25158:13;25174:23;25189:7;25174:14;:23::i;:::-;25158:39;;25222:5;25216:11;;:2;:11;;;;25208:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25316:5;25300:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25325:37;25342:5;25349:12;:10;:12::i;:::-;25325:16;:37::i;:::-;25300:62;25278:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25459:21;25468:2;25472:7;25459:8;:21::i;:::-;25077:411;;;:::o;37801:136::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37910:19:::1;37889:18;;:40;;;;;;;;;;;;;;;;;;37801:136:::0;:::o;37022:268::-;37151:3;37122:34;;:10;;;;;;;;;;;:34;;;37117:114;;37174:10;;;;;;;;;;;:23;;;37198:5;37205:3;37210:8;37174:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37117:114;37241:41;37261:5;37268:3;37273:8;37241:19;:41::i;:::-;37022:268;;;:::o;38403:103::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38494:8:::1;38474:10;;:29;;;;;;;;;;;;;;;;;;38403:103:::0;:::o;38514:114::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38577:10:::1;38569:28;;:51;38598:21;38569:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;38514:114::o:0;26714:185::-;26852:39;26869:4;26875:2;26879:7;26852:39;;;;;;;;;;;;:16;:39::i;:::-;26714:185;;;:::o;35734:31::-;;;;;;;;;;;;;:::o;38279:116::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38373:14:::1;38357:13;;:30;;;;;;;;;;;;;;;;;;38279:116:::0;:::o;38054:106::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38141:11:::1;38131:7;:21;;;;;;;;;;;;:::i;:::-;;38054:106:::0;:::o;23680:239::-;23752:7;23772:13;23788:7;:16;23796:7;23788:16;;;;;;;;;;;;;;;;;;;;;23772:32;;23840:1;23823:19;;:5;:19;;;;23815:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23906:5;23899:12;;;23680:239;;;:::o;35532:22::-;;;;;;;;;;;;;:::o;38168:103::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38252:11:::1;38239:10;:24;;;;38168:103:::0;:::o;35774:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23410:208::-;23482:7;23527:1;23510:19;;:5;:19;;;;23502:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23594:9;:16;23604:5;23594:16;;;;;;;;;;;;;;;;23587:23;;23410:208;;;:::o;5029:103::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5094:30:::1;5121:1;5094:18;:30::i;:::-;5029:103::o:0;37609:88::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37679:10:::1;;;;;;;;;;;37678:11;37665:10;;:24;;;;;;;;;;;;;;;;;;37609:88::o:0;35868:24::-;;;;;;;;;;;;;:::o;35635:22::-;;;;:::o;36073:639::-;36169:6;36156:19;;:10;;:19;;;;:::i;:::-;36143:9;:32;36135:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36242:9;;;;;;;;;;;36215:36;;36232:6;36215:23;;:14;;;;;;;;;;;:23;;;;:::i;:::-;:36;;;;36207:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36293:10;;;;;;;;;;;36285:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;36353:13;;;;;;;;;;;36343:23;;:6;:23;;;;36335:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;36461:18;;;;;;;;;;;36424:55;;:22;:34;36447:10;36424:34;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;36416:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;36530:7;36526:179;36547:6;36543:10;;:1;:10;;;36526:179;;;36574:37;36584:10;36596:14;;;;;;;;;;;36574:37;;:9;:37::i;:::-;36626:14;;:16;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;36657:22;:34;36680:10;36657:34;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;36555:3;;;;;:::i;:::-;;;;36526:179;;;;36073:639;:::o;35561:22::-;;;;;;;;;;;;;:::o;4378:87::-;4424:7;4451:6;;;;;;;;;;;4444:13;;4378:87;:::o;35804:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;36720:270::-;36784:10;;;;;;;;;;;36776:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;36854:9;;;;;;;;;;;36837:26;;:14;;;;;;;;;;;:26;;;36829:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36893:14;36899:7;36893:14;;:5;:14::i;:::-;36918:37;36928:10;36940:14;;;;;;;;;;;36918:37;;:9;:37::i;:::-;36966:14;;:16;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;36720:270;:::o;24155:104::-;24211:13;24244:7;24237:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24155:104;:::o;35596:32::-;;;;;;;;;;;;;:::o;38636:131::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38724:5:::1;38717:22;;;38740:10;38752:6;38717:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38636:131:::0;;:::o;25847:155::-;25942:52;25961:12;:10;:12::i;:::-;25975:8;25985;25942:18;:52::i;:::-;25847:155;;:::o;37298:303::-;37451:3;37422:34;;:10;;;;;;;;;;;:34;;;37417:114;;37474:10;;;;;;;;;;;:23;;;37498:5;37505:3;37510:8;37474:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37417:114;37541:52;37565:5;37572:3;37577:8;37587:5;37541:23;:52::i;:::-;37298:303;;;;:::o;24330:343::-;24403:13;24437:16;24445:7;24437;:16::i;:::-;24429:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24518:21;24542:10;:8;:10::i;:::-;24518:34;;24594:1;24576:7;24570:21;:25;:95;;;;;;;;;;;;;;;;;24622:7;24631:18;:7;:16;:18::i;:::-;24605:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24570:95;24563:102;;;24330:343;;;:::o;37705:88::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37775:10:::1;;;;;;;;;;;37774:11;37761:10;;:24;;;;;;;;;;;;;;;;;;37705:88::o:0;35664:30::-;;;;;;;;;;;;;:::o;35701:26::-;;;;;;;;;;;;;:::o;26073:164::-;26170:4;26194:18;:25;26213:5;26194:25;;;;;;;;;;;;;;;:35;26220:8;26194:35;;;;;;;;;;;;;;;;;;;;;;;;;26187:42;;26073:164;;;;:::o;5287:201::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5396:1:::1;5376:22;;:8;:22;;;;5368:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5452:28;5471:8;5452:18;:28::i;:::-;5287:201:::0;:::o;38775:144::-;4609:12;:10;:12::i;:::-;4598:23;;:7;:5;:7::i;:::-;:23;;;4590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38861:5:::1;38853:27;;;38889:4;38896:10;38908:2;38853:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38775:144:::0;;:::o;23041:305::-;23143:4;23195:25;23180:40;;;:11;:40;;;;:105;;;;23252:33;23237:48;;;:11;:48;;;;23180:105;:158;;;;23302:36;23326:11;23302:23;:36::i;:::-;23180:158;23160:178;;23041:305;;;:::o;3102:98::-;3155:7;3182:10;3175:17;;3102:98;:::o;28808:127::-;28873:4;28925:1;28897:30;;:7;:16;28905:7;28897:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28890:37;;28808:127;;;:::o;32790:174::-;32892:2;32865:15;:24;32881:7;32865:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32948:7;32944:2;32910:46;;32919:23;32934:7;32919:14;:23::i;:::-;32910:46;;;;;;;;;;;;32790:174;;:::o;26304:339::-;26499:41;26518:12;:10;:12::i;:::-;26532:7;26499:18;:41::i;:::-;26491:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26607:28;26617:4;26623:2;26627:7;26607:9;:28::i;:::-;26304:339;;;:::o;5648:191::-;5722:16;5741:6;;;;;;;;;;;5722:25;;5767:8;5758:6;;:17;;;;;;;;;;;;;;;;;;5822:8;5791:40;;5812:8;5791:40;;;;;;;;;;;;5648:191;;:::o;29792:110::-;29868:26;29878:2;29882:7;29868:26;;;;;;;;;;;;:9;:26::i;:::-;29792:110;;:::o;31397:360::-;31457:13;31473:23;31488:7;31473:14;:23::i;:::-;31457:39;;31509:48;31530:5;31545:1;31549:7;31509:20;:48::i;:::-;31598:29;31615:1;31619:7;31598:8;:29::i;:::-;31660:1;31640:9;:16;31650:5;31640:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31679:7;:16;31687:7;31679:16;;;;;;;;;;;;31672:23;;;;;;;;;;;31741:7;31737:1;31713:36;;31722:5;31713:36;;;;;;;;;;;;31397:360;;:::o;33106:315::-;33261:8;33252:17;;:5;:17;;;;33244:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33348:8;33310:18;:25;33329:5;33310:25;;;;;;;;;;;;;;;:35;33336:8;33310:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33394:8;33372:41;;33387:5;33372:41;;;33404:8;33372:41;;;;;;:::i;:::-;;;;;;;;33106:315;;;:::o;26970:328::-;27145:41;27164:12;:10;:12::i;:::-;27178:7;27145:18;:41::i;:::-;27137:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27251:39;27265:4;27271:2;27275:7;27284:5;27251:13;:39::i;:::-;26970:328;;;;:::o;35965:100::-;36017:13;36050:7;36043:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35965:100;:::o;803:723::-;859:13;1089:1;1080:5;:10;1076:53;;;1107:10;;;;;;;;;;;;;;;;;;;;;1076:53;1139:12;1154:5;1139:20;;1170:14;1195:78;1210:1;1202:4;:9;1195:78;;1228:8;;;;;:::i;:::-;;;;1259:2;1251:10;;;;;:::i;:::-;;;1195:78;;;1283:19;1315:6;1305:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1283:39;;1333:154;1349:1;1340:5;:10;1333:154;;1377:1;1367:11;;;;;:::i;:::-;;;1444:2;1436:5;:10;;;;:::i;:::-;1423:2;:24;;;;:::i;:::-;1410:39;;1393:6;1400;1393:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1473:2;1464:11;;;;;:::i;:::-;;;1333:154;;;1511:6;1497:21;;;;;803:723;;;;:::o;16168:157::-;16253:4;16292:25;16277:40;;;:11;:40;;;;16270:47;;16168:157;;;:::o;29102:348::-;29195:4;29220:16;29228:7;29220;:16::i;:::-;29212:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29296:13;29312:23;29327:7;29312:14;:23::i;:::-;29296:39;;29365:5;29354:16;;:7;:16;;;:51;;;;29398:7;29374:31;;:20;29386:7;29374:11;:20::i;:::-;:31;;;29354:51;:87;;;;29409:32;29426:5;29433:7;29409:16;:32::i;:::-;29354:87;29346:96;;;29102:348;;;;:::o;32094:578::-;32253:4;32226:31;;:23;32241:7;32226:14;:23::i;:::-;:31;;;32218:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32336:1;32322:16;;:2;:16;;;;32314:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32392:39;32413:4;32419:2;32423:7;32392:20;:39::i;:::-;32496:29;32513:1;32517:7;32496:8;:29::i;:::-;32557:1;32538:9;:15;32548:4;32538:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32586:1;32569:9;:13;32579:2;32569:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32617:2;32598:7;:16;32606:7;32598:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32656:7;32652:2;32637:27;;32646:4;32637:27;;;;;;;;;;;;32094:578;;;:::o;30129:321::-;30259:18;30265:2;30269:7;30259:5;:18::i;:::-;30310:54;30341:1;30345:2;30349:7;30358:5;30310:22;:54::i;:::-;30288:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30129:321;;;:::o;38997:186::-;39130:45;39157:4;39163:2;39167:7;39130:26;:45::i;:::-;38997:186;;;:::o;28180:315::-;28337:28;28347:4;28353:2;28357:7;28337:9;:28::i;:::-;28384:48;28407:4;28413:2;28417:7;28426:5;28384:22;:48::i;:::-;28376:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28180:315;;;;:::o;30786:382::-;30880:1;30866:16;;:2;:16;;;;30858:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30939:16;30947:7;30939;:16::i;:::-;30938:17;30930:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31001:45;31030:1;31034:2;31038:7;31001:20;:45::i;:::-;31076:1;31059:9;:13;31069:2;31059:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31107:2;31088:7;:16;31096:7;31088:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31152:7;31148:2;31127:33;;31144:1;31127:33;;;;;;;;;;;;30786:382;;:::o;33986:799::-;34141:4;34162:15;:2;:13;;;:15::i;:::-;34158:620;;;34214:2;34198:36;;;34235:12;:10;:12::i;:::-;34249:4;34255:7;34264:5;34198:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34194:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34457:1;34440:6;:13;:18;34436:272;;;34483:60;;;;;;;;;;:::i;:::-;;;;;;;;34436:272;34658:6;34652:13;34643:6;34639:2;34635:15;34628:38;34194:529;34331:41;;;34321:51;;;:6;:51;;;;34314:58;;;;;34158:620;34762:4;34755:11;;33986:799;;;;;;;:::o;35357:126::-;;;;:::o;6527:387::-;6587:4;6795:12;6862:7;6850:20;6842:28;;6905:1;6898:4;:8;6891:15;;;6527: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::-;;1074:6;1068:13;1059:22;;1090:30;1114:5;1090:30;:::i;:::-;1049:77;;;;:::o;1132:137::-;;1215:6;1202:20;1193:29;;1231:32;1257:5;1231:32;:::i;:::-;1183:86;;;;:::o;1275:141::-;;1362:6;1356:13;1347:22;;1378:32;1404:5;1378:32;:::i;:::-;1337:79;;;;:::o;1435:271::-;;1539:3;1532:4;1524:6;1520:17;1516:27;1506:2;;1557:1;1554;1547:12;1506:2;1597:6;1584:20;1622:78;1696:3;1688:6;1681:4;1673:6;1669:17;1622:78;:::i;:::-;1613:87;;1496:210;;;;;:::o;1726:273::-;;1831:3;1824:4;1816:6;1812:17;1808:27;1798:2;;1849:1;1846;1839:12;1798:2;1889:6;1876:20;1914:79;1989:3;1981:6;1974:4;1966:6;1962:17;1914:79;:::i;:::-;1905:88;;1788:211;;;;;:::o;2005:137::-;;2088:6;2075:20;2066:29;;2104:32;2130:5;2104:32;:::i;:::-;2056:86;;;;:::o;2148:139::-;;2232:6;2219:20;2210:29;;2248:33;2275:5;2248:33;:::i;:::-;2200:87;;;;:::o;2293:135::-;;2375:6;2362:20;2353:29;;2391:31;2416:5;2391:31;:::i;:::-;2343:85;;;;:::o;2434:262::-;;2542:2;2530:9;2521:7;2517:23;2513:32;2510:2;;;2558:1;2555;2548:12;2510:2;2601:1;2626:53;2671:7;2662:6;2651:9;2647:22;2626:53;:::i;:::-;2616:63;;2572:117;2500:196;;;;:::o;2702:407::-;;;2827:2;2815:9;2806:7;2802:23;2798:32;2795:2;;;2843:1;2840;2833:12;2795:2;2886:1;2911:53;2956:7;2947:6;2936:9;2932:22;2911:53;:::i;:::-;2901:63;;2857:117;3013:2;3039:53;3084:7;3075:6;3064:9;3060:22;3039:53;:::i;:::-;3029:63;;2984:118;2785:324;;;;;:::o;3115:552::-;;;;3257:2;3245:9;3236:7;3232:23;3228:32;3225:2;;;3273:1;3270;3263:12;3225:2;3316:1;3341:53;3386:7;3377:6;3366:9;3362:22;3341:53;:::i;:::-;3331:63;;3287:117;3443:2;3469:53;3514:7;3505:6;3494:9;3490:22;3469:53;:::i;:::-;3459:63;;3414:118;3571:2;3597:53;3642:7;3633:6;3622:9;3618:22;3597:53;:::i;:::-;3587:63;;3542:118;3215:452;;;;;:::o;3673:809::-;;;;;3841:3;3829:9;3820:7;3816:23;3812:33;3809:2;;;3858:1;3855;3848:12;3809:2;3901:1;3926:53;3971:7;3962:6;3951:9;3947:22;3926:53;:::i;:::-;3916:63;;3872:117;4028:2;4054:53;4099:7;4090:6;4079:9;4075:22;4054:53;:::i;:::-;4044:63;;3999:118;4156:2;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4127:118;4312:2;4301:9;4297:18;4284:32;4343:18;4335:6;4332:30;4329:2;;;4375:1;4372;4365:12;4329:2;4403:62;4457:7;4448:6;4437:9;4433:22;4403:62;:::i;:::-;4393:72;;4255:220;3799:683;;;;;;;:::o;4488:401::-;;;4610:2;4598:9;4589:7;4585:23;4581:32;4578:2;;;4626:1;4623;4616:12;4578:2;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:50;4864:7;4855:6;4844:9;4840:22;4822:50;:::i;:::-;4812:60;;4767:115;4568:321;;;;;:::o;4895:407::-;;;5020:2;5008:9;4999:7;4995:23;4991:32;4988:2;;;5036:1;5033;5026:12;4988:2;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;5206:2;5232:53;5277:7;5268:6;5257:9;5253:22;5232:53;:::i;:::-;5222:63;;5177:118;4978:324;;;;;:::o;5308:278::-;;5424:2;5412:9;5403:7;5399:23;5395:32;5392:2;;;5440:1;5437;5430:12;5392:2;5483:1;5508:61;5561:7;5552:6;5541:9;5537:22;5508:61;:::i;:::-;5498:71;;5454:125;5382:204;;;;:::o;5592:260::-;;5699:2;5687:9;5678:7;5674:23;5670:32;5667:2;;;5715:1;5712;5705:12;5667:2;5758:1;5783:52;5827:7;5818:6;5807:9;5803:22;5783:52;:::i;:::-;5773:62;;5729:116;5657:195;;;;:::o;5858:282::-;;5976:2;5964:9;5955:7;5951:23;5947:32;5944:2;;;5992:1;5989;5982:12;5944:2;6035:1;6060:63;6115:7;6106:6;6095:9;6091:22;6060:63;:::i;:::-;6050:73;;6006:127;5934:206;;;;:::o;6146:375::-;;6264:2;6252:9;6243:7;6239:23;6235:32;6232:2;;;6280:1;6277;6270:12;6232:2;6351:1;6340:9;6336:17;6323:31;6381:18;6373:6;6370:30;6367:2;;;6413:1;6410;6403:12;6367:2;6441:63;6496:7;6487:6;6476:9;6472:22;6441:63;:::i;:::-;6431:73;;6294:220;6222:299;;;;:::o;6527:260::-;;6634:2;6622:9;6613:7;6609:23;6605:32;6602:2;;;6650:1;6647;6640:12;6602:2;6693:1;6718:52;6762:7;6753:6;6742:9;6738:22;6718:52;:::i;:::-;6708:62;;6664:116;6592:195;;;;:::o;6793:262::-;;6901:2;6889:9;6880:7;6876:23;6872:32;6869:2;;;6917:1;6914;6907:12;6869:2;6960:1;6985:53;7030:7;7021:6;7010:9;7006:22;6985:53;:::i;:::-;6975:63;;6931:117;6859:196;;;;:::o;7061:258::-;;7167:2;7155:9;7146:7;7142:23;7138:32;7135:2;;;7183:1;7180;7173:12;7135:2;7226:1;7251:51;7294:7;7285:6;7274:9;7270:22;7251:51;:::i;:::-;7241:61;;7197:115;7125:194;;;;:::o;7325:118::-;7412:24;7430:5;7412:24;:::i;:::-;7407:3;7400:37;7390:53;;:::o;7449:109::-;7530:21;7545:5;7530:21;:::i;:::-;7525:3;7518:34;7508:50;;:::o;7564:360::-;;7678:38;7710:5;7678:38;:::i;:::-;7732:70;7795:6;7790:3;7732:70;:::i;:::-;7725:77;;7811:52;7856:6;7851:3;7844:4;7837:5;7833:16;7811:52;:::i;:::-;7888:29;7910:6;7888:29;:::i;:::-;7883:3;7879:39;7872:46;;7654:270;;;;;:::o;7930:157::-;8030:50;8074:5;8030:50;:::i;:::-;8025:3;8018:63;8008:79;;:::o;8093:364::-;;8209:39;8242:5;8209:39;:::i;:::-;8264:71;8328:6;8323:3;8264:71;:::i;:::-;8257:78;;8344:52;8389:6;8384:3;8377:4;8370:5;8366:16;8344:52;:::i;:::-;8421:29;8443:6;8421:29;:::i;:::-;8416:3;8412:39;8405:46;;8185:272;;;;;:::o;8463:377::-;;8597:39;8630:5;8597:39;:::i;:::-;8652:89;8734:6;8729:3;8652:89;:::i;:::-;8645:96;;8750:52;8795:6;8790:3;8783:4;8776:5;8772:16;8750:52;:::i;:::-;8827:6;8822:3;8818:16;8811:23;;8573:267;;;;;:::o;8846:382::-;;9009:67;9073:2;9068:3;9009:67;:::i;:::-;9002:74;;9106:34;9102:1;9097:3;9093:11;9086:55;9172:20;9167:2;9162:3;9158:12;9151:42;9219:2;9214:3;9210:12;9203:19;;8992:236;;;:::o;9234:370::-;;9397:67;9461:2;9456:3;9397:67;:::i;:::-;9390:74;;9494:34;9490:1;9485:3;9481:11;9474:55;9560:8;9555:2;9550:3;9546:12;9539:30;9595:2;9590:3;9586:12;9579:19;;9380:224;;;:::o;9610:326::-;;9773:67;9837:2;9832:3;9773:67;:::i;:::-;9766:74;;9870:30;9866:1;9861:3;9857:11;9850:51;9927:2;9922:3;9918:12;9911:19;;9756:180;;;:::o;9942:368::-;;10105:67;10169:2;10164:3;10105:67;:::i;:::-;10098:74;;10202:34;10198:1;10193:3;10189:11;10182:55;10268:6;10263:2;10258:3;10254:12;10247:28;10301:2;10296:3;10292:12;10285:19;;10088:222;;;:::o;10316:323::-;;10479:67;10543:2;10538:3;10479:67;:::i;:::-;10472:74;;10576:27;10572:1;10567:3;10563:11;10556:48;10630:2;10625:3;10621:12;10614:19;;10462:177;;;:::o;10645:329::-;;10808:67;10872:2;10867:3;10808:67;:::i;:::-;10801:74;;10905:33;10901:1;10896:3;10892:11;10885:54;10965:2;10960:3;10956:12;10949:19;;10791:183;;;:::o;10980:317::-;;11143:67;11207:2;11202:3;11143:67;:::i;:::-;11136:74;;11240:21;11236:1;11231:3;11227:11;11220:42;11288:2;11283:3;11279:12;11272:19;;11126:171;;;:::o;11303:314::-;;11466:67;11530:2;11525:3;11466:67;:::i;:::-;11459:74;;11563:18;11559:1;11554:3;11550:11;11543:39;11608:2;11603:3;11599:12;11592:19;;11449:168;;;:::o;11623:316::-;;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11883:20;11879:1;11874:3;11870:11;11863:41;11930:2;11925:3;11921:12;11914:19;;11769:170;;;:::o;11945:376::-;;12108:67;12172:2;12167:3;12108:67;:::i;:::-;12101:74;;12205:34;12201:1;12196:3;12192:11;12185:55;12271:14;12266:2;12261:3;12257:12;12250:36;12312:2;12307:3;12303:12;12296:19;;12091:230;;;:::o;12327:312::-;;12490:67;12554:2;12549:3;12490:67;:::i;:::-;12483:74;;12587:16;12583:1;12578:3;12574:11;12567:37;12630:2;12625:3;12621:12;12614:19;;12473:166;;;:::o;12645:388::-;;12808:67;12872:2;12867:3;12808:67;:::i;:::-;12801:74;;12905:34;12901:1;12896:3;12892:11;12885:55;12971:26;12966:2;12961:3;12957:12;12950:48;13024:2;13019:3;13015:12;13008:19;;12791:242;;;:::o;13039:374::-;;13202:67;13266:2;13261:3;13202:67;:::i;:::-;13195:74;;13299:34;13295:1;13290:3;13286:11;13279:55;13365:12;13360:2;13355:3;13351:12;13344:34;13404:2;13399:3;13395:12;13388:19;;13185:228;;;:::o;13419:373::-;;13582:67;13646:2;13641:3;13582:67;:::i;:::-;13575:74;;13679:34;13675:1;13670:3;13666:11;13659:55;13745:11;13740:2;13735:3;13731:12;13724:33;13783:2;13778:3;13774:12;13767:19;;13565:227;;;:::o;13798:330::-;;13961:67;14025:2;14020:3;13961:67;:::i;:::-;13954:74;;14058:34;14054:1;14049:3;14045:11;14038:55;14119:2;14114:3;14110:12;14103:19;;13944:184;;;:::o;14134:376::-;;14297:67;14361:2;14356:3;14297:67;:::i;:::-;14290:74;;14394:34;14390:1;14385:3;14381:11;14374:55;14460:14;14455:2;14450:3;14446:12;14439:36;14501:2;14496:3;14492:12;14485:19;;14280:230;;;:::o;14516:337::-;;14697:84;14779:1;14774:3;14697:84;:::i;:::-;14690:91;;14811:7;14807:1;14802:3;14798:11;14791:28;14845:1;14840:3;14836:11;14829:18;;14680:173;;;:::o;14859:330::-;;15022:67;15086:2;15081:3;15022:67;:::i;:::-;15015:74;;15119:34;15115:1;15110:3;15106:11;15099:55;15180:2;15175:3;15171:12;15164:19;;15005:184;;;:::o;15195:373::-;;15358:67;15422:2;15417:3;15358:67;:::i;:::-;15351:74;;15455:34;15451:1;15446:3;15442:11;15435:55;15521:11;15516:2;15511:3;15507:12;15500:33;15559:2;15554:3;15550:12;15543:19;;15341:227;;;:::o;15574:379::-;;15737:67;15801:2;15796:3;15737:67;:::i;:::-;15730:74;;15834:34;15830:1;15825:3;15821:11;15814:55;15900:17;15895:2;15890:3;15886:12;15879:39;15944:2;15939:3;15935:12;15928:19;;15720:233;;;:::o;15959:366::-;;16122:67;16186:2;16181:3;16122:67;:::i;:::-;16115:74;;16219:34;16215:1;16210:3;16206:11;16199:55;16285:4;16280:2;16275:3;16271:12;16264:26;16316:2;16311:3;16307:12;16300:19;;16105:220;;;:::o;16331:365::-;;16494:67;16558:2;16553:3;16494:67;:::i;:::-;16487:74;;16591:34;16587:1;16582:3;16578:11;16571:55;16657:3;16652:2;16647:3;16643:12;16636:25;16687:2;16682:3;16678:12;16671:19;;16477:219;;;:::o;16702:314::-;;16865:67;16929:2;16924:3;16865:67;:::i;:::-;16858:74;;16962:18;16958:1;16953:3;16949:11;16942:39;17007:2;17002:3;16998:12;16991:19;;16848:168;;;:::o;17022:381::-;;17185:67;17249:2;17244:3;17185:67;:::i;:::-;17178:74;;17282:34;17278:1;17273:3;17269:11;17262:55;17348:19;17343:2;17338:3;17334:12;17327:41;17394:2;17389:3;17385:12;17378:19;;17168:235;;;:::o;17409:115::-;17494:23;17511:5;17494:23;:::i;:::-;17489:3;17482:36;17472:52;;:::o;17530:118::-;17617:24;17635:5;17617:24;:::i;:::-;17612:3;17605:37;17595:53;;:::o;17654:112::-;17737:22;17753:5;17737:22;:::i;:::-;17732:3;17725:35;17715:51;;:::o;17772:701::-;;18075:95;18166:3;18157:6;18075:95;:::i;:::-;18068:102;;18187:95;18278:3;18269:6;18187:95;:::i;:::-;18180:102;;18299:148;18443:3;18299:148;:::i;:::-;18292:155;;18464:3;18457:10;;18057:416;;;;;:::o;18479:222::-;;18610:2;18599:9;18595:18;18587:26;;18623:71;18691:1;18680:9;18676:17;18667:6;18623:71;:::i;:::-;18577:124;;;;:::o;18707:442::-;;18894:2;18883:9;18879:18;18871:26;;18907:71;18975:1;18964:9;18960:17;18951:6;18907:71;:::i;:::-;18988:72;19056:2;19045:9;19041:18;19032:6;18988:72;:::i;:::-;19070;19138:2;19127:9;19123:18;19114:6;19070:72;:::i;:::-;18861:288;;;;;;:::o;19155:640::-;;19388:3;19377:9;19373:19;19365:27;;19402:71;19470:1;19459:9;19455:17;19446:6;19402:71;:::i;:::-;19483:72;19551:2;19540:9;19536:18;19527:6;19483:72;:::i;:::-;19565;19633:2;19622:9;19618:18;19609:6;19565:72;:::i;:::-;19684:9;19678:4;19674:20;19669:2;19658:9;19654:18;19647:48;19712:76;19783:4;19774:6;19712:76;:::i;:::-;19704:84;;19355:440;;;;;;;:::o;19801:332::-;;19960:2;19949:9;19945:18;19937:26;;19973:71;20041:1;20030:9;20026:17;20017:6;19973:71;:::i;:::-;20054:72;20122:2;20111:9;20107:18;20098:6;20054:72;:::i;:::-;19927:206;;;;;:::o;20139:210::-;;20264:2;20253:9;20249:18;20241:26;;20277:65;20339:1;20328:9;20324:17;20315:6;20277:65;:::i;:::-;20231:118;;;;:::o;20355:248::-;;20499:2;20488:9;20484:18;20476:26;;20512:84;20593:1;20582:9;20578:17;20569:6;20512:84;:::i;:::-;20466:137;;;;:::o;20609:313::-;;20760:2;20749:9;20745:18;20737:26;;20809:9;20803:4;20799:20;20795:1;20784:9;20780:17;20773:47;20837:78;20910:4;20901:6;20837:78;:::i;:::-;20829:86;;20727:195;;;;:::o;20928:419::-;;21132:2;21121:9;21117:18;21109:26;;21181:9;21175:4;21171:20;21167:1;21156:9;21152:17;21145:47;21209:131;21335:4;21209:131;:::i;:::-;21201:139;;21099:248;;;:::o;21353:419::-;;21557:2;21546:9;21542:18;21534:26;;21606:9;21600:4;21596:20;21592:1;21581:9;21577:17;21570:47;21634:131;21760:4;21634:131;:::i;:::-;21626:139;;21524:248;;;:::o;21778:419::-;;21982:2;21971:9;21967:18;21959:26;;22031:9;22025:4;22021:20;22017:1;22006:9;22002:17;21995:47;22059:131;22185:4;22059:131;:::i;:::-;22051:139;;21949:248;;;:::o;22203:419::-;;22407:2;22396:9;22392:18;22384:26;;22456:9;22450:4;22446:20;22442:1;22431:9;22427:17;22420:47;22484:131;22610:4;22484:131;:::i;:::-;22476:139;;22374:248;;;:::o;22628:419::-;;22832:2;22821:9;22817:18;22809:26;;22881:9;22875:4;22871:20;22867:1;22856:9;22852:17;22845:47;22909:131;23035:4;22909:131;:::i;:::-;22901:139;;22799:248;;;:::o;23053:419::-;;23257:2;23246:9;23242:18;23234:26;;23306:9;23300:4;23296:20;23292:1;23281:9;23277:17;23270:47;23334:131;23460:4;23334:131;:::i;:::-;23326:139;;23224:248;;;:::o;23478:419::-;;23682:2;23671:9;23667:18;23659:26;;23731:9;23725:4;23721:20;23717:1;23706:9;23702:17;23695:47;23759:131;23885:4;23759:131;:::i;:::-;23751:139;;23649:248;;;:::o;23903:419::-;;24107:2;24096:9;24092:18;24084:26;;24156:9;24150:4;24146:20;24142:1;24131:9;24127:17;24120:47;24184:131;24310:4;24184:131;:::i;:::-;24176:139;;24074:248;;;:::o;24328:419::-;;24532:2;24521:9;24517:18;24509:26;;24581:9;24575:4;24571:20;24567:1;24556:9;24552:17;24545:47;24609:131;24735:4;24609:131;:::i;:::-;24601:139;;24499:248;;;:::o;24753:419::-;;24957:2;24946:9;24942:18;24934:26;;25006:9;25000:4;24996:20;24992:1;24981:9;24977:17;24970:47;25034:131;25160:4;25034:131;:::i;:::-;25026:139;;24924:248;;;:::o;25178:419::-;;25382:2;25371:9;25367:18;25359:26;;25431:9;25425:4;25421:20;25417:1;25406:9;25402:17;25395:47;25459:131;25585:4;25459:131;:::i;:::-;25451:139;;25349:248;;;:::o;25603:419::-;;25807:2;25796:9;25792:18;25784:26;;25856:9;25850:4;25846:20;25842:1;25831:9;25827:17;25820:47;25884:131;26010:4;25884:131;:::i;:::-;25876:139;;25774:248;;;:::o;26028:419::-;;26232:2;26221:9;26217:18;26209:26;;26281:9;26275:4;26271:20;26267:1;26256:9;26252:17;26245:47;26309:131;26435:4;26309:131;:::i;:::-;26301:139;;26199:248;;;:::o;26453:419::-;;26657:2;26646:9;26642:18;26634:26;;26706:9;26700:4;26696:20;26692:1;26681:9;26677:17;26670:47;26734:131;26860:4;26734:131;:::i;:::-;26726:139;;26624:248;;;:::o;26878:419::-;;27082:2;27071:9;27067:18;27059:26;;27131:9;27125:4;27121:20;27117:1;27106:9;27102:17;27095:47;27159:131;27285:4;27159:131;:::i;:::-;27151:139;;27049:248;;;:::o;27303:419::-;;27507:2;27496:9;27492:18;27484:26;;27556:9;27550:4;27546:20;27542:1;27531:9;27527:17;27520:47;27584:131;27710:4;27584:131;:::i;:::-;27576:139;;27474:248;;;:::o;27728:419::-;;27932:2;27921:9;27917:18;27909:26;;27981:9;27975:4;27971:20;27967:1;27956:9;27952:17;27945:47;28009:131;28135:4;28009:131;:::i;:::-;28001:139;;27899:248;;;:::o;28153:419::-;;28357:2;28346:9;28342:18;28334:26;;28406:9;28400:4;28396:20;28392:1;28381:9;28377:17;28370:47;28434:131;28560:4;28434:131;:::i;:::-;28426:139;;28324:248;;;:::o;28578:419::-;;28782:2;28771:9;28767:18;28759:26;;28831:9;28825:4;28821:20;28817:1;28806:9;28802:17;28795:47;28859:131;28985:4;28859:131;:::i;:::-;28851:139;;28749:248;;;:::o;29003:419::-;;29207:2;29196:9;29192:18;29184:26;;29256:9;29250:4;29246:20;29242:1;29231:9;29227:17;29220:47;29284:131;29410:4;29284:131;:::i;:::-;29276:139;;29174:248;;;:::o;29428:419::-;;29632:2;29621:9;29617:18;29609:26;;29681:9;29675:4;29671:20;29667:1;29656:9;29652:17;29645:47;29709:131;29835:4;29709:131;:::i;:::-;29701:139;;29599:248;;;:::o;29853:419::-;;30057:2;30046:9;30042:18;30034:26;;30106:9;30100:4;30096:20;30092:1;30081:9;30077:17;30070:47;30134:131;30260:4;30134:131;:::i;:::-;30126:139;;30024:248;;;:::o;30278:419::-;;30482:2;30471:9;30467:18;30459:26;;30531:9;30525:4;30521:20;30517:1;30506:9;30502:17;30495:47;30559:131;30685:4;30559:131;:::i;:::-;30551:139;;30449:248;;;:::o;30703:218::-;;30832:2;30821:9;30817:18;30809:26;;30845:69;30911:1;30900:9;30896:17;30887:6;30845:69;:::i;:::-;30799:122;;;;:::o;30927:222::-;;31058:2;31047:9;31043:18;31035:26;;31071:71;31139:1;31128:9;31124:17;31115:6;31071:71;:::i;:::-;31025:124;;;;:::o;31155:214::-;;31282:2;31271:9;31267:18;31259:26;;31295:67;31359:1;31348:9;31344:17;31335:6;31295:67;:::i;:::-;31249:120;;;;:::o;31375:283::-;;31441:2;31435:9;31425:19;;31483:4;31475:6;31471:17;31590:6;31578:10;31575:22;31554:18;31542:10;31539:34;31536:62;31533:2;;;31601:18;;:::i;:::-;31533:2;31641:10;31637:2;31630:22;31415:243;;;;:::o;31664:331::-;;31815:18;31807:6;31804:30;31801:2;;;31837:18;;:::i;:::-;31801:2;31922:4;31918:9;31911:4;31903:6;31899:17;31895:33;31887:41;;31983:4;31977;31973:15;31965:23;;31730:265;;;:::o;32001:332::-;;32153:18;32145:6;32142:30;32139:2;;;32175:18;;:::i;:::-;32139:2;32260:4;32256:9;32249:4;32241:6;32237:17;32233:33;32225:41;;32321:4;32315;32311:15;32303:23;;32068:265;;;:::o;32339:98::-;;32424:5;32418:12;32408:22;;32397:40;;;:::o;32443:99::-;;32529:5;32523:12;32513:22;;32502:40;;;:::o;32548:168::-;;32665:6;32660:3;32653:19;32705:4;32700:3;32696:14;32681:29;;32643:73;;;;:::o;32722:169::-;;32840:6;32835:3;32828:19;32880:4;32875:3;32871:14;32856:29;;32818:73;;;;:::o;32897:148::-;;33036:3;33021:18;;33011:34;;;;:::o;33051:242::-;;33109:19;33126:1;33109:19;:::i;:::-;33104:24;;33142:19;33159:1;33142:19;:::i;:::-;33137:24;;33235:1;33227:6;33223:14;33220:1;33217:21;33214:2;;;33241:18;;:::i;:::-;33214:2;33285:1;33282;33278:9;33271:16;;33094:199;;;;:::o;33299:305::-;;33358:20;33376:1;33358:20;:::i;:::-;33353:25;;33392:20;33410:1;33392:20;:::i;:::-;33387:25;;33546:1;33478:66;33474:74;33471:1;33468:81;33465:2;;;33552:18;;:::i;:::-;33465:2;33596:1;33593;33589:9;33582:16;;33343:261;;;;:::o;33610:185::-;;33667:20;33685:1;33667:20;:::i;:::-;33662:25;;33701:20;33719:1;33701:20;:::i;:::-;33696:25;;33740:1;33730:2;;33745:18;;:::i;:::-;33730:2;33787:1;33784;33780:9;33775:14;;33652:143;;;;:::o;33801:348::-;;33864:20;33882:1;33864:20;:::i;:::-;33859:25;;33898:20;33916:1;33898:20;:::i;:::-;33893:25;;34086:1;34018:66;34014:74;34011:1;34008:81;34003:1;33996:9;33989:17;33985:105;33982:2;;;34093:18;;:::i;:::-;33982:2;34141:1;34138;34134:9;34123:20;;33849:300;;;;:::o;34155:191::-;;34215:20;34233:1;34215:20;:::i;:::-;34210:25;;34249:20;34267:1;34249:20;:::i;:::-;34244:25;;34288:1;34285;34282:8;34279:2;;;34293:18;;:::i;:::-;34279:2;34338:1;34335;34331:9;34323:17;;34200:146;;;;:::o;34352:96::-;;34418:24;34436:5;34418:24;:::i;:::-;34407:35;;34397:51;;;:::o;34454:90::-;;34531:5;34524:13;34517:21;34506:32;;34496:48;;;:::o;34550:149::-;;34626:66;34619:5;34615:78;34604:89;;34594:105;;;:::o;34705:89::-;;34781:6;34774:5;34770:18;34759:29;;34749:45;;;:::o;34800:126::-;;34877:42;34870:5;34866:54;34855:65;;34845:81;;;:::o;34932:77::-;;34998:5;34987:16;;34977:32;;;:::o;35015:86::-;;35090:4;35083:5;35079:16;35068:27;;35058:43;;;:::o;35107:152::-;;35203:50;35247:5;35203:50;:::i;:::-;35190:63;;35180:79;;;:::o;35265:126::-;;35361:24;35379:5;35361:24;:::i;:::-;35348:37;;35338:53;;;:::o;35397:154::-;35481:6;35476:3;35471;35458:30;35543:1;35534:6;35529:3;35525:16;35518:27;35448:103;;;:::o;35557:307::-;35625:1;35635:113;35649:6;35646:1;35643:13;35635:113;;;35734:1;35729:3;35725:11;35719:18;35715:1;35710:3;35706:11;35699:39;35671:2;35668:1;35664:10;35659:15;;35635:113;;;35766:6;35763:1;35760:13;35757:2;;;35846:1;35837:6;35832:3;35828:16;35821:27;35757:2;35606:258;;;;:::o;35870:320::-;;35951:1;35945:4;35941:12;35931:22;;35998:1;35992:4;35988:12;36019:18;36009:2;;36075:4;36067:6;36063:17;36053:27;;36009:2;36137;36129:6;36126:14;36106:18;36103:38;36100:2;;;36156:18;;:::i;:::-;36100:2;35921:269;;;;:::o;36196:171::-;;36257:23;36274:5;36257:23;:::i;:::-;36248:32;;36302:6;36295:5;36292:17;36289:2;;;36312:18;;:::i;:::-;36289:2;36359:1;36352:5;36348:13;36341:20;;36238:129;;;:::o;36373:233::-;;36435:24;36453:5;36435:24;:::i;:::-;36426:33;;36481:66;36474:5;36471:77;36468:2;;;36551:18;;:::i;:::-;36468:2;36598:1;36591:5;36587:13;36580:20;;36416:190;;;:::o;36612:167::-;;36672:22;36688:5;36672:22;:::i;:::-;36663:31;;36716:4;36709:5;36706:15;36703:2;;;36724:18;;:::i;:::-;36703:2;36771:1;36764:5;36760:13;36753:20;;36653:126;;;:::o;36785:176::-;;36834:20;36852:1;36834:20;:::i;:::-;36829:25;;36868:20;36886:1;36868:20;:::i;:::-;36863:25;;36907:1;36897:2;;36912:18;;:::i;:::-;36897:2;36953:1;36950;36946:9;36941:14;;36819:142;;;;:::o;36967:180::-;37015:77;37012:1;37005:88;37112:4;37109:1;37102:15;37136:4;37133:1;37126:15;37153:180;37201:77;37198:1;37191:88;37298:4;37295:1;37288:15;37322:4;37319:1;37312:15;37339:180;37387:77;37384:1;37377:88;37484:4;37481:1;37474:15;37508:4;37505:1;37498:15;37525:180;37573:77;37570:1;37563:88;37670:4;37667:1;37660:15;37694:4;37691:1;37684:15;37711:102;;37803:2;37799:7;37794:2;37787:5;37783:14;37779:28;37769:38;;37759:54;;;:::o;37819:122::-;37892:24;37910:5;37892:24;:::i;:::-;37885:5;37882:35;37872:2;;37931:1;37928;37921:12;37872:2;37862:79;:::o;37947:116::-;38017:21;38032:5;38017:21;:::i;:::-;38010:5;38007:32;37997:2;;38053:1;38050;38043:12;37997:2;37987:76;:::o;38069:120::-;38141:23;38158:5;38141:23;:::i;:::-;38134:5;38131:34;38121:2;;38179:1;38176;38169:12;38121:2;38111:78;:::o;38195:120::-;38267:23;38284:5;38267:23;:::i;:::-;38260:5;38257:34;38247:2;;38305:1;38302;38295:12;38247:2;38237:78;:::o;38321:122::-;38394:24;38412:5;38394:24;:::i;:::-;38387:5;38384:35;38374:2;;38433:1;38430;38423:12;38374:2;38364:79;:::o;38449:118::-;38520:22;38536:5;38520:22;:::i;:::-;38513:5;38510:33;38500:2;;38557:1;38554;38547:12;38500:2;38490:77;:::o

Swarm Source

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