Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
950 GenZ
Holders
237
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GenZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ZOMBIEZ
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-11 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/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); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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 Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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 { _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 { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/zombiez.sol pragma solidity >=0.8.0 <0.9.0; contract ZOMBIEZ is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; string public baseURI; string public notRevealedUri; string public uriSuffix = ".json"; uint256 public cost = 0.0356 ether; uint256 public costDisc = 0.0222 ether; uint256 public maxSupply = 5656; uint256 public freeSupply = 0; uint256 public MaxperTx = 5; uint256 public nftPerAddressLimit = 10; uint256 public nftPerAddressLimit_WL = 7; uint256 public nftPerAddressLimit_free = 3; address[] public whitelistedAddresses; mapping(address => uint256) public addressMintedBalance; bool public presale = true; bool public paused = true; bool public revealed = false; constructor() ERC721A("Genesis ZOMBIEZ", "GenZ") { setNotRevealedUri("ipfs://QmYKhKCNCMTPaD6CtjCnDCuUEd9w9z3BFPfPayS7bDBrSC/hidden.json"); } // Internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } // Presale and Public Mint function mint(uint256 _amount) external payable { address _caller = _msgSender(); uint256 ownerMintedCount = addressMintedBalance[_caller]; require(!paused, "Contract is paused."); require(_amount > 0, "Need to mint at least 1 NFT."); require(totalSupply() + _amount <= maxSupply, "Max supply exceeded."); require(tx.origin == _caller, "Caller can't be another contract."); require(_amount <= MaxperTx, "Excess max mint per tx."); if (presale == true) { require(isWhitelisted(_caller), "user is not whitelisted."); if (ownerMintedCount < nftPerAddressLimit_free) { require(ownerMintedCount + _amount <= nftPerAddressLimit_free, "Excess max free per address."); } else if (ownerMintedCount >= nftPerAddressLimit_free) { require(ownerMintedCount + _amount <= nftPerAddressLimit_WL, "Excess max per WL address."); require(_amount * costDisc <= msg.value, "Invalid funds provided."); } addressMintedBalance[_caller] += _amount; _safeMint(_caller, _amount); } if (presale == false) { if (ownerMintedCount < 1) { require(freeSupply < 888, "Free supply sold out."); require(ownerMintedCount + _amount == 1, "You can mint only 1 for free."); addressMintedBalance[_caller] += _amount; freeSupply++; _safeMint(_caller, _amount); } else if (ownerMintedCount >= 1) { require(ownerMintedCount + _amount <= nftPerAddressLimit, "Excess max per address limit."); require(_amount * cost <= msg.value, "Invalid funds provided."); addressMintedBalance[_caller] += _amount; _safeMint(_caller, _amount); } } } // Only owner mint, used to mint tokens for other wallets function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(_mintAmount > 0, "Invalid mint amount!"); require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!"); addressMintedBalance[_receiver] += _mintAmount; _safeMint(_receiver, _mintAmount); } // Check if address is whitelisted function isWhitelisted(address _user) public view returns (bool) { for (uint i = 0; i < whitelistedAddresses.length; i++) { if (whitelistedAddresses[i] == _user) { return true; } } return false; } // TokenURI index function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token."); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } // Set Cost function setCost(uint256 _cost) public onlyOwner { cost = _cost; } // Set Cost + Discount function setCostDisc(uint256 _cost) public onlyOwner { costDisc = _cost; } // Sets the max amount of mints per transaction function setMaxperTx(uint256 _maxperTx) public onlyOwner { MaxperTx = _maxperTx; } // Returns the baseURI for metadata function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } // Internal function to set the hidden IPFS metadata function setNotRevealedUri(string memory _notRevealedUri) public onlyOwner { notRevealedUri = _notRevealedUri; } // Whitelist addresses function whitelistUsers(address[] calldata _users) public onlyOwner { delete whitelistedAddresses; whitelistedAddresses = _users; } // Internal function to change contract revealed, true = revealed function setReveal(bool _state) public onlyOwner { revealed = _state; } // Internal function to change contract pause, true = paused function setPaused(bool _state) public onlyOwner { paused = _state; } // Internal function to change contract presale state, true = presale ON function setPresaleState(bool _state) public onlyOwner { presale = _state; } // Do not remove this function or you will not be able to withdraw funds function withdraw() public onlyOwner nonReentrant { // Owner wallet (bool T1, ) = payable(owner()).call{value: address(this).balance / 2}(""); require(T1, "Transfer failed."); // Community wallet (bool T2, ) = payable(0x20bfE7480177a05b76b295D652F66D630018cfc9).call{value: address(this).balance}(""); require(T2, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costDisc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit_free","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCostDisc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxperTx","type":"uint256"}],"name":"setMaxperTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"name":"setNotRevealedUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620003a0565b50667e7a02ea010000600d55664edec84a038000600e55611618600f5560006010556005601155600a601255600760135560036014556001601760006101000a81548160ff0219169083151502179055506001601760016101000a81548160ff0219169083151502179055506000601760026101000a81548160ff021916908315150217905550348015620000e557600080fd5b506040518060400160405280600f81526020017f47656e65736973205a4f4d4249455a00000000000000000000000000000000008152506040518060400160405280600481526020017f47656e5a0000000000000000000000000000000000000000000000000000000081525081600290805190602001906200016a929190620003a0565b50806003908051906020019062000183929190620003a0565b5062000194620001f460201b60201c565b6000819055505050620001bc620001b0620001fd60201b60201c565b6200020560201b60201c565b6001600981905550620001ee604051806080016040528060418152602001620050fc60419139620002cb60201b60201c565b62000538565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002db620001fd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003016200037660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200035a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003519062000477565b60405180910390fd5b80600b908051906020019062000372929190620003a0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ae90620004aa565b90600052602060002090601f016020900481019282620003d257600085556200041e565b82601f10620003ed57805160ff19168380011785556200041e565b828001600101855582156200041e579182015b828111156200041d57825182559160200191906001019062000400565b5b5090506200042d919062000431565b5090565b5b808211156200044c57600081600090555060010162000432565b5090565b60006200045f60208362000499565b91506200046c826200050f565b602082019050919050565b60006020820190508181036000830152620004928162000450565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004c357607f821691505b60208210811415620004da57620004d9620004e0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614bb480620005486000396000f3fe6080604052600436106102885760003560e01c80635ef9ff371161015a578063ba4e5c49116100c1578063e985e9c51161007a578063e985e9c5146109c1578063edec5f27146109fe578063efbd73f414610a27578063f2fde38b14610a50578063fdea8e0b14610a79578063ff64569114610aa457610288565b8063ba4e5c491461089f578063ba7d2c76146108dc578063bce4d6ae14610907578063c17ecd1214610930578063c87b56dd14610959578063d5abeb011461099657610288565b80638da5cb5b116101135780638da5cb5b146107b257806395d89b41146107dd578063a0712d6814610808578063a22cb46514610824578063b5f3a2831461084d578063b88d4fde1461087657610288565b80635ef9ff37146106a25780636352211e146106cb5780636c0360eb1461070857806370a0823114610733578063715018a614610770578063745c229f1461078757610288565b806324a6ab0c116101fe57806344a0d68a116101b757806344a0d68a146105a457806349696a56146105cd57806351830227146105f85780635503a0e81461062357806355f804b31461064e5780635c975abb1461067757610288565b806324a6ab0c146104965780632a3f300c146104c15780633af32abf146104ea5780633ccfd60b1461052757806342842e0e1461053e578063438b63001461056757610288565b806313faede61161025057806313faede61461038657806316c38b3c146103b157806318160ddd146103da57806318cae26914610405578063228dc6d31461044257806323b872dd1461046d57610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063081c8c4414610332578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613996565b610acf565b6040516102c19190614005565b60405180910390f35b3480156102d657600080fd5b506102df610b61565b6040516102ec9190614020565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613a39565b610bf3565b6040516103299190613f7c565b60405180910390f35b34801561033e57600080fd5b50610347610c6f565b6040516103549190614020565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f91906138dc565b610cfd565b005b34801561039257600080fd5b5061039b610ea4565b6040516103a891906142a2565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190613969565b610eaa565b005b3480156103e657600080fd5b506103ef610f43565b6040516103fc91906142a2565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190613759565b610f5a565b60405161043991906142a2565b60405180910390f35b34801561044e57600080fd5b50610457610f72565b60405161046491906142a2565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f91906137c6565b610f78565b005b3480156104a257600080fd5b506104ab610f88565b6040516104b891906142a2565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613969565b610f8e565b005b3480156104f657600080fd5b50610511600480360381019061050c9190613759565b611027565b60405161051e9190614005565b60405180910390f35b34801561053357600080fd5b5061053c6110d6565b005b34801561054a57600080fd5b50610565600480360381019061056091906137c6565b61132b565b005b34801561057357600080fd5b5061058e60048036038101906105899190613759565b61134b565b60405161059b9190613fe3565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613a39565b611456565b005b3480156105d957600080fd5b506105e26114dc565b6040516105ef91906142a2565b60405180910390f35b34801561060457600080fd5b5061060d6114e2565b60405161061a9190614005565b60405180910390f35b34801561062f57600080fd5b506106386114f5565b6040516106459190614020565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906139f0565b611583565b005b34801561068357600080fd5b5061068c611619565b6040516106999190614005565b60405180910390f35b3480156106ae57600080fd5b506106c960048036038101906106c49190613a39565b61162c565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190613a39565b6116b2565b6040516106ff9190613f7c565b60405180910390f35b34801561071457600080fd5b5061071d6116c4565b60405161072a9190614020565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190613759565b611752565b60405161076791906142a2565b60405180910390f35b34801561077c57600080fd5b5061078561180b565b005b34801561079357600080fd5b5061079c611893565b6040516107a991906142a2565b60405180910390f35b3480156107be57600080fd5b506107c7611899565b6040516107d49190613f7c565b60405180910390f35b3480156107e957600080fd5b506107f26118c3565b6040516107ff9190614020565b60405180910390f35b610822600480360381019061081d9190613a39565b611955565b005b34801561083057600080fd5b5061084b6004803603810190610846919061389c565b611f57565b005b34801561085957600080fd5b50610874600480360381019061086f9190613a39565b6120cf565b005b34801561088257600080fd5b5061089d60048036038101906108989190613819565b612155565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190613a39565b6121c8565b6040516108d39190613f7c565b60405180910390f35b3480156108e857600080fd5b506108f1612207565b6040516108fe91906142a2565b60405180910390f35b34801561091357600080fd5b5061092e60048036038101906109299190613969565b61220d565b005b34801561093c57600080fd5b50610957600480360381019061095291906139f0565b6122a6565b005b34801561096557600080fd5b50610980600480360381019061097b9190613a39565b61233c565b60405161098d9190614020565b60405180910390f35b3480156109a257600080fd5b506109ab612495565b6040516109b891906142a2565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613786565b61249b565b6040516109f59190614005565b60405180910390f35b348015610a0a57600080fd5b50610a256004803603810190610a20919061391c565b61252f565b005b348015610a3357600080fd5b50610a4e6004803603810190610a499190613a66565b6125cf565b005b348015610a5c57600080fd5b50610a776004803603810190610a729190613759565b612749565b005b348015610a8557600080fd5b50610a8e612841565b604051610a9b9190614005565b60405180910390f35b348015610ab057600080fd5b50610ab9612854565b604051610ac691906142a2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b70906145ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9c906145ab565b8015610be95780601f10610bbe57610100808354040283529160200191610be9565b820191906000526020600020905b815481529060010190602001808311610bcc57829003601f168201915b5050505050905090565b6000610bfe8261285a565b610c34576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610c7c906145ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca8906145ab565b8015610cf55780601f10610cca57610100808354040283529160200191610cf5565b820191906000526020600020905b815481529060010190602001808311610cd857829003601f168201915b505050505081565b6000610d08826128b9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d70576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d8f612987565b73ffffffffffffffffffffffffffffffffffffffff1614610df257610dbb81610db6612987565b61249b565b610df1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d5481565b610eb261298f565b73ffffffffffffffffffffffffffffffffffffffff16610ed0611899565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d906141a2565b60405180910390fd5b80601760016101000a81548160ff02191690831515021790555050565b6000610f4d612997565b6001546000540303905090565b60166020528060005260406000206000915090505481565b60145481565b610f838383836129a0565b505050565b60105481565b610f9661298f565b73ffffffffffffffffffffffffffffffffffffffff16610fb4611899565b73ffffffffffffffffffffffffffffffffffffffff161461100a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611001906141a2565b60405180910390fd5b80601760026101000a81548160ff02191690831515021790555050565b600080600090505b6015805490508110156110cb578273ffffffffffffffffffffffffffffffffffffffff166015828154811061106757611066614715565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110b85760019150506110d1565b80806110c39061460e565b91505061102f565b50600090505b919050565b6110de61298f565b73ffffffffffffffffffffffffffffffffffffffff166110fc611899565b73ffffffffffffffffffffffffffffffffffffffff1614611152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611149906141a2565b60405180910390fd5b60026009541415611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614242565b60405180910390fd5b600260098190555060006111aa611899565b73ffffffffffffffffffffffffffffffffffffffff166002476111cd9190614436565b6040516111d990613f67565b60006040518083038185875af1925050503d8060008114611216576040519150601f19603f3d011682016040523d82523d6000602084013e61121b565b606091505b505090508061125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690614202565b60405180910390fd5b60007320bfe7480177a05b76b295d652f66d630018cfc973ffffffffffffffffffffffffffffffffffffffff164760405161129990613f67565b60006040518083038185875af1925050503d80600081146112d6576040519150601f19603f3d011682016040523d82523d6000602084013e6112db565b606091505b505090508061131f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131690614202565b60405180910390fd5b50506001600981905550565b61134683838360405180602001604052806000815250612155565b505050565b6060600061135883611752565b905060008167ffffffffffffffff81111561137657611375614744565b5b6040519080825280602002602001820160405280156113a45781602001602082028036833780820191505090505b50905060006001905060005b83811080156113c15750600f548211155b1561144a5760006113d1836116b2565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611436578284838151811061141b5761141a614715565b5b60200260200101818152505081806114329061460e565b9250505b82806114419061460e565b935050506113b0565b82945050505050919050565b61145e61298f565b73ffffffffffffffffffffffffffffffffffffffff1661147c611899565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906141a2565b60405180910390fd5b80600d8190555050565b600e5481565b601760029054906101000a900460ff1681565b600c8054611502906145ab565b80601f016020809104026020016040519081016040528092919081815260200182805461152e906145ab565b801561157b5780601f106115505761010080835404028352916020019161157b565b820191906000526020600020905b81548152906001019060200180831161155e57829003601f168201915b505050505081565b61158b61298f565b73ffffffffffffffffffffffffffffffffffffffff166115a9611899565b73ffffffffffffffffffffffffffffffffffffffff16146115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f6906141a2565b60405180910390fd5b80600a9080519060200190611615929190613456565b5050565b601760019054906101000a900460ff1681565b61163461298f565b73ffffffffffffffffffffffffffffffffffffffff16611652611899565b73ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f906141a2565b60405180910390fd5b8060118190555050565b60006116bd826128b9565b9050919050565b600a80546116d1906145ab565b80601f01602080910402602001604051908101604052809291908181526020018280546116fd906145ab565b801561174a5780601f1061171f5761010080835404028352916020019161174a565b820191906000526020600020905b81548152906001019060200180831161172d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61181361298f565b73ffffffffffffffffffffffffffffffffffffffff16611831611899565b73ffffffffffffffffffffffffffffffffffffffff1614611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e906141a2565b60405180910390fd5b6118916000612d4a565b565b60135481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118d2906145ab565b80601f01602080910402602001604051908101604052809291908181526020018280546118fe906145ab565b801561194b5780601f106119205761010080835404028352916020019161194b565b820191906000526020600020905b81548152906001019060200180831161192e57829003601f168201915b5050505050905090565b600061195f61298f565b90506000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601760019054906101000a900460ff16156119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614222565b60405180910390fd5b60008311611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90614082565b60405180910390fd5b600f5483611a44610f43565b611a4e91906143e0565b1115611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690614282565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af4906140a2565b60405180910390fd5b601154831115611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990614102565b60405180910390fd5b60011515601760009054906101000a900460ff1615151415611d1157611b6782611027565b611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d90614122565b60405180910390fd5b601454811015611c05576014548382611bbf91906143e0565b1115611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790614042565b60405180910390fd5b611cb0565b6014548110611caf576013548382611c1d91906143e0565b1115611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c55906141c2565b60405180910390fd5b34600e5484611c6d9190614467565b1115611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614162565b60405180910390fd5b5b5b82601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cff91906143e0565b92505081905550611d108284612e10565b5b60001515601760009054906101000a900460ff1615151415611f52576001811015611e475761037860105410611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614182565b60405180910390fd5b60018382611d8a91906143e0565b14611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc190614062565b60405180910390fd5b82601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e1991906143e0565b9250508190555060106000815480929190611e339061460e565b9190505550611e428284612e10565b611f51565b60018110611f50576012548382611e5e91906143e0565b1115611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614142565b60405180910390fd5b34600d5484611eae9190614467565b1115611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690614162565b60405180910390fd5b82601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3e91906143e0565b92505081905550611f4f8284612e10565b5b5b5b505050565b611f5f612987565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fc4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fd1612987565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661207e612987565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c39190614005565b60405180910390a35050565b6120d761298f565b73ffffffffffffffffffffffffffffffffffffffff166120f5611899565b73ffffffffffffffffffffffffffffffffffffffff161461214b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612142906141a2565b60405180910390fd5b80600e8190555050565b6121608484846129a0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121c25761218b84848484612e2e565b6121c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601581815481106121d857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b61221561298f565b73ffffffffffffffffffffffffffffffffffffffff16612233611899565b73ffffffffffffffffffffffffffffffffffffffff1614612289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612280906141a2565b60405180910390fd5b80601760006101000a81548160ff02191690831515021790555050565b6122ae61298f565b73ffffffffffffffffffffffffffffffffffffffff166122cc611899565b73ffffffffffffffffffffffffffffffffffffffff1614612322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612319906141a2565b60405180910390fd5b80600b9080519060200190612338929190613456565b5050565b60606123478261285a565b612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614262565b60405180910390fd5b60001515601760029054906101000a900460ff161515141561243457600b80546123af906145ab565b80601f01602080910402602001604051908101604052809291908181526020018280546123db906145ab565b80156124285780601f106123fd57610100808354040283529160200191612428565b820191906000526020600020905b81548152906001019060200180831161240b57829003601f168201915b50505050509050612490565b600061243e612f8e565b9050600081511161245e576040518060200160405280600081525061248c565b8061246884613020565b600c60405160200161247c93929190613f36565b6040516020818303038152906040525b9150505b919050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61253761298f565b73ffffffffffffffffffffffffffffffffffffffff16612555611899565b73ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a2906141a2565b60405180910390fd5b601560006125b991906134dc565b8181601591906125ca9291906134fd565b505050565b6125d761298f565b73ffffffffffffffffffffffffffffffffffffffff166125f5611899565b73ffffffffffffffffffffffffffffffffffffffff161461264b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612642906141a2565b60405180910390fd5b6000821161268e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612685906140e2565b60405180910390fd5b600f548261269a610f43565b6126a491906143e0565b11156126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc906141e2565b60405180910390fd5b81601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273491906143e0565b925050819055506127458183612e10565b5050565b61275161298f565b73ffffffffffffffffffffffffffffffffffffffff1661276f611899565b73ffffffffffffffffffffffffffffffffffffffff16146127c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bc906141a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282c906140c2565b60405180910390fd5b61283e81612d4a565b50565b601760009054906101000a900460ff1681565b60115481565b600081612865612997565b11158015612874575060005482105b80156128b2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806128c8612997565b116129505760005481101561294f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561294d575b6000811415612943576004600083600190039350838152602001908152602001600020549050612918565b8092505050612982565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006129ab826128b9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a12576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a33612987565b73ffffffffffffffffffffffffffffffffffffffff161480612a625750612a6185612a5c612987565b61249b565b5b80612aa75750612a70612987565b73ffffffffffffffffffffffffffffffffffffffff16612a8f84610bf3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612ae0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b47576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b548585856001613181565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612c5186613187565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612cdb576000600184019050600060046000838152602001908152602001600020541415612cd9576000548114612cd8578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d438585856001613191565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e2a828260405180602001604052806000815250613197565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e54612987565b8786866040518563ffffffff1660e01b8152600401612e769493929190613f97565b602060405180830381600087803b158015612e9057600080fd5b505af1925050508015612ec157506040513d601f19601f82011682018060405250810190612ebe91906139c3565b60015b612f3b573d8060008114612ef1576040519150601f19603f3d011682016040523d82523d6000602084013e612ef6565b606091505b50600081511415612f33576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612f9d906145ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc9906145ab565b80156130165780601f10612feb57610100808354040283529160200191613016565b820191906000526020600020905b815481529060010190602001808311612ff957829003601f168201915b5050505050905090565b60606000821415613068576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317c565b600082905060005b6000821461309a5780806130839061460e565b915050600a826130939190614436565b9150613070565b60008167ffffffffffffffff8111156130b6576130b5614744565b5b6040519080825280601f01601f1916602001820160405280156130e85781602001600182028036833780820191505090505b5090505b600085146131755760018261310191906144c1565b9150600a856131109190614657565b603061311c91906143e0565b60f81b81838151811061313257613131614715565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561316e9190614436565b94506130ec565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613204576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561323f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61324c6000858386613181565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16132b16001851461344c565b901b60a042901b6132c186613187565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146133c5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133756000878480600101955087612e2e565b6133ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106133065782600054146133c057600080fd5b613430565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106133c6575b8160008190555050506134466000858386613191565b50505050565b6000819050919050565b828054613462906145ab565b90600052602060002090601f01602090048101928261348457600085556134cb565b82601f1061349d57805160ff19168380011785556134cb565b828001600101855582156134cb579182015b828111156134ca5782518255916020019190600101906134af565b5b5090506134d8919061359d565b5090565b50805460008255906000526020600020908101906134fa919061359d565b50565b82805482825590600052602060002090810192821561358c579160200282015b8281111561358b57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061351d565b5b509050613599919061359d565b5090565b5b808211156135b657600081600090555060010161359e565b5090565b60006135cd6135c8846142e2565b6142bd565b9050828152602081018484840111156135e9576135e8614782565b5b6135f4848285614569565b509392505050565b600061360f61360a84614313565b6142bd565b90508281526020810184848401111561362b5761362a614782565b5b613636848285614569565b509392505050565b60008135905061364d81614b22565b92915050565b60008083601f84011261366957613668614778565b5b8235905067ffffffffffffffff81111561368657613685614773565b5b6020830191508360208202830111156136a2576136a161477d565b5b9250929050565b6000813590506136b881614b39565b92915050565b6000813590506136cd81614b50565b92915050565b6000815190506136e281614b50565b92915050565b600082601f8301126136fd576136fc614778565b5b813561370d8482602086016135ba565b91505092915050565b600082601f83011261372b5761372a614778565b5b813561373b8482602086016135fc565b91505092915050565b60008135905061375381614b67565b92915050565b60006020828403121561376f5761376e61478c565b5b600061377d8482850161363e565b91505092915050565b6000806040838503121561379d5761379c61478c565b5b60006137ab8582860161363e565b92505060206137bc8582860161363e565b9150509250929050565b6000806000606084860312156137df576137de61478c565b5b60006137ed8682870161363e565b93505060206137fe8682870161363e565b925050604061380f86828701613744565b9150509250925092565b600080600080608085870312156138335761383261478c565b5b60006138418782880161363e565b94505060206138528782880161363e565b935050604061386387828801613744565b925050606085013567ffffffffffffffff81111561388457613883614787565b5b613890878288016136e8565b91505092959194509250565b600080604083850312156138b3576138b261478c565b5b60006138c18582860161363e565b92505060206138d2858286016136a9565b9150509250929050565b600080604083850312156138f3576138f261478c565b5b60006139018582860161363e565b925050602061391285828601613744565b9150509250929050565b600080602083850312156139335761393261478c565b5b600083013567ffffffffffffffff81111561395157613950614787565b5b61395d85828601613653565b92509250509250929050565b60006020828403121561397f5761397e61478c565b5b600061398d848285016136a9565b91505092915050565b6000602082840312156139ac576139ab61478c565b5b60006139ba848285016136be565b91505092915050565b6000602082840312156139d9576139d861478c565b5b60006139e7848285016136d3565b91505092915050565b600060208284031215613a0657613a0561478c565b5b600082013567ffffffffffffffff811115613a2457613a23614787565b5b613a3084828501613716565b91505092915050565b600060208284031215613a4f57613a4e61478c565b5b6000613a5d84828501613744565b91505092915050565b60008060408385031215613a7d57613a7c61478c565b5b6000613a8b85828601613744565b9250506020613a9c8582860161363e565b9150509250929050565b6000613ab28383613f18565b60208301905092915050565b613ac7816144f5565b82525050565b6000613ad882614369565b613ae28185614397565b9350613aed83614344565b8060005b83811015613b1e578151613b058882613aa6565b9750613b108361438a565b925050600181019050613af1565b5085935050505092915050565b613b3481614507565b82525050565b6000613b4582614374565b613b4f81856143a8565b9350613b5f818560208601614578565b613b6881614791565b840191505092915050565b6000613b7e8261437f565b613b8881856143c4565b9350613b98818560208601614578565b613ba181614791565b840191505092915050565b6000613bb78261437f565b613bc181856143d5565b9350613bd1818560208601614578565b80840191505092915050565b60008154613bea816145ab565b613bf481866143d5565b94506001821660008114613c0f5760018114613c2057613c53565b60ff19831686528186019350613c53565b613c2985614354565b60005b83811015613c4b57815481890152600182019150602081019050613c2c565b838801955050505b50505092915050565b6000613c69601c836143c4565b9150613c74826147a2565b602082019050919050565b6000613c8c601d836143c4565b9150613c97826147cb565b602082019050919050565b6000613caf601c836143c4565b9150613cba826147f4565b602082019050919050565b6000613cd26021836143c4565b9150613cdd8261481d565b604082019050919050565b6000613cf56026836143c4565b9150613d008261486c565b604082019050919050565b6000613d186014836143c4565b9150613d23826148bb565b602082019050919050565b6000613d3b6017836143c4565b9150613d46826148e4565b602082019050919050565b6000613d5e6018836143c4565b9150613d698261490d565b602082019050919050565b6000613d81601d836143c4565b9150613d8c82614936565b602082019050919050565b6000613da46017836143c4565b9150613daf8261495f565b602082019050919050565b6000613dc76015836143c4565b9150613dd282614988565b602082019050919050565b6000613dea6020836143c4565b9150613df5826149b1565b602082019050919050565b6000613e0d601a836143c4565b9150613e18826149da565b602082019050919050565b6000613e306000836143b9565b9150613e3b82614a03565b600082019050919050565b6000613e536014836143c4565b9150613e5e82614a06565b602082019050919050565b6000613e766010836143c4565b9150613e8182614a2f565b602082019050919050565b6000613e996013836143c4565b9150613ea482614a58565b602082019050919050565b6000613ebc601f836143c4565b9150613ec782614a81565b602082019050919050565b6000613edf6030836143c4565b9150613eea82614aaa565b604082019050919050565b6000613f026014836143c4565b9150613f0d82614af9565b602082019050919050565b613f218161455f565b82525050565b613f308161455f565b82525050565b6000613f428286613bac565b9150613f4e8285613bac565b9150613f5a8284613bdd565b9150819050949350505050565b6000613f7282613e23565b9150819050919050565b6000602082019050613f916000830184613abe565b92915050565b6000608082019050613fac6000830187613abe565b613fb96020830186613abe565b613fc66040830185613f27565b8181036060830152613fd88184613b3a565b905095945050505050565b60006020820190508181036000830152613ffd8184613acd565b905092915050565b600060208201905061401a6000830184613b2b565b92915050565b6000602082019050818103600083015261403a8184613b73565b905092915050565b6000602082019050818103600083015261405b81613c5c565b9050919050565b6000602082019050818103600083015261407b81613c7f565b9050919050565b6000602082019050818103600083015261409b81613ca2565b9050919050565b600060208201905081810360008301526140bb81613cc5565b9050919050565b600060208201905081810360008301526140db81613ce8565b9050919050565b600060208201905081810360008301526140fb81613d0b565b9050919050565b6000602082019050818103600083015261411b81613d2e565b9050919050565b6000602082019050818103600083015261413b81613d51565b9050919050565b6000602082019050818103600083015261415b81613d74565b9050919050565b6000602082019050818103600083015261417b81613d97565b9050919050565b6000602082019050818103600083015261419b81613dba565b9050919050565b600060208201905081810360008301526141bb81613ddd565b9050919050565b600060208201905081810360008301526141db81613e00565b9050919050565b600060208201905081810360008301526141fb81613e46565b9050919050565b6000602082019050818103600083015261421b81613e69565b9050919050565b6000602082019050818103600083015261423b81613e8c565b9050919050565b6000602082019050818103600083015261425b81613eaf565b9050919050565b6000602082019050818103600083015261427b81613ed2565b9050919050565b6000602082019050818103600083015261429b81613ef5565b9050919050565b60006020820190506142b76000830184613f27565b92915050565b60006142c76142d8565b90506142d382826145dd565b919050565b6000604051905090565b600067ffffffffffffffff8211156142fd576142fc614744565b5b61430682614791565b9050602081019050919050565b600067ffffffffffffffff82111561432e5761432d614744565b5b61433782614791565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143eb8261455f565b91506143f68361455f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561442b5761442a614688565b5b828201905092915050565b60006144418261455f565b915061444c8361455f565b92508261445c5761445b6146b7565b5b828204905092915050565b60006144728261455f565b915061447d8361455f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144b6576144b5614688565b5b828202905092915050565b60006144cc8261455f565b91506144d78361455f565b9250828210156144ea576144e9614688565b5b828203905092915050565b60006145008261453f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561459657808201518184015260208101905061457b565b838111156145a5576000848401525b50505050565b600060028204905060018216806145c357607f821691505b602082108114156145d7576145d66146e6565b5b50919050565b6145e682614791565b810181811067ffffffffffffffff8211171561460557614604614744565b5b80604052505050565b60006146198261455f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561464c5761464b614688565b5b600182019050919050565b60006146628261455f565b915061466d8361455f565b92508261467d5761467c6146b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f457863657373206d617820667265652070657220616464726573732e00000000600082015250565b7f596f752063616e206d696e74206f6e6c79203120666f7220667265652e000000600082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f43616c6c65722063616e277420626520616e6f7468657220636f6e747261637460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f457863657373206d6178206d696e74207065722074782e000000000000000000600082015250565b7f75736572206973206e6f742077686974656c69737465642e0000000000000000600082015250565b7f457863657373206d6178207065722061646472657373206c696d69742e000000600082015250565b7f496e76616c69642066756e64732070726f76696465642e000000000000000000600082015250565b7f4672656520737570706c7920736f6c64206f75742e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863657373206d61782070657220574c20616464726573732e000000000000600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b614b2b816144f5565b8114614b3657600080fd5b50565b614b4281614507565b8114614b4d57600080fd5b50565b614b5981614513565b8114614b6457600080fd5b50565b614b708161455f565b8114614b7b57600080fd5b5056fea2646970667358221220e7558ca6ab19cc40fc022d3474a9e04dd535cdf7da4ddb389831bd1eb1ec902a64736f6c63430008070033697066733a2f2f516d594b684b434e434d545061443643746a436e4443755545643977397a334246506650617953376244427253432f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102885760003560e01c80635ef9ff371161015a578063ba4e5c49116100c1578063e985e9c51161007a578063e985e9c5146109c1578063edec5f27146109fe578063efbd73f414610a27578063f2fde38b14610a50578063fdea8e0b14610a79578063ff64569114610aa457610288565b8063ba4e5c491461089f578063ba7d2c76146108dc578063bce4d6ae14610907578063c17ecd1214610930578063c87b56dd14610959578063d5abeb011461099657610288565b80638da5cb5b116101135780638da5cb5b146107b257806395d89b41146107dd578063a0712d6814610808578063a22cb46514610824578063b5f3a2831461084d578063b88d4fde1461087657610288565b80635ef9ff37146106a25780636352211e146106cb5780636c0360eb1461070857806370a0823114610733578063715018a614610770578063745c229f1461078757610288565b806324a6ab0c116101fe57806344a0d68a116101b757806344a0d68a146105a457806349696a56146105cd57806351830227146105f85780635503a0e81461062357806355f804b31461064e5780635c975abb1461067757610288565b806324a6ab0c146104965780632a3f300c146104c15780633af32abf146104ea5780633ccfd60b1461052757806342842e0e1461053e578063438b63001461056757610288565b806313faede61161025057806313faede61461038657806316c38b3c146103b157806318160ddd146103da57806318cae26914610405578063228dc6d31461044257806323b872dd1461046d57610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063081c8c4414610332578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613996565b610acf565b6040516102c19190614005565b60405180910390f35b3480156102d657600080fd5b506102df610b61565b6040516102ec9190614020565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613a39565b610bf3565b6040516103299190613f7c565b60405180910390f35b34801561033e57600080fd5b50610347610c6f565b6040516103549190614020565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f91906138dc565b610cfd565b005b34801561039257600080fd5b5061039b610ea4565b6040516103a891906142a2565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d39190613969565b610eaa565b005b3480156103e657600080fd5b506103ef610f43565b6040516103fc91906142a2565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190613759565b610f5a565b60405161043991906142a2565b60405180910390f35b34801561044e57600080fd5b50610457610f72565b60405161046491906142a2565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f91906137c6565b610f78565b005b3480156104a257600080fd5b506104ab610f88565b6040516104b891906142a2565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613969565b610f8e565b005b3480156104f657600080fd5b50610511600480360381019061050c9190613759565b611027565b60405161051e9190614005565b60405180910390f35b34801561053357600080fd5b5061053c6110d6565b005b34801561054a57600080fd5b50610565600480360381019061056091906137c6565b61132b565b005b34801561057357600080fd5b5061058e60048036038101906105899190613759565b61134b565b60405161059b9190613fe3565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613a39565b611456565b005b3480156105d957600080fd5b506105e26114dc565b6040516105ef91906142a2565b60405180910390f35b34801561060457600080fd5b5061060d6114e2565b60405161061a9190614005565b60405180910390f35b34801561062f57600080fd5b506106386114f5565b6040516106459190614020565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906139f0565b611583565b005b34801561068357600080fd5b5061068c611619565b6040516106999190614005565b60405180910390f35b3480156106ae57600080fd5b506106c960048036038101906106c49190613a39565b61162c565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190613a39565b6116b2565b6040516106ff9190613f7c565b60405180910390f35b34801561071457600080fd5b5061071d6116c4565b60405161072a9190614020565b60405180910390f35b34801561073f57600080fd5b5061075a60048036038101906107559190613759565b611752565b60405161076791906142a2565b60405180910390f35b34801561077c57600080fd5b5061078561180b565b005b34801561079357600080fd5b5061079c611893565b6040516107a991906142a2565b60405180910390f35b3480156107be57600080fd5b506107c7611899565b6040516107d49190613f7c565b60405180910390f35b3480156107e957600080fd5b506107f26118c3565b6040516107ff9190614020565b60405180910390f35b610822600480360381019061081d9190613a39565b611955565b005b34801561083057600080fd5b5061084b6004803603810190610846919061389c565b611f57565b005b34801561085957600080fd5b50610874600480360381019061086f9190613a39565b6120cf565b005b34801561088257600080fd5b5061089d60048036038101906108989190613819565b612155565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190613a39565b6121c8565b6040516108d39190613f7c565b60405180910390f35b3480156108e857600080fd5b506108f1612207565b6040516108fe91906142a2565b60405180910390f35b34801561091357600080fd5b5061092e60048036038101906109299190613969565b61220d565b005b34801561093c57600080fd5b50610957600480360381019061095291906139f0565b6122a6565b005b34801561096557600080fd5b50610980600480360381019061097b9190613a39565b61233c565b60405161098d9190614020565b60405180910390f35b3480156109a257600080fd5b506109ab612495565b6040516109b891906142a2565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613786565b61249b565b6040516109f59190614005565b60405180910390f35b348015610a0a57600080fd5b50610a256004803603810190610a20919061391c565b61252f565b005b348015610a3357600080fd5b50610a4e6004803603810190610a499190613a66565b6125cf565b005b348015610a5c57600080fd5b50610a776004803603810190610a729190613759565b612749565b005b348015610a8557600080fd5b50610a8e612841565b604051610a9b9190614005565b60405180910390f35b348015610ab057600080fd5b50610ab9612854565b604051610ac691906142a2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b70906145ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9c906145ab565b8015610be95780601f10610bbe57610100808354040283529160200191610be9565b820191906000526020600020905b815481529060010190602001808311610bcc57829003601f168201915b5050505050905090565b6000610bfe8261285a565b610c34576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b8054610c7c906145ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca8906145ab565b8015610cf55780601f10610cca57610100808354040283529160200191610cf5565b820191906000526020600020905b815481529060010190602001808311610cd857829003601f168201915b505050505081565b6000610d08826128b9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d70576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d8f612987565b73ffffffffffffffffffffffffffffffffffffffff1614610df257610dbb81610db6612987565b61249b565b610df1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d5481565b610eb261298f565b73ffffffffffffffffffffffffffffffffffffffff16610ed0611899565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d906141a2565b60405180910390fd5b80601760016101000a81548160ff02191690831515021790555050565b6000610f4d612997565b6001546000540303905090565b60166020528060005260406000206000915090505481565b60145481565b610f838383836129a0565b505050565b60105481565b610f9661298f565b73ffffffffffffffffffffffffffffffffffffffff16610fb4611899565b73ffffffffffffffffffffffffffffffffffffffff161461100a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611001906141a2565b60405180910390fd5b80601760026101000a81548160ff02191690831515021790555050565b600080600090505b6015805490508110156110cb578273ffffffffffffffffffffffffffffffffffffffff166015828154811061106757611066614715565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110b85760019150506110d1565b80806110c39061460e565b91505061102f565b50600090505b919050565b6110de61298f565b73ffffffffffffffffffffffffffffffffffffffff166110fc611899565b73ffffffffffffffffffffffffffffffffffffffff1614611152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611149906141a2565b60405180910390fd5b60026009541415611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614242565b60405180910390fd5b600260098190555060006111aa611899565b73ffffffffffffffffffffffffffffffffffffffff166002476111cd9190614436565b6040516111d990613f67565b60006040518083038185875af1925050503d8060008114611216576040519150601f19603f3d011682016040523d82523d6000602084013e61121b565b606091505b505090508061125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690614202565b60405180910390fd5b60007320bfe7480177a05b76b295d652f66d630018cfc973ffffffffffffffffffffffffffffffffffffffff164760405161129990613f67565b60006040518083038185875af1925050503d80600081146112d6576040519150601f19603f3d011682016040523d82523d6000602084013e6112db565b606091505b505090508061131f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131690614202565b60405180910390fd5b50506001600981905550565b61134683838360405180602001604052806000815250612155565b505050565b6060600061135883611752565b905060008167ffffffffffffffff81111561137657611375614744565b5b6040519080825280602002602001820160405280156113a45781602001602082028036833780820191505090505b50905060006001905060005b83811080156113c15750600f548211155b1561144a5760006113d1836116b2565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611436578284838151811061141b5761141a614715565b5b60200260200101818152505081806114329061460e565b9250505b82806114419061460e565b935050506113b0565b82945050505050919050565b61145e61298f565b73ffffffffffffffffffffffffffffffffffffffff1661147c611899565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906141a2565b60405180910390fd5b80600d8190555050565b600e5481565b601760029054906101000a900460ff1681565b600c8054611502906145ab565b80601f016020809104026020016040519081016040528092919081815260200182805461152e906145ab565b801561157b5780601f106115505761010080835404028352916020019161157b565b820191906000526020600020905b81548152906001019060200180831161155e57829003601f168201915b505050505081565b61158b61298f565b73ffffffffffffffffffffffffffffffffffffffff166115a9611899565b73ffffffffffffffffffffffffffffffffffffffff16146115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f6906141a2565b60405180910390fd5b80600a9080519060200190611615929190613456565b5050565b601760019054906101000a900460ff1681565b61163461298f565b73ffffffffffffffffffffffffffffffffffffffff16611652611899565b73ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f906141a2565b60405180910390fd5b8060118190555050565b60006116bd826128b9565b9050919050565b600a80546116d1906145ab565b80601f01602080910402602001604051908101604052809291908181526020018280546116fd906145ab565b801561174a5780601f1061171f5761010080835404028352916020019161174a565b820191906000526020600020905b81548152906001019060200180831161172d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61181361298f565b73ffffffffffffffffffffffffffffffffffffffff16611831611899565b73ffffffffffffffffffffffffffffffffffffffff1614611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e906141a2565b60405180910390fd5b6118916000612d4a565b565b60135481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118d2906145ab565b80601f01602080910402602001604051908101604052809291908181526020018280546118fe906145ab565b801561194b5780601f106119205761010080835404028352916020019161194b565b820191906000526020600020905b81548152906001019060200180831161192e57829003601f168201915b5050505050905090565b600061195f61298f565b90506000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601760019054906101000a900460ff16156119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614222565b60405180910390fd5b60008311611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90614082565b60405180910390fd5b600f5483611a44610f43565b611a4e91906143e0565b1115611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690614282565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af4906140a2565b60405180910390fd5b601154831115611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990614102565b60405180910390fd5b60011515601760009054906101000a900460ff1615151415611d1157611b6782611027565b611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d90614122565b60405180910390fd5b601454811015611c05576014548382611bbf91906143e0565b1115611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790614042565b60405180910390fd5b611cb0565b6014548110611caf576013548382611c1d91906143e0565b1115611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c55906141c2565b60405180910390fd5b34600e5484611c6d9190614467565b1115611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614162565b60405180910390fd5b5b5b82601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cff91906143e0565b92505081905550611d108284612e10565b5b60001515601760009054906101000a900460ff1615151415611f52576001811015611e475761037860105410611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614182565b60405180910390fd5b60018382611d8a91906143e0565b14611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc190614062565b60405180910390fd5b82601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e1991906143e0565b9250508190555060106000815480929190611e339061460e565b9190505550611e428284612e10565b611f51565b60018110611f50576012548382611e5e91906143e0565b1115611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614142565b60405180910390fd5b34600d5484611eae9190614467565b1115611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690614162565b60405180910390fd5b82601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3e91906143e0565b92505081905550611f4f8284612e10565b5b5b5b505050565b611f5f612987565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fc4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fd1612987565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661207e612987565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c39190614005565b60405180910390a35050565b6120d761298f565b73ffffffffffffffffffffffffffffffffffffffff166120f5611899565b73ffffffffffffffffffffffffffffffffffffffff161461214b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612142906141a2565b60405180910390fd5b80600e8190555050565b6121608484846129a0565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121c25761218b84848484612e2e565b6121c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601581815481106121d857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b61221561298f565b73ffffffffffffffffffffffffffffffffffffffff16612233611899565b73ffffffffffffffffffffffffffffffffffffffff1614612289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612280906141a2565b60405180910390fd5b80601760006101000a81548160ff02191690831515021790555050565b6122ae61298f565b73ffffffffffffffffffffffffffffffffffffffff166122cc611899565b73ffffffffffffffffffffffffffffffffffffffff1614612322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612319906141a2565b60405180910390fd5b80600b9080519060200190612338929190613456565b5050565b60606123478261285a565b612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614262565b60405180910390fd5b60001515601760029054906101000a900460ff161515141561243457600b80546123af906145ab565b80601f01602080910402602001604051908101604052809291908181526020018280546123db906145ab565b80156124285780601f106123fd57610100808354040283529160200191612428565b820191906000526020600020905b81548152906001019060200180831161240b57829003601f168201915b50505050509050612490565b600061243e612f8e565b9050600081511161245e576040518060200160405280600081525061248c565b8061246884613020565b600c60405160200161247c93929190613f36565b6040516020818303038152906040525b9150505b919050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61253761298f565b73ffffffffffffffffffffffffffffffffffffffff16612555611899565b73ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a2906141a2565b60405180910390fd5b601560006125b991906134dc565b8181601591906125ca9291906134fd565b505050565b6125d761298f565b73ffffffffffffffffffffffffffffffffffffffff166125f5611899565b73ffffffffffffffffffffffffffffffffffffffff161461264b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612642906141a2565b60405180910390fd5b6000821161268e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612685906140e2565b60405180910390fd5b600f548261269a610f43565b6126a491906143e0565b11156126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc906141e2565b60405180910390fd5b81601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273491906143e0565b925050819055506127458183612e10565b5050565b61275161298f565b73ffffffffffffffffffffffffffffffffffffffff1661276f611899565b73ffffffffffffffffffffffffffffffffffffffff16146127c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bc906141a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282c906140c2565b60405180910390fd5b61283e81612d4a565b50565b601760009054906101000a900460ff1681565b60115481565b600081612865612997565b11158015612874575060005482105b80156128b2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806128c8612997565b116129505760005481101561294f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561294d575b6000811415612943576004600083600190039350838152602001908152602001600020549050612918565b8092505050612982565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006129ab826128b9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a12576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a33612987565b73ffffffffffffffffffffffffffffffffffffffff161480612a625750612a6185612a5c612987565b61249b565b5b80612aa75750612a70612987565b73ffffffffffffffffffffffffffffffffffffffff16612a8f84610bf3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612ae0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b47576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b548585856001613181565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612c5186613187565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612cdb576000600184019050600060046000838152602001908152602001600020541415612cd9576000548114612cd8578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d438585856001613191565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e2a828260405180602001604052806000815250613197565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e54612987565b8786866040518563ffffffff1660e01b8152600401612e769493929190613f97565b602060405180830381600087803b158015612e9057600080fd5b505af1925050508015612ec157506040513d601f19601f82011682018060405250810190612ebe91906139c3565b60015b612f3b573d8060008114612ef1576040519150601f19603f3d011682016040523d82523d6000602084013e612ef6565b606091505b50600081511415612f33576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612f9d906145ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc9906145ab565b80156130165780601f10612feb57610100808354040283529160200191613016565b820191906000526020600020905b815481529060010190602001808311612ff957829003601f168201915b5050505050905090565b60606000821415613068576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317c565b600082905060005b6000821461309a5780806130839061460e565b915050600a826130939190614436565b9150613070565b60008167ffffffffffffffff8111156130b6576130b5614744565b5b6040519080825280601f01601f1916602001820160405280156130e85781602001600182028036833780820191505090505b5090505b600085146131755760018261310191906144c1565b9150600a856131109190614657565b603061311c91906143e0565b60f81b81838151811061313257613131614715565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561316e9190614436565b94506130ec565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613204576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561323f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61324c6000858386613181565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16132b16001851461344c565b901b60a042901b6132c186613187565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146133c5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133756000878480600101955087612e2e565b6133ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106133065782600054146133c057600080fd5b613430565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106133c6575b8160008190555050506134466000858386613191565b50505050565b6000819050919050565b828054613462906145ab565b90600052602060002090601f01602090048101928261348457600085556134cb565b82601f1061349d57805160ff19168380011785556134cb565b828001600101855582156134cb579182015b828111156134ca5782518255916020019190600101906134af565b5b5090506134d8919061359d565b5090565b50805460008255906000526020600020908101906134fa919061359d565b50565b82805482825590600052602060002090810192821561358c579160200282015b8281111561358b57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061351d565b5b509050613599919061359d565b5090565b5b808211156135b657600081600090555060010161359e565b5090565b60006135cd6135c8846142e2565b6142bd565b9050828152602081018484840111156135e9576135e8614782565b5b6135f4848285614569565b509392505050565b600061360f61360a84614313565b6142bd565b90508281526020810184848401111561362b5761362a614782565b5b613636848285614569565b509392505050565b60008135905061364d81614b22565b92915050565b60008083601f84011261366957613668614778565b5b8235905067ffffffffffffffff81111561368657613685614773565b5b6020830191508360208202830111156136a2576136a161477d565b5b9250929050565b6000813590506136b881614b39565b92915050565b6000813590506136cd81614b50565b92915050565b6000815190506136e281614b50565b92915050565b600082601f8301126136fd576136fc614778565b5b813561370d8482602086016135ba565b91505092915050565b600082601f83011261372b5761372a614778565b5b813561373b8482602086016135fc565b91505092915050565b60008135905061375381614b67565b92915050565b60006020828403121561376f5761376e61478c565b5b600061377d8482850161363e565b91505092915050565b6000806040838503121561379d5761379c61478c565b5b60006137ab8582860161363e565b92505060206137bc8582860161363e565b9150509250929050565b6000806000606084860312156137df576137de61478c565b5b60006137ed8682870161363e565b93505060206137fe8682870161363e565b925050604061380f86828701613744565b9150509250925092565b600080600080608085870312156138335761383261478c565b5b60006138418782880161363e565b94505060206138528782880161363e565b935050604061386387828801613744565b925050606085013567ffffffffffffffff81111561388457613883614787565b5b613890878288016136e8565b91505092959194509250565b600080604083850312156138b3576138b261478c565b5b60006138c18582860161363e565b92505060206138d2858286016136a9565b9150509250929050565b600080604083850312156138f3576138f261478c565b5b60006139018582860161363e565b925050602061391285828601613744565b9150509250929050565b600080602083850312156139335761393261478c565b5b600083013567ffffffffffffffff81111561395157613950614787565b5b61395d85828601613653565b92509250509250929050565b60006020828403121561397f5761397e61478c565b5b600061398d848285016136a9565b91505092915050565b6000602082840312156139ac576139ab61478c565b5b60006139ba848285016136be565b91505092915050565b6000602082840312156139d9576139d861478c565b5b60006139e7848285016136d3565b91505092915050565b600060208284031215613a0657613a0561478c565b5b600082013567ffffffffffffffff811115613a2457613a23614787565b5b613a3084828501613716565b91505092915050565b600060208284031215613a4f57613a4e61478c565b5b6000613a5d84828501613744565b91505092915050565b60008060408385031215613a7d57613a7c61478c565b5b6000613a8b85828601613744565b9250506020613a9c8582860161363e565b9150509250929050565b6000613ab28383613f18565b60208301905092915050565b613ac7816144f5565b82525050565b6000613ad882614369565b613ae28185614397565b9350613aed83614344565b8060005b83811015613b1e578151613b058882613aa6565b9750613b108361438a565b925050600181019050613af1565b5085935050505092915050565b613b3481614507565b82525050565b6000613b4582614374565b613b4f81856143a8565b9350613b5f818560208601614578565b613b6881614791565b840191505092915050565b6000613b7e8261437f565b613b8881856143c4565b9350613b98818560208601614578565b613ba181614791565b840191505092915050565b6000613bb78261437f565b613bc181856143d5565b9350613bd1818560208601614578565b80840191505092915050565b60008154613bea816145ab565b613bf481866143d5565b94506001821660008114613c0f5760018114613c2057613c53565b60ff19831686528186019350613c53565b613c2985614354565b60005b83811015613c4b57815481890152600182019150602081019050613c2c565b838801955050505b50505092915050565b6000613c69601c836143c4565b9150613c74826147a2565b602082019050919050565b6000613c8c601d836143c4565b9150613c97826147cb565b602082019050919050565b6000613caf601c836143c4565b9150613cba826147f4565b602082019050919050565b6000613cd26021836143c4565b9150613cdd8261481d565b604082019050919050565b6000613cf56026836143c4565b9150613d008261486c565b604082019050919050565b6000613d186014836143c4565b9150613d23826148bb565b602082019050919050565b6000613d3b6017836143c4565b9150613d46826148e4565b602082019050919050565b6000613d5e6018836143c4565b9150613d698261490d565b602082019050919050565b6000613d81601d836143c4565b9150613d8c82614936565b602082019050919050565b6000613da46017836143c4565b9150613daf8261495f565b602082019050919050565b6000613dc76015836143c4565b9150613dd282614988565b602082019050919050565b6000613dea6020836143c4565b9150613df5826149b1565b602082019050919050565b6000613e0d601a836143c4565b9150613e18826149da565b602082019050919050565b6000613e306000836143b9565b9150613e3b82614a03565b600082019050919050565b6000613e536014836143c4565b9150613e5e82614a06565b602082019050919050565b6000613e766010836143c4565b9150613e8182614a2f565b602082019050919050565b6000613e996013836143c4565b9150613ea482614a58565b602082019050919050565b6000613ebc601f836143c4565b9150613ec782614a81565b602082019050919050565b6000613edf6030836143c4565b9150613eea82614aaa565b604082019050919050565b6000613f026014836143c4565b9150613f0d82614af9565b602082019050919050565b613f218161455f565b82525050565b613f308161455f565b82525050565b6000613f428286613bac565b9150613f4e8285613bac565b9150613f5a8284613bdd565b9150819050949350505050565b6000613f7282613e23565b9150819050919050565b6000602082019050613f916000830184613abe565b92915050565b6000608082019050613fac6000830187613abe565b613fb96020830186613abe565b613fc66040830185613f27565b8181036060830152613fd88184613b3a565b905095945050505050565b60006020820190508181036000830152613ffd8184613acd565b905092915050565b600060208201905061401a6000830184613b2b565b92915050565b6000602082019050818103600083015261403a8184613b73565b905092915050565b6000602082019050818103600083015261405b81613c5c565b9050919050565b6000602082019050818103600083015261407b81613c7f565b9050919050565b6000602082019050818103600083015261409b81613ca2565b9050919050565b600060208201905081810360008301526140bb81613cc5565b9050919050565b600060208201905081810360008301526140db81613ce8565b9050919050565b600060208201905081810360008301526140fb81613d0b565b9050919050565b6000602082019050818103600083015261411b81613d2e565b9050919050565b6000602082019050818103600083015261413b81613d51565b9050919050565b6000602082019050818103600083015261415b81613d74565b9050919050565b6000602082019050818103600083015261417b81613d97565b9050919050565b6000602082019050818103600083015261419b81613dba565b9050919050565b600060208201905081810360008301526141bb81613ddd565b9050919050565b600060208201905081810360008301526141db81613e00565b9050919050565b600060208201905081810360008301526141fb81613e46565b9050919050565b6000602082019050818103600083015261421b81613e69565b9050919050565b6000602082019050818103600083015261423b81613e8c565b9050919050565b6000602082019050818103600083015261425b81613eaf565b9050919050565b6000602082019050818103600083015261427b81613ed2565b9050919050565b6000602082019050818103600083015261429b81613ef5565b9050919050565b60006020820190506142b76000830184613f27565b92915050565b60006142c76142d8565b90506142d382826145dd565b919050565b6000604051905090565b600067ffffffffffffffff8211156142fd576142fc614744565b5b61430682614791565b9050602081019050919050565b600067ffffffffffffffff82111561432e5761432d614744565b5b61433782614791565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006143eb8261455f565b91506143f68361455f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561442b5761442a614688565b5b828201905092915050565b60006144418261455f565b915061444c8361455f565b92508261445c5761445b6146b7565b5b828204905092915050565b60006144728261455f565b915061447d8361455f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144b6576144b5614688565b5b828202905092915050565b60006144cc8261455f565b91506144d78361455f565b9250828210156144ea576144e9614688565b5b828203905092915050565b60006145008261453f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561459657808201518184015260208101905061457b565b838111156145a5576000848401525b50505050565b600060028204905060018216806145c357607f821691505b602082108114156145d7576145d66146e6565b5b50919050565b6145e682614791565b810181811067ffffffffffffffff8211171561460557614604614744565b5b80604052505050565b60006146198261455f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561464c5761464b614688565b5b600182019050919050565b60006146628261455f565b915061466d8361455f565b92508261467d5761467c6146b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f457863657373206d617820667265652070657220616464726573732e00000000600082015250565b7f596f752063616e206d696e74206f6e6c79203120666f7220667265652e000000600082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f43616c6c65722063616e277420626520616e6f7468657220636f6e747261637460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f457863657373206d6178206d696e74207065722074782e000000000000000000600082015250565b7f75736572206973206e6f742077686974656c69737465642e0000000000000000600082015250565b7f457863657373206d6178207065722061646472657373206c696d69742e000000600082015250565b7f496e76616c69642066756e64732070726f76696465642e000000000000000000600082015250565b7f4672656520737570706c7920736f6c64206f75742e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863657373206d61782070657220574c20616464726573732e000000000000600082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b614b2b816144f5565b8114614b3657600080fd5b50565b614b4281614507565b8114614b4d57600080fd5b50565b614b5981614513565b8114614b6457600080fd5b50565b614b708161455f565b8114614b7b57600080fd5b5056fea2646970667358221220e7558ca6ab19cc40fc022d3474a9e04dd535cdf7da4ddb389831bd1eb1ec902a64736f6c63430008070033
Deployed Bytecode Sourcemap
63954:6796:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38609:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45690:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64079:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45150:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64158:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70013:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37663:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64539:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64444:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46576:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64282:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69856:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67455:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70354:393;;;;;;;;;;;;;:::i;:::-;;46817:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68219:645;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68891:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64199:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64668:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64114:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69295:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64636:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69152:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43411:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64051:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39288:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24719:103;;;;;;;;;;;;;:::i;:::-;;64397:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24068:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43791:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65139:1852;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45966:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69005:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47073:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64495:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64352:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70180:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69463:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67751:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64244:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46345:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69627:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67064:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24977:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64603:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64318:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38609:615;38694:4;39009:10;38994:25;;:11;:25;;;;:102;;;;39086:10;39071:25;;:11;:25;;;;38994:102;:179;;;;39163:10;39148:25;;:11;:25;;;;38994:179;38974:199;;38609:615;;;:::o;43622:100::-;43676:13;43709:5;43702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43622:100;:::o;45690:204::-;45758:7;45783:16;45791:7;45783;:16::i;:::-;45778:64;;45808:34;;;;;;;;;;;;;;45778:64;45862:15;:24;45878:7;45862:24;;;;;;;;;;;;;;;;;;;;;45855:31;;45690:204;;;:::o;64079:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45150:474::-;45223:13;45255:27;45274:7;45255:18;:27::i;:::-;45223:61;;45305:5;45299:11;;:2;:11;;;45295:48;;;45319:24;;;;;;;;;;;;;;45295:48;45383:5;45360:28;;:19;:17;:19::i;:::-;:28;;;45356:175;;45408:44;45425:5;45432:19;:17;:19::i;:::-;45408:16;:44::i;:::-;45403:128;;45480:35;;;;;;;;;;;;;;45403:128;45356:175;45570:2;45543:15;:24;45559:7;45543:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45608:7;45604:2;45588:28;;45597:5;45588:28;;;;;;;;;;;;45212:412;45150:474;;:::o;64158:34::-;;;;:::o;70013:81::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70080:6:::1;70071;;:15;;;;;;;;;;;;;;;;;;70013:81:::0;:::o;37663:315::-;37716:7;37944:15;:13;:15::i;:::-;37929:12;;37913:13;;:28;:46;37906:53;;37663:315;:::o;64539:55::-;;;;;;;;;;;;;;;;;:::o;64444:42::-;;;;:::o;46576:170::-;46710:28;46720:4;46726:2;46730:7;46710:9;:28::i;:::-;46576:170;;;:::o;64282:29::-;;;;:::o;69856:83::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69925:6:::1;69914:8;;:17;;;;;;;;;;;;;;;;;;69856:83:::0;:::o;67455:263::-;67514:4;67534:6;67543:1;67534:10;;67529:157;67550:20;:27;;;;67546:1;:31;67529:157;;;67626:5;67599:32;;:20;67620:1;67599:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;67595:80;;;67655:4;67648:11;;;;;67595:80;67579:3;;;;;:::i;:::-;;;;67529:157;;;;67703:5;67696:12;;67455:263;;;;:::o;70354:393::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19042:1:::1;19640:7;;:19;;19632:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19042:1;19773:7;:18;;;;70445:7:::2;70466;:5;:7::i;:::-;70458:21;;70511:1;70487:21;:25;;;;:::i;:::-;70458:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70444:73;;;70534:2;70526:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;70596:7;70617:42;70609:56;;70673:21;70609:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70595:104;;;70716:2;70708:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;70404:343;;18998:1:::1;19952:7;:22;;;;70354:393::o:0;46817:185::-;46955:39;46972:4;46978:2;46982:7;46955:39;;;;;;;;;;;;:16;:39::i;:::-;46817:185;;;:::o;68219:645::-;68279:16;68306:23;68332:17;68342:6;68332:9;:17::i;:::-;68306:43;;68358:30;68405:15;68391:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68358:63;;68430:22;68455:1;68430:26;;68465:23;68503:325;68528:15;68510;:33;:64;;;;;68565:9;;68547:14;:27;;68510:64;68503:325;;;68587:25;68615:23;68623:14;68615:7;:23::i;:::-;68587:51;;68676:6;68655:27;;:17;:27;;;68651:141;;;68732:14;68699:13;68713:15;68699:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;68763:17;;;;;:::i;:::-;;;;68651:141;68802:16;;;;;:::i;:::-;;;;68576:252;68503:325;;;68843:13;68836:20;;;;;;68219:645;;;:::o;68891:78::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68956:5:::1;68949:4;:12;;;;68891:78:::0;:::o;64199:38::-;;;;:::o;64668:28::-;;;;;;;;;;;;;:::o;64114:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69295:102::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69378:11:::1;69368:7;:21;;;;;;;;;;;;:::i;:::-;;69295:102:::0;:::o;64636:25::-;;;;;;;;;;;;;:::o;69152:94::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69229:9:::1;69218:8;:20;;;;69152:94:::0;:::o;43411:144::-;43475:7;43518:27;43537:7;43518:18;:27::i;:::-;43495:52;;43411:144;;;:::o;64051:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39288:224::-;39352:7;39393:1;39376:19;;:5;:19;;;39372:60;;;39404:28;;;;;;;;;;;;;;39372:60;34627:13;39450:18;:25;39469:5;39450:25;;;;;;;;;;;;;;;;:54;39443:61;;39288:224;;;:::o;24719:103::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24784:30:::1;24811:1;24784:18;:30::i;:::-;24719:103::o:0;64397:40::-;;;;:::o;24068:87::-;24114:7;24141:6;;;;;;;;;;;24134:13;;24068:87;:::o;43791:104::-;43847:13;43880:7;43873:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43791:104;:::o;65139:1852::-;65196:15;65214:12;:10;:12::i;:::-;65196:30;;65233:24;65260:20;:29;65281:7;65260:29;;;;;;;;;;;;;;;;65233:56;;65307:6;;;;;;;;;;;65306:7;65298:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;65362:1;65352:7;:11;65344:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;65438:9;;65427:7;65411:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;65403:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65500:7;65487:20;;:9;:20;;;65479:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65571:8;;65560:7;:19;;65552:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;65631:4;65620:15;;:7;;;;;;;;;;;:15;;;65616:650;;;65658:22;65672:7;65658:13;:22::i;:::-;65650:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;65745:23;;65726:16;:42;65722:442;;;65823:23;;65812:7;65793:16;:26;;;;:::i;:::-;:53;;65785:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;65722:442;;;65936:23;;65916:16;:43;65912:252;;66014:21;;66003:7;65984:16;:26;;;;:::i;:::-;:51;;65976:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;66111:9;66099:8;;66089:7;:18;;;;:::i;:::-;:31;;66081:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65912:252;65722:442;66209:7;66176:20;:29;66197:7;66176:29;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;66227:27;66237:7;66246;66227:9;:27::i;:::-;65616:650;66289:5;66278:16;;:7;;;;;;;;;;;:16;;;66274:710;;;66332:1;66313:16;:20;66309:664;;;66372:3;66359:10;;:16;66351:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66454:1;66443:7;66424:16;:26;;;;:::i;:::-;:31;66416:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66539:7;66506:20;:29;66527:7;66506:29;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;66561:10;;:12;;;;;;;;;:::i;:::-;;;;;;66588:27;66598:7;66607;66588:9;:27::i;:::-;66309:664;;;66672:1;66652:16;:21;66648:325;;66728:18;;66717:7;66698:16;:26;;;;:::i;:::-;:48;;66690:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;66821:9;66813:4;;66803:7;:14;;;;:::i;:::-;:27;;66795:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;66908:7;66875:20;:29;66896:7;66875:29;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;66930:27;66940:7;66949;66930:9;:27::i;:::-;66648:325;66309:664;66274:710;65187:1804;;65139:1852;:::o;45966:308::-;46077:19;:17;:19::i;:::-;46065:31;;:8;:31;;;46061:61;;;46105:17;;;;;;;;;;;;;;46061:61;46187:8;46135:18;:39;46154:19;:17;:19::i;:::-;46135:39;;;;;;;;;;;;;;;:49;46175:8;46135:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46247:8;46211:55;;46226:19;:17;:19::i;:::-;46211:55;;;46257:8;46211:55;;;;;;:::i;:::-;;;;;;;;45966:308;;:::o;69005:86::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69078:5:::1;69067:8;:16;;;;69005:86:::0;:::o;47073:396::-;47240:28;47250:4;47256:2;47260:7;47240:9;:28::i;:::-;47301:1;47283:2;:14;;;:19;47279:183;;47322:56;47353:4;47359:2;47363:7;47372:5;47322:30;:56::i;:::-;47317:145;;47406:40;;;;;;;;;;;;;;47317:145;47279:183;47073:396;;;;:::o;64495:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64352:38::-;;;;:::o;70180:88::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70254:6:::1;70244:7;;:16;;;;;;;;;;;;;;;;;;70180:88:::0;:::o;69463:124::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69564:15:::1;69547:14;:32;;;;;;;;;;;;:::i;:::-;;69463:124:::0;:::o;67751:460::-;67825:13;67857:17;67865:8;67857:7;:17::i;:::-;67849:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67957:5;67945:17;;:8;;;;;;;;;;;:17;;;67941:65;;;67982:14;67975:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67941:65;68016:28;68047:10;:8;:10::i;:::-;68016:41;;68104:1;68079:14;68073:28;:32;:130;;;;;;;;;;;;;;;;;68141:14;68157:19;:8;:17;:19::i;:::-;68178:9;68124:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68073:130;68066:137;;;67751:460;;;;:::o;64244:31::-;;;;:::o;46345:164::-;46442:4;46466:18;:25;46485:5;46466:25;;;;;;;;;;;;;;;:35;46492:8;46466:35;;;;;;;;;;;;;;;;;;;;;;;;;46459:42;;46345:164;;;;:::o;69627:150::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69711:20:::1;;69704:27;;;;:::i;:::-;69763:6;;69740:20;:29;;;;;;;:::i;:::-;;69627:150:::0;;:::o;67064:341::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67180:1:::1;67166:11;:15;67158:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;67256:9;;67241:11;67225:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;67217:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67338:11;67303:20;:31;67324:9;67303:31;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;67360:33;67370:9;67381:11;67360:9;:33::i;:::-;67064:341:::0;;:::o;24977:201::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25086:1:::1;25066:22;;:8;:22;;;;25058:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25142:28;25161:8;25142:18;:28::i;:::-;24977:201:::0;:::o;64603:26::-;;;;;;;;;;;;;:::o;64318:27::-;;;;:::o;47724:273::-;47781:4;47837:7;47818:15;:13;:15::i;:::-;:26;;:66;;;;;47871:13;;47861:7;:23;47818:66;:152;;;;;47969:1;35397:8;47922:17;:26;47940:7;47922:26;;;;;;;;;;;;:43;:48;47818:152;47798:172;;47724:273;;;:::o;40926:1129::-;40993:7;41013:12;41028:7;41013:22;;41096:4;41077:15;:13;:15::i;:::-;:23;41073:915;;41130:13;;41123:4;:20;41119:869;;;41168:14;41185:17;:23;41203:4;41185:23;;;;;;;;;;;;41168:40;;41301:1;35397:8;41274:6;:23;:28;41270:699;;;41793:113;41810:1;41800:6;:11;41793:113;;;41853:17;:25;41871:6;;;;;;;41853:25;;;;;;;;;;;;41844:34;;41793:113;;;41939:6;41932:13;;;;;;41270:699;41145:843;41119:869;41073:915;42016:31;;;;;;;;;;;;;;40926:1129;;;;:::o;61706:105::-;61766:7;61793:10;61786:17;;61706:105;:::o;22792:98::-;22845:7;22872:10;22865:17;;22792:98;:::o;64998:99::-;65063:7;65088:1;65081:8;;64998:99;:::o;52963:2515::-;53078:27;53108;53127:7;53108:18;:27::i;:::-;53078:57;;53193:4;53152:45;;53168:19;53152:45;;;53148:86;;53206:28;;;;;;;;;;;;;;53148:86;53247:22;53296:4;53273:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;53317:43;53334:4;53340:19;:17;:19::i;:::-;53317:16;:43::i;:::-;53273:87;:147;;;;53401:19;:17;:19::i;:::-;53377:43;;:20;53389:7;53377:11;:20::i;:::-;:43;;;53273:147;53247:174;;53439:17;53434:66;;53465:35;;;;;;;;;;;;;;53434:66;53529:1;53515:16;;:2;:16;;;53511:52;;;53540:23;;;;;;;;;;;;;;53511:52;53576:43;53598:4;53604:2;53608:7;53617:1;53576:21;:43::i;:::-;53692:15;:24;53708:7;53692:24;;;;;;;;;;;;53685:31;;;;;;;;;;;54084:18;:24;54103:4;54084:24;;;;;;;;;;;;;;;;54082:26;;;;;;;;;;;;54153:18;:22;54172:2;54153:22;;;;;;;;;;;;;;;;54151:24;;;;;;;;;;;35679:8;35281:3;54534:15;:41;;54492:21;54510:2;54492:17;:21::i;:::-;:84;:128;54446:17;:26;54464:7;54446:26;;;;;;;;;;;:174;;;;54790:1;35679:8;54740:19;:46;:51;54736:626;;;54812:19;54844:1;54834:7;:11;54812:33;;55001:1;54967:17;:30;54985:11;54967:30;;;;;;;;;;;;:35;54963:384;;;55105:13;;55090:11;:28;55086:242;;55285:19;55252:17;:30;55270:11;55252:30;;;;;;;;;;;:52;;;;55086:242;54963:384;54793:569;54736:626;55409:7;55405:2;55390:27;;55399:4;55390:27;;;;;;;;;;;;55428:42;55449:4;55455:2;55459:7;55468:1;55428:20;:42::i;:::-;53067:2411;;52963:2515;;;:::o;25338:191::-;25412:16;25431:6;;;;;;;;;;;25412:25;;25457:8;25448:6;;:17;;;;;;;;;;;;;;;;;;25512:8;25481:40;;25502:8;25481:40;;;;;;;;;;;;25401:128;25338:191;:::o;48081:104::-;48150:27;48160:2;48164:8;48150:27;;;;;;;;;;;;:9;:27::i;:::-;48081:104;;:::o;59175:716::-;59338:4;59384:2;59359:45;;;59405:19;:17;:19::i;:::-;59426:4;59432:7;59441:5;59359:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59355:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59659:1;59642:6;:13;:18;59638:235;;;59688:40;;;;;;;;;;;;;;59638:235;59831:6;59825:13;59816:6;59812:2;59808:15;59801:38;59355:529;59528:54;;;59518:64;;;:6;:64;;;;59511:71;;;59175:716;;;;;;:::o;64884:106::-;64944:13;64975:7;64968:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64884:106;:::o;20354:723::-;20410:13;20640:1;20631:5;:10;20627:53;;;20658:10;;;;;;;;;;;;;;;;;;;;;20627:53;20690:12;20705:5;20690:20;;20721:14;20746:78;20761:1;20753:4;:9;20746:78;;20779:8;;;;;:::i;:::-;;;;20810:2;20802:10;;;;;:::i;:::-;;;20746:78;;;20834:19;20866:6;20856:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20834:39;;20884:154;20900:1;20891:5;:10;20884:154;;20928:1;20918:11;;;;;:::i;:::-;;;20995:2;20987:5;:10;;;;:::i;:::-;20974:2;:24;;;;:::i;:::-;20961:39;;20944:6;20951;20944:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21024:2;21015:11;;;;;:::i;:::-;;;20884:154;;;21062:6;21048:21;;;;;20354:723;;;;:::o;60539:159::-;;;;;:::o;44711:148::-;44775:14;44836:5;44826:15;;44711:148;;;:::o;61357:158::-;;;;;:::o;48558:2236::-;48681:20;48704:13;;48681:36;;48746:1;48732:16;;:2;:16;;;48728:48;;;48757:19;;;;;;;;;;;;;;48728:48;48803:1;48791:8;:13;48787:44;;;48813:18;;;;;;;;;;;;;;48787:44;48844:61;48874:1;48878:2;48882:12;48896:8;48844:21;:61::i;:::-;49448:1;34764:2;49419:1;:25;;49418:31;49406:8;:44;49380:18;:22;49399:2;49380:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;35544:3;49849:29;49876:1;49864:8;:13;49849:14;:29::i;:::-;:56;;35281:3;49786:15;:41;;49744:21;49762:2;49744:17;:21::i;:::-;:84;:162;49693:17;:31;49711:12;49693:31;;;;;;;;;;;:213;;;;49923:20;49946:12;49923:35;;49973:11;50002:8;49987:12;:23;49973:37;;50049:1;50031:2;:14;;;:19;50027:635;;50071:313;50127:12;50123:2;50102:38;;50119:1;50102:38;;;;;;;;;;;;50168:69;50207:1;50211:2;50215:14;;;;;;50231:5;50168:30;:69::i;:::-;50163:174;;50273:40;;;;;;;;;;;;;;50163:174;50379:3;50364:12;:18;50071:313;;50465:12;50448:13;;:29;50444:43;;50479:8;;;50444:43;50027:635;;;50528:119;50584:14;;;;;;50580:2;50559:40;;50576:1;50559:40;;;;;;;;;;;;50642:3;50627:12;:18;50528:119;;50027:635;50692:12;50676:13;:28;;;;49157:1559;;50726:60;50755:1;50759:2;50763:12;50777:8;50726:20;:60::i;:::-;48670:2124;48558:2236;;;:::o;44946:142::-;45004:14;45065:5;45055:15;;44946:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:323::-;6832:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:119;;;6887:79;;:::i;:::-;6849:119;7007:1;7032:50;7074:7;7065:6;7054:9;7050:22;7032:50;:::i;:::-;7022:60;;6978:114;6776:323;;;;:::o;7105:327::-;7163:6;7212:2;7200:9;7191:7;7187:23;7183:32;7180:119;;;7218:79;;:::i;:::-;7180:119;7338:1;7363:52;7407:7;7398:6;7387:9;7383:22;7363:52;:::i;:::-;7353:62;;7309:116;7105:327;;;;:::o;7438:349::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:63;7762:7;7753:6;7742:9;7738:22;7707:63;:::i;:::-;7697:73;;7653:127;7438:349;;;;:::o;7793:509::-;7862:6;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8222:63;8277:7;8268:6;8257:9;8253:22;8222:63;:::i;:::-;8212:73;;8008:287;7793:509;;;;:::o;8308:329::-;8367:6;8416:2;8404:9;8395:7;8391:23;8387:32;8384:119;;;8422:79;;:::i;:::-;8384:119;8542:1;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8513:117;8308:329;;;;:::o;8643:474::-;8711:6;8719;8768:2;8756:9;8747:7;8743:23;8739:32;8736:119;;;8774:79;;:::i;:::-;8736:119;8894:1;8919:53;8964:7;8955:6;8944:9;8940:22;8919:53;:::i;:::-;8909:63;;8865:117;9021:2;9047:53;9092:7;9083:6;9072:9;9068:22;9047:53;:::i;:::-;9037:63;;8992:118;8643:474;;;;;:::o;9123:179::-;9192:10;9213:46;9255:3;9247:6;9213:46;:::i;:::-;9291:4;9286:3;9282:14;9268:28;;9123:179;;;;:::o;9308:118::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9308:118;;:::o;9462:732::-;9581:3;9610:54;9658:5;9610:54;:::i;:::-;9680:86;9759:6;9754:3;9680:86;:::i;:::-;9673:93;;9790:56;9840:5;9790:56;:::i;:::-;9869:7;9900:1;9885:284;9910:6;9907:1;9904:13;9885:284;;;9986:6;9980:13;10013:63;10072:3;10057:13;10013:63;:::i;:::-;10006:70;;10099:60;10152:6;10099:60;:::i;:::-;10089:70;;9945:224;9932:1;9929;9925:9;9920:14;;9885:284;;;9889:14;10185:3;10178:10;;9586:608;;;9462:732;;;;:::o;10200:109::-;10281:21;10296:5;10281:21;:::i;:::-;10276:3;10269:34;10200:109;;:::o;10315:360::-;10401:3;10429:38;10461:5;10429:38;:::i;:::-;10483:70;10546:6;10541:3;10483:70;:::i;:::-;10476:77;;10562:52;10607:6;10602:3;10595:4;10588:5;10584:16;10562:52;:::i;:::-;10639:29;10661:6;10639:29;:::i;:::-;10634:3;10630:39;10623:46;;10405:270;10315:360;;;;:::o;10681:364::-;10769:3;10797:39;10830:5;10797:39;:::i;:::-;10852:71;10916:6;10911:3;10852:71;:::i;:::-;10845:78;;10932:52;10977:6;10972:3;10965:4;10958:5;10954:16;10932:52;:::i;:::-;11009:29;11031:6;11009:29;:::i;:::-;11004:3;11000:39;10993:46;;10773:272;10681:364;;;;:::o;11051:377::-;11157:3;11185:39;11218:5;11185:39;:::i;:::-;11240:89;11322:6;11317:3;11240:89;:::i;:::-;11233:96;;11338:52;11383:6;11378:3;11371:4;11364:5;11360:16;11338:52;:::i;:::-;11415:6;11410:3;11406:16;11399:23;;11161:267;11051:377;;;;:::o;11458:845::-;11561:3;11598:5;11592:12;11627:36;11653:9;11627:36;:::i;:::-;11679:89;11761:6;11756:3;11679:89;:::i;:::-;11672:96;;11799:1;11788:9;11784:17;11815:1;11810:137;;;;11961:1;11956:341;;;;11777:520;;11810:137;11894:4;11890:9;11879;11875:25;11870:3;11863:38;11930:6;11925:3;11921:16;11914:23;;11810:137;;11956:341;12023:38;12055:5;12023:38;:::i;:::-;12083:1;12097:154;12111:6;12108:1;12105:13;12097:154;;;12185:7;12179:14;12175:1;12170:3;12166:11;12159:35;12235:1;12226:7;12222:15;12211:26;;12133:4;12130:1;12126:12;12121:17;;12097:154;;;12280:6;12275:3;12271:16;12264:23;;11963:334;;11777:520;;11565:738;;11458:845;;;;:::o;12309:366::-;12451:3;12472:67;12536:2;12531:3;12472:67;:::i;:::-;12465:74;;12548:93;12637:3;12548:93;:::i;:::-;12666:2;12661:3;12657:12;12650:19;;12309:366;;;:::o;12681:::-;12823:3;12844:67;12908:2;12903:3;12844:67;:::i;:::-;12837:74;;12920:93;13009:3;12920:93;:::i;:::-;13038:2;13033:3;13029:12;13022:19;;12681:366;;;:::o;13053:::-;13195:3;13216:67;13280:2;13275:3;13216:67;:::i;:::-;13209:74;;13292:93;13381:3;13292:93;:::i;:::-;13410:2;13405:3;13401:12;13394:19;;13053:366;;;:::o;13425:::-;13567:3;13588:67;13652:2;13647:3;13588:67;:::i;:::-;13581:74;;13664:93;13753:3;13664:93;:::i;:::-;13782:2;13777:3;13773:12;13766:19;;13425:366;;;:::o;13797:::-;13939:3;13960:67;14024:2;14019:3;13960:67;:::i;:::-;13953:74;;14036:93;14125:3;14036:93;:::i;:::-;14154:2;14149:3;14145:12;14138:19;;13797:366;;;:::o;14169:::-;14311:3;14332:67;14396:2;14391:3;14332:67;:::i;:::-;14325:74;;14408:93;14497:3;14408:93;:::i;:::-;14526:2;14521:3;14517:12;14510:19;;14169:366;;;:::o;14541:::-;14683:3;14704:67;14768:2;14763:3;14704:67;:::i;:::-;14697:74;;14780:93;14869:3;14780:93;:::i;:::-;14898:2;14893:3;14889:12;14882:19;;14541:366;;;:::o;14913:::-;15055:3;15076:67;15140:2;15135:3;15076:67;:::i;:::-;15069:74;;15152:93;15241:3;15152:93;:::i;:::-;15270:2;15265:3;15261:12;15254:19;;14913:366;;;:::o;15285:::-;15427:3;15448:67;15512:2;15507:3;15448:67;:::i;:::-;15441:74;;15524:93;15613:3;15524:93;:::i;:::-;15642:2;15637:3;15633:12;15626:19;;15285:366;;;:::o;15657:::-;15799:3;15820:67;15884:2;15879:3;15820:67;:::i;:::-;15813:74;;15896:93;15985:3;15896:93;:::i;:::-;16014:2;16009:3;16005:12;15998:19;;15657:366;;;:::o;16029:::-;16171:3;16192:67;16256:2;16251:3;16192:67;:::i;:::-;16185:74;;16268:93;16357:3;16268:93;:::i;:::-;16386:2;16381:3;16377:12;16370:19;;16029:366;;;:::o;16401:::-;16543:3;16564:67;16628:2;16623:3;16564:67;:::i;:::-;16557:74;;16640:93;16729:3;16640:93;:::i;:::-;16758:2;16753:3;16749:12;16742:19;;16401:366;;;:::o;16773:::-;16915:3;16936:67;17000:2;16995:3;16936:67;:::i;:::-;16929:74;;17012:93;17101:3;17012:93;:::i;:::-;17130:2;17125:3;17121:12;17114:19;;16773:366;;;:::o;17145:398::-;17304:3;17325:83;17406:1;17401:3;17325:83;:::i;:::-;17318:90;;17417:93;17506:3;17417:93;:::i;:::-;17535:1;17530:3;17526:11;17519:18;;17145:398;;;:::o;17549:366::-;17691:3;17712:67;17776:2;17771:3;17712:67;:::i;:::-;17705:74;;17788:93;17877:3;17788:93;:::i;:::-;17906:2;17901:3;17897:12;17890:19;;17549:366;;;:::o;17921:::-;18063:3;18084:67;18148:2;18143:3;18084:67;:::i;:::-;18077:74;;18160:93;18249:3;18160:93;:::i;:::-;18278:2;18273:3;18269:12;18262:19;;17921:366;;;:::o;18293:::-;18435:3;18456:67;18520:2;18515:3;18456:67;:::i;:::-;18449:74;;18532:93;18621:3;18532:93;:::i;:::-;18650:2;18645:3;18641:12;18634:19;;18293:366;;;:::o;18665:::-;18807:3;18828:67;18892:2;18887:3;18828:67;:::i;:::-;18821:74;;18904:93;18993:3;18904:93;:::i;:::-;19022:2;19017:3;19013:12;19006:19;;18665:366;;;:::o;19037:::-;19179:3;19200:67;19264:2;19259:3;19200:67;:::i;:::-;19193:74;;19276:93;19365:3;19276:93;:::i;:::-;19394:2;19389:3;19385:12;19378:19;;19037:366;;;:::o;19409:::-;19551:3;19572:67;19636:2;19631:3;19572:67;:::i;:::-;19565:74;;19648:93;19737:3;19648:93;:::i;:::-;19766:2;19761:3;19757:12;19750:19;;19409:366;;;:::o;19781:108::-;19858:24;19876:5;19858:24;:::i;:::-;19853:3;19846:37;19781:108;;:::o;19895:118::-;19982:24;20000:5;19982:24;:::i;:::-;19977:3;19970:37;19895:118;;:::o;20019:589::-;20244:3;20266:95;20357:3;20348:6;20266:95;:::i;:::-;20259:102;;20378:95;20469:3;20460:6;20378:95;:::i;:::-;20371:102;;20490:92;20578:3;20569:6;20490:92;:::i;:::-;20483:99;;20599:3;20592:10;;20019:589;;;;;;:::o;20614:379::-;20798:3;20820:147;20963:3;20820:147;:::i;:::-;20813:154;;20984:3;20977:10;;20614:379;;;:::o;20999:222::-;21092:4;21130:2;21119:9;21115:18;21107:26;;21143:71;21211:1;21200:9;21196:17;21187:6;21143:71;:::i;:::-;20999:222;;;;:::o;21227:640::-;21422:4;21460:3;21449:9;21445:19;21437:27;;21474:71;21542:1;21531:9;21527:17;21518:6;21474:71;:::i;:::-;21555:72;21623:2;21612:9;21608:18;21599:6;21555:72;:::i;:::-;21637;21705:2;21694:9;21690:18;21681:6;21637:72;:::i;:::-;21756:9;21750:4;21746:20;21741:2;21730:9;21726:18;21719:48;21784:76;21855:4;21846:6;21784:76;:::i;:::-;21776:84;;21227:640;;;;;;;:::o;21873:373::-;22016:4;22054:2;22043:9;22039:18;22031:26;;22103:9;22097:4;22093:20;22089:1;22078:9;22074:17;22067:47;22131:108;22234:4;22225:6;22131:108;:::i;:::-;22123:116;;21873:373;;;;:::o;22252:210::-;22339:4;22377:2;22366:9;22362:18;22354:26;;22390:65;22452:1;22441:9;22437:17;22428:6;22390:65;:::i;:::-;22252:210;;;;:::o;22468:313::-;22581:4;22619:2;22608:9;22604:18;22596:26;;22668:9;22662:4;22658:20;22654:1;22643:9;22639:17;22632:47;22696:78;22769:4;22760:6;22696:78;:::i;:::-;22688:86;;22468:313;;;;:::o;22787:419::-;22953:4;22991:2;22980:9;22976:18;22968:26;;23040:9;23034:4;23030:20;23026:1;23015:9;23011:17;23004:47;23068:131;23194:4;23068:131;:::i;:::-;23060:139;;22787:419;;;:::o;23212:::-;23378:4;23416:2;23405:9;23401:18;23393:26;;23465:9;23459:4;23455:20;23451:1;23440:9;23436:17;23429:47;23493:131;23619:4;23493:131;:::i;:::-;23485:139;;23212:419;;;:::o;23637:::-;23803:4;23841:2;23830:9;23826:18;23818:26;;23890:9;23884:4;23880:20;23876:1;23865:9;23861:17;23854:47;23918:131;24044:4;23918:131;:::i;:::-;23910:139;;23637:419;;;:::o;24062:::-;24228:4;24266:2;24255:9;24251:18;24243:26;;24315:9;24309:4;24305:20;24301:1;24290:9;24286:17;24279:47;24343:131;24469:4;24343:131;:::i;:::-;24335:139;;24062:419;;;:::o;24487:::-;24653:4;24691:2;24680:9;24676:18;24668:26;;24740:9;24734:4;24730:20;24726:1;24715:9;24711:17;24704:47;24768:131;24894:4;24768:131;:::i;:::-;24760:139;;24487:419;;;:::o;24912:::-;25078:4;25116:2;25105:9;25101:18;25093:26;;25165:9;25159:4;25155:20;25151:1;25140:9;25136:17;25129:47;25193:131;25319:4;25193:131;:::i;:::-;25185:139;;24912:419;;;:::o;25337:::-;25503:4;25541:2;25530:9;25526:18;25518:26;;25590:9;25584:4;25580:20;25576:1;25565:9;25561:17;25554:47;25618:131;25744:4;25618:131;:::i;:::-;25610:139;;25337:419;;;:::o;25762:::-;25928:4;25966:2;25955:9;25951:18;25943:26;;26015:9;26009:4;26005:20;26001:1;25990:9;25986:17;25979:47;26043:131;26169:4;26043:131;:::i;:::-;26035:139;;25762:419;;;:::o;26187:::-;26353:4;26391:2;26380:9;26376:18;26368:26;;26440:9;26434:4;26430:20;26426:1;26415:9;26411:17;26404:47;26468:131;26594:4;26468:131;:::i;:::-;26460:139;;26187:419;;;:::o;26612:::-;26778:4;26816:2;26805:9;26801:18;26793:26;;26865:9;26859:4;26855:20;26851:1;26840:9;26836:17;26829:47;26893:131;27019:4;26893:131;:::i;:::-;26885:139;;26612:419;;;:::o;27037:::-;27203:4;27241:2;27230:9;27226:18;27218:26;;27290:9;27284:4;27280:20;27276:1;27265:9;27261:17;27254:47;27318:131;27444:4;27318:131;:::i;:::-;27310:139;;27037:419;;;:::o;27462:::-;27628:4;27666:2;27655:9;27651:18;27643:26;;27715:9;27709:4;27705:20;27701:1;27690:9;27686:17;27679:47;27743:131;27869:4;27743:131;:::i;:::-;27735:139;;27462:419;;;:::o;27887:::-;28053:4;28091:2;28080:9;28076:18;28068:26;;28140:9;28134:4;28130:20;28126:1;28115:9;28111:17;28104:47;28168:131;28294:4;28168:131;:::i;:::-;28160:139;;27887:419;;;:::o;28312:::-;28478:4;28516:2;28505:9;28501:18;28493:26;;28565:9;28559:4;28555:20;28551:1;28540:9;28536:17;28529:47;28593:131;28719:4;28593:131;:::i;:::-;28585:139;;28312:419;;;:::o;28737:::-;28903:4;28941:2;28930:9;28926:18;28918:26;;28990:9;28984:4;28980:20;28976:1;28965:9;28961:17;28954:47;29018:131;29144:4;29018:131;:::i;:::-;29010:139;;28737:419;;;:::o;29162:::-;29328:4;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29162:419;;;:::o;29587:::-;29753:4;29791:2;29780:9;29776:18;29768:26;;29840:9;29834:4;29830:20;29826:1;29815:9;29811:17;29804:47;29868:131;29994:4;29868:131;:::i;:::-;29860:139;;29587:419;;;:::o;30012:::-;30178:4;30216:2;30205:9;30201:18;30193:26;;30265:9;30259:4;30255:20;30251:1;30240:9;30236:17;30229:47;30293:131;30419:4;30293:131;:::i;:::-;30285:139;;30012:419;;;:::o;30437:::-;30603:4;30641:2;30630:9;30626:18;30618:26;;30690:9;30684:4;30680:20;30676:1;30665:9;30661:17;30654:47;30718:131;30844:4;30718:131;:::i;:::-;30710:139;;30437:419;;;:::o;30862:222::-;30955:4;30993:2;30982:9;30978:18;30970:26;;31006:71;31074:1;31063:9;31059:17;31050:6;31006:71;:::i;:::-;30862:222;;;;:::o;31090:129::-;31124:6;31151:20;;:::i;:::-;31141:30;;31180:33;31208:4;31200:6;31180:33;:::i;:::-;31090:129;;;:::o;31225:75::-;31258:6;31291:2;31285:9;31275:19;;31225:75;:::o;31306:307::-;31367:4;31457:18;31449:6;31446:30;31443:56;;;31479:18;;:::i;:::-;31443:56;31517:29;31539:6;31517:29;:::i;:::-;31509:37;;31601:4;31595;31591:15;31583:23;;31306:307;;;:::o;31619:308::-;31681:4;31771:18;31763:6;31760:30;31757:56;;;31793:18;;:::i;:::-;31757:56;31831:29;31853:6;31831:29;:::i;:::-;31823:37;;31915:4;31909;31905:15;31897:23;;31619:308;;;:::o;31933:132::-;32000:4;32023:3;32015:11;;32053:4;32048:3;32044:14;32036:22;;31933:132;;;:::o;32071:141::-;32120:4;32143:3;32135:11;;32166:3;32163:1;32156:14;32200:4;32197:1;32187:18;32179:26;;32071:141;;;:::o;32218:114::-;32285:6;32319:5;32313:12;32303:22;;32218:114;;;:::o;32338:98::-;32389:6;32423:5;32417:12;32407:22;;32338:98;;;:::o;32442:99::-;32494:6;32528:5;32522:12;32512:22;;32442:99;;;:::o;32547:113::-;32617:4;32649;32644:3;32640:14;32632:22;;32547:113;;;:::o;32666:184::-;32765:11;32799:6;32794:3;32787:19;32839:4;32834:3;32830:14;32815:29;;32666:184;;;;:::o;32856:168::-;32939:11;32973:6;32968:3;32961:19;33013:4;33008:3;33004:14;32989:29;;32856:168;;;;:::o;33030:147::-;33131:11;33168:3;33153:18;;33030:147;;;;:::o;33183:169::-;33267:11;33301:6;33296:3;33289:19;33341:4;33336:3;33332:14;33317:29;;33183:169;;;;:::o;33358:148::-;33460:11;33497:3;33482:18;;33358:148;;;;:::o;33512:305::-;33552:3;33571:20;33589:1;33571:20;:::i;:::-;33566:25;;33605:20;33623:1;33605:20;:::i;:::-;33600:25;;33759:1;33691:66;33687:74;33684:1;33681:81;33678:107;;;33765:18;;:::i;:::-;33678:107;33809:1;33806;33802:9;33795:16;;33512:305;;;;:::o;33823:185::-;33863:1;33880:20;33898:1;33880:20;:::i;:::-;33875:25;;33914:20;33932:1;33914:20;:::i;:::-;33909:25;;33953:1;33943:35;;33958:18;;:::i;:::-;33943:35;34000:1;33997;33993:9;33988:14;;33823:185;;;;:::o;34014:348::-;34054:7;34077:20;34095:1;34077:20;:::i;:::-;34072:25;;34111:20;34129:1;34111:20;:::i;:::-;34106:25;;34299:1;34231:66;34227:74;34224:1;34221:81;34216:1;34209:9;34202:17;34198:105;34195:131;;;34306:18;;:::i;:::-;34195:131;34354:1;34351;34347:9;34336:20;;34014:348;;;;:::o;34368:191::-;34408:4;34428:20;34446:1;34428:20;:::i;:::-;34423:25;;34462:20;34480:1;34462:20;:::i;:::-;34457:25;;34501:1;34498;34495:8;34492:34;;;34506:18;;:::i;:::-;34492:34;34551:1;34548;34544:9;34536:17;;34368:191;;;;:::o;34565:96::-;34602:7;34631:24;34649:5;34631:24;:::i;:::-;34620:35;;34565:96;;;:::o;34667:90::-;34701:7;34744:5;34737:13;34730:21;34719:32;;34667:90;;;:::o;34763:149::-;34799:7;34839:66;34832:5;34828:78;34817:89;;34763:149;;;:::o;34918:126::-;34955:7;34995:42;34988:5;34984:54;34973:65;;34918:126;;;:::o;35050:77::-;35087:7;35116:5;35105:16;;35050:77;;;:::o;35133:154::-;35217:6;35212:3;35207;35194:30;35279:1;35270:6;35265:3;35261:16;35254:27;35133:154;;;:::o;35293:307::-;35361:1;35371:113;35385:6;35382:1;35379:13;35371:113;;;35470:1;35465:3;35461:11;35455:18;35451:1;35446:3;35442:11;35435:39;35407:2;35404:1;35400:10;35395:15;;35371:113;;;35502:6;35499:1;35496:13;35493:101;;;35582:1;35573:6;35568:3;35564:16;35557:27;35493:101;35342:258;35293:307;;;:::o;35606:320::-;35650:6;35687:1;35681:4;35677:12;35667:22;;35734:1;35728:4;35724:12;35755:18;35745:81;;35811:4;35803:6;35799:17;35789:27;;35745:81;35873:2;35865:6;35862:14;35842:18;35839:38;35836:84;;;35892:18;;:::i;:::-;35836:84;35657:269;35606:320;;;:::o;35932:281::-;36015:27;36037:4;36015:27;:::i;:::-;36007:6;36003:40;36145:6;36133:10;36130:22;36109:18;36097:10;36094:34;36091:62;36088:88;;;36156:18;;:::i;:::-;36088:88;36196:10;36192:2;36185:22;35975:238;35932:281;;:::o;36219:233::-;36258:3;36281:24;36299:5;36281:24;:::i;:::-;36272:33;;36327:66;36320:5;36317:77;36314:103;;;36397:18;;:::i;:::-;36314:103;36444:1;36437:5;36433:13;36426:20;;36219:233;;;:::o;36458:176::-;36490:1;36507:20;36525:1;36507:20;:::i;:::-;36502:25;;36541:20;36559:1;36541:20;:::i;:::-;36536:25;;36580:1;36570:35;;36585:18;;:::i;:::-;36570:35;36626:1;36623;36619:9;36614:14;;36458:176;;;;:::o;36640:180::-;36688:77;36685:1;36678:88;36785:4;36782:1;36775:15;36809:4;36806:1;36799:15;36826:180;36874:77;36871:1;36864:88;36971:4;36968:1;36961:15;36995:4;36992:1;36985:15;37012:180;37060:77;37057:1;37050:88;37157:4;37154:1;37147:15;37181:4;37178:1;37171:15;37198:180;37246:77;37243:1;37236:88;37343:4;37340:1;37333:15;37367:4;37364:1;37357:15;37384:180;37432:77;37429:1;37422:88;37529:4;37526:1;37519:15;37553:4;37550:1;37543:15;37570:117;37679:1;37676;37669:12;37693:117;37802:1;37799;37792:12;37816:117;37925:1;37922;37915:12;37939:117;38048:1;38045;38038:12;38062:117;38171:1;38168;38161:12;38185:117;38294:1;38291;38284:12;38308:102;38349:6;38400:2;38396:7;38391:2;38384:5;38380:14;38376:28;38366:38;;38308:102;;;:::o;38416:178::-;38556:30;38552:1;38544:6;38540:14;38533:54;38416:178;:::o;38600:179::-;38740:31;38736:1;38728:6;38724:14;38717:55;38600:179;:::o;38785:178::-;38925:30;38921:1;38913:6;38909:14;38902:54;38785:178;:::o;38969:220::-;39109:34;39105:1;39097:6;39093:14;39086:58;39178:3;39173:2;39165:6;39161:15;39154:28;38969:220;:::o;39195:225::-;39335:34;39331:1;39323:6;39319:14;39312:58;39404:8;39399:2;39391:6;39387:15;39380:33;39195:225;:::o;39426:170::-;39566:22;39562:1;39554:6;39550:14;39543:46;39426:170;:::o;39602:173::-;39742:25;39738:1;39730:6;39726:14;39719:49;39602:173;:::o;39781:174::-;39921:26;39917:1;39909:6;39905:14;39898:50;39781:174;:::o;39961:179::-;40101:31;40097:1;40089:6;40085:14;40078:55;39961:179;:::o;40146:173::-;40286:25;40282:1;40274:6;40270:14;40263:49;40146:173;:::o;40325:171::-;40465:23;40461:1;40453:6;40449:14;40442:47;40325:171;:::o;40502:182::-;40642:34;40638:1;40630:6;40626:14;40619:58;40502:182;:::o;40690:176::-;40830:28;40826:1;40818:6;40814:14;40807:52;40690:176;:::o;40872:114::-;;:::o;40992:170::-;41132:22;41128:1;41120:6;41116:14;41109:46;40992:170;:::o;41168:166::-;41308:18;41304:1;41296:6;41292:14;41285:42;41168:166;:::o;41340:169::-;41480:21;41476:1;41468:6;41464:14;41457:45;41340:169;:::o;41515:181::-;41655:33;41651:1;41643:6;41639:14;41632:57;41515:181;:::o;41702:235::-;41842:34;41838:1;41830:6;41826:14;41819:58;41911:18;41906:2;41898:6;41894:15;41887:43;41702:235;:::o;41943:170::-;42083:22;42079:1;42071:6;42067:14;42060:46;41943:170;:::o;42119:122::-;42192:24;42210:5;42192:24;:::i;:::-;42185:5;42182:35;42172:63;;42231:1;42228;42221:12;42172:63;42119:122;:::o;42247:116::-;42317:21;42332:5;42317:21;:::i;:::-;42310:5;42307:32;42297:60;;42353:1;42350;42343:12;42297:60;42247:116;:::o;42369:120::-;42441:23;42458:5;42441:23;:::i;:::-;42434:5;42431:34;42421:62;;42479:1;42476;42469:12;42421:62;42369:120;:::o;42495:122::-;42568:24;42586:5;42568:24;:::i;:::-;42561:5;42558:35;42548:63;;42607:1;42604;42597:12;42548:63;42495:122;:::o
Swarm Source
ipfs://e7558ca6ab19cc40fc022d3474a9e04dd535cdf7da4ddb389831bd1eb1ec902a
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.