Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
175 TS1
Holders
91
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TS1Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
TheSimples
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-11 */ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) 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. */ 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 Merklee 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) } } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/TheSimples.sol //Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 pragma solidity 0.8.10; contract TheSimples is ERC721, Ownable, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private _tokenIdsCounter; uint public constant MAX_SUPPLY = 1111; uint public constant MAX_EXTERNAL_MINTS = 1056; uint public constant MAX_TREASURY_MINTS = 55; uint public constant maxGenesisClaims = 1; uint public constant maxOgsWlMints = 2; uint public constant maxWlMints = 1; uint public constant maxPublicMints = 2; uint public constant price = 0.11 ether; address private constant splitAddress = 0x6F957b0f6BeE061AC1aa66248E70f94389Cf9908; address private constant treasuryAddress = 0xe3e4775D8b220f1046B3070Ab5ED09135F0E3F8f; bool public isPresaleActive = false; bool public isPublicActive = false; mapping(address => uint) genesisClaims; mapping(address => uint) ogMints; mapping(address => uint) whitelistMintsCount; mapping(address => uint) publicMintCount; uint public treasuryMintCounter = 0; uint public externalMintCounter = 0; bytes32 private genesisRoot; bytes32 private ogsRoot; bytes32 private whitelistRoot; string private _customBaseURI; constructor( string memory initialBaseURI, bytes32 _genesisRoot, bytes32 _ogsRoot, bytes32 _whitelistRoot ) ERC721("The Simples 1111", "TS1") { setBaseTokenURI(initialBaseURI); genesisRoot = _genesisRoot; ogsRoot = _ogsRoot; whitelistRoot = _whitelistRoot; } function genesisClaim(bytes32[] calldata _proof) public withValidStage(isPresaleActive) withValidProof(genesisRoot, _proof) mintCountNotExceeded(genesisClaims, 1, maxGenesisClaims) notSoldOut(1) callerIsUser nonReentrant { genesisClaims[msg.sender]++; externalMintCounter++; mint(msg.sender); } function ogsMint(bytes32[] calldata _proof, uint _quantity) public payable withValidStage(isPresaleActive) withValidProof(ogsRoot, _proof) mintCountNotExceeded(ogMints, _quantity, maxOgsWlMints) withValidAmount(_quantity) notSoldOut(_quantity) callerIsUser nonReentrant { for (uint i = 0; i < _quantity; i++) { ogMints[msg.sender]++; externalMintCounter++; mint(msg.sender); } } function whitelistMint(bytes32[] calldata _proof) public payable withValidStage(isPresaleActive) withValidProof(whitelistRoot, _proof) mintCountNotExceeded(whitelistMintsCount, 1, maxWlMints) withValidAmount(1) notSoldOut(1) callerIsUser nonReentrant { whitelistMintsCount[msg.sender]++; externalMintCounter++; mint(msg.sender); } function publicMint(uint _quantity) public payable withValidStage(isPublicActive) mintCountNotExceeded(publicMintCount, _quantity, maxPublicMints) withValidAmount(_quantity) notSoldOut(_quantity) callerIsUser nonReentrant { for (uint i = 0; i < _quantity; i++) { publicMintCount[msg.sender]++; externalMintCounter++; mint(msg.sender); } } function treasuryMint(uint _quantity) public onlyOwner { require(treasuryMintCounter + _quantity <= MAX_TREASURY_MINTS, "Minted out"); for (uint i = 0; i < _quantity; i++) { treasuryMintCounter++; mint(treasuryAddress); } } function mint(address to) internal { _tokenIdsCounter.increment(); uint256 tokenId = _tokenIdsCounter.current(); _safeMint(to, tokenId); } modifier notSoldOut(uint _quantity){ require(externalMintCounter + _quantity <= MAX_EXTERNAL_MINTS, "Sold out"); _; } modifier mintCountNotExceeded(mapping(address => uint) storage _mintedCount, uint _quantity, uint _maxMints){ require(_mintedCount[msg.sender] + _quantity <= _maxMints, "Max mints exceeded"); _; } modifier withValidAmount(uint _quantity){ require(msg.value >= price * _quantity, "Not enough ether sent"); _; } modifier withValidProof(bytes32 root, bytes32[] calldata _proof){ require(MerkleProof.verify(_proof, root, keccak256(abi.encodePacked(msg.sender))), "Invalid proof"); _; } modifier withValidStage(bool isStageActive){ require(isStageActive, "Stage inactive"); _; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function totalSupply() public view returns (uint256) { return _tokenIdsCounter.current(); } function setBaseTokenURI(string memory baseURI) public onlyOwner { _customBaseURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _customBaseURI; } function togglePresaleMint() external onlyOwner { isPresaleActive = !isPresaleActive; } function togglePublicMint() external onlyOwner { isPublicActive = !isPublicActive; } function setGenesisRoot(bytes32 _root) external onlyOwner { genesisRoot = _root; } function setOgRoot(bytes32 _root) external onlyOwner { ogsRoot = _root; } function setWhitelistRoot(bytes32 _root) external onlyOwner { whitelistRoot = _root; } function withdrawFunds() external onlyOwner nonReentrant { uint balance = address(this).balance; uint splitAmount = balance * 58 / 1000; uint teamAmount = balance - splitAmount; require(payable(splitAddress).send(splitAmount), "split transfer failed"); require(payable(msg.sender).send(teamAmount), "transfer failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"initialBaseURI","type":"string"},{"internalType":"bytes32","name":"_genesisRoot","type":"bytes32"},{"internalType":"bytes32","name":"_ogsRoot","type":"bytes32"},{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_EXTERNAL_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":"MAX_TREASURY_MINTS","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":"externalMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"genesisClaim","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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGenesisClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOgsWlMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWlMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"ogsMint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setGenesisRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setOgRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"treasuryMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526009805461ffff191690556000600e819055600f553480156200002657600080fd5b5060405162002bfb38038062002bfb83398101604081905262000049916200027c565b604080518082018252601081526f5468652053696d706c6573203131313160801b60208083019182528351808501909452600384526254533160e81b9084015281519192916200009c91600091620001c0565b508051620000b2906001906020840190620001c0565b505050620000cf620000c9620000f260201b60201c565b620000f6565b6001600755620000df8462000148565b60109290925560115560125550620003b1565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620001a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001bc906013906020840190620001c0565b5050565b828054620001ce9062000374565b90600052602060002090601f016020900481019282620001f257600085556200023d565b82601f106200020d57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023d57825182559160200191906001019062000220565b506200024b9291506200024f565b5090565b5b808211156200024b576000815560010162000250565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156200029357600080fd5b84516001600160401b0380821115620002ab57600080fd5b818701915087601f830112620002c057600080fd5b815181811115620002d557620002d562000266565b604051601f8201601f19908116603f0116810190838211818310171562000300576200030062000266565b81604052828152602093508a848487010111156200031d57600080fd5b600091505b8282101562000341578482018401518183018501529083019062000322565b82821115620003535760008484830101525b9289015160408a01516060909a0151939b909a509297509195505050505050565b600181811c908216806200038957607f821691505b60208210811415620003ab57634e487b7160e01b600052602260045260246000fd5b50919050565b61283a80620003c16000396000f3fe6080604052600436106102465760003560e01c806395d89b4111610139578063c7b0dcbc116100b6578063e8dd50ec1161007a578063e8dd50ec146104d9578063e985e9c514610616578063ed4dcde61461065f578063efdc778814610674578063f2fde38b14610694578063f5aa406d146106b457600080fd5b8063c7b0dcbc146105a1578063c8792ba1146105b6578063c87b56dd146105d6578063ca406bee146105f6578063cb64e534146105a157600080fd5b8063a8ecd807116100fd578063a8ecd8071461052d578063b7dce7f414610543578063b88d4fde14610559578063c017f12b14610579578063c24fe91c1461058c57600080fd5b806395d89b41146104a8578063a035b1fe146104bd578063a0914a36146104d9578063a22cb465146104ee578063a3330d251461050e57600080fd5b806332cb6b0c116101c757806360d938dc1161018b57806360d938dc1461041b5780636352211e1461043557806370a0823114610455578063715018a6146104755780638da5cb5b1461048a57600080fd5b806332cb6b0c146103a7578063372f657c146103bd5780634047638d146103d057806342842e0e146103e55780634331534f1461040557600080fd5b806318160ddd1161020e57806318160ddd1461031c57806323b872dd1461033f57806324600fc31461035f5780632db115441461037457806330176e131461038757600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a257806308bdba66146102da578063095ea7b3146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612083565b6106d4565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610726565b60405161027791906120f8565b3480156102ae57600080fd5b506102c26102bd36600461210b565b6107b8565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612170565b610852565b005b34801561030857600080fd5b506102fa6103173660046121ce565b610a0e565b34801561032857600080fd5b50610331610b24565b604051908152602001610277565b34801561034b57600080fd5b506102fa61035a3660046121f8565b610b34565b34801561036b57600080fd5b506102fa610b65565b6102fa61038236600461210b565b610cbb565b34801561039357600080fd5b506102fa6103a23660046122c0565b610e39565b3480156103b357600080fd5b5061033161045781565b6102fa6103cb366004612170565b610e7a565b3480156103dc57600080fd5b506102fa611053565b3480156103f157600080fd5b506102fa6104003660046121f8565b61109a565b34801561041157600080fd5b5061033161042081565b34801561042757600080fd5b5060095461026b9060ff1681565b34801561044157600080fd5b506102c261045036600461210b565b6110b5565b34801561046157600080fd5b50610331610470366004612309565b61112c565b34801561048157600080fd5b506102fa6111b3565b34801561049657600080fd5b506006546001600160a01b03166102c2565b3480156104b457600080fd5b506102956111e9565b3480156104c957600080fd5b50610331670186cc6acd4b000081565b3480156104e557600080fd5b50610331600181565b3480156104fa57600080fd5b506102fa610509366004612324565b6111f8565b34801561051a57600080fd5b5060095461026b90610100900460ff1681565b34801561053957600080fd5b50610331600e5481565b34801561054f57600080fd5b50610331600f5481565b34801561056557600080fd5b506102fa610574366004612360565b611203565b6102fa6105873660046123dc565b61123b565b34801561059857600080fd5b50610331603781565b3480156105ad57600080fd5b50610331600281565b3480156105c257600080fd5b506102fa6105d136600461210b565b611431565b3480156105e257600080fd5b506102956105f136600461210b565b611460565b34801561060257600080fd5b506102fa61061136600461210b565b61153b565b34801561062257600080fd5b5061026b610631366004612428565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066b57600080fd5b506102fa61156a565b34801561068057600080fd5b506102fa61068f36600461210b565b6115a8565b3480156106a057600080fd5b506102fa6106af366004612309565b61166c565b3480156106c057600080fd5b506102fa6106cf36600461210b565b611707565b60006001600160e01b031982166380ac58cd60e01b148061070557506001600160e01b03198216635b5e139f60e01b145b8061072057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546107359061245b565b80601f01602080910402602001604051908101604052809291908181526020018280546107619061245b565b80156107ae5780601f10610783576101008083540402835291602001916107ae565b820191906000526020600020905b81548152906001019060200180831161079157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60095460ff16806108755760405162461bcd60e51b815260040161082d90612496565b60105483836108e8828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b03193360601b16602082015287925060340190505b60405160208183030381529060405280519060200120611736565b6109045760405162461bcd60e51b815260040161082d906124be565b336000908152600a6020819052604090912054600190819081906109299082906124fb565b11156109475760405162461bcd60e51b815260040161082d90612513565b600161042081600f5461095a91906124fb565b11156109785760405162461bcd60e51b815260040161082d9061253f565b3233146109975760405162461bcd60e51b815260040161082d90612561565b600260075414156109ba5760405162461bcd60e51b815260040161082d90612598565b6002600755336000908152600a602052604081208054916109da836125cf565b9091555050600f80549060006109ef836125cf565b91905055506109fd3361174c565b505060016007555050505050505050565b6000610a19826110b5565b9050806001600160a01b0316836001600160a01b03161415610a875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082d565b336001600160a01b0382161480610aa35750610aa38133610631565b610b155760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082d565b610b1f8383611771565b505050565b6000610b2f60085490565b905090565b610b3e33826117df565b610b5a5760405162461bcd60e51b815260040161082d906125ea565b610b1f8383836118d6565b6006546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161082d9061263b565b60026007541415610bb25760405162461bcd60e51b815260040161082d90612598565b60026007554760006103e8610bc883603a612670565b610bd291906126a5565b90506000610be082846126b9565b604051909150736f957b0f6bee061ac1aa66248e70f94389cf99089083156108fc029084906000818181858888f19350505050610c575760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d081d1c985b9cd9995c8819985a5b1959605a1b604482015260640161082d565b604051339082156108fc029083906000818181858888f19350505050610cb15760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015260640161082d565b5050600160075550565b600954610100900460ff1680610ce35760405162461bcd60e51b815260040161082d90612496565b336000908152600d602081905260409091205483906002908190610d089084906124fb565b1115610d265760405162461bcd60e51b815260040161082d90612513565b84610d3981670186cc6acd4b0000612670565b341015610d585760405162461bcd60e51b815260040161082d906126d0565b8561042081600f54610d6a91906124fb565b1115610d885760405162461bcd60e51b815260040161082d9061253f565b323314610da75760405162461bcd60e51b815260040161082d90612561565b60026007541415610dca5760405162461bcd60e51b815260040161082d90612598565b600260075560005b87811015610e2a57336000908152600d60205260408120805491610df5836125cf565b9091555050600f8054906000610e0a836125cf565b9190505550610e183361174c565b80610e22816125cf565b915050610dd2565b50506001600755505050505050565b6006546001600160a01b03163314610e635760405162461bcd60e51b815260040161082d9061263b565b8051610e76906013906020840190611fd4565b5050565b60095460ff1680610e9d5760405162461bcd60e51b815260040161082d90612496565b6012548383610ef9828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b03193360601b16602082015287925060340190506108cd565b610f155760405162461bcd60e51b815260040161082d906124be565b336000908152600c602081905260409091205460019081908190610f3a9082906124fb565b1115610f585760405162461bcd60e51b815260040161082d90612513565b6001610f6c81670186cc6acd4b0000612670565b341015610f8b5760405162461bcd60e51b815260040161082d906126d0565b600161042081600f54610f9e91906124fb565b1115610fbc5760405162461bcd60e51b815260040161082d9061253f565b323314610fdb5760405162461bcd60e51b815260040161082d90612561565b60026007541415610ffe5760405162461bcd60e51b815260040161082d90612598565b6002600755336000908152600c6020526040812080549161101e836125cf565b9091555050600f8054906000611033836125cf565b91905055506110413361174c565b50506001600755505050505050505050565b6006546001600160a01b0316331461107d5760405162461bcd60e51b815260040161082d9061263b565b6009805461ff001981166101009182900460ff1615909102179055565b610b1f83838360405180602001604052806000815250611203565b6000818152600260205260408120546001600160a01b0316806107205760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082d565b60006001600160a01b0382166111975760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161082d565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146111dd5760405162461bcd60e51b815260040161082d9061263b565b6111e76000611a72565b565b6060600180546107359061245b565b610e76338383611ac4565b61120d33836117df565b6112295760405162461bcd60e51b815260040161082d906125ea565b61123584848484611b93565b50505050565b60095460ff168061125e5760405162461bcd60e51b815260040161082d90612496565b60115484846112ba828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b03193360601b16602082015287925060340190506108cd565b6112d65760405162461bcd60e51b815260040161082d906124be565b336000908152600b6020819052604090912054869060029081906112fb9084906124fb565b11156113195760405162461bcd60e51b815260040161082d90612513565b8761132c81670186cc6acd4b0000612670565b34101561134b5760405162461bcd60e51b815260040161082d906126d0565b8861042081600f5461135d91906124fb565b111561137b5760405162461bcd60e51b815260040161082d9061253f565b32331461139a5760405162461bcd60e51b815260040161082d90612561565b600260075414156113bd5760405162461bcd60e51b815260040161082d90612598565b600260075560005b8a81101561141d57336000908152600b602052604081208054916113e8836125cf565b9091555050600f80549060006113fd836125cf565b919050555061140b3361174c565b80611415816125cf565b9150506113c5565b505060016007555050505050505050505050565b6006546001600160a01b0316331461145b5760405162461bcd60e51b815260040161082d9061263b565b601155565b6000818152600260205260409020546060906001600160a01b03166114df5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161082d565b60006114e9611bc6565b905060008151116115095760405180602001604052806000815250611534565b8061151384611bd5565b6040516020016115249291906126ff565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146115655760405162461bcd60e51b815260040161082d9061263b565b601055565b6006546001600160a01b031633146115945760405162461bcd60e51b815260040161082d9061263b565b6009805460ff19811660ff90911615179055565b6006546001600160a01b031633146115d25760405162461bcd60e51b815260040161082d9061263b565b603781600e546115e291906124fb565b111561161d5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161082d565b60005b81811015610e7657600e8054906000611638836125cf565b919050555061165a73e3e4775d8b220f1046b3070ab5ed09135f0e3f8f61174c565b80611664816125cf565b915050611620565b6006546001600160a01b031633146116965760405162461bcd60e51b815260040161082d9061263b565b6001600160a01b0381166116fb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082d565b61170481611a72565b50565b6006546001600160a01b031633146117315760405162461bcd60e51b815260040161082d9061263b565b601255565b6000826117438584611cd3565b14949350505050565b61175a600880546001019055565b600061176560085490565b9050610e768282611d47565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117a6826110b5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082d565b6000611863836110b5565b9050806001600160a01b0316846001600160a01b0316148061189e5750836001600160a01b0316611893846107b8565b6001600160a01b0316145b806118ce57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118e9826110b5565b6001600160a01b03161461194d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161082d565b6001600160a01b0382166119af5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082d565b6119ba600082611771565b6001600160a01b03831660009081526003602052604081208054600192906119e39084906126b9565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a119084906124fb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611b265760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b9e8484846118d6565b611baa84848484611d61565b6112355760405162461bcd60e51b815260040161082d9061272e565b6060601380546107359061245b565b606081611bf95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c235780611c0d816125cf565b9150611c1c9050600a836126a5565b9150611bfd565b60008167ffffffffffffffff811115611c3e57611c3e612234565b6040519080825280601f01601f191660200182016040528015611c68576020820181803683370190505b5090505b84156118ce57611c7d6001836126b9565b9150611c8a600a86612780565b611c959060306124fb565b60f81b818381518110611caa57611caa612794565b60200101906001600160f81b031916908160001a905350611ccc600a866126a5565b9450611c6c565b600081815b8451811015611d3f576000858281518110611cf557611cf5612794565b60200260200101519050808311611d1b5760008381526020829052604090209250611d2c565b600081815260208490526040902092505b5080611d37816125cf565b915050611cd8565b509392505050565b610e76828260405180602001604052806000815250611e5f565b60006001600160a01b0384163b15611e5457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611da59033908990889088906004016127aa565b6020604051808303816000875af1925050508015611de0575060408051601f3d908101601f19168201909252611ddd918101906127e7565b60015b611e3a573d808015611e0e576040519150601f19603f3d011682016040523d82523d6000602084013e611e13565b606091505b508051611e325760405162461bcd60e51b815260040161082d9061272e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118ce565b506001949350505050565b611e698383611e92565b611e766000848484611d61565b610b1f5760405162461bcd60e51b815260040161082d9061272e565b6001600160a01b038216611ee85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082d565b6000818152600260205260409020546001600160a01b031615611f4d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082d565b6001600160a01b0382166000908152600360205260408120805460019290611f769084906124fb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611fe09061245b565b90600052602060002090601f0160209004810192826120025760008555612048565b82601f1061201b57805160ff1916838001178555612048565b82800160010185558215612048579182015b8281111561204857825182559160200191906001019061202d565b50612054929150612058565b5090565b5b808211156120545760008155600101612059565b6001600160e01b03198116811461170457600080fd5b60006020828403121561209557600080fd5b81356115348161206d565b60005b838110156120bb5781810151838201526020016120a3565b838111156112355750506000910152565b600081518084526120e48160208601602086016120a0565b601f01601f19169290920160200192915050565b60208152600061153460208301846120cc565b60006020828403121561211d57600080fd5b5035919050565b60008083601f84011261213657600080fd5b50813567ffffffffffffffff81111561214e57600080fd5b6020830191508360208260051b850101111561216957600080fd5b9250929050565b6000806020838503121561218357600080fd5b823567ffffffffffffffff81111561219a57600080fd5b6121a685828601612124565b90969095509350505050565b80356001600160a01b03811681146121c957600080fd5b919050565b600080604083850312156121e157600080fd5b6121ea836121b2565b946020939093013593505050565b60008060006060848603121561220d57600080fd5b612216846121b2565b9250612224602085016121b2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561226557612265612234565b604051601f8501601f19908116603f0116810190828211818310171561228d5761228d612234565b816040528093508581528686860111156122a657600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156122d257600080fd5b813567ffffffffffffffff8111156122e957600080fd5b8201601f810184136122fa57600080fd5b6118ce8482356020840161224a565b60006020828403121561231b57600080fd5b611534826121b2565b6000806040838503121561233757600080fd5b612340836121b2565b91506020830135801515811461235557600080fd5b809150509250929050565b6000806000806080858703121561237657600080fd5b61237f856121b2565b935061238d602086016121b2565b925060408501359150606085013567ffffffffffffffff8111156123b057600080fd5b8501601f810187136123c157600080fd5b6123d08782356020840161224a565b91505092959194509250565b6000806000604084860312156123f157600080fd5b833567ffffffffffffffff81111561240857600080fd5b61241486828701612124565b909790965060209590950135949350505050565b6000806040838503121561243b57600080fd5b612444836121b2565b9150612452602084016121b2565b90509250929050565b600181811c9082168061246f57607f821691505b6020821081141561249057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d537461676520696e61637469766560901b604082015260600190565b6020808252600d908201526c24b73b30b634b210383937b7b360991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561250e5761250e6124e5565b500190565b60208082526012908201527113585e081b5a5b9d1cc8195e18d95959195960721b604082015260600190565b60208082526008908201526714dbdb19081bdd5d60c21b604082015260600190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006000198214156125e3576125e36124e5565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081600019048311821515161561268a5761268a6124e5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826126b4576126b461268f565b500490565b6000828210156126cb576126cb6124e5565b500390565b602080825260159082015274139bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b604082015260600190565b600083516127118184602088016120a0565b8351908301906127258183602088016120a0565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261278f5761278f61268f565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127dd908301846120cc565b9695505050505050565b6000602082840312156127f957600080fd5b81516115348161206d56fea2646970667358221220bf35523fb5c628a3e01a7d585f1659e87d275e320ea6aaa6596e86fc0edca02564736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000080d25414f4e1feb4a6d9eb331c5740aeb69aedf09d800c7b4910b8d98d8de13c5d632c01a1ccdfa4ad62c0e4554fdc2632475178bec6a1273c8503c37575be6be7dc4b12260b51bb09533c5c8d4bf39aa240b97a672a72fd5ea4c733e63ecb26f2000000000000000000000000000000000000000000000000000000000000003768747470733a2f2f73696d706c65732d6170692e6865726f6b756170702e636f6d2f6170692f6d657461646174612f73696d706c65732f000000000000000000
Deployed Bytecode
0x6080604052600436106102465760003560e01c806395d89b4111610139578063c7b0dcbc116100b6578063e8dd50ec1161007a578063e8dd50ec146104d9578063e985e9c514610616578063ed4dcde61461065f578063efdc778814610674578063f2fde38b14610694578063f5aa406d146106b457600080fd5b8063c7b0dcbc146105a1578063c8792ba1146105b6578063c87b56dd146105d6578063ca406bee146105f6578063cb64e534146105a157600080fd5b8063a8ecd807116100fd578063a8ecd8071461052d578063b7dce7f414610543578063b88d4fde14610559578063c017f12b14610579578063c24fe91c1461058c57600080fd5b806395d89b41146104a8578063a035b1fe146104bd578063a0914a36146104d9578063a22cb465146104ee578063a3330d251461050e57600080fd5b806332cb6b0c116101c757806360d938dc1161018b57806360d938dc1461041b5780636352211e1461043557806370a0823114610455578063715018a6146104755780638da5cb5b1461048a57600080fd5b806332cb6b0c146103a7578063372f657c146103bd5780634047638d146103d057806342842e0e146103e55780634331534f1461040557600080fd5b806318160ddd1161020e57806318160ddd1461031c57806323b872dd1461033f57806324600fc31461035f5780632db115441461037457806330176e131461038757600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a257806308bdba66146102da578063095ea7b3146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612083565b6106d4565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610726565b60405161027791906120f8565b3480156102ae57600080fd5b506102c26102bd36600461210b565b6107b8565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612170565b610852565b005b34801561030857600080fd5b506102fa6103173660046121ce565b610a0e565b34801561032857600080fd5b50610331610b24565b604051908152602001610277565b34801561034b57600080fd5b506102fa61035a3660046121f8565b610b34565b34801561036b57600080fd5b506102fa610b65565b6102fa61038236600461210b565b610cbb565b34801561039357600080fd5b506102fa6103a23660046122c0565b610e39565b3480156103b357600080fd5b5061033161045781565b6102fa6103cb366004612170565b610e7a565b3480156103dc57600080fd5b506102fa611053565b3480156103f157600080fd5b506102fa6104003660046121f8565b61109a565b34801561041157600080fd5b5061033161042081565b34801561042757600080fd5b5060095461026b9060ff1681565b34801561044157600080fd5b506102c261045036600461210b565b6110b5565b34801561046157600080fd5b50610331610470366004612309565b61112c565b34801561048157600080fd5b506102fa6111b3565b34801561049657600080fd5b506006546001600160a01b03166102c2565b3480156104b457600080fd5b506102956111e9565b3480156104c957600080fd5b50610331670186cc6acd4b000081565b3480156104e557600080fd5b50610331600181565b3480156104fa57600080fd5b506102fa610509366004612324565b6111f8565b34801561051a57600080fd5b5060095461026b90610100900460ff1681565b34801561053957600080fd5b50610331600e5481565b34801561054f57600080fd5b50610331600f5481565b34801561056557600080fd5b506102fa610574366004612360565b611203565b6102fa6105873660046123dc565b61123b565b34801561059857600080fd5b50610331603781565b3480156105ad57600080fd5b50610331600281565b3480156105c257600080fd5b506102fa6105d136600461210b565b611431565b3480156105e257600080fd5b506102956105f136600461210b565b611460565b34801561060257600080fd5b506102fa61061136600461210b565b61153b565b34801561062257600080fd5b5061026b610631366004612428565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066b57600080fd5b506102fa61156a565b34801561068057600080fd5b506102fa61068f36600461210b565b6115a8565b3480156106a057600080fd5b506102fa6106af366004612309565b61166c565b3480156106c057600080fd5b506102fa6106cf36600461210b565b611707565b60006001600160e01b031982166380ac58cd60e01b148061070557506001600160e01b03198216635b5e139f60e01b145b8061072057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546107359061245b565b80601f01602080910402602001604051908101604052809291908181526020018280546107619061245b565b80156107ae5780601f10610783576101008083540402835291602001916107ae565b820191906000526020600020905b81548152906001019060200180831161079157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60095460ff16806108755760405162461bcd60e51b815260040161082d90612496565b60105483836108e8828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b03193360601b16602082015287925060340190505b60405160208183030381529060405280519060200120611736565b6109045760405162461bcd60e51b815260040161082d906124be565b336000908152600a6020819052604090912054600190819081906109299082906124fb565b11156109475760405162461bcd60e51b815260040161082d90612513565b600161042081600f5461095a91906124fb565b11156109785760405162461bcd60e51b815260040161082d9061253f565b3233146109975760405162461bcd60e51b815260040161082d90612561565b600260075414156109ba5760405162461bcd60e51b815260040161082d90612598565b6002600755336000908152600a602052604081208054916109da836125cf565b9091555050600f80549060006109ef836125cf565b91905055506109fd3361174c565b505060016007555050505050505050565b6000610a19826110b5565b9050806001600160a01b0316836001600160a01b03161415610a875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082d565b336001600160a01b0382161480610aa35750610aa38133610631565b610b155760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082d565b610b1f8383611771565b505050565b6000610b2f60085490565b905090565b610b3e33826117df565b610b5a5760405162461bcd60e51b815260040161082d906125ea565b610b1f8383836118d6565b6006546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161082d9061263b565b60026007541415610bb25760405162461bcd60e51b815260040161082d90612598565b60026007554760006103e8610bc883603a612670565b610bd291906126a5565b90506000610be082846126b9565b604051909150736f957b0f6bee061ac1aa66248e70f94389cf99089083156108fc029084906000818181858888f19350505050610c575760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d081d1c985b9cd9995c8819985a5b1959605a1b604482015260640161082d565b604051339082156108fc029083906000818181858888f19350505050610cb15760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015260640161082d565b5050600160075550565b600954610100900460ff1680610ce35760405162461bcd60e51b815260040161082d90612496565b336000908152600d602081905260409091205483906002908190610d089084906124fb565b1115610d265760405162461bcd60e51b815260040161082d90612513565b84610d3981670186cc6acd4b0000612670565b341015610d585760405162461bcd60e51b815260040161082d906126d0565b8561042081600f54610d6a91906124fb565b1115610d885760405162461bcd60e51b815260040161082d9061253f565b323314610da75760405162461bcd60e51b815260040161082d90612561565b60026007541415610dca5760405162461bcd60e51b815260040161082d90612598565b600260075560005b87811015610e2a57336000908152600d60205260408120805491610df5836125cf565b9091555050600f8054906000610e0a836125cf565b9190505550610e183361174c565b80610e22816125cf565b915050610dd2565b50506001600755505050505050565b6006546001600160a01b03163314610e635760405162461bcd60e51b815260040161082d9061263b565b8051610e76906013906020840190611fd4565b5050565b60095460ff1680610e9d5760405162461bcd60e51b815260040161082d90612496565b6012548383610ef9828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b03193360601b16602082015287925060340190506108cd565b610f155760405162461bcd60e51b815260040161082d906124be565b336000908152600c602081905260409091205460019081908190610f3a9082906124fb565b1115610f585760405162461bcd60e51b815260040161082d90612513565b6001610f6c81670186cc6acd4b0000612670565b341015610f8b5760405162461bcd60e51b815260040161082d906126d0565b600161042081600f54610f9e91906124fb565b1115610fbc5760405162461bcd60e51b815260040161082d9061253f565b323314610fdb5760405162461bcd60e51b815260040161082d90612561565b60026007541415610ffe5760405162461bcd60e51b815260040161082d90612598565b6002600755336000908152600c6020526040812080549161101e836125cf565b9091555050600f8054906000611033836125cf565b91905055506110413361174c565b50506001600755505050505050505050565b6006546001600160a01b0316331461107d5760405162461bcd60e51b815260040161082d9061263b565b6009805461ff001981166101009182900460ff1615909102179055565b610b1f83838360405180602001604052806000815250611203565b6000818152600260205260408120546001600160a01b0316806107205760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082d565b60006001600160a01b0382166111975760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161082d565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146111dd5760405162461bcd60e51b815260040161082d9061263b565b6111e76000611a72565b565b6060600180546107359061245b565b610e76338383611ac4565b61120d33836117df565b6112295760405162461bcd60e51b815260040161082d906125ea565b61123584848484611b93565b50505050565b60095460ff168061125e5760405162461bcd60e51b815260040161082d90612496565b60115484846112ba828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516001600160601b03193360601b16602082015287925060340190506108cd565b6112d65760405162461bcd60e51b815260040161082d906124be565b336000908152600b6020819052604090912054869060029081906112fb9084906124fb565b11156113195760405162461bcd60e51b815260040161082d90612513565b8761132c81670186cc6acd4b0000612670565b34101561134b5760405162461bcd60e51b815260040161082d906126d0565b8861042081600f5461135d91906124fb565b111561137b5760405162461bcd60e51b815260040161082d9061253f565b32331461139a5760405162461bcd60e51b815260040161082d90612561565b600260075414156113bd5760405162461bcd60e51b815260040161082d90612598565b600260075560005b8a81101561141d57336000908152600b602052604081208054916113e8836125cf565b9091555050600f80549060006113fd836125cf565b919050555061140b3361174c565b80611415816125cf565b9150506113c5565b505060016007555050505050505050505050565b6006546001600160a01b0316331461145b5760405162461bcd60e51b815260040161082d9061263b565b601155565b6000818152600260205260409020546060906001600160a01b03166114df5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161082d565b60006114e9611bc6565b905060008151116115095760405180602001604052806000815250611534565b8061151384611bd5565b6040516020016115249291906126ff565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146115655760405162461bcd60e51b815260040161082d9061263b565b601055565b6006546001600160a01b031633146115945760405162461bcd60e51b815260040161082d9061263b565b6009805460ff19811660ff90911615179055565b6006546001600160a01b031633146115d25760405162461bcd60e51b815260040161082d9061263b565b603781600e546115e291906124fb565b111561161d5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161082d565b60005b81811015610e7657600e8054906000611638836125cf565b919050555061165a73e3e4775d8b220f1046b3070ab5ed09135f0e3f8f61174c565b80611664816125cf565b915050611620565b6006546001600160a01b031633146116965760405162461bcd60e51b815260040161082d9061263b565b6001600160a01b0381166116fb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082d565b61170481611a72565b50565b6006546001600160a01b031633146117315760405162461bcd60e51b815260040161082d9061263b565b601255565b6000826117438584611cd3565b14949350505050565b61175a600880546001019055565b600061176560085490565b9050610e768282611d47565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117a6826110b5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082d565b6000611863836110b5565b9050806001600160a01b0316846001600160a01b0316148061189e5750836001600160a01b0316611893846107b8565b6001600160a01b0316145b806118ce57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118e9826110b5565b6001600160a01b03161461194d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161082d565b6001600160a01b0382166119af5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082d565b6119ba600082611771565b6001600160a01b03831660009081526003602052604081208054600192906119e39084906126b9565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a119084906124fb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611b265760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b9e8484846118d6565b611baa84848484611d61565b6112355760405162461bcd60e51b815260040161082d9061272e565b6060601380546107359061245b565b606081611bf95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c235780611c0d816125cf565b9150611c1c9050600a836126a5565b9150611bfd565b60008167ffffffffffffffff811115611c3e57611c3e612234565b6040519080825280601f01601f191660200182016040528015611c68576020820181803683370190505b5090505b84156118ce57611c7d6001836126b9565b9150611c8a600a86612780565b611c959060306124fb565b60f81b818381518110611caa57611caa612794565b60200101906001600160f81b031916908160001a905350611ccc600a866126a5565b9450611c6c565b600081815b8451811015611d3f576000858281518110611cf557611cf5612794565b60200260200101519050808311611d1b5760008381526020829052604090209250611d2c565b600081815260208490526040902092505b5080611d37816125cf565b915050611cd8565b509392505050565b610e76828260405180602001604052806000815250611e5f565b60006001600160a01b0384163b15611e5457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611da59033908990889088906004016127aa565b6020604051808303816000875af1925050508015611de0575060408051601f3d908101601f19168201909252611ddd918101906127e7565b60015b611e3a573d808015611e0e576040519150601f19603f3d011682016040523d82523d6000602084013e611e13565b606091505b508051611e325760405162461bcd60e51b815260040161082d9061272e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118ce565b506001949350505050565b611e698383611e92565b611e766000848484611d61565b610b1f5760405162461bcd60e51b815260040161082d9061272e565b6001600160a01b038216611ee85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082d565b6000818152600260205260409020546001600160a01b031615611f4d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082d565b6001600160a01b0382166000908152600360205260408120805460019290611f769084906124fb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611fe09061245b565b90600052602060002090601f0160209004810192826120025760008555612048565b82601f1061201b57805160ff1916838001178555612048565b82800160010185558215612048579182015b8281111561204857825182559160200191906001019061202d565b50612054929150612058565b5090565b5b808211156120545760008155600101612059565b6001600160e01b03198116811461170457600080fd5b60006020828403121561209557600080fd5b81356115348161206d565b60005b838110156120bb5781810151838201526020016120a3565b838111156112355750506000910152565b600081518084526120e48160208601602086016120a0565b601f01601f19169290920160200192915050565b60208152600061153460208301846120cc565b60006020828403121561211d57600080fd5b5035919050565b60008083601f84011261213657600080fd5b50813567ffffffffffffffff81111561214e57600080fd5b6020830191508360208260051b850101111561216957600080fd5b9250929050565b6000806020838503121561218357600080fd5b823567ffffffffffffffff81111561219a57600080fd5b6121a685828601612124565b90969095509350505050565b80356001600160a01b03811681146121c957600080fd5b919050565b600080604083850312156121e157600080fd5b6121ea836121b2565b946020939093013593505050565b60008060006060848603121561220d57600080fd5b612216846121b2565b9250612224602085016121b2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561226557612265612234565b604051601f8501601f19908116603f0116810190828211818310171561228d5761228d612234565b816040528093508581528686860111156122a657600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156122d257600080fd5b813567ffffffffffffffff8111156122e957600080fd5b8201601f810184136122fa57600080fd5b6118ce8482356020840161224a565b60006020828403121561231b57600080fd5b611534826121b2565b6000806040838503121561233757600080fd5b612340836121b2565b91506020830135801515811461235557600080fd5b809150509250929050565b6000806000806080858703121561237657600080fd5b61237f856121b2565b935061238d602086016121b2565b925060408501359150606085013567ffffffffffffffff8111156123b057600080fd5b8501601f810187136123c157600080fd5b6123d08782356020840161224a565b91505092959194509250565b6000806000604084860312156123f157600080fd5b833567ffffffffffffffff81111561240857600080fd5b61241486828701612124565b909790965060209590950135949350505050565b6000806040838503121561243b57600080fd5b612444836121b2565b9150612452602084016121b2565b90509250929050565b600181811c9082168061246f57607f821691505b6020821081141561249057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d537461676520696e61637469766560901b604082015260600190565b6020808252600d908201526c24b73b30b634b210383937b7b360991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561250e5761250e6124e5565b500190565b60208082526012908201527113585e081b5a5b9d1cc8195e18d95959195960721b604082015260600190565b60208082526008908201526714dbdb19081bdd5d60c21b604082015260600190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006000198214156125e3576125e36124e5565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081600019048311821515161561268a5761268a6124e5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826126b4576126b461268f565b500490565b6000828210156126cb576126cb6124e5565b500390565b602080825260159082015274139bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b604082015260600190565b600083516127118184602088016120a0565b8351908301906127258183602088016120a0565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261278f5761278f61268f565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127dd908301846120cc565b9695505050505050565b6000602082840312156127f957600080fd5b81516115348161206d56fea2646970667358221220bf35523fb5c628a3e01a7d585f1659e87d275e320ea6aaa6596e86fc0edca02564736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080d25414f4e1feb4a6d9eb331c5740aeb69aedf09d800c7b4910b8d98d8de13c5d632c01a1ccdfa4ad62c0e4554fdc2632475178bec6a1273c8503c37575be6be7dc4b12260b51bb09533c5c8d4bf39aa240b97a672a72fd5ea4c733e63ecb26f2000000000000000000000000000000000000000000000000000000000000003768747470733a2f2f73696d706c65732d6170692e6865726f6b756170702e636f6d2f6170692f6d657461646174612f73696d706c65732f000000000000000000
-----Decoded View---------------
Arg [0] : initialBaseURI (string): https://simples-api.herokuapp.com/api/metadata/simples/
Arg [1] : _genesisRoot (bytes32): 0xd25414f4e1feb4a6d9eb331c5740aeb69aedf09d800c7b4910b8d98d8de13c5d
Arg [2] : _ogsRoot (bytes32): 0x632c01a1ccdfa4ad62c0e4554fdc2632475178bec6a1273c8503c37575be6be7
Arg [3] : _whitelistRoot (bytes32): 0xdc4b12260b51bb09533c5c8d4bf39aa240b97a672a72fd5ea4c733e63ecb26f2
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : d25414f4e1feb4a6d9eb331c5740aeb69aedf09d800c7b4910b8d98d8de13c5d
Arg [2] : 632c01a1ccdfa4ad62c0e4554fdc2632475178bec6a1273c8503c37575be6be7
Arg [3] : dc4b12260b51bb09533c5c8d4bf39aa240b97a672a72fd5ea4c733e63ecb26f2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [5] : 68747470733a2f2f73696d706c65732d6170692e6865726f6b756170702e636f
Arg [6] : 6d2f6170692f6d657461646174612f73696d706c65732f000000000000000000
Deployed Bytecode Sourcemap
44160:5946:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21736:305;;;;;;;;;;-1:-1:-1;21736:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21736:305:0;;;;;;;;22681:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24240:221::-;;;;;;;;;;-1:-1:-1;24240:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;24240:221:0;1528:203:1;45727:356:0;;;;;;;;;;-1:-1:-1;45727:356:0;;;;;:::i;:::-;;:::i;:::-;;23763:411;;;;;;;;;;-1:-1:-1;23763:411:0;;;;;:::i;:::-;;:::i;48855:105::-;;;;;;;;;;;;;:::i;:::-;;;3133:25:1;;;3121:2;3106:18;48855:105:0;2987:177:1;24990:339:0;;;;;;;;;;-1:-1:-1;24990:339:0;;;;;:::i;:::-;;:::i;49729:372::-;;;;;;;;;;;;;:::i;46979:430::-;;;;;;:::i;:::-;;:::i;48968:108::-;;;;;;;;;;-1:-1:-1;48968:108:0;;;;;:::i;:::-;;:::i;44317:38::-;;;;;;;;;;;;44351:4;44317:38;;46574:397;;;;;;:::i;:::-;;:::i;49316:98::-;;;;;;;;;;;;;:::i;25400:185::-;;;;;;;;;;-1:-1:-1;25400:185:0;;;;;:::i;:::-;;:::i;44362:46::-;;;;;;;;;;;;44404:4;44362:46;;44882:35;;;;;;;;;;-1:-1:-1;44882:35:0;;;;;;;;22375:239;;;;;;;;;;-1:-1:-1;22375:239:0;;;;;:::i;:::-;;:::i;22105:208::-;;;;;;;;;;-1:-1:-1;22105:208:0;;;;;:::i;:::-;;:::i;38042:103::-;;;;;;;;;;;;;:::i;37391:87::-;;;;;;;;;;-1:-1:-1;37464:6:0;;-1:-1:-1;;;;;37464:6:0;37391:87;;22850:104;;;;;;;;;;;;;:::i;44651:39::-;;;;;;;;;;;;44680:10;44651:39;;44561:35;;;;;;;;;;;;44595:1;44561:35;;24533:155;;;;;;;;;;-1:-1:-1;24533:155:0;;;;;:::i;:::-;;:::i;44924:34::-;;;;;;;;;;-1:-1:-1;44924:34:0;;;;;;;;;;;45151:35;;;;;;;;;;;;;;;;45193;;;;;;;;;;;;;;;;25656:328;;;;;;;;;;-1:-1:-1;25656:328:0;;;;;:::i;:::-;;:::i;46091:475::-;;;;;;:::i;:::-;;:::i;44415:44::-;;;;;;;;;;;;44457:2;44415:44;;44603:39;;;;;;;;;;;;44641:1;44603:39;;49526:87;;;;;;;;;;-1:-1:-1;49526:87:0;;;;;:::i;:::-;;:::i;23025:334::-;;;;;;;;;;-1:-1:-1;23025:334:0;;;;;:::i;:::-;;:::i;49422:96::-;;;;;;;;;;-1:-1:-1;49422:96:0;;;;;:::i;:::-;;:::i;24759:164::-;;;;;;;;;;-1:-1:-1;24759:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24880:25:0;;;24856:4;24880:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24759:164;49207:101;;;;;;;;;;;;;:::i;47417:281::-;;;;;;;;;;-1:-1:-1;47417:281:0;;;;;:::i;:::-;;:::i;38300:201::-;;;;;;;;;;-1:-1:-1;38300:201:0;;;;;:::i;:::-;;:::i;49621:100::-;;;;;;;;;;-1:-1:-1;49621:100:0;;;;;:::i;:::-;;:::i;21736:305::-;21838:4;-1:-1:-1;;;;;;21875:40:0;;-1:-1:-1;;;21875:40:0;;:105;;-1:-1:-1;;;;;;;21932:48:0;;-1:-1:-1;;;21932:48:0;21875:105;:158;;;-1:-1:-1;;;;;;;;;;20268:40:0;;;21997:36;21855:178;21736:305;-1:-1:-1;;21736:305:0:o;22681:100::-;22735:13;22768:5;22761:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22681:100;:::o;24240:221::-;24316:7;27583:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27583:16:0;24336:73;;;;-1:-1:-1;;;24336:73:0;;7489:2:1;24336:73:0;;;7471:21:1;7528:2;7508:18;;;7501:30;7567:34;7547:18;;;7540:62;-1:-1:-1;;;7618:18:1;;;7611:42;7670:19;;24336:73:0;;;;;;;;;-1:-1:-1;24429:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24429:24:0;;24240:221::o;45727:356::-;45803:15;;;;;48658:40;;;;-1:-1:-1;;;48658:40:0;;;;;;;:::i;:::-;45840:11:::1;;45853:6;;48485:73;48504:6;;48485:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;48528:28:0::1;::::0;-1:-1:-1;;;;;;48545:10:0::1;8192:2:1::0;8188:15;8184:53;48528:28:0::1;::::0;::::1;8172:66:1::0;48512:4:0;;-1:-1:-1;8254:12:1;;;-1:-1:-1;48528:28:0::1;;;;;;;;;;;;;48518:39;;;;;;48485:18;:73::i;:::-;48477:99;;;;-1:-1:-1::0;;;48477:99:0::1;;;;;;;:::i;:::-;48172:10:::2;48159:24;::::0;;;45887:13:::2;48159:24;::::0;;;;;;;;45902:1:::2;::::0;;;;;48159:36:::2;::::0;45902:1;;48159:36:::2;:::i;:::-;:49;;48151:80;;;;-1:-1:-1::0;;;48151:80:0::2;;;;;;;:::i;:::-;45939:1:::3;44404:4;47960:9;47938:19;;:31;;;;:::i;:::-;:53;;47930:74;;;;-1:-1:-1::0;;;47930:74:0::3;;;;;;;:::i;:::-;48769:9:::4;48782:10;48769:23;48761:66;;;;-1:-1:-1::0;;;48761:66:0::4;;;;;;;:::i;:::-;43076:1:::5;43674:7;;:19;;43666:63;;;;-1:-1:-1::0;;;43666:63:0::5;;;;;;;:::i;:::-;43076:1;43807:7;:18:::0;46003:10:::6;45989:25;::::0;;;:13:::6;:25;::::0;;;;:27;;;::::6;::::0;::::6;:::i;:::-;::::0;;;-1:-1:-1;;46027:19:0::6;:21:::0;;;:19:::6;:21;::::0;::::6;:::i;:::-;;;;;;46059:16;46064:10;46059:4;:16::i;:::-;-1:-1:-1::0;;43032:1:0::5;43986:7;:22:::0;-1:-1:-1;;;;;;;;45727:356:0:o;23763:411::-;23844:13;23860:23;23875:7;23860:14;:23::i;:::-;23844:39;;23908:5;-1:-1:-1;;;;;23902:11:0;:2;-1:-1:-1;;;;;23902:11:0;;;23894:57;;;;-1:-1:-1;;;23894:57:0;;10628:2:1;23894:57:0;;;10610:21:1;10667:2;10647:18;;;10640:30;10706:34;10686:18;;;10679:62;-1:-1:-1;;;10757:18:1;;;10750:31;10798:19;;23894:57:0;10426:397:1;23894:57:0;17022:10;-1:-1:-1;;;;;23986:21:0;;;;:62;;-1:-1:-1;24011:37:0;24028:5;17022:10;24759:164;:::i;24011:37::-;23964:168;;;;-1:-1:-1;;;23964:168:0;;11030:2:1;23964:168:0;;;11012:21:1;11069:2;11049:18;;;11042:30;11108:34;11088:18;;;11081:62;11179:26;11159:18;;;11152:54;11223:19;;23964:168:0;10828:420:1;23964:168:0;24145:21;24154:2;24158:7;24145:8;:21::i;:::-;23833:341;23763:411;;:::o;48855:105::-;48899:7;48926:26;:16;35822:14;;35730:114;48926:26;48919:33;;48855:105;:::o;24990:339::-;25185:41;17022:10;25218:7;25185:18;:41::i;:::-;25177:103;;;;-1:-1:-1;;;25177:103:0;;;;;;;:::i;:::-;25293:28;25303:4;25309:2;25313:7;25293:9;:28::i;49729:372::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;43076:1:::1;43674:7;;:19;;43666:63;;;;-1:-1:-1::0;;;43666:63:0::1;;;;;;;:::i;:::-;43076:1;43807:7;:18:::0;49812:21:::2;49797:12;49878:4;49863:12;49812:21:::0;49873:2:::2;49863:12;:::i;:::-;:19;;;;:::i;:::-;49844:38:::0;-1:-1:-1;49893:15:0::2;49911:21;49844:38:::0;49911:7;:21:::2;:::i;:::-;49951:39;::::0;49893;;-1:-1:-1;44739:42:0::2;::::0;49951:39;::::2;;;::::0;49978:11;;49951:39:::2;::::0;;;49978:11;44739:42;49951:39;::::2;;;;;;49943:73;;;::::0;-1:-1:-1;;;49943:73:0;;12794:2:1;49943:73:0::2;::::0;::::2;12776:21:1::0;12833:2;12813:18;;;12806:30;-1:-1:-1;;;12852:18:1;;;12845:51;12913:18;;49943:73:0::2;12592:345:1::0;49943:73:0::2;50035:36;::::0;50043:10:::2;::::0;50035:36;::::2;;;::::0;50060:10;;50035:36:::2;::::0;;;50060:10;50043;50035:36;::::2;;;;;;50027:64;;;::::0;-1:-1:-1;;;50027:64:0;;13144:2:1;50027:64:0::2;::::0;::::2;13126:21:1::0;13183:2;13163:18;;;13156:30;-1:-1:-1;;;13202:18:1;;;13195:45;13257:18;;50027:64:0::2;12942:339:1::0;50027:64:0::2;-1:-1:-1::0;;43032:1:0::1;43986:7;:22:::0;-1:-1:-1;49729:372:0:o;46979:430::-;47050:14;;;;;;;;48658:40;;;;-1:-1:-1;;;48658:40:0;;;;;;;:::i;:::-;48172:10:::1;48159:24;::::0;;;47092:15:::1;48159:24;::::0;;;;;;;;47109:9;;44641:1:::1;::::0;;;48159:36:::1;::::0;47109:9;;48159:36:::1;:::i;:::-;:49;;48151:80;;;;-1:-1:-1::0;;;48151:80:0::1;;;;;;;:::i;:::-;47157:9:::0;48331:17:::2;47157:9:::0;44680:10:::2;48331:17;:::i;:::-;48318:9;:30;;48310:64;;;;-1:-1:-1::0;;;48310:64:0::2;;;;;;;:::i;:::-;47184:9:::3;44404:4;47960:9;47938:19;;:31;;;;:::i;:::-;:53;;47930:74;;;;-1:-1:-1::0;;;47930:74:0::3;;;;;;;:::i;:::-;48769:9:::4;48782:10;48769:23;48761:66;;;;-1:-1:-1::0;;;48761:66:0::4;;;;;;;:::i;:::-;43076:1:::5;43674:7;;:19;;43666:63;;;;-1:-1:-1::0;;;43666:63:0::5;;;;;;;:::i;:::-;43076:1;43807:7;:18:::0;47247:6:::6;47242:160;47263:9;47259:1;:13;47242:160;;;47310:10;47294:27;::::0;;;:15:::6;:27;::::0;;;;:29;;;::::6;::::0;::::6;:::i;:::-;::::0;;;-1:-1:-1;;47338:19:0::6;:21:::0;;;:19:::6;:21;::::0;::::6;:::i;:::-;;;;;;47374:16;47379:10;47374:4;:16::i;:::-;47274:3:::0;::::6;::::0;::::6;:::i;:::-;;;;47242:160;;;-1:-1:-1::0;;43032:1:0::5;43986:7;:22:::0;-1:-1:-1;;;;;;46979:430:0:o;48968:108::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;49044:24;;::::1;::::0;:14:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48968:108:::0;:::o;46574:397::-;46659:15;;;;;48658:40;;;;-1:-1:-1;;;48658:40:0;;;;;;;:::i;:::-;46696:13:::1;;46711:6;;48485:73;48504:6;;48485:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;48528:28:0::1;::::0;-1:-1:-1;;;;;;48545:10:0::1;8192:2:1::0;8188:15;8184:53;48528:28:0::1;::::0;::::1;8172:66:1::0;48512:4:0;;-1:-1:-1;8254:12:1;;;-1:-1:-1;48528:28:0::1;8043:229:1::0;48485:73:0::1;48477:99;;;;-1:-1:-1::0;;;48477:99:0::1;;;;;;;:::i;:::-;48172:10:::2;48159:24;::::0;;;46745:19:::2;48159:24;::::0;;;;;;;;46766:1:::2;::::0;;;;;48159:36:::2;::::0;46766:1;;48159:36:::2;:::i;:::-;:49;;48151:80;;;;-1:-1:-1::0;;;48151:80:0::2;;;;;;;:::i;:::-;46802:1:::3;48331:17;46802:1:::0;44680:10:::3;48331:17;:::i;:::-;48318:9;:30;;48310:64;;;;-1:-1:-1::0;;;48310:64:0::3;;;;;;;:::i;:::-;46821:1:::4;44404:4;47960:9;47938:19;;:31;;;;:::i;:::-;:53;;47930:74;;;;-1:-1:-1::0;;;47930:74:0::4;;;;;;;:::i;:::-;48769:9:::5;48782:10;48769:23;48761:66;;;;-1:-1:-1::0;;;48761:66:0::5;;;;;;;:::i;:::-;43076:1:::6;43674:7;;:19;;43666:63;;;;-1:-1:-1::0;;;43666:63:0::6;;;;;;;:::i;:::-;43076:1;43807:7;:18:::0;46891:10:::7;46871:31;::::0;;;:19:::7;:31;::::0;;;;:33;;;::::7;::::0;::::7;:::i;:::-;::::0;;;-1:-1:-1;;46915:19:0::7;:21:::0;;;:19:::7;:21;::::0;::::7;:::i;:::-;;;;;;46947:16;46952:10;46947:4;:16::i;:::-;-1:-1:-1::0;;43032:1:0::6;43986:7;:22:::0;-1:-1:-1;;;;;;;;;46574:397:0:o;49316:98::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;49392:14:::1;::::0;;-1:-1:-1;;49374:32:0;::::1;49392:14;::::0;;;::::1;;;49391:15;49374:32:::0;;::::1;;::::0;;49316:98::o;25400:185::-;25538:39;25555:4;25561:2;25565:7;25538:39;;;;;;;;;;;;:16;:39::i;22375:239::-;22447:7;22483:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22483:16:0;22518:19;22510:73;;;;-1:-1:-1;;;22510:73:0;;13838:2:1;22510:73:0;;;13820:21:1;13877:2;13857:18;;;13850:30;13916:34;13896:18;;;13889:62;-1:-1:-1;;;13967:18:1;;;13960:39;14016:19;;22510:73:0;13636:405:1;22105:208:0;22177:7;-1:-1:-1;;;;;22205:19:0;;22197:74;;;;-1:-1:-1;;;22197:74:0;;14248:2:1;22197:74:0;;;14230:21:1;14287:2;14267:18;;;14260:30;14326:34;14306:18;;;14299:62;-1:-1:-1;;;14377:18:1;;;14370:40;14427:19;;22197:74:0;14046:406:1;22197:74:0;-1:-1:-1;;;;;;22289:16:0;;;;;:9;:16;;;;;;;22105:208::o;38042:103::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;38107:30:::1;38134:1;38107:18;:30::i;:::-;38042:103::o:0;22850:104::-;22906:13;22939:7;22932:14;;;;;:::i;24533:155::-;24628:52;17022:10;24661:8;24671;24628:18;:52::i;25656:328::-;25831:41;17022:10;25864:7;25831:18;:41::i;:::-;25823:103;;;;-1:-1:-1;;;25823:103:0;;;;;;;:::i;:::-;25937:39;25951:4;25957:2;25961:7;25970:5;25937:13;:39::i;:::-;25656:328;;;;:::o;46091:475::-;46186:15;;;;;48658:40;;;;-1:-1:-1;;;48658:40:0;;;;;;;:::i;:::-;46223:7:::1;;46232:6;;48485:73;48504:6;;48485:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;48528:28:0::1;::::0;-1:-1:-1;;;;;;48545:10:0::1;8192:2:1::0;8188:15;8184:53;48528:28:0::1;::::0;::::1;8172:66:1::0;48512:4:0;;-1:-1:-1;8254:12:1;;;-1:-1:-1;48528:28:0::1;8043:229:1::0;48485:73:0::1;48477:99;;;;-1:-1:-1::0;;;48477:99:0::1;;;;;;;:::i;:::-;48172:10:::2;48159:24;::::0;;;46266:7:::2;48159:24;::::0;;;;;;;;46275:9;;44553:1:::2;::::0;;;48159:36:::2;::::0;46275:9;;48159:36:::2;:::i;:::-;:49;;48151:80;;;;-1:-1:-1::0;;;48151:80:0::2;;;;;;;:::i;:::-;46322:9:::0;48331:17:::3;46322:9:::0;44680:10:::3;48331:17;:::i;:::-;48318:9;:30;;48310:64;;;;-1:-1:-1::0;;;48310:64:0::3;;;;;;;:::i;:::-;46349:9:::4;44404:4;47960:9;47938:19;;:31;;;;:::i;:::-;:53;;47930:74;;;;-1:-1:-1::0;;;47930:74:0::4;;;;;;;:::i;:::-;48769:9:::5;48782:10;48769:23;48761:66;;;;-1:-1:-1::0;;;48761:66:0::5;;;;;;;:::i;:::-;43076:1:::6;43674:7;;:19;;43666:63;;;;-1:-1:-1::0;;;43666:63:0::6;;;;;;;:::i;:::-;43076:1;43807:7;:18:::0;46412:6:::7;46407:152;46428:9;46424:1;:13;46407:152;;;46467:10;46459:19;::::0;;;:7:::7;:19;::::0;;;;:21;;;::::7;::::0;::::7;:::i;:::-;::::0;;;-1:-1:-1;;46495:19:0::7;:21:::0;;;:19:::7;:21;::::0;::::7;:::i;:::-;;;;;;46531:16;46536:10;46531:4;:16::i;:::-;46439:3:::0;::::7;::::0;::::7;:::i;:::-;;;;46407:152;;;-1:-1:-1::0;;43032:1:0::6;43986:7;:22:::0;-1:-1:-1;;;;;;;;;;;46091:475:0:o;49526:87::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;49590:7:::1;:15:::0;49526:87::o;23025:334::-;27559:4;27583:16;;;:7;:16;;;;;;23098:13;;-1:-1:-1;;;;;27583:16:0;23124:76;;;;-1:-1:-1;;;23124:76:0;;14659:2:1;23124:76:0;;;14641:21:1;14698:2;14678:18;;;14671:30;14737:34;14717:18;;;14710:62;-1:-1:-1;;;14788:18:1;;;14781:45;14843:19;;23124:76:0;14457:411:1;23124:76:0;23213:21;23237:10;:8;:10::i;:::-;23213:34;;23289:1;23271:7;23265:21;:25;:86;;;;;;;;;;;;;;;;;23317:7;23326:18;:7;:16;:18::i;:::-;23300:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23265:86;23258:93;23025:334;-1:-1:-1;;;23025:334:0:o;49422:96::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;49491:11:::1;:19:::0;49422:96::o;49207:101::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;49285:15:::1;::::0;;-1:-1:-1;;49266:34:0;::::1;49285:15;::::0;;::::1;49284:16;49266:34;::::0;;49207:101::o;47417:281::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;44457:2:::1;47513:9;47491:19;;:31;;;;:::i;:::-;:53;;47483:76;;;::::0;-1:-1:-1;;;47483:76:0;;15550:2:1;47483:76:0::1;::::0;::::1;15532:21:1::0;15589:2;15569:18;;;15562:30;-1:-1:-1;;;15608:18:1;;;15601:40;15658:18;;47483:76:0::1;15348:334:1::0;47483:76:0::1;47575:6;47570:121;47591:9;47587:1;:13;47570:121;;;47622:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;;;;;;47658;44831:42;47658:4;:21::i;:::-;47602:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47570:121;;38300:201:::0;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38389:22:0;::::1;38381:73;;;::::0;-1:-1:-1;;;38381:73:0;;15889:2:1;38381:73:0::1;::::0;::::1;15871:21:1::0;15928:2;15908:18;;;15901:30;15967:34;15947:18;;;15940:62;-1:-1:-1;;;16018:18:1;;;16011:36;16064:19;;38381:73:0::1;15687:402:1::0;38381:73:0::1;38465:28;38484:8;38465:18;:28::i;:::-;38300:201:::0;:::o;49621:100::-;37464:6;;-1:-1:-1;;;;;37464:6:0;17022:10;37611:23;37603:68;;;;-1:-1:-1;;;37603:68:0;;;;;;;:::i;:::-;49692:13:::1;:21:::0;49621:100::o;39790:190::-;39915:4;39968;39939:25;39952:5;39959:4;39939:12;:25::i;:::-;:33;;39790:190;-1:-1:-1;;;;39790:190:0:o;47706:170::-;47752:28;:16;35941:19;;35959:1;35941:19;;;35852:127;47752:28;47791:15;47809:26;:16;35822:14;;35730:114;47809:26;47791:44;;47846:22;47856:2;47860:7;47846:9;:22::i;31640:174::-;31715:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31715:29:0;-1:-1:-1;;;;;31715:29:0;;;;;;;;:24;;31769:23;31715:24;31769:14;:23::i;:::-;-1:-1:-1;;;;;31760:46:0;;;;;;;;;;;31640:174;;:::o;27788:348::-;27881:4;27583:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27583:16:0;27898:73;;;;-1:-1:-1;;;27898:73:0;;16296:2:1;27898:73:0;;;16278:21:1;16335:2;16315:18;;;16308:30;16374:34;16354:18;;;16347:62;-1:-1:-1;;;16425:18:1;;;16418:42;16477:19;;27898:73:0;16094:408:1;27898:73:0;27982:13;27998:23;28013:7;27998:14;:23::i;:::-;27982:39;;28051:5;-1:-1:-1;;;;;28040:16:0;:7;-1:-1:-1;;;;;28040:16:0;;:51;;;;28084:7;-1:-1:-1;;;;;28060:31:0;:20;28072:7;28060:11;:20::i;:::-;-1:-1:-1;;;;;28060:31:0;;28040:51;:87;;;-1:-1:-1;;;;;;24880:25:0;;;24856:4;24880:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28095:32;28032:96;27788:348;-1:-1:-1;;;;27788:348:0:o;30897:625::-;31056:4;-1:-1:-1;;;;;31029:31:0;:23;31044:7;31029:14;:23::i;:::-;-1:-1:-1;;;;;31029:31:0;;31021:81;;;;-1:-1:-1;;;31021:81:0;;16709:2:1;31021:81:0;;;16691:21:1;16748:2;16728:18;;;16721:30;16787:34;16767:18;;;16760:62;-1:-1:-1;;;16838:18:1;;;16831:35;16883:19;;31021:81:0;16507:401:1;31021:81:0;-1:-1:-1;;;;;31121:16:0;;31113:65;;;;-1:-1:-1;;;31113:65:0;;17115:2:1;31113:65:0;;;17097:21:1;17154:2;17134:18;;;17127:30;17193:34;17173:18;;;17166:62;-1:-1:-1;;;17244:18:1;;;17237:34;17288:19;;31113:65:0;16913:400:1;31113:65:0;31295:29;31312:1;31316:7;31295:8;:29::i;:::-;-1:-1:-1;;;;;31337:15:0;;;;;;:9;:15;;;;;:20;;31356:1;;31337:15;:20;;31356:1;;31337:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31368:13:0;;;;;;:9;:13;;;;;:18;;31385:1;;31368:13;:18;;31385:1;;31368:18;:::i;:::-;;;;-1:-1:-1;;31397:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31397:21:0;-1:-1:-1;;;;;31397:21:0;;;;;;;;;31436:27;;31397:16;;31436:27;;;;;;;23833:341;23763:411;;:::o;38661:191::-;38754:6;;;-1:-1:-1;;;;;38771:17:0;;;-1:-1:-1;;;;;;38771:17:0;;;;;;;38804:40;;38754:6;;;38771:17;38754:6;;38804:40;;38735:16;;38804:40;38724:128;38661:191;:::o;31956:315::-;32111:8;-1:-1:-1;;;;;32102:17:0;:5;-1:-1:-1;;;;;32102:17:0;;;32094:55;;;;-1:-1:-1;;;32094:55:0;;17520:2:1;32094:55:0;;;17502:21:1;17559:2;17539:18;;;17532:30;17598:27;17578:18;;;17571:55;17643:18;;32094:55:0;17318:349:1;32094:55:0;-1:-1:-1;;;;;32160:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32160:46:0;;;;;;;;;;32222:41;;540::1;;;32222::0;;513:18:1;32222:41:0;;;;;;;31956:315;;;:::o;26866:::-;27023:28;27033:4;27039:2;27043:7;27023:9;:28::i;:::-;27070:48;27093:4;27099:2;27103:7;27112:5;27070:22;:48::i;:::-;27062:111;;;;-1:-1:-1;;;27062:111:0;;;;;;;:::i;49084:115::-;49144:13;49177:14;49170:21;;;;;:::i;17529:723::-;17585:13;17806:10;17802:53;;-1:-1:-1;;17833:10:0;;;;;;;;;;;;-1:-1:-1;;;17833:10:0;;;;;17529:723::o;17802:53::-;17880:5;17865:12;17921:78;17928:9;;17921:78;;17954:8;;;;:::i;:::-;;-1:-1:-1;17977:10:0;;-1:-1:-1;17985:2:0;17977:10;;:::i;:::-;;;17921:78;;;18009:19;18041:6;18031:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18031:17:0;;18009:39;;18059:154;18066:10;;18059:154;;18093:11;18103:1;18093:11;;:::i;:::-;;-1:-1:-1;18162:10:0;18170:2;18162:5;:10;:::i;:::-;18149:24;;:2;:24;:::i;:::-;18136:39;;18119:6;18126;18119:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18119:56:0;;;;;;;;-1:-1:-1;18190:11:0;18199:2;18190:11;;:::i;:::-;;;18059:154;;40342:675;40425:7;40468:4;40425:7;40483:497;40507:5;:12;40503:1;:16;40483:497;;;40541:20;40564:5;40570:1;40564:8;;;;;;;;:::i;:::-;;;;;;;40541:31;;40607:12;40591;:28;40587:382;;41093:13;41143:15;;;41179:4;41172:15;;;41226:4;41210:21;;40719:57;;40587:382;;;41093:13;41143:15;;;41179:4;41172:15;;;41226:4;41210:21;;40896:57;;40587:382;-1:-1:-1;40521:3:0;;;;:::i;:::-;;;;40483:497;;;-1:-1:-1;40997:12:0;40342:675;-1:-1:-1;;;40342:675:0:o;28478:110::-;28554:26;28564:2;28568:7;28554:26;;;;;;;;;;;;:9;:26::i;32836:799::-;32991:4;-1:-1:-1;;;;;33012:13:0;;9280:19;:23;33008:620;;33048:72;;-1:-1:-1;;;33048:72:0;;-1:-1:-1;;;;;33048:36:0;;;;;:72;;17022:10;;33099:4;;33105:7;;33114:5;;33048:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33048:72:0;;;;;;;;-1:-1:-1;;33048:72:0;;;;;;;;;;;;:::i;:::-;;;33044:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33290:13:0;;33286:272;;33333:60;;-1:-1:-1;;;33333:60:0;;;;;;;:::i;33286:272::-;33508:6;33502:13;33493:6;33489:2;33485:15;33478:38;33044:529;-1:-1:-1;;;;;;33171:51:0;-1:-1:-1;;;33171:51:0;;-1:-1:-1;33164:58:0;;33008:620;-1:-1:-1;33612:4:0;32836:799;;;;;;:::o;28815:321::-;28945:18;28951:2;28955:7;28945:5;:18::i;:::-;28996:54;29027:1;29031:2;29035:7;29044:5;28996:22;:54::i;:::-;28974:154;;;;-1:-1:-1;;;28974:154:0;;;;;;;:::i;29472:439::-;-1:-1:-1;;;;;29552:16:0;;29544:61;;;;-1:-1:-1;;;29544:61:0;;19290:2:1;29544:61:0;;;19272:21:1;;;19309:18;;;19302:30;19368:34;19348:18;;;19341:62;19420:18;;29544:61:0;19088:356:1;29544:61:0;27559:4;27583:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27583:16:0;:30;29616:58;;;;-1:-1:-1;;;29616:58:0;;19651:2:1;29616:58:0;;;19633:21:1;19690:2;19670:18;;;19663:30;19729;19709:18;;;19702:58;19777:18;;29616:58:0;19449:352:1;29616:58:0;-1:-1:-1;;;;;29745:13:0;;;;;;:9;:13;;;;;:18;;29762:1;;29745:13;:18;;29762:1;;29745:18;:::i;:::-;;;;-1:-1:-1;;29774:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29774:21:0;-1:-1:-1;;;;;29774:21:0;;;;;;;;29813:33;;29774:16;;;29813:33;;29774:16;;29813:33;49044:24:::1;48968:108:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:367::-;1799:8;1809:6;1863:3;1856:4;1848:6;1844:17;1840:27;1830:55;;1881:1;1878;1871:12;1830:55;-1:-1:-1;1904:20:1;;1947:18;1936:30;;1933:50;;;1979:1;1976;1969:12;1933:50;2016:4;2008:6;2004:17;1992:29;;2076:3;2069:4;2059:6;2056:1;2052:14;2044:6;2040:27;2036:38;2033:47;2030:67;;;2093:1;2090;2083:12;2030:67;1736:367;;;;;:::o;2108:437::-;2194:6;2202;2255:2;2243:9;2234:7;2230:23;2226:32;2223:52;;;2271:1;2268;2261:12;2223:52;2311:9;2298:23;2344:18;2336:6;2333:30;2330:50;;;2376:1;2373;2366:12;2330:50;2415:70;2477:7;2468:6;2457:9;2453:22;2415:70;:::i;:::-;2504:8;;2389:96;;-1:-1:-1;2108:437:1;-1:-1:-1;;;;2108:437:1:o;2550:173::-;2618:20;;-1:-1:-1;;;;;2667:31:1;;2657:42;;2647:70;;2713:1;2710;2703:12;2647:70;2550:173;;;:::o;2728:254::-;2796:6;2804;2857:2;2845:9;2836:7;2832:23;2828:32;2825:52;;;2873:1;2870;2863:12;2825:52;2896:29;2915:9;2896:29;:::i;:::-;2886:39;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2728:254:1:o;3169:328::-;3246:6;3254;3262;3315:2;3303:9;3294:7;3290:23;3286:32;3283:52;;;3331:1;3328;3321:12;3283:52;3354:29;3373:9;3354:29;:::i;:::-;3344:39;;3402:38;3436:2;3425:9;3421:18;3402:38;:::i;:::-;3392:48;;3487:2;3476:9;3472:18;3459:32;3449:42;;3169:328;;;;;:::o;3502:127::-;3563:10;3558:3;3554:20;3551:1;3544:31;3594:4;3591:1;3584:15;3618:4;3615:1;3608:15;3634:632;3699:5;3729:18;3770:2;3762:6;3759:14;3756:40;;;3776:18;;:::i;:::-;3851:2;3845:9;3819:2;3905:15;;-1:-1:-1;;3901:24:1;;;3927:2;3897:33;3893:42;3881:55;;;3951:18;;;3971:22;;;3948:46;3945:72;;;3997:18;;:::i;:::-;4037:10;4033:2;4026:22;4066:6;4057:15;;4096:6;4088;4081:22;4136:3;4127:6;4122:3;4118:16;4115:25;4112:45;;;4153:1;4150;4143:12;4112:45;4203:6;4198:3;4191:4;4183:6;4179:17;4166:44;4258:1;4251:4;4242:6;4234;4230:19;4226:30;4219:41;;;;3634:632;;;;;:::o;4271:451::-;4340:6;4393:2;4381:9;4372:7;4368:23;4364:32;4361:52;;;4409:1;4406;4399:12;4361:52;4449:9;4436:23;4482:18;4474:6;4471:30;4468:50;;;4514:1;4511;4504:12;4468:50;4537:22;;4590:4;4582:13;;4578:27;-1:-1:-1;4568:55:1;;4619:1;4616;4609:12;4568:55;4642:74;4708:7;4703:2;4690:16;4685:2;4681;4677:11;4642:74;:::i;4727:186::-;4786:6;4839:2;4827:9;4818:7;4814:23;4810:32;4807:52;;;4855:1;4852;4845:12;4807:52;4878:29;4897:9;4878:29;:::i;4918:347::-;4983:6;4991;5044:2;5032:9;5023:7;5019:23;5015:32;5012:52;;;5060:1;5057;5050:12;5012:52;5083:29;5102:9;5083:29;:::i;:::-;5073:39;;5162:2;5151:9;5147:18;5134:32;5209:5;5202:13;5195:21;5188:5;5185:32;5175:60;;5231:1;5228;5221:12;5175:60;5254:5;5244:15;;;4918:347;;;;;:::o;5270:667::-;5365:6;5373;5381;5389;5442:3;5430:9;5421:7;5417:23;5413:33;5410:53;;;5459:1;5456;5449:12;5410:53;5482:29;5501:9;5482:29;:::i;:::-;5472:39;;5530:38;5564:2;5553:9;5549:18;5530:38;:::i;:::-;5520:48;;5615:2;5604:9;5600:18;5587:32;5577:42;;5670:2;5659:9;5655:18;5642:32;5697:18;5689:6;5686:30;5683:50;;;5729:1;5726;5719:12;5683:50;5752:22;;5805:4;5797:13;;5793:27;-1:-1:-1;5783:55:1;;5834:1;5831;5824:12;5783:55;5857:74;5923:7;5918:2;5905:16;5900:2;5896;5892:11;5857:74;:::i;:::-;5847:84;;;5270:667;;;;;;;:::o;5942:505::-;6037:6;6045;6053;6106:2;6094:9;6085:7;6081:23;6077:32;6074:52;;;6122:1;6119;6112:12;6074:52;6162:9;6149:23;6195:18;6187:6;6184:30;6181:50;;;6227:1;6224;6217:12;6181:50;6266:70;6328:7;6319:6;6308:9;6304:22;6266:70;:::i;:::-;6355:8;;6240:96;;-1:-1:-1;6437:2:1;6422:18;;;;6409:32;;5942:505;-1:-1:-1;;;;5942:505:1:o;6637:260::-;6705:6;6713;6766:2;6754:9;6745:7;6741:23;6737:32;6734:52;;;6782:1;6779;6772:12;6734:52;6805:29;6824:9;6805:29;:::i;:::-;6795:39;;6853:38;6887:2;6876:9;6872:18;6853:38;:::i;:::-;6843:48;;6637:260;;;;;:::o;6902:380::-;6981:1;6977:12;;;;7024;;;7045:61;;7099:4;7091:6;7087:17;7077:27;;7045:61;7152:2;7144:6;7141:14;7121:18;7118:38;7115:161;;;7198:10;7193:3;7189:20;7186:1;7179:31;7233:4;7230:1;7223:15;7261:4;7258:1;7251:15;7115:161;;6902:380;;;:::o;7700:338::-;7902:2;7884:21;;;7941:2;7921:18;;;7914:30;-1:-1:-1;;;7975:2:1;7960:18;;7953:44;8029:2;8014:18;;7700:338::o;8277:337::-;8479:2;8461:21;;;8518:2;8498:18;;;8491:30;-1:-1:-1;;;8552:2:1;8537:18;;8530:43;8605:2;8590:18;;8277:337::o;8619:127::-;8680:10;8675:3;8671:20;8668:1;8661:31;8711:4;8708:1;8701:15;8735:4;8732:1;8725:15;8751:128;8791:3;8822:1;8818:6;8815:1;8812:13;8809:39;;;8828:18;;:::i;:::-;-1:-1:-1;8864:9:1;;8751:128::o;8884:342::-;9086:2;9068:21;;;9125:2;9105:18;;;9098:30;-1:-1:-1;;;9159:2:1;9144:18;;9137:48;9217:2;9202:18;;8884:342::o;9231:331::-;9433:2;9415:21;;;9472:1;9452:18;;;9445:29;-1:-1:-1;;;9505:2:1;9490:18;;9483:38;9553:2;9538:18;;9231:331::o;9567:354::-;9769:2;9751:21;;;9808:2;9788:18;;;9781:30;9847:32;9842:2;9827:18;;9820:60;9912:2;9897:18;;9567:354::o;9926:355::-;10128:2;10110:21;;;10167:2;10147:18;;;10140:30;10206:33;10201:2;10186:18;;10179:61;10272:2;10257:18;;9926:355::o;10286:135::-;10325:3;-1:-1:-1;;10346:17:1;;10343:43;;;10366:18;;:::i;:::-;-1:-1:-1;10413:1:1;10402:13;;10286:135::o;11253:413::-;11455:2;11437:21;;;11494:2;11474:18;;;11467:30;11533:34;11528:2;11513:18;;11506:62;-1:-1:-1;;;11599:2:1;11584:18;;11577:47;11656:3;11641:19;;11253:413::o;11671:356::-;11873:2;11855:21;;;11892:18;;;11885:30;11951:34;11946:2;11931:18;;11924:62;12018:2;12003:18;;11671:356::o;12032:168::-;12072:7;12138:1;12134;12130:6;12126:14;12123:1;12120:21;12115:1;12108:9;12101:17;12097:45;12094:71;;;12145:18;;:::i;:::-;-1:-1:-1;12185:9:1;;12032:168::o;12205:127::-;12266:10;12261:3;12257:20;12254:1;12247:31;12297:4;12294:1;12287:15;12321:4;12318:1;12311:15;12337:120;12377:1;12403;12393:35;;12408:18;;:::i;:::-;-1:-1:-1;12442:9:1;;12337:120::o;12462:125::-;12502:4;12530:1;12527;12524:8;12521:34;;;12535:18;;:::i;:::-;-1:-1:-1;12572:9:1;;12462:125::o;13286:345::-;13488:2;13470:21;;;13527:2;13507:18;;;13500:30;-1:-1:-1;;;13561:2:1;13546:18;;13539:51;13622:2;13607:18;;13286:345::o;14873:470::-;15052:3;15090:6;15084:13;15106:53;15152:6;15147:3;15140:4;15132:6;15128:17;15106:53;:::i;:::-;15222:13;;15181:16;;;;15244:57;15222:13;15181:16;15278:4;15266:17;;15244:57;:::i;:::-;15317:20;;14873:470;-1:-1:-1;;;;14873:470:1:o;17672:414::-;17874:2;17856:21;;;17913:2;17893:18;;;17886:30;17952:34;17947:2;17932:18;;17925:62;-1:-1:-1;;;18018:2:1;18003:18;;17996:48;18076:3;18061:19;;17672:414::o;18091:112::-;18123:1;18149;18139:35;;18154:18;;:::i;:::-;-1:-1:-1;18188:9:1;;18091:112::o;18208:127::-;18269:10;18264:3;18260:20;18257:1;18250:31;18300:4;18297:1;18290:15;18324:4;18321:1;18314:15;18340:489;-1:-1:-1;;;;;18609:15:1;;;18591:34;;18661:15;;18656:2;18641:18;;18634:43;18708:2;18693:18;;18686:34;;;18756:3;18751:2;18736:18;;18729:31;;;18534:4;;18777:46;;18803:19;;18795:6;18777:46;:::i;:::-;18769:54;18340:489;-1:-1:-1;;;;;;18340:489:1:o;18834:249::-;18903:6;18956:2;18944:9;18935:7;18931:23;18927:32;18924:52;;;18972:1;18969;18962:12;18924:52;19004:9;18998:16;19023:30;19047:5;19023:30;:::i
Swarm Source
ipfs://bf35523fb5c628a3e01a7d585f1659e87d275e320ea6aaa6596e86fc0edca025
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.