ERC-721
Overview
Max Total Supply
1,448 Zimmymon
Holders
1,052
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ZimmymonLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Zimmymon
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-12 */ /** ███████╗██╗███╗ ███╗███╗ ███╗██╗ ██╗███╗ ███╗ ██████╗ ███╗ ██╗ ╚══███╔╝██║████╗ ████║████╗ ████║╚██╗ ██╔╝████╗ ████║██╔═══██╗████╗ ██║ ███╔╝ ██║██╔████╔██║██╔████╔██║ ╚████╔╝ ██╔████╔██║██║ ██║██╔██╗ ██║ ███╔╝ ██║██║╚██╔╝██║██║╚██╔╝██║ ╚██╔╝ ██║╚██╔╝██║██║ ██║██║╚██╗██║ ███████╗██║██║ ╚═╝ ██║██║ ╚═╝ ██║ ██║ ██║ ╚═╝ ██║╚██████╔╝██║ ╚████║ ╚══════╝╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ /** // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } } } } 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; } } 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); } } 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); } 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; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } 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); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } 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); } } pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 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**128 - 1 (max value of uint128). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. 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; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // Compiler will pack the following // _currentIndex and _burnCounter into a single 256bit word. // The tokenId of the next token to be minted. uint128 internal _currentIndex; // The number of tokens burned. uint128 internal _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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * 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) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @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 override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 (!_checkOnERC721Received(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 tokenId < _currentIndex && !_ownerships[tokenId].burned; } 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 { _mint(to, quantity, _data, true); } /** * @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, bytes memory _data, bool safe ) 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 > 3.4e38 (2**128) - 1 // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = uint128(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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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**128. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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**128. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @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 {} } pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } contract Zimmymon is ERC721A, Ownable { uint256 public constant MAX_MINTS = 1; uint256 public constant MAX_SUPPLY = 5208; uint256 public constant NUMBER_RESERVED_TOKENS = 25; uint256 public reservedTokensMinted = 0; uint256 public mintRate = 0 ether; bool public saleIsActive = false; mapping(address => uint256) public timesMinted; bytes32 public rootHashA; bytes32 public rootHashB; string public baseURI; constructor() ERC721A("Zimmymon", "Zimmymon") { } function claimA(uint256 quantity, bytes32[] calldata _proof) external payable { // _safeMint's second argument now takes in a quantity, not a tokenId. bytes32 _address = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_proof, rootHashA, _address), "Address not found in whitelist"); require(quantity + timesMinted[msg.sender] <= MAX_MINTS, "Only 1 mint per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left"); require(saleIsActive, "Mint period not active"); _safeMint(msg.sender, quantity); timesMinted[msg.sender] += quantity; } function claimB(uint256 quantity, bytes32[] calldata _proof) external payable { // _safeMint's second argument now takes in a quantity, not a tokenId. bytes32 _address = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_proof, rootHashB, _address), "Address not found in whitelist"); require(quantity + timesMinted[msg.sender] <= MAX_MINTS, "Only 1 mint per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left"); require(saleIsActive, "Mint period not active"); _safeMint(msg.sender, quantity); timesMinted[msg.sender] += quantity; } function mintReservedTokens(address to, uint16 quantity) external onlyOwner { require(reservedTokensMinted + quantity <= NUMBER_RESERVED_TOKENS, "This amount is more than max allowed"); reservedTokensMinted += quantity; _safeMint(to, quantity); } function withdraw() external payable onlyOwner { payable(owner()).transfer(address(this).balance); } function _baseURI() internal view override returns (string memory) { return baseURI; } function setMintRate(uint256 _mintRate) public onlyOwner { mintRate = _mintRate; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function setRootHashA(bytes32 _hashA) public onlyOwner { rootHashA = _hashA; } function setRootHashB(bytes32 _hashB) public onlyOwner { rootHashB = _hashB; } }
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":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","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":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUMBER_RESERVED_TOKENS","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":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimA","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"mintReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootHashA","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootHashB","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintRate","type":"uint256"}],"name":"setMintRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hashA","type":"bytes32"}],"name":"setRootHashA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hashB","type":"bytes32"}],"name":"setRootHashB","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":"address","name":"","type":"address"}],"name":"timesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405260006008819055600955600a805460ff191690553480156200002557600080fd5b506040805180820182526008808252672d34b6b6bcb6b7b760c11b6020808401828152855180870190965292855284015281519192916200006991600191620000f8565b5080516200007f906002906020840190620000f8565b5050506200009c62000096620000a260201b60201c565b620000a6565b620001db565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000106906200019e565b90600052602060002090601f0160209004810192826200012a576000855562000175565b82601f106200014557805160ff191683800117855562000175565b8280016001018555821562000175579182015b828111156200017557825182559160200191906001019062000158565b506200018392915062000187565b5090565b5b8082111562000183576000815560010162000188565b600181811c90821680620001b357607f821691505b60208210811415620001d557634e487b7160e01b600052602260045260246000fd5b50919050565b61210080620001eb6000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c514610611578063eb8d24441461065a578063edbe8fc514610674578063f2fde38b1461068a578063f3e38821146106aa57600080fd5b8063c87b56dd14610586578063ca0dcf16146105a6578063cce132d1146105bc578063dbc9db7c146105d1578063dbe2193f146105f157600080fd5b806395d89b41116100f257806395d89b4114610506578063a22cb4651461051b578063b22edfbc1461053b578063b88d4fde14610550578063bc874f7b1461057057600080fd5b806370a0823114610493578063715018a6146104b357806378047418146104c85780638da5cb5b146104e857600080fd5b806332cb6b0c116101b15780634f6ccce7116101755780634f6ccce7146103f157806355f804b3146104115780636352211e146104315780636363be18146104515780636c0360eb1461047e57600080fd5b806332cb6b0c1461038b57806334918dfd146103a15780633ccfd60b146103b65780633f6d5281146103be57806342842e0e146103d157600080fd5b806318160ddd116101f857806318160ddd146102db578063181c22751461031857806323b872dd146103385780632f745c5914610358578063302581001461037857600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611dc3565b6106c0565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461072d565b6040516102569190611f51565b34801561028d57600080fd5b506102a161029c366004611dab565b6107bf565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004611d82565b610803565b005b3480156102e757600080fd5b5061030a6000546001600160801b03600160801b82048116918116919091031690565b604051908152602001610256565b34801561032457600080fd5b506102d9610333366004611dab565b610891565b34801561034457600080fd5b506102d9610353366004611c64565b6108c9565b34801561036457600080fd5b5061030a610373366004611d82565b6108d4565b6102d9610386366004611e40565b6109d0565b34801561039757600080fd5b5061030a61145881565b3480156103ad57600080fd5b506102d9610bf0565b6102d9610c2e565b6102d96103cc366004611e40565b610c94565b3480156103dd57600080fd5b506102d96103ec366004611c64565b610d0e565b3480156103fd57600080fd5b5061030a61040c366004611dab565b610d29565b34801561041d57600080fd5b506102d961042c366004611dfb565b610dd3565b34801561043d57600080fd5b506102a161044c366004611dab565b610e14565b34801561045d57600080fd5b5061030a61046c366004611c18565b600b6020526000908152604090205481565b34801561048a57600080fd5b50610274610e26565b34801561049f57600080fd5b5061030a6104ae366004611c18565b610eb4565b3480156104bf57600080fd5b506102d9610f02565b3480156104d457600080fd5b506102d96104e3366004611d51565b610f38565b3480156104f457600080fd5b506007546001600160a01b03166102a1565b34801561051257600080fd5b50610274610ffa565b34801561052757600080fd5b506102d9610536366004611d17565b611009565b34801561054757600080fd5b5061030a601981565b34801561055c57600080fd5b506102d961056b366004611c9f565b61109f565b34801561057c57600080fd5b5061030a600c5481565b34801561059257600080fd5b506102746105a1366004611dab565b6110d9565b3480156105b257600080fd5b5061030a60095481565b3480156105c857600080fd5b5061030a600181565b3480156105dd57600080fd5b506102d96105ec366004611dab565b61115e565b3480156105fd57600080fd5b506102d961060c366004611dab565b61118d565b34801561061d57600080fd5b5061024a61062c366004611c32565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561066657600080fd5b50600a5461024a9060ff1681565b34801561068057600080fd5b5061030a600d5481565b34801561069657600080fd5b506102d96106a5366004611c18565b6111bc565b3480156106b657600080fd5b5061030a60085481565b60006001600160e01b031982166380ac58cd60e01b14806106f157506001600160e01b03198216635b5e139f60e01b145b8061070c57506001600160e01b0319821663780e9d6360e01b145b8061072757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461073c90612008565b80601f016020809104026020016040519081016040528092919081815260200182805461076890612008565b80156107b55780601f1061078a576101008083540402835291602001916107b5565b820191906000526020600020905b81548152906001019060200180831161079857829003601f168201915b5050505050905090565b60006107ca82611254565b6107e7576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061080e82610e14565b9050806001600160a01b0316836001600160a01b031614156108435760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108635750610861813361062c565b155b15610881576040516367d9dca160e11b815260040160405180910390fd5b61088c838383611288565b505050565b6007546001600160a01b031633146108c45760405162461bcd60e51b81526004016108bb90611f64565b60405180910390fd5b600c55565b61088c8383836112e4565b60006108df83610eb4565b82106108fe576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b838110156109ca57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061097657506109c2565b80516001600160a01b03161561098b57805192505b876001600160a01b0316836001600160a01b031614156109c057868414156109b95750935061072792505050565b6001909301925b505b60010161090f565b50600080fd5b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610a4a83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050611501565b610a965760405162461bcd60e51b815260206004820152601e60248201527f41646472657373206e6f7420666f756e6420696e2077686974656c697374000060448201526064016108bb565b336000908152600b6020526040902054600190610ab39086611f99565b1115610afa5760405162461bcd60e51b815260206004820152601660248201527513db9b1e480c481b5a5b9d081c195c881dd85b1b195d60521b60448201526064016108bb565b61145884610b206000546001600160801b03600160801b82048116918116919091031690565b610b2a9190611f99565b1115610b715760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016108bb565b600a5460ff16610bbc5760405162461bcd60e51b81526020600482015260166024820152754d696e7420706572696f64206e6f742061637469766560501b60448201526064016108bb565b610bc63385611517565b336000908152600b602052604081208054869290610be5908490611f99565b909155505050505050565b6007546001600160a01b03163314610c1a5760405162461bcd60e51b81526004016108bb90611f64565b600a805460ff19811660ff90911615179055565b6007546001600160a01b03163314610c585760405162461bcd60e51b81526004016108bb90611f64565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610c91573d6000803e3d6000fd5b50565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610a4a83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d549150849050611501565b61088c8383836040518060200160405280600081525061109f565b600080546001600160801b031681805b82811015610db957600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610db05785831415610da95750949350505050565b6001909201915b50600101610d39565b506040516329c8c00760e21b815260040160405180910390fd5b6007546001600160a01b03163314610dfd5760405162461bcd60e51b81526004016108bb90611f64565b8051610e1090600e906020840190611aee565b5050565b6000610e1f82611531565b5192915050565b600e8054610e3390612008565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5f90612008565b8015610eac5780601f10610e8157610100808354040283529160200191610eac565b820191906000526020600020905b815481529060010190602001808311610e8f57829003601f168201915b505050505081565b60006001600160a01b038216610edd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b03163314610f2c5760405162461bcd60e51b81526004016108bb90611f64565b610f366000611653565b565b6007546001600160a01b03163314610f625760405162461bcd60e51b81526004016108bb90611f64565b60198161ffff16600854610f769190611f99565b1115610fd05760405162461bcd60e51b8152602060048201526024808201527f5468697320616d6f756e74206973206d6f7265207468616e206d617820616c6c6044820152631bddd95960e21b60648201526084016108bb565b8061ffff1660086000828254610fe69190611f99565b90915550610e1090508261ffff8316611517565b60606002805461073c90612008565b6001600160a01b0382163314156110335760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110aa8484846112e4565b6110b6848484846116a5565b6110d3576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606110e482611254565b61110157604051630a14c4b560e41b815260040160405180910390fd5b600061110b6117b4565b905080516000141561112c5760405180602001604052806000815250611157565b80611136846117c3565b604051602001611147929190611ee5565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146111885760405162461bcd60e51b81526004016108bb90611f64565b600d55565b6007546001600160a01b031633146111b75760405162461bcd60e51b81526004016108bb90611f64565b600955565b6007546001600160a01b031633146111e65760405162461bcd60e51b81526004016108bb90611f64565b6001600160a01b03811661124b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108bb565b610c9181611653565b600080546001600160801b031682108015610727575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006112ef82611531565b80519091506000906001600160a01b0316336001600160a01b0316148061131d5750815161131d903361062c565b8061133857503361132d846107bf565b6001600160a01b0316145b90508061135857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461138d5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166113b457604051633a954ecd60e21b815260040160405180910390fd5b6113c46000848460000151611288565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166114b7576000546001600160801b03168110156114b757825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008261150e85846118dc565b14949350505050565b610e1082826040518060200160405280600081525061195e565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561163a57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906116385780516001600160a01b0316156115cf579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611633579392505050565b6115cf565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156117a857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116e9903390899088908890600401611f14565b602060405180830381600087803b15801561170357600080fd5b505af1925050508015611733575060408051601f3d908101601f1916820190925261173091810190611ddf565b60015b61178e573d808015611761576040519150601f19603f3d011682016040523d82523d6000602084013e611766565b606091505b508051611786576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117ac565b5060015b949350505050565b6060600e805461073c90612008565b6060816117e75750506040805180820190915260018152600360fc1b602082015290565b8160005b811561181157806117fb81612043565b915061180a9050600a83611fb1565b91506117eb565b6000816001600160401b0381111561183957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611863576020820181803683370190505b5090505b84156117ac57611878600183611fc5565b9150611885600a8661205e565b611890906030611f99565b60f81b8183815181106118b357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506118d5600a86611fb1565b9450611867565b600081815b845181101561195657600085828151811061190c57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116119325760008381526020829052604090209250611943565b600081815260208490526040902092505b508061194e81612043565b9150506118e1565b509392505050565b61088c83838360016000546001600160801b03166001600160a01b03851661199857604051622e076360e81b815260040160405180910390fd5b836119b65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015611ac85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015611a9e5750611a9c60008884886116a5565b155b15611abc576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611a47565b50600080546001600160801b0319166001600160801b03929092169190911790556114fa565b828054611afa90612008565b90600052602060002090601f016020900481019282611b1c5760008555611b62565b82601f10611b3557805160ff1916838001178555611b62565b82800160010185558215611b62579182015b82811115611b62578251825591602001919060010190611b47565b50611b6e929150611b72565b5090565b5b80821115611b6e5760008155600101611b73565b60006001600160401b0380841115611ba157611ba161209e565b604051601f8501601f19908116603f01168101908282118183101715611bc957611bc961209e565b81604052809350858152868686011115611be257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611c1357600080fd5b919050565b600060208284031215611c29578081fd5b61115782611bfc565b60008060408385031215611c44578081fd5b611c4d83611bfc565b9150611c5b60208401611bfc565b90509250929050565b600080600060608486031215611c78578081fd5b611c8184611bfc565b9250611c8f60208501611bfc565b9150604084013590509250925092565b60008060008060808587031215611cb4578081fd5b611cbd85611bfc565b9350611ccb60208601611bfc565b92506040850135915060608501356001600160401b03811115611cec578182fd5b8501601f81018713611cfc578182fd5b611d0b87823560208401611b87565b91505092959194509250565b60008060408385031215611d29578182fd5b611d3283611bfc565b915060208301358015158114611d46578182fd5b809150509250929050565b60008060408385031215611d63578182fd5b611d6c83611bfc565b9150602083013561ffff81168114611d46578182fd5b60008060408385031215611d94578182fd5b611d9d83611bfc565b946020939093013593505050565b600060208284031215611dbc578081fd5b5035919050565b600060208284031215611dd4578081fd5b8135611157816120b4565b600060208284031215611df0578081fd5b8151611157816120b4565b600060208284031215611e0c578081fd5b81356001600160401b03811115611e21578182fd5b8201601f81018413611e31578182fd5b6117ac84823560208401611b87565b600080600060408486031215611e54578081fd5b8335925060208401356001600160401b0380821115611e71578283fd5b818601915086601f830112611e84578283fd5b813581811115611e92578384fd5b8760208260051b8501011115611ea6578384fd5b6020830194508093505050509250925092565b60008151808452611ed1816020860160208601611fdc565b601f01601f19169290920160200192915050565b60008351611ef7818460208801611fdc565b835190830190611f0b818360208801611fdc565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f4790830184611eb9565b9695505050505050565b6020815260006111576020830184611eb9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611fac57611fac612072565b500190565b600082611fc057611fc0612088565b500490565b600082821015611fd757611fd7612072565b500390565b60005b83811015611ff7578181015183820152602001611fdf565b838111156110d35750506000910152565b600181811c9082168061201c57607f821691505b6020821081141561203d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561205757612057612072565b5060010190565b60008261206d5761206d612088565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c9157600080fdfea2646970667358221220de9690ae5d4f7e15208c9d0c087ef1686a2f40036f1b99c0d8085ca1bf054ca364736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102255760003560e01c806370a0823111610123578063c87b56dd116100ab578063e985e9c51161006f578063e985e9c514610611578063eb8d24441461065a578063edbe8fc514610674578063f2fde38b1461068a578063f3e38821146106aa57600080fd5b8063c87b56dd14610586578063ca0dcf16146105a6578063cce132d1146105bc578063dbc9db7c146105d1578063dbe2193f146105f157600080fd5b806395d89b41116100f257806395d89b4114610506578063a22cb4651461051b578063b22edfbc1461053b578063b88d4fde14610550578063bc874f7b1461057057600080fd5b806370a0823114610493578063715018a6146104b357806378047418146104c85780638da5cb5b146104e857600080fd5b806332cb6b0c116101b15780634f6ccce7116101755780634f6ccce7146103f157806355f804b3146104115780636352211e146104315780636363be18146104515780636c0360eb1461047e57600080fd5b806332cb6b0c1461038b57806334918dfd146103a15780633ccfd60b146103b65780633f6d5281146103be57806342842e0e146103d157600080fd5b806318160ddd116101f857806318160ddd146102db578063181c22751461031857806323b872dd146103385780632f745c5914610358578063302581001461037857600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611dc3565b6106c0565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461072d565b6040516102569190611f51565b34801561028d57600080fd5b506102a161029c366004611dab565b6107bf565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004611d82565b610803565b005b3480156102e757600080fd5b5061030a6000546001600160801b03600160801b82048116918116919091031690565b604051908152602001610256565b34801561032457600080fd5b506102d9610333366004611dab565b610891565b34801561034457600080fd5b506102d9610353366004611c64565b6108c9565b34801561036457600080fd5b5061030a610373366004611d82565b6108d4565b6102d9610386366004611e40565b6109d0565b34801561039757600080fd5b5061030a61145881565b3480156103ad57600080fd5b506102d9610bf0565b6102d9610c2e565b6102d96103cc366004611e40565b610c94565b3480156103dd57600080fd5b506102d96103ec366004611c64565b610d0e565b3480156103fd57600080fd5b5061030a61040c366004611dab565b610d29565b34801561041d57600080fd5b506102d961042c366004611dfb565b610dd3565b34801561043d57600080fd5b506102a161044c366004611dab565b610e14565b34801561045d57600080fd5b5061030a61046c366004611c18565b600b6020526000908152604090205481565b34801561048a57600080fd5b50610274610e26565b34801561049f57600080fd5b5061030a6104ae366004611c18565b610eb4565b3480156104bf57600080fd5b506102d9610f02565b3480156104d457600080fd5b506102d96104e3366004611d51565b610f38565b3480156104f457600080fd5b506007546001600160a01b03166102a1565b34801561051257600080fd5b50610274610ffa565b34801561052757600080fd5b506102d9610536366004611d17565b611009565b34801561054757600080fd5b5061030a601981565b34801561055c57600080fd5b506102d961056b366004611c9f565b61109f565b34801561057c57600080fd5b5061030a600c5481565b34801561059257600080fd5b506102746105a1366004611dab565b6110d9565b3480156105b257600080fd5b5061030a60095481565b3480156105c857600080fd5b5061030a600181565b3480156105dd57600080fd5b506102d96105ec366004611dab565b61115e565b3480156105fd57600080fd5b506102d961060c366004611dab565b61118d565b34801561061d57600080fd5b5061024a61062c366004611c32565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561066657600080fd5b50600a5461024a9060ff1681565b34801561068057600080fd5b5061030a600d5481565b34801561069657600080fd5b506102d96106a5366004611c18565b6111bc565b3480156106b657600080fd5b5061030a60085481565b60006001600160e01b031982166380ac58cd60e01b14806106f157506001600160e01b03198216635b5e139f60e01b145b8061070c57506001600160e01b0319821663780e9d6360e01b145b8061072757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461073c90612008565b80601f016020809104026020016040519081016040528092919081815260200182805461076890612008565b80156107b55780601f1061078a576101008083540402835291602001916107b5565b820191906000526020600020905b81548152906001019060200180831161079857829003601f168201915b5050505050905090565b60006107ca82611254565b6107e7576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061080e82610e14565b9050806001600160a01b0316836001600160a01b031614156108435760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108635750610861813361062c565b155b15610881576040516367d9dca160e11b815260040160405180910390fd5b61088c838383611288565b505050565b6007546001600160a01b031633146108c45760405162461bcd60e51b81526004016108bb90611f64565b60405180910390fd5b600c55565b61088c8383836112e4565b60006108df83610eb4565b82106108fe576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b838110156109ca57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061097657506109c2565b80516001600160a01b03161561098b57805192505b876001600160a01b0316836001600160a01b031614156109c057868414156109b95750935061072792505050565b6001909301925b505b60010161090f565b50600080fd5b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610a4a83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050611501565b610a965760405162461bcd60e51b815260206004820152601e60248201527f41646472657373206e6f7420666f756e6420696e2077686974656c697374000060448201526064016108bb565b336000908152600b6020526040902054600190610ab39086611f99565b1115610afa5760405162461bcd60e51b815260206004820152601660248201527513db9b1e480c481b5a5b9d081c195c881dd85b1b195d60521b60448201526064016108bb565b61145884610b206000546001600160801b03600160801b82048116918116919091031690565b610b2a9190611f99565b1115610b715760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016108bb565b600a5460ff16610bbc5760405162461bcd60e51b81526020600482015260166024820152754d696e7420706572696f64206e6f742061637469766560501b60448201526064016108bb565b610bc63385611517565b336000908152600b602052604081208054869290610be5908490611f99565b909155505050505050565b6007546001600160a01b03163314610c1a5760405162461bcd60e51b81526004016108bb90611f64565b600a805460ff19811660ff90911615179055565b6007546001600160a01b03163314610c585760405162461bcd60e51b81526004016108bb90611f64565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610c91573d6000803e3d6000fd5b50565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610a4a83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d549150849050611501565b61088c8383836040518060200160405280600081525061109f565b600080546001600160801b031681805b82811015610db957600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610db05785831415610da95750949350505050565b6001909201915b50600101610d39565b506040516329c8c00760e21b815260040160405180910390fd5b6007546001600160a01b03163314610dfd5760405162461bcd60e51b81526004016108bb90611f64565b8051610e1090600e906020840190611aee565b5050565b6000610e1f82611531565b5192915050565b600e8054610e3390612008565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5f90612008565b8015610eac5780601f10610e8157610100808354040283529160200191610eac565b820191906000526020600020905b815481529060010190602001808311610e8f57829003601f168201915b505050505081565b60006001600160a01b038216610edd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b03163314610f2c5760405162461bcd60e51b81526004016108bb90611f64565b610f366000611653565b565b6007546001600160a01b03163314610f625760405162461bcd60e51b81526004016108bb90611f64565b60198161ffff16600854610f769190611f99565b1115610fd05760405162461bcd60e51b8152602060048201526024808201527f5468697320616d6f756e74206973206d6f7265207468616e206d617820616c6c6044820152631bddd95960e21b60648201526084016108bb565b8061ffff1660086000828254610fe69190611f99565b90915550610e1090508261ffff8316611517565b60606002805461073c90612008565b6001600160a01b0382163314156110335760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110aa8484846112e4565b6110b6848484846116a5565b6110d3576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606110e482611254565b61110157604051630a14c4b560e41b815260040160405180910390fd5b600061110b6117b4565b905080516000141561112c5760405180602001604052806000815250611157565b80611136846117c3565b604051602001611147929190611ee5565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146111885760405162461bcd60e51b81526004016108bb90611f64565b600d55565b6007546001600160a01b031633146111b75760405162461bcd60e51b81526004016108bb90611f64565b600955565b6007546001600160a01b031633146111e65760405162461bcd60e51b81526004016108bb90611f64565b6001600160a01b03811661124b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108bb565b610c9181611653565b600080546001600160801b031682108015610727575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006112ef82611531565b80519091506000906001600160a01b0316336001600160a01b0316148061131d5750815161131d903361062c565b8061133857503361132d846107bf565b6001600160a01b0316145b90508061135857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b03161461138d5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166113b457604051633a954ecd60e21b815260040160405180910390fd5b6113c46000848460000151611288565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166114b7576000546001600160801b03168110156114b757825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008261150e85846118dc565b14949350505050565b610e1082826040518060200160405280600081525061195e565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561163a57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906116385780516001600160a01b0316156115cf579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611633579392505050565b6115cf565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156117a857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116e9903390899088908890600401611f14565b602060405180830381600087803b15801561170357600080fd5b505af1925050508015611733575060408051601f3d908101601f1916820190925261173091810190611ddf565b60015b61178e573d808015611761576040519150601f19603f3d011682016040523d82523d6000602084013e611766565b606091505b508051611786576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117ac565b5060015b949350505050565b6060600e805461073c90612008565b6060816117e75750506040805180820190915260018152600360fc1b602082015290565b8160005b811561181157806117fb81612043565b915061180a9050600a83611fb1565b91506117eb565b6000816001600160401b0381111561183957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611863576020820181803683370190505b5090505b84156117ac57611878600183611fc5565b9150611885600a8661205e565b611890906030611f99565b60f81b8183815181106118b357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506118d5600a86611fb1565b9450611867565b600081815b845181101561195657600085828151811061190c57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116119325760008381526020829052604090209250611943565b600081815260208490526040902092505b508061194e81612043565b9150506118e1565b509392505050565b61088c83838360016000546001600160801b03166001600160a01b03851661199857604051622e076360e81b815260040160405180910390fd5b836119b65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015611ac85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015611a9e5750611a9c60008884886116a5565b155b15611abc576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611a47565b50600080546001600160801b0319166001600160801b03929092169190911790556114fa565b828054611afa90612008565b90600052602060002090601f016020900481019282611b1c5760008555611b62565b82601f10611b3557805160ff1916838001178555611b62565b82800160010185558215611b62579182015b82811115611b62578251825591602001919060010190611b47565b50611b6e929150611b72565b5090565b5b80821115611b6e5760008155600101611b73565b60006001600160401b0380841115611ba157611ba161209e565b604051601f8501601f19908116603f01168101908282118183101715611bc957611bc961209e565b81604052809350858152868686011115611be257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611c1357600080fd5b919050565b600060208284031215611c29578081fd5b61115782611bfc565b60008060408385031215611c44578081fd5b611c4d83611bfc565b9150611c5b60208401611bfc565b90509250929050565b600080600060608486031215611c78578081fd5b611c8184611bfc565b9250611c8f60208501611bfc565b9150604084013590509250925092565b60008060008060808587031215611cb4578081fd5b611cbd85611bfc565b9350611ccb60208601611bfc565b92506040850135915060608501356001600160401b03811115611cec578182fd5b8501601f81018713611cfc578182fd5b611d0b87823560208401611b87565b91505092959194509250565b60008060408385031215611d29578182fd5b611d3283611bfc565b915060208301358015158114611d46578182fd5b809150509250929050565b60008060408385031215611d63578182fd5b611d6c83611bfc565b9150602083013561ffff81168114611d46578182fd5b60008060408385031215611d94578182fd5b611d9d83611bfc565b946020939093013593505050565b600060208284031215611dbc578081fd5b5035919050565b600060208284031215611dd4578081fd5b8135611157816120b4565b600060208284031215611df0578081fd5b8151611157816120b4565b600060208284031215611e0c578081fd5b81356001600160401b03811115611e21578182fd5b8201601f81018413611e31578182fd5b6117ac84823560208401611b87565b600080600060408486031215611e54578081fd5b8335925060208401356001600160401b0380821115611e71578283fd5b818601915086601f830112611e84578283fd5b813581811115611e92578384fd5b8760208260051b8501011115611ea6578384fd5b6020830194508093505050509250925092565b60008151808452611ed1816020860160208601611fdc565b601f01601f19169290920160200192915050565b60008351611ef7818460208801611fdc565b835190830190611f0b818360208801611fdc565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f4790830184611eb9565b9695505050505050565b6020815260006111576020830184611eb9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611fac57611fac612072565b500190565b600082611fc057611fc0612088565b500490565b600082821015611fd757611fd7612072565b500390565b60005b83811015611ff7578181015183820152602001611fdf565b838111156110d35750506000910152565b600181811c9082168061201c57607f821691505b6020821081141561203d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561205757612057612072565b5060010190565b60008261206d5761206d612088565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c9157600080fdfea2646970667358221220de9690ae5d4f7e15208c9d0c087ef1686a2f40036f1b99c0d8085ca1bf054ca364736f6c63430008040033
Deployed Bytecode Sourcemap
48709:2892:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29723:372;;;;;;;;;;-1:-1:-1;29723:372:0;;;;;:::i;:::-;;:::i;:::-;;;7334:14:1;;7327:22;7309:41;;7297:2;7282:18;29723:372:0;;;;;;;;32333:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33836:204::-;;;;;;;;;;-1:-1:-1;33836:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6632:32:1;;;6614:51;;6602:2;6587:18;33836:204:0;6569:102:1;33399:371:0;;;;;;;;;;-1:-1:-1;33399:371:0;;;;;:::i;:::-;;:::i;:::-;;26960:280;;;;;;;;;;;;27013:7;27205:12;-1:-1:-1;;;;;;;;27205:12:0;;;;27189:13;;;:28;;;;27182:35;;26960:280;;;;7507:25:1;;;7495:2;7480:18;26960:280:0;7462:76:1;51406:92:0;;;;;;;;;;-1:-1:-1;51406:92:0;;;;;:::i;:::-;;:::i;34693:170::-;;;;;;;;;;-1:-1:-1;34693:170:0;;;;;:::i;:::-;;:::i;28546:1105::-;;;;;;;;;;-1:-1:-1;28546:1105:0;;;;;:::i;:::-;;:::i;49244:661::-;;;;;;:::i;:::-;;:::i;48798:41::-;;;;;;;;;;;;48835:4;48798:41;;51309:89;;;;;;;;;;;;;:::i;50879:114::-;;;:::i;49913:661::-;;;;;;:::i;:::-;;:::i;34934:185::-;;;;;;;;;;-1:-1:-1;34934:185:0;;;;;:::i;:::-;;:::i;27533:713::-;;;;;;;;;;-1:-1:-1;27533:713:0;;;;;:::i;:::-;;:::i;51213:88::-;;;;;;;;;;-1:-1:-1;51213:88:0;;;;;:::i;:::-;;:::i;32142:124::-;;;;;;;;;;-1:-1:-1;32142:124:0;;;;;:::i;:::-;;:::i;49033:46::-;;;;;;;;;;-1:-1:-1;49033:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;49152:21;;;;;;;;;;;;;:::i;30159:206::-;;;;;;;;;;-1:-1:-1;30159:206:0;;;;;:::i;:::-;;:::i;22965:103::-;;;;;;;;;;;;;:::i;50582:289::-;;;;;;;;;;-1:-1:-1;50582:289:0;;;;;:::i;:::-;;:::i;22314:87::-;;;;;;;;;;-1:-1:-1;22387:6:0;;-1:-1:-1;;;;;22387:6:0;22314:87;;32502:104;;;;;;;;;;;;;:::i;34112:279::-;;;;;;;;;;-1:-1:-1;34112:279:0;;;;;:::i;:::-;;:::i;48846:51::-;;;;;;;;;;;;48895:2;48846:51;;35190:342;;;;;;;;;;-1:-1:-1;35190:342:0;;;;;:::i;:::-;;:::i;49088:24::-;;;;;;;;;;;;;;;;32677:318;;;;;;;;;;-1:-1:-1;32677:318:0;;;;;:::i;:::-;;:::i;48950:33::-;;;;;;;;;;;;;;;;48754:37;;;;;;;;;;;;48790:1;48754:37;;51506:92;;;;;;;;;;-1:-1:-1;51506:92:0;;;;;:::i;:::-;;:::i;51109:96::-;;;;;;;;;;-1:-1:-1;51109:96:0;;;;;:::i;:::-;;:::i;34462:164::-;;;;;;;;;;-1:-1:-1;34462:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34583:25:0;;;34559:4;34583:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34462:164;48992:32;;;;;;;;;;-1:-1:-1;48992:32:0;;;;;;;;49119:24;;;;;;;;;;;;;;;;23223:201;;;;;;;;;;-1:-1:-1;23223:201:0;;;;;:::i;:::-;;:::i;48904:39::-;;;;;;;;;;;;;;;;29723:372;29825:4;-1:-1:-1;;;;;;29862:40:0;;-1:-1:-1;;;29862:40:0;;:105;;-1:-1:-1;;;;;;;29919:48:0;;-1:-1:-1;;;29919:48:0;29862:105;:172;;;-1:-1:-1;;;;;;;29984:50:0;;-1:-1:-1;;;29984:50:0;29862:172;:225;;;-1:-1:-1;;;;;;;;;;15037:40:0;;;30051:36;29842:245;29723:372;-1:-1:-1;;29723:372:0:o;32333:100::-;32387:13;32420:5;32413:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32333:100;:::o;33836:204::-;33904:7;33929:16;33937:7;33929;:16::i;:::-;33924:64;;33954:34;;-1:-1:-1;;;33954:34:0;;;;;;;;;;;33924:64;-1:-1:-1;34008:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34008:24:0;;33836:204::o;33399:371::-;33472:13;33488:24;33504:7;33488:15;:24::i;:::-;33472:40;;33533:5;-1:-1:-1;;;;;33527:11:0;:2;-1:-1:-1;;;;;33527:11:0;;33523:48;;;33547:24;;-1:-1:-1;;;33547:24:0;;;;;;;;;;;33523:48;11280:10;-1:-1:-1;;;;;33588:21:0;;;;;;:63;;-1:-1:-1;33614:37:0;33631:5;11280:10;34462:164;:::i;33614:37::-;33613:38;33588:63;33584:138;;;33675:35;;-1:-1:-1;;;33675:35:0;;;;;;;;;;;33584:138;33734:28;33743:2;33747:7;33756:5;33734:8;:28::i;:::-;33399:371;;;:::o;51406:92::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;;;;;;;;;51472:9:::1;:18:::0;51406:92::o;34693:170::-;34827:28;34837:4;34843:2;34847:7;34827:9;:28::i;28546:1105::-;28635:7;28668:16;28678:5;28668:9;:16::i;:::-;28659:5;:25;28655:61;;28693:23;;-1:-1:-1;;;28693:23:0;;;;;;;;;;;28655:61;28727:22;28752:13;;-1:-1:-1;;;;;28752:13:0;;28727:22;;29002:557;29022:14;29018:1;:18;29002:557;;;29062:31;29096:14;;;:11;:14;;;;;;;;;29062:48;;;;;;;;;-1:-1:-1;;;;;29062:48:0;;;;-1:-1:-1;;;29062:48:0;;-1:-1:-1;;;;;29062:48:0;;;;;;;;-1:-1:-1;;;29062:48:0;;;;;;;;;;;;;;;;29129:73;;29174:8;;;29129:73;29224:14;;-1:-1:-1;;;;;29224:28:0;;29220:111;;29297:14;;;-1:-1:-1;29220:111:0;29374:5;-1:-1:-1;;;;;29353:26:0;:17;-1:-1:-1;;;;;29353:26:0;;29349:195;;;29423:5;29408:11;:20;29404:85;;;-1:-1:-1;29464:1:0;-1:-1:-1;29457:8:0;;-1:-1:-1;;;29457:8:0;29404:85;29511:13;;;;;29349:195;29002:557;;29038:3;;29002:557;;;;29635:8;;;49244:661;49442:28;;-1:-1:-1;;49459:10:0;5908:2:1;5904:15;5900:53;49442:28:0;;;5888:66:1;49413:16:0;;5970:12:1;;49442:28:0;;;;;;;;;;;;49432:39;;;;;;49413:58;;49490:47;49509:6;;49490:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49517:9:0;;;-1:-1:-1;49528:8:0;;-1:-1:-1;49490:18:0;:47::i;:::-;49482:90;;;;-1:-1:-1;;;49482:90:0;;9834:2:1;49482:90:0;;;9816:21:1;9873:2;9853:18;;;9846:30;9912:32;9892:18;;;9885:60;9962:18;;49482:90:0;9806:180:1;49482:90:0;49614:10;49602:23;;;;:11;:23;;;;;;48790:1;;49591:34;;:8;:34;:::i;:::-;:47;;49583:82;;;;-1:-1:-1;;;49583:82:0;;9132:2:1;49583:82:0;;;9114:21:1;9171:2;9151:18;;;9144:30;-1:-1:-1;;;9190:18:1;;;9183:52;9252:18;;49583:82:0;9104:172:1;49583:82:0;48835:4;49700:8;49684:13;27013:7;27205:12;-1:-1:-1;;;;;;;;27205:12:0;;;;27189:13;;;:28;;;;27182:35;;26960:280;49684:13;:24;;;;:::i;:::-;:38;;49676:73;;;;-1:-1:-1;;;49676:73:0;;8781:2:1;49676:73:0;;;8763:21:1;8820:2;8800:18;;;8793:30;-1:-1:-1;;;8839:18:1;;;8832:52;8901:18;;49676:73:0;8753:172:1;49676:73:0;49768:12;;;;49760:47;;;;-1:-1:-1;;;49760:47:0;;9483:2:1;49760:47:0;;;9465:21:1;9522:2;9502:18;;;9495:30;-1:-1:-1;;;9541:18:1;;;9534:52;9603:18;;49760:47:0;9455:172:1;49760:47:0;49820:31;49830:10;49842:8;49820:9;:31::i;:::-;49874:10;49862:23;;;;:11;:23;;;;;:35;;49889:8;;49862:23;:35;;49889:8;;49862:35;:::i;:::-;;;;-1:-1:-1;;;;;;49244:661:0:o;51309:89::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;51378:12:::1;::::0;;-1:-1:-1;;51362:28:0;::::1;51378:12;::::0;;::::1;51377:13;51362:28;::::0;;51309:89::o;50879:114::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;22387:6;;50937:48:::1;::::0;-1:-1:-1;;;;;22387:6:0;;;;50963:21:::1;50937:48:::0;::::1;;;::::0;::::1;::::0;;;50963:21;22387:6;50937:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50879:114::o:0;49913:661::-;50111:28;;-1:-1:-1;;50128:10:0;5908:2:1;5904:15;5900:53;50111:28:0;;;5888:66:1;50082:16:0;;5970:12:1;;50111:28:0;;;;;;;;;;;;50101:39;;;;;;50082:58;;50159:47;50178:6;;50159:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50186:9:0;;;-1:-1:-1;50197:8:0;;-1:-1:-1;50159:18:0;:47::i;34934:185::-;35072:39;35089:4;35095:2;35099:7;35072:39;;;;;;;;;;;;:16;:39::i;27533:713::-;27600:7;27645:13;;-1:-1:-1;;;;;27645:13:0;27600:7;;27859:328;27879:14;27875:1;:18;27859:328;;;27919:31;27953:14;;;:11;:14;;;;;;;;;27919:48;;;;;;;;;-1:-1:-1;;;;;27919:48:0;;;;-1:-1:-1;;;27919:48:0;;-1:-1:-1;;;;;27919:48:0;;;;;;;;-1:-1:-1;;;27919:48:0;;;;;;;;;;;;;;27986:186;;28051:5;28036:11;:20;28032:85;;;-1:-1:-1;28092:1:0;27533:713;-1:-1:-1;;;;27533:713:0:o;28032:85::-;28139:13;;;;;27986:186;-1:-1:-1;27895:3:0;;27859:328;;;;28215:23;;-1:-1:-1;;;28215:23:0;;;;;;;;;;;51213:88;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;51280:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51213:88:::0;:::o;32142:124::-;32206:7;32233:20;32245:7;32233:11;:20::i;:::-;:25;;32142:124;-1:-1:-1;;32142:124:0:o;49152:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30159:206::-;30223:7;-1:-1:-1;;;;;30247:19:0;;30243:60;;30275:28;;-1:-1:-1;;;30275:28:0;;;;;;;;;;;30243:60;-1:-1:-1;;;;;;30329:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;30329:27:0;;30159:206::o;22965:103::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;23030:30:::1;23057:1;23030:18;:30::i;:::-;22965:103::o:0;50582:289::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;48895:2:::1;50706:8;50683:31;;:20;;:31;;;;:::i;:::-;:57;;50675:106;;;::::0;-1:-1:-1;;;50675:106:0;;7969:2:1;50675:106:0::1;::::0;::::1;7951:21:1::0;8008:2;7988:18;;;7981:30;8047:34;8027:18;;;8020:62;-1:-1:-1;;;8098:18:1;;;8091:34;8142:19;;50675:106:0::1;7941:226:1::0;50675:106:0::1;50818:8;50794:32;;:20;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;50839:23:0::1;::::0;-1:-1:-1;50849:2:0;50839:23:::1;::::0;::::1;:9;:23::i;32502:104::-:0;32558:13;32591:7;32584:14;;;;;:::i;34112:279::-;-1:-1:-1;;;;;34203:24:0;;11280:10;34203:24;34199:54;;;34236:17;;-1:-1:-1;;;34236:17:0;;;;;;;;;;;34199:54;11280:10;34266:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34266:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34266:53:0;;;;;;;;;;34335:48;;7309:41:1;;;34266:42:0;;11280:10;34335:48;;7282:18:1;34335:48:0;;;;;;;34112:279;;:::o;35190:342::-;35357:28;35367:4;35373:2;35377:7;35357:9;:28::i;:::-;35401:48;35424:4;35430:2;35434:7;35443:5;35401:22;:48::i;:::-;35396:129;;35473:40;;-1:-1:-1;;;35473:40:0;;;;;;;;;;;35396:129;35190:342;;;;:::o;32677:318::-;32750:13;32781:16;32789:7;32781;:16::i;:::-;32776:59;;32806:29;;-1:-1:-1;;;32806:29:0;;;;;;;;;;;32776:59;32848:21;32872:10;:8;:10::i;:::-;32848:34;;32906:7;32900:21;32925:1;32900:26;;:87;;;;;;;;;;;;;;;;;32953:7;32962:18;:7;:16;:18::i;:::-;32936:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32900:87;32893:94;32677:318;-1:-1:-1;;;32677:318:0:o;51506:92::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;51572:9:::1;:18:::0;51506:92::o;51109:96::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;51177:8:::1;:20:::0;51109:96::o;23223:201::-;22387:6;;-1:-1:-1;;;;;22387:6:0;11280:10;22534:23;22526:68;;;;-1:-1:-1;;;22526:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23312:22:0;::::1;23304:73;;;::::0;-1:-1:-1;;;23304:73:0;;8374:2:1;23304:73:0::1;::::0;::::1;8356:21:1::0;8413:2;8393:18;;;8386:30;8452:34;8432:18;;;8425:62;-1:-1:-1;;;8503:18:1;;;8496:36;8549:19;;23304:73:0::1;8346:228:1::0;23304:73:0::1;23388:28;23407:8;23388:18;:28::i;35787:144::-:0;35844:4;35878:13;;-1:-1:-1;;;;;35878:13:0;35868:23;;:55;;;;-1:-1:-1;;35896:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;35896:27:0;;;;35895:28;;35787:144::o;43003:196::-;43118:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43118:29:0;-1:-1:-1;;;;;43118:29:0;;;;;;;;;43163:28;;43118:24;;43163:28;;;;;;;43003:196;;;:::o;38504:2112::-;38619:35;38657:20;38669:7;38657:11;:20::i;:::-;38732:18;;38619:58;;-1:-1:-1;38690:22:0;;-1:-1:-1;;;;;38716:34:0;11280:10;-1:-1:-1;;;;;38716:34:0;;:101;;;-1:-1:-1;38784:18:0;;38767:50;;11280:10;34462:164;:::i;38767:50::-;38716:154;;;-1:-1:-1;11280:10:0;38834:20;38846:7;38834:11;:20::i;:::-;-1:-1:-1;;;;;38834:36:0;;38716:154;38690:181;;38889:17;38884:66;;38915:35;;-1:-1:-1;;;38915:35:0;;;;;;;;;;;38884:66;38987:4;-1:-1:-1;;;;;38965:26:0;:13;:18;;;-1:-1:-1;;;;;38965:26:0;;38961:67;;39000:28;;-1:-1:-1;;;39000:28:0;;;;;;;;;;;38961:67;-1:-1:-1;;;;;39043:16:0;;39039:52;;39068:23;;-1:-1:-1;;;39068:23:0;;;;;;;;;;;39039:52;39212:49;39229:1;39233:7;39242:13;:18;;;39212:8;:49::i;:::-;-1:-1:-1;;;;;39557:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;39557:31:0;;;-1:-1:-1;;;;;39557:31:0;;;-1:-1:-1;;39557:31:0;;;;;;;39603:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39603:29:0;;;;;;;;;;;39649:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;39694:61:0;;;;-1:-1:-1;;;39739:15:0;39694:61;;;;;;;;;;;40029:11;;;40059:24;;;;;:29;40029:11;;40059:29;40055:445;;40284:13;;-1:-1:-1;;;;;40284:13:0;40270:27;;40266:219;;;40354:18;;;40322:24;;;:11;:24;;;;;;;;:50;;40437:28;;;;-1:-1:-1;;;;;40395:70:0;-1:-1:-1;;;40395:70:0;-1:-1:-1;;;;;;40395:70:0;;;-1:-1:-1;;;;;40322:50:0;;;40395:70;;;;;;;40266:219;38504:2112;40547:7;40543:2;-1:-1:-1;;;;;40528:27:0;40537:4;-1:-1:-1;;;;;40528:27:0;;;;;;;;;;;40566:42;38504:2112;;;;;:::o;47244:190::-;47369:4;47422;47393:25;47406:5;47413:4;47393:12;:25::i;:::-;:33;;47244:190;-1:-1:-1;;;;47244:190:0:o;35939:104::-;36008:27;36018:2;36022:8;36008:27;;;;;;;;;;;;:9;:27::i;30997:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;31163:13:0;;31107:7;;-1:-1:-1;;;;;31163:13:0;31156:20;;31152:861;;;31197:31;31231:17;;;:11;:17;;;;;;;;;31197:51;;;;;;;;;-1:-1:-1;;;;;31197:51:0;;;;-1:-1:-1;;;31197:51:0;;-1:-1:-1;;;;;31197:51:0;;;;;;;;-1:-1:-1;;;31197:51:0;;;;;;;;;;;;;;31267:731;;31317:14;;-1:-1:-1;;;;;31317:28:0;;31313:101;;31381:9;30997:1083;-1:-1:-1;;;30997:1083:0:o;31313:101::-;-1:-1:-1;;;31758:6:0;31803:17;;;;:11;:17;;;;;;;;;31791:29;;;;;;;;;-1:-1:-1;;;;;31791:29:0;;;;;-1:-1:-1;;;31791:29:0;;-1:-1:-1;;;;;31791:29:0;;;;;;;;-1:-1:-1;;;31791:29:0;;;;;;;;;;;;;31851:28;31847:109;;31919:9;30997:1083;-1:-1:-1;;;30997:1083:0:o;31847:109::-;31718:261;;;31152:861;;32041:31;;-1:-1:-1;;;32041:31:0;;;;;;;;;;;23584:191;23677:6;;;-1:-1:-1;;;;;23694:17:0;;;-1:-1:-1;;;;;;23694:17:0;;;;;;;23727:40;;23677:6;;;23694:17;23677:6;;23727:40;;23658:16;;23727:40;23584:191;;:::o;43764:790::-;43919:4;-1:-1:-1;;;;;43940:13:0;;3658:19;:23;43936:611;;43976:72;;-1:-1:-1;;;43976:72:0;;-1:-1:-1;;;;;43976:36:0;;;;;:72;;11280:10;;44027:4;;44033:7;;44042:5;;43976:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43976:72:0;;;;;;;;-1:-1:-1;;43976:72:0;;;;;;;;;;;;:::i;:::-;;;43972:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44222:13:0;;44218:259;;44272:40;;-1:-1:-1;;;44272:40:0;;;;;;;;;;;44218:259;44427:6;44421:13;44412:6;44408:2;44404:15;44397:38;43972:520;-1:-1:-1;;;;;;44099:55:0;-1:-1:-1;;;44099:55:0;;-1:-1:-1;44092:62:0;;43936:611;-1:-1:-1;44531:4:0;43936:611;43764:790;;;;;;:::o;51001:100::-;51053:13;51086:7;51079:14;;;;;:::i;11667:723::-;11723:13;11944:10;11940:53;;-1:-1:-1;;11971:10:0;;;;;;;;;;;;-1:-1:-1;;;11971:10:0;;;;;11667:723::o;11940:53::-;12018:5;12003:12;12059:78;12066:9;;12059:78;;12092:8;;;;:::i;:::-;;-1:-1:-1;12115:10:0;;-1:-1:-1;12123:2:0;12115:10;;:::i;:::-;;;12059:78;;;12147:19;12179:6;-1:-1:-1;;;;;12169:17:0;;;;;-1:-1:-1;;;12169:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12169:17:0;;12147:39;;12197:154;12204:10;;12197:154;;12231:11;12241:1;12231:11;;:::i;:::-;;-1:-1:-1;12300:10:0;12308:2;12300:5;:10;:::i;:::-;12287:24;;:2;:24;:::i;:::-;12274:39;;12257:6;12264;12257:14;;;;;;-1:-1:-1;;;12257:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;12257:56:0;;;;;;;;-1:-1:-1;12328:11:0;12337:2;12328:11;;:::i;:::-;;;12197:154;;47795:675;47878:7;47921:4;47878:7;47936:497;47960:5;:12;47956:1;:16;47936:497;;;47994:20;48017:5;48023:1;48017:8;;;;;;-1:-1:-1;;;48017:8:0;;;;;;;;;;;;;;;47994:31;;48060:12;48044;:28;48040:382;;48546:13;48596:15;;;48632:4;48625:15;;;48679:4;48663:21;;48172:57;;48040:382;;;48546:13;48596:15;;;48632:4;48625:15;;;48679:4;48663:21;;48349:57;;48040:382;-1:-1:-1;47974:3:0;;;;:::i;:::-;;;;47936:497;;;-1:-1:-1;48450:12:0;47795:675;-1:-1:-1;;;47795:675:0:o;36406:163::-;36529:32;36535:2;36539:8;36549:5;36556:4;36967:20;36990:13;-1:-1:-1;;;;;36990:13:0;-1:-1:-1;;;;;37018:16:0;;37014:48;;37043:19;;-1:-1:-1;;;37043:19:0;;;;;;;;;;;37014:48;37077:13;37073:44;;37099:18;;-1:-1:-1;;;37099:18:0;;;;;;;;;;;37073:44;-1:-1:-1;;;;;37469:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;37528:49:0;;-1:-1:-1;;;;;37469:44:0;;;;;;;37528:49;;;;-1:-1:-1;;37469:44:0;;;;;;37528:49;;;;;;;;;;;;;;;;37594:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;37644:66:0;;;;-1:-1:-1;;;37694:15:0;37644:66;;;;;;;;;;;37594:25;;37779:328;37799:8;37795:1;:12;37779:328;;;37838:38;;37863:12;;-1:-1:-1;;;;;37838:38:0;;;37855:1;;37838:38;;37855:1;;37838:38;37899:4;:68;;;;;37908:59;37939:1;37943:2;37947:12;37961:5;37908:22;:59::i;:::-;37907:60;37899:68;37895:164;;;37999:40;;-1:-1:-1;;;37999:40:0;;;;;;;;;;;37895:164;38077:14;;;;;37809:3;37779:328;;;-1:-1:-1;38123:13:0;:37;;-1:-1:-1;;;;;;38123:37:0;-1:-1:-1;;;;;38123:37:0;;;;;;;;;;38182:60;35190:342;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:196::-;887:6;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:29;1008:9;989:29;:::i;1029:270::-;1097:6;1105;1158:2;1146:9;1137:7;1133:23;1129:32;1126:2;;;1179:6;1171;1164:22;1126:2;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1116:183;;;;;:::o;1304:338::-;1381:6;1389;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:2;;;1471:6;1463;1456:22;1418:2;1499:29;1518:9;1499:29;:::i;:::-;1489:39;;1547:38;1581:2;1570:9;1566:18;1547:38;:::i;:::-;1537:48;;1632:2;1621:9;1617:18;1604:32;1594:42;;1408:234;;;;;:::o;1647:696::-;1742:6;1750;1758;1766;1819:3;1807:9;1798:7;1794:23;1790:33;1787:2;;;1841:6;1833;1826:22;1787:2;1869:29;1888:9;1869:29;:::i;:::-;1859:39;;1917:38;1951:2;1940:9;1936:18;1917:38;:::i;:::-;1907:48;;2002:2;1991:9;1987:18;1974:32;1964:42;;2057:2;2046:9;2042:18;2029:32;-1:-1:-1;;;;;2076:6:1;2073:30;2070:2;;;2121:6;2113;2106:22;2070:2;2149:22;;2202:4;2194:13;;2190:27;-1:-1:-1;2180:2:1;;2236:6;2228;2221:22;2180:2;2264:73;2329:7;2324:2;2311:16;2306:2;2302;2298:11;2264:73;:::i;:::-;2254:83;;;1777:566;;;;;;;:::o;2348:367::-;2413:6;2421;2474:2;2462:9;2453:7;2449:23;2445:32;2442:2;;;2495:6;2487;2480:22;2442:2;2523:29;2542:9;2523:29;:::i;:::-;2513:39;;2602:2;2591:9;2587:18;2574:32;2649:5;2642:13;2635:21;2628:5;2625:32;2615:2;;2676:6;2668;2661:22;2615:2;2704:5;2694:15;;;2432:283;;;;;:::o;2720:366::-;2787:6;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:2;;;2869:6;2861;2854:22;2816:2;2897:29;2916:9;2897:29;:::i;:::-;2887:39;;2976:2;2965:9;2961:18;2948:32;3020:6;3013:5;3009:18;3002:5;2999:29;2989:2;;3047:6;3039;3032:22;3091:264;3159:6;3167;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3241:6;3233;3226:22;3188:2;3269:29;3288:9;3269:29;:::i;:::-;3259:39;3345:2;3330:18;;;;3317:32;;-1:-1:-1;;;3178:177:1:o;3360:190::-;3419:6;3472:2;3460:9;3451:7;3447:23;3443:32;3440:2;;;3493:6;3485;3478:22;3440:2;-1:-1:-1;3521:23:1;;3430:120;-1:-1:-1;3430:120:1:o;3555:255::-;3613:6;3666:2;3654:9;3645:7;3641:23;3637:32;3634:2;;;3687:6;3679;3672:22;3634:2;3731:9;3718:23;3750:30;3774:5;3750:30;:::i;3815:259::-;3884:6;3937:2;3925:9;3916:7;3912:23;3908:32;3905:2;;;3958:6;3950;3943:22;3905:2;3995:9;3989:16;4014:30;4038:5;4014:30;:::i;4079:480::-;4148:6;4201:2;4189:9;4180:7;4176:23;4172:32;4169:2;;;4222:6;4214;4207:22;4169:2;4267:9;4254:23;-1:-1:-1;;;;;4292:6:1;4289:30;4286:2;;;4337:6;4329;4322:22;4286:2;4365:22;;4418:4;4410:13;;4406:27;-1:-1:-1;4396:2:1;;4452:6;4444;4437:22;4396:2;4480:73;4545:7;4540:2;4527:16;4522:2;4518;4514:11;4480:73;:::i;4759:733::-;4854:6;4862;4870;4923:2;4911:9;4902:7;4898:23;4894:32;4891:2;;;4944:6;4936;4929:22;4891:2;4985:9;4972:23;4962:33;;5046:2;5035:9;5031:18;5018:32;-1:-1:-1;;;;;5110:2:1;5102:6;5099:14;5096:2;;;5131:6;5123;5116:22;5096:2;5174:6;5163:9;5159:22;5149:32;;5219:7;5212:4;5208:2;5204:13;5200:27;5190:2;;5246:6;5238;5231:22;5190:2;5291;5278:16;5317:2;5309:6;5306:14;5303:2;;;5338:6;5330;5323:22;5303:2;5396:7;5391:2;5381:6;5378:1;5374:14;5370:2;5366:23;5362:32;5359:45;5356:2;;;5422:6;5414;5407:22;5356:2;5458;5454;5450:11;5440:21;;5480:6;5470:16;;;;;4881:611;;;;;:::o;5497:257::-;5538:3;5576:5;5570:12;5603:6;5598:3;5591:19;5619:63;5675:6;5668:4;5663:3;5659:14;5652:4;5645:5;5641:16;5619:63;:::i;:::-;5736:2;5715:15;-1:-1:-1;;5711:29:1;5702:39;;;;5743:4;5698:50;;5546:208;-1:-1:-1;;5546:208:1:o;5993:470::-;6172:3;6210:6;6204:13;6226:53;6272:6;6267:3;6260:4;6252:6;6248:17;6226:53;:::i;:::-;6342:13;;6301:16;;;;6364:57;6342:13;6301:16;6398:4;6386:17;;6364:57;:::i;:::-;6437:20;;6180:283;-1:-1:-1;;;;6180:283:1:o;6676:488::-;-1:-1:-1;;;;;6945:15:1;;;6927:34;;6997:15;;6992:2;6977:18;;6970:43;7044:2;7029:18;;7022:34;;;7092:3;7087:2;7072:18;;7065:31;;;6870:4;;7113:45;;7138:19;;7130:6;7113:45;:::i;:::-;7105:53;6879:285;-1:-1:-1;;;;;;6879:285:1:o;7543:219::-;7692:2;7681:9;7674:21;7655:4;7712:44;7752:2;7741:9;7737:18;7729:6;7712:44;:::i;9991:356::-;10193:2;10175:21;;;10212:18;;;10205:30;10271:34;10266:2;10251:18;;10244:62;10338:2;10323:18;;10165:182::o;10534:128::-;10574:3;10605:1;10601:6;10598:1;10595:13;10592:2;;;10611:18;;:::i;:::-;-1:-1:-1;10647:9:1;;10582:80::o;10667:120::-;10707:1;10733;10723:2;;10738:18;;:::i;:::-;-1:-1:-1;10772:9:1;;10713:74::o;10792:125::-;10832:4;10860:1;10857;10854:8;10851:2;;;10865:18;;:::i;:::-;-1:-1:-1;10902:9:1;;10841:76::o;10922:258::-;10994:1;11004:113;11018:6;11015:1;11012:13;11004:113;;;11094:11;;;11088:18;11075:11;;;11068:39;11040:2;11033:10;11004:113;;;11135:6;11132:1;11129:13;11126:2;;;-1:-1:-1;;11170:1:1;11152:16;;11145:27;10975:205::o;11185:380::-;11264:1;11260:12;;;;11307;;;11328:2;;11382:4;11374:6;11370:17;11360:27;;11328:2;11435;11427:6;11424:14;11404:18;11401:38;11398:2;;;11481:10;11476:3;11472:20;11469:1;11462:31;11516:4;11513:1;11506:15;11544:4;11541:1;11534:15;11398:2;;11240:325;;;:::o;11570:135::-;11609:3;-1:-1:-1;;11630:17:1;;11627:2;;;11650:18;;:::i;:::-;-1:-1:-1;11697:1:1;11686:13;;11617:88::o;11710:112::-;11742:1;11768;11758:2;;11773:18;;:::i;:::-;-1:-1:-1;11807:9:1;;11748:74::o;11827:127::-;11888:10;11883:3;11879:20;11876:1;11869:31;11919:4;11916:1;11909:15;11943:4;11940:1;11933:15;11959:127;12020:10;12015:3;12011:20;12008:1;12001:31;12051:4;12048:1;12041:15;12075:4;12072:1;12065:15;12091:127;12152:10;12147:3;12143:20;12140:1;12133:31;12183:4;12180:1;12173:15;12207:4;12204:1;12197:15;12223:131;-1:-1:-1;;;;;;12297:32:1;;12287:43;;12277:2;;12344:1;12341;12334:12
Swarm Source
ipfs://de9690ae5d4f7e15208c9d0c087ef1686a2f40036f1b99c0d8085ca1bf054ca3
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.